/* ============================================================
   Sistema Facultad — Aurora
   Vidrio, resplandor y dock flotante. Sin CDN: funciona offline.

   El color de marca lo pone la carrera (ver js/carreras.js) y
   cada materia tiene el suyo, que se pasa con --mat.
   ============================================================ */

/* --- Reset ------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }
html { -webkit-text-size-adjust: 100%; }
img, svg { display: block; max-width: 100%; }
button, input, select, textarea { font: inherit; color: inherit; }
button { cursor: pointer; background: none; border: none; }
a { color: inherit; }

/* --- Tokens ------------------------------------------------ */
:root {
  color-scheme: dark;

  --bg:            #070a12;
  --vidrio:        rgba(255,255,255,.055);
  --vidrio-alto:   rgba(255,255,255,.088);
  --vidrio-hondo:  rgba(0,0,0,.30);
  --borde:         rgba(255,255,255,.11);
  --borde-alto:    rgba(255,255,255,.20);

  --texto: #f2f5fb;
  --tenue: #a7b0c2;
  --debil: #6f7b92;

  /* Los pisa js/carreras.js según la carrera activa. */
  --carrera:       #d9663a;
  --carrera-2:     #ef9563;
  --sobre-carrera: #1a0a02;

  /* Semáforo: estos colores significan algo, no decoran.
     Bajados de saturación para que no compitan con el contenido;
     siguen siendo distinguibles entre sí de un vistazo. */
  --ok:     #56b06a;
  --media:  #d2ad4a;
  --riesgo: #d95f57;
  --inerte: #6e7681;

  /* Color de la tarjeta en curso; cada una lo redefine. */
  --mat: #7d8ba3;

  /* Radios. Subidos a pedido suyo: la app entera va más redondeada.
     Todo lo que redondea sale de acá, así no queda una tarjeta con
     un radio y el modal de al lado con otro. */
  --r-sm: 15px;
  --r:    22px;
  --r-lg: 30px;

  --alto-dock: 74px;
  /* Alto de la cabecera pegajosa. Lo necesita cualquier pantalla que
     quiera ocupar exactamente lo que queda y no una gota más.
     Ojo: es el alto de la fila. Lo que la cabecera ocupa de verdad es
     esto MÁS la franja del reloj (--cielo). */
  --alto-cab: 68px;

  /* La franja de arriba que se come el sistema: reloj, señal, batería.
     Con viewport-fit=cover el navegador nos deja dibujar debajo de
     ella, así que si nadie la descuenta el logo queda tapado por el
     reloj. En la compu vale 0 y no cambia nada. */
  --cielo: env(safe-area-inset-top, 0px);

  /* Dónde apoya el dock. Antes eran 20 px POR ENCIMA de la franja de
     gestos y en un celular quedaba flotando a 56 px del borde, como
     despegado. Ahora apoya justo sobre el borde seguro. */
  --piso: max(10px, env(safe-area-inset-bottom, 0px));
  --resorte: cubic-bezier(.34, 1.45, .5, 1);

  /* Cuánto se sale del borde el resplandor de un elemento cuando
     está en hover o elegido, contando el desenfoque de la sombra y
     los 2-5 px que se levanta. Todo contenedor que recorte tiene
     que dejarle este lugar, o el resplandor se ve cortado en
     cuadrado. */
  --halo: 16px;
  --trama-fondo: none;
  --trama-size: auto;
}

/* --- Base -------------------------------------------------- */
body {  
  background-color: var(--bg);  
  background-image: var(--trama-fondo);
  background-size: var(--trama-size);
  color: var(--texto);  
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;  
  font-size: 16px;  
  line-height: 1.5;  
  -webkit-font-smoothing: antialiased;  
  min-height: 100dvh;  
  overflow-x: hidden;  
  padding-bottom: calc(var(--alto-dock) + 26px + var(--piso));
}

/* Manchas de color del fondo, fijas y difusas. */
body::before, body::after {
  content: ""; position: fixed; border-radius: 50%;
  filter: blur(130px); z-index: -1; pointer-events: none;
}
body::before {  
  width: 640px; height: 640px; top: -290px; left: -190px;  
  background: color-mix(in srgb, var(--carrera) 16%, transparent);
  transition: background 0.5s ease;
}
body::after {
  width: 560px; height: 560px; top: 90px; right: -250px;
  background: rgba(124, 108, 200, .09);
}

::selection { background: var(--carrera); color: var(--sobre-carrera); }
/* Sin border-radius acá: el navegador le da al contorno la forma
   del elemento. Forzarlo a 6px dibujaba un rectángulo naranja
   alrededor de las fichas redondas, y eso era lo que se veía
   "cortado". */
:focus-visible { outline: 2px solid var(--carrera-2); outline-offset: 2px; }

/* --- Tipografía -------------------------------------------- */
h1 { font-size: 1.9rem;   font-weight: 750; letter-spacing: -.03em; }
h2 { font-size: 1.25rem;  font-weight: 690; letter-spacing: -.02em; }
h3 { font-size: 1.03rem;  font-weight: 650; letter-spacing: -.015em; }

.sub   { color: var(--tenue); font-size: .91rem; }
.menor { font-size: .84rem; }
.etiqueta {
  font-size: .69rem; letter-spacing: .1em; text-transform: uppercase;
  font-weight: 750; color: var(--debil);
}
.num { font-variant-numeric: tabular-nums; }

/* --- Estructura -------------------------------------------- */
.contenedor { width: 100%; max-width: 1080px; margin: 0 auto; padding: 0 18px; }

.cabecera {
  position: sticky; top: 0; z-index: 30;
  /* El relleno de arriba es la franja del reloj. Va como padding y no
     como margen para que el vidrio esmerilado la cubra: si no, el
     reloj queda leyéndose sobre el contenido que pasa por debajo. */
  padding-top: var(--cielo);
  backdrop-filter: blur(22px);
  background: linear-gradient(to bottom, rgba(7,10,18,.93), rgba(7,10,18,.55));
  border-bottom: 1px solid rgba(255,255,255,.07);
}
/* Tres columnas para que el buscador quede centrado de verdad y no
   "más o menos al medio": las dos laterales se reparten lo que
   sobra, así que el del medio cae siempre en el eje. */
.cabecera-fila {
  display: grid; grid-template-columns: 1fr minmax(0, 430px) 1fr;
  align-items: center; gap: 13px; height: 68px;
}

.marca { display: flex; align-items: center; gap: 11px; min-width: 0; cursor: pointer; }
/* Adentro va el eje en línea (ver index.html), no una letra: por eso no
   lleva font-*. `color` sigue haciendo falta — es de donde el SVG saca
   su currentColor, así que la marca se tiñe sola con la carrera. */
.marca-logo {
  width: 40px; height: 40px; border-radius: 13px; flex-shrink: 0;
  display: grid; place-items: center;
  overflow: hidden;
  isolation: isolate;
  background: linear-gradient(140deg, var(--carrera-2), var(--carrera));
  color: var(--sobre-carrera);
  box-shadow: 0 0 20px color-mix(in srgb, var(--carrera) 24%, transparent);
}
.marca-logo svg { width: 24px; height: 24px; }
.marca-logo .logo-tema-svg { width: 100%; height: 100%; }
/* Los dos estilos alternativos del modal "Acerca de" (js/app.js). El
   degradé de arriba sigue siendo el de icons/ — éstos son sólo para la
   marca dentro de la app. */
.marca-logo.vidrio {
  background: var(--vidrio-alto); border: 1px solid var(--borde-alto);
  color: var(--carrera-2); box-shadow: none;
}
.marca-logo.negro {
  background: #050608; border: 1px solid rgba(255,255,255,.08);
  color: var(--texto);
  box-shadow: 0 0 16px color-mix(in srgb, var(--carrera) 22%, transparent);
}
.marca-txt { min-width: 0; }
.marca-txt strong { display: block; font-size: .94rem; font-weight: 700; letter-spacing: -.015em; }
.marca-txt span {
  display: block; font-size: .74rem; color: var(--debil);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* --- El modal "Acerca de Axis" ------------------------------------ */
.acerca-marca { display: flex; flex-direction: column; align-items: center; gap: 13px; padding: 4px 0 20px; text-align: center; }
.acerca-previa { width: 72px; height: 72px; border-radius: 22px; }
.acerca-previa svg { width: 44px; height: 44px; }
.acerca-previa .logo-tema-svg { width: 100%; height: 100%; }
.acerca-previa { overflow: hidden; isolation: isolate; }
.acerca-lema { color: var(--tenue); font-size: .93rem; max-width: 30ch; line-height: 1.5; }

.buscador {
  width: 100%;
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px; border-radius: 15px;
  background: var(--vidrio); border: 1px solid var(--borde);
  color: var(--tenue); font-size: .84rem; text-align: left;
  transition: border-color .25s, box-shadow .25s, background .25s;
}
.buscador:hover {
  border-color: color-mix(in srgb, var(--carrera) 38%, transparent);
  box-shadow: 0 0 20px color-mix(in srgb, var(--carrera) 10%, transparent);
}
.buscador .crece { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.buscador kbd {
  font-size: .65rem; font-family: ui-monospace, monospace;
  background: rgba(255,255,255,.1); border: 1px solid var(--borde);
  padding: 2px 7px; border-radius: 6px; flex-shrink: 0;
}
/* --- Accesos de la cabecera (Gemini, NotebookLM, Ajustes) ---- */
.cabecera-acciones { display: flex; align-items: center; gap: 7px; justify-content: flex-end; }

.icono-tool {
  width: 38px; height: 38px; border-radius: 12px; flex-shrink: 0;
  display: grid; place-items: center; text-decoration: none;
  color: var(--tenue);
  background: var(--vidrio); border: 1px solid var(--borde);
  transition: transform .28s var(--resorte), background .2s, border-color .2s, color .2s;
}
.icono-tool svg { width: 19px; height: 19px; }
.icono-tool:hover {
  transform: translateY(-2px);
  color: color-mix(in srgb, var(--mat, var(--carrera-2)) 88%, #fff);
  background: color-mix(in srgb, var(--mat, var(--carrera)) 14%, var(--vidrio));
  border-color: color-mix(in srgb, var(--mat, var(--carrera)) 45%, transparent);
  box-shadow: 0 0 18px -5px color-mix(in srgb, var(--mat, var(--carrera)) 55%, transparent);
}
.icono-tool:active { transform: scale(.93); }

/* En pantallas chicas no hay lugar para centrar nada: cada cosa
   ocupa lo que necesita y el buscador se queda con el resto. */
@media (max-width: 720px) {
  .cabecera-fila { grid-template-columns: auto 1fr auto; }
  .buscador .crece, .buscador kbd { display: none; }
  .buscador { width: auto; margin-left: auto; }
}
@media (max-width: 560px) {
  .marca-txt { display: none; }
  .icono-tool { width: 34px; height: 34px; border-radius: 10px; }
  .icono-tool svg { width: 17px; height: 17px; }
}

.vista { padding: 24px 0 20px; }
.vista-cab { margin-bottom: 20px; }
.vista-cab h1 { margin-bottom: 2px; }

.fila { display: flex; align-items: center; gap: 12px; }
.fila-sep { justify-content: space-between; }
.crece { flex: 1; min-width: 0; }
.pila { display: flex; flex-direction: column; gap: 13px; }

.seccion { margin-top: 30px; }
.seccion-cab { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 13px; }

/* --- Tu piel: el fondo detrás del vidrio (Ajustes) y el color/emoji
   de cada materia (detalle de materia → Configurar). Maqueta aprobada
   en disenos/AI-piel.html. --- */

/* La capa del fondo. Va DEBAJO de las dos manchas que dibuja
   body::before/::after (z-index -1): el automático las deja ver, y
   cualquier otro fondo las tapa. Fija, nunca hace scroll. */
#fondo-app {
  position: fixed; inset: 0; z-index: -2; pointer-events: none;
  background-size: cover; background-position: center; opacity: 0;
  transition: opacity .45s ease;
}
/* La foto se desenfoca y se le baja el color antes de tocar el vidrio:
   sin esto, una foto con contraste se come el texto de las tarjetas.
   El scale evita que el blur deje ver el borde transparente. */
#fondo-app.es-foto { filter: blur(16px) saturate(.72); transform: scale(1.08); }
/* El velo: la perilla no baja la opacidad del fondo (quedaría gris
   lavado), sube este negro encima — así el fondo queda oscuro y
   profundo, que es lo que el vidrio necesita para seguir leyéndose. */
#velo-fondo-app {
  position: fixed; inset: 0; z-index: -2; pointer-events: none;
  background: var(--bg); opacity: 0; transition: opacity .45s ease;
}

.fondos {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
  gap: 12px;
  padding: var(--halo); margin: calc(var(--halo) * -1);
}
.fondo-op {
  border: none; background: none; padding: 0; cursor: pointer;
  display: flex; flex-direction: column; gap: 7px; text-align: center;
  font: inherit; color: var(--tenue);
}
.fondo-tile {
  aspect-ratio: 9/13; border-radius: var(--r-sm);
  border: 1px solid var(--borde); background-size: cover; background-position: center;
  position: relative; overflow: hidden;
  transition: transform .18s var(--resorte), border-color .18s, box-shadow .18s;
}
/* Una miniatura del vidrio adentro de la miniatura del fondo: sin esto
   elegís un fondo lindo y recién adentro de la app te enterás de que
   la tarjeta encima no se lee. */
.fondo-tile::after {
  content: ""; position: absolute; left: 14%; right: 14%; top: 38%; height: 26%;
  border-radius: 7px; background: var(--vidrio-alto);
  border: 1px solid var(--borde-alto); backdrop-filter: blur(6px);
}
.fondo-op:hover .fondo-tile { transform: translateY(-3px); border-color: var(--borde-alto); }
.fondo-op[aria-pressed="true"] .fondo-tile {
  border-color: #fff;
  box-shadow: 0 0 0 2px rgba(255,255,255,.55), 0 6px 22px rgba(255,255,255,.16);
}
.fondo-op[aria-pressed="true"] { color: var(--texto); }
.fondo-op span { font-size: .74rem; font-weight: 600; }

.control-fila {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  margin-top: 18px; color: var(--tenue); font-size: .88rem;
}
.control-fila input[type=range] { flex: 1; min-width: 160px; accent-color: var(--carrera); }
.control-fila .valor { font-variant-numeric: tabular-nums; color: var(--texto); font-weight: 650; min-width: 40px; }

/* El sello de la materia: un emoji antes del nombre, para reconocerla
   sin leer. Vacío = no se dibuja y la tarjeta queda como siempre. */
.mat-sello {
  width: 28px; height: 28px; flex: 0 0 28px; border-radius: 9px;
  display: grid; place-items: center; font-size: 15px; line-height: 1;
  background: color-mix(in srgb, var(--mat) 26%, transparent);
  border: 1px solid color-mix(in srgb, var(--mat) 45%, transparent);
}

/* El panel de Personalizar (color + emoji), adentro de Configurar en
   el detalle de una materia — js/views/materias.js. */
.piel-colores, .piel-emojis {
  display: flex; flex-wrap: wrap; gap: 10px;
  padding: var(--halo); margin: calc(var(--halo) * -1) calc(var(--halo) * -1) 4px;
}
.piel-color-op {
  width: 32px; height: 32px; border-radius: 50%; cursor: pointer;
  border: 2px solid transparent; padding: 0;
  transition: transform .16s var(--resorte), box-shadow .16s;
}
.piel-color-op:hover { transform: scale(1.14); }
.piel-color-op[aria-pressed="true"] {
  border-color: #fff; box-shadow: 0 0 0 3px rgba(255,255,255,.18), 0 0 14px currentColor;
  transform: scale(1.1);
}
.piel-emoji-op {
  width: 36px; height: 36px; border-radius: 11px; font-size: 17px; cursor: pointer;
  background: var(--vidrio); border: 1px solid var(--borde); color: var(--texto);
  display: grid; place-items: center; padding: 0;
  transition: transform .16s var(--resorte), border-color .16s, background .16s;
}
.piel-emoji-op:hover { transform: translateY(-2px); border-color: var(--borde-alto); background: var(--vidrio-alto); }
.piel-emoji-op[aria-pressed="true"] { border-color: #fff; background: var(--vidrio-alto); }
.piel-emoji-op.ninguno { font-size: .64rem; font-weight: 700; color: var(--debil); letter-spacing: .04em; }

/* --- Vidrio ------------------------------------------------ */
.tarjeta, .tarjeta-int {
  position: relative; overflow: hidden;
  background: var(--vidrio);
  backdrop-filter: blur(28px);
  border: 1px solid var(--borde);
  border-radius: var(--r);
  box-shadow: 0 20px 50px -22px rgba(0,0,0,.75), inset 0 1px 0 rgba(255,255,255,.09);
  padding: 18px;
  transition: transform .38s cubic-bezier(.16,1,.3,1), border-color .3s, box-shadow .38s, background .3s;
}
/* Reflejo interno teñido por la materia */
.tarjeta::before, .tarjeta-int::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  opacity: .42; transition: opacity .35s;
  background: radial-gradient(430px 130px at 8% 0%,
              color-mix(in srgb, var(--mat) 13%, transparent), transparent 70%);
}
.tarjeta > *, .tarjeta-int > * { position: relative; }

.tarjeta-int { width: 100%; text-align: left; display: block; }
.tarjeta-int:hover, .tarjeta.viva:hover {
  transform: translateY(-5px);
  background: var(--vidrio-alto);
  border-color: color-mix(in srgb, var(--mat) 38%, transparent);
  box-shadow: 0 30px 62px -24px rgba(0,0,0,.85),
              0 0 34px color-mix(in srgb, var(--mat) 13%, transparent),
              inset 0 1px 0 rgba(255,255,255,.13);
}
.tarjeta-int:hover::before, .tarjeta.viva:hover::before { opacity: .78; }
.tarjeta-int:active { transform: translateY(-2px) scale(.99); transition-duration: .1s; }

/* Las tarjetas de Hoy (Clases, Tareas, Progreso, Semáforo, Bloc)
   quedaban rígidas al lado de la destacada de arriba, que sí "se
   infla" al tocarla. Mismo gesto —se despega un toque, brilla un
   toque— pero teñido con --carrera en vez de --mat: estas tarjetas
   no son de una sola materia como para tomar ese color. */
.tarjeta.panel:hover {
  transform: translateY(-4px);
  background: var(--vidrio-alto);
  border-color: color-mix(in srgb, var(--carrera) 32%, var(--borde));
  box-shadow: 0 26px 54px -22px rgba(0,0,0,.8),
              0 0 28px color-mix(in srgb, var(--carrera) 10%, transparent),
              inset 0 1px 0 rgba(255,255,255,.12);
}
.tarjeta.panel:hover::before { opacity: .7; }
.tarjeta.panel:active { transform: translateY(-1px) scale(.995); transition-duration: .1s; }

/* Franja de color a la izquierda */
.franja {
  position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
  background: var(--mat);
  box-shadow: 0 0 14px color-mix(in srgb, var(--mat) 38%, transparent);
}
.con-franja { padding-left: 24px; }

.grilla { display: grid; gap: 13px; grid-template-columns: 1fr; }
@media (min-width: 640px) { .grilla-2 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 900px) { .grilla-3 { grid-template-columns: repeat(3, 1fr); } }

/* --- Destacado --------------------------------------------- */
.destacado { padding: 24px; margin-bottom: 16px; border-radius: var(--r-lg); }
.destacado h2 { margin: 9px 0 3px; font-size: 1.42rem; }
.cuenta {
  font-size: 3.3rem; font-weight: 790; letter-spacing: -.05em; line-height: 1;
  color: var(--mat);
  text-shadow: 0 0 34px color-mix(in srgb, var(--mat) 24%, transparent);
}
.pie-destacado { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 18px; }

/* Pulso "en vivo" */
.vivo {
  display: inline-flex; align-items: center; gap: 9px;
  font-size: .7rem; font-weight: 780; letter-spacing: .09em;
  text-transform: uppercase; color: var(--mat);
}
.punto {
  width: 11px; height: 11px; border-radius: 50%; background: var(--mat);
  position: relative; box-shadow: 0 0 9px color-mix(in srgb, var(--mat) 55%, transparent); flex-shrink: 0;
}
.punto::after {
  content: ""; position: absolute; inset: -6px; border-radius: 50%;
  border: 2px solid var(--mat);
  animation: onda 2.2s cubic-bezier(0,.55,.45,1) infinite;
}
@keyframes onda { 0% { transform: scale(.55); opacity: 1; } 100% { transform: scale(2); opacity: 0; } }

/* --- Anillos de progreso ----------------------------------- */
.metricas { display: grid; grid-template-columns: repeat(2, 1fr); gap: 13px; }
@media (min-width: 720px) { .metricas { grid-template-columns: repeat(4, 1fr); } }
.metrica { padding: 20px; text-align: center; }
.aro { width: 78px; height: 78px; margin: 0 auto 10px; position: relative; }
.aro svg { transform: rotate(-90deg); filter: drop-shadow(0 0 7px color-mix(in srgb, var(--mat) 30%, transparent)); }
.aro circle { fill: none; stroke-width: 8; stroke-linecap: round; }
.aro .fondo { stroke: rgba(255,255,255,.09); }
.aro .valor { stroke: var(--mat); stroke-dasharray: 201; transition: stroke-dashoffset 1.1s var(--resorte); }
.aro b { position: absolute; inset: 0; display: grid; place-items: center; font-size: 1.18rem; font-weight: 760; letter-spacing: -.03em; }
.metrica .rotulo { font-size: .81rem; color: var(--tenue); font-weight: 550; }

/* --- Insignias --------------------------------------------- */
.insignia {
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
  font-size: .77rem; font-weight: 660; padding: 5px 12px; border-radius: 999px;
  background: color-mix(in srgb, var(--tono, var(--mat)) 13%, transparent);
  color: color-mix(in srgb, var(--tono, var(--mat)) 82%, #ffffff);
  border: 1px solid color-mix(in srgb, var(--tono, var(--mat)) 24%, transparent);
}
.insignia[data-tono="ok"]     { --tono: var(--ok); }
.insignia[data-tono="media"]  { --tono: var(--media); }
.insignia[data-tono="riesgo"] { --tono: var(--riesgo); }
.insignia[data-tono="acento"] { --tono: var(--carrera-2); }
.insignia[data-tono="inerte"] { --tono: var(--tenue); background: rgba(255,255,255,.07); border-color: var(--borde); }

/* --- Botones ----------------------------------------------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  padding: 10px 18px; border-radius: 999px; min-height: 42px;
  font-size: .89rem; font-weight: 680;
  background: linear-gradient(135deg, var(--carrera-2), var(--carrera));
  color: var(--sobre-carrera);
  box-shadow: 0 8px 20px -10px color-mix(in srgb, var(--carrera) 55%, transparent);
  transition: transform .3s var(--resorte), filter .2s, background .25s, border-color .25s;
}
.btn:hover { transform: scale(1.045); filter: brightness(1.1); }
.btn:active { transform: scale(.96); }

.btn-suave {
  background: var(--vidrio); color: var(--texto);
  border: 1px solid var(--borde); box-shadow: none;
}
.btn-suave:hover { background: var(--vidrio-alto); border-color: var(--borde-alto); filter: none; }

.btn-fantasma { background: none; color: var(--tenue); box-shadow: none; }
.btn-fantasma:hover { background: var(--vidrio); color: var(--texto); filter: none; }

.btn-peligro {
  background: rgba(255,69,58,.14); color: var(--riesgo);
  border: 1px solid rgba(255,69,58,.34); box-shadow: none;
}
/* Botón teñido por la materia: se usa adentro del panel de una
   materia, donde el naranja de la carrera competiría con su color. */
.btn-mat {
  background: color-mix(in srgb, var(--mat) 22%, transparent);
  border: 1px solid color-mix(in srgb, var(--mat) 55%, transparent);
  color: var(--texto);
  box-shadow: none;
}
.btn-mat:hover { background: color-mix(in srgb, var(--mat) 34%, transparent); filter: none; }

.btn-sm { padding: 7px 14px; min-height: 34px; font-size: .8rem; }
.btn-icono { width: 42px; padding: 0; flex-shrink: 0; }
.btn-bloque { width: 100%; }

/* --- Listas ------------------------------------------------ */
.lista { display: flex; flex-direction: column; gap: 9px; }
.item {
  --mat: var(--inerte);
  position: relative; display: flex; align-items: center; gap: 12px;
  padding: 12px 14px; border-radius: var(--r-sm);
  background: var(--vidrio-hondo);
  border: 1px solid rgba(255,255,255,.07);
  border-left: 3px solid var(--mat);
  transition: transform .22s, background .22s, box-shadow .22s, border-color .22s;
}
.item.tap { cursor: pointer; }
.item.tap:hover {
  transform: translateX(4px); background: rgba(0,0,0,.45);
  box-shadow: -8px 0 22px -12px color-mix(in srgb, var(--mat) 45%, transparent);
}
.item-txt { flex: 1; min-width: 0; }
.item-txt .titulo { font-weight: 570; font-size: .95rem; }
.item-txt .meta { font-size: .79rem; color: var(--debil); }
.hecha .titulo { text-decoration: line-through; color: var(--debil); font-weight: 400; }

/* --- Importante y orden a mano (tareas y notas) -------------- */
/* El asa: agarra sólo desde acá, así el resto de la fila —tildar,
   abrir, editar— sigue funcionando como siempre. touch-action:none le
   saca la ambigüedad al dedo: sin esto, arrancar el arrastre desde
   la fila entera compite con el scroll de la página. */
.asa {
  width: 28px; height: 34px; flex-shrink: 0; margin: -6px 0;
  display: grid; place-items: center; color: var(--debil);
  cursor: grab; touch-action: none; border-radius: 8px;
  transition: color .2s, background .2s;
}
.asa:hover { color: var(--tenue); background: rgba(255,255,255,.05); }
.asa:active { cursor: grabbing; }

/* La estrella: nada de semáforo (ya dice "vencida", "al día"...). Se
   prende con el color de la carrera, grande y con resplandor — el
   pedido fue "que resalte", no un ícono más. */
.estrella {
  width: 32px; height: 32px; flex-shrink: 0;
  display: grid; place-items: center; border-radius: 10px;
  color: var(--debil); background: transparent; border: 1px solid transparent;
  transition: transform .25s var(--resorte), background .2s, color .2s, border-color .2s;
}
.estrella:hover { color: var(--tenue); background: rgba(255,255,255,.06); }
.estrella .ico { transition: fill .2s; }
.estrella[aria-pressed="true"] {
  color: var(--carrera-2);
  background: color-mix(in srgb, var(--carrera) 16%, transparent);
  border-color: color-mix(in srgb, var(--carrera) 40%, transparent);
  filter: drop-shadow(0 0 6px color-mix(in srgb, var(--carrera) 55%, transparent));
}
.estrella[aria-pressed="true"] .ico { fill: currentColor; }
.estrella:active { transform: scale(.88); }

/* La fila o tarjeta importante: un lavado suave de --carrera de punta
   a punta. El borde de la izquierda sigue siendo el de la materia
   (--mat): esto tiñe el borde EXTERIOR, no lo reemplaza. */
.item.importante {
  background: color-mix(in srgb, var(--carrera) 7%, var(--vidrio-hondo));
  border-color: color-mix(in srgb, var(--carrera) 30%, rgba(255,255,255,.07));
}

/* La fila que se está agarrando: se despega del documento y sigue al
   dedo. pointer-events:none deja que elementFromPoint "vea a través"
   de ella para encontrar qué hay debajo. */
.item.arrastrando {
  position: fixed; z-index: 60; pointer-events: none; margin: 0;
  box-shadow: 0 28px 60px -18px rgba(0,0,0,.9), inset 0 1px 0 rgba(255,255,255,.12);
  transform: scale(1.02) rotate(-.3deg);
}
.placeholder-arrastre {
  border: 1.5px dashed color-mix(in srgb, var(--carrera) 55%, transparent);
  border-radius: var(--r-sm);
  background: color-mix(in srgb, var(--carrera) 6%, transparent);
}
body.hay-arrastre { -webkit-user-select: none; user-select: none; }

.chk {
  appearance: none; width: 22px; height: 22px; flex-shrink: 0;
  border: 2px solid rgba(255,255,255,.24); border-radius: 50%;
  position: relative; transition: transform .35s var(--resorte), background .2s, border-color .2s;
}
.chk:checked { background: var(--mat); border-color: var(--mat); transform: scale(1.1); }
.chk:checked::after {
  content: ""; position: absolute; left: 7px; top: 3px;
  width: 5px; height: 10px; border: solid var(--bg);
  border-width: 0 2px 2px 0; transform: rotate(45deg);
}

.vacio { color: var(--debil); font-size: .91rem; padding: 26px 0; text-align: center; }

/* --- Materias ---------------------------------------------- */
.tarjeta-int.tap { cursor: pointer; }
.materia-cab { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; margin-bottom: 9px; }
.materia-nombre { font-size: 1.02rem; font-weight: 660; line-height: 1.3; letter-spacing: -.015em; }
/* El lapicito de "Personalizar": adentro de .materia-cab (un ítem
   flex más, no position:absolute) para que nunca le gane lugar a la
   insignia de estado — con space-between, la insignia sigue siendo
   siempre el último ítem pegado al borde, se agregue lo que se
   agregue antes. Transparente hasta el hover/foco, y siempre visible
   en celular porque ahí no hay hover que lo revele. */
.mat-editar { display: inline-flex; flex-shrink: 0; opacity: 0; transition: opacity .15s; }
.tarjeta-int.tap:hover .mat-editar, .tarjeta-int.tap:focus-within .mat-editar { opacity: 1; }
@media (hover: none) { .mat-editar { opacity: 1; } }
/* La previsualización del panel de Personalizar es la tarjeta real,
   pero inerte: sin esto, tocarla dispararía "ver-materia" (o de
   nuevo el lapicito) por encima del propio panel que la muestra. */
.mat-preview { pointer-events: none; }
.materia-datos { display: flex; gap: 7px; flex-wrap: wrap; margin-top: 10px; }
.dato {
  font-size: .74rem; color: var(--tenue);
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.08);
  padding: 3px 10px; border-radius: 999px;
}
.dato strong { color: var(--texto); font-weight: 680; }
/* Una nota en la tarjeta se lee por color antes que por número. */
.dato[data-tono] { border-color: color-mix(in srgb, var(--tono) 30%, transparent); }
.dato[data-tono] strong { color: var(--tono); }
.dato[data-tono="ok"]     { --tono: var(--ok); }
.dato[data-tono="media"]  { --tono: var(--media); }
.dato[data-tono="riesgo"] { --tono: var(--riesgo); }

.barra { height: 6px; border-radius: 999px; background: rgba(255,255,255,.09); overflow: hidden; margin-top: 11px; }
.barra > i {
  display: block; height: 100%; border-radius: 999px; background: var(--mat);
  box-shadow: 0 0 10px color-mix(in srgb, var(--mat) 34%, transparent);
  transition: width .9s var(--resorte);
}
.barra[data-tono="media"]  > i { background: var(--media); box-shadow: 0 0 10px color-mix(in srgb, var(--media) 30%, transparent); }
.barra[data-tono="riesgo"] > i { background: var(--riesgo); box-shadow: 0 0 10px color-mix(in srgb, var(--riesgo) 30%, transparent); }

.grupo-anio { margin-top: 26px; }
.grupo-anio:first-child { margin-top: 0; }
.grupo-anio > h2 { margin-bottom: 12px; display: flex; align-items: center; gap: 12px; }
.grupo-anio > h2::after { content: ""; flex: 1; height: 1px; background: rgba(255,255,255,.08); }

/* --- Correlativas ------------------------------------------ */
.correlativa {
  display: flex; align-items: center; gap: 11px; padding: 9px 0;
  font-size: .89rem; border-bottom: 1px solid rgba(255,255,255,.06);
}
.correlativa:last-child { border-bottom: none; }
.correlativa .marca-est {
  width: 22px; height: 22px; border-radius: 50%; flex-shrink: 0;
  display: grid; place-items: center; font-size: .69rem; font-weight: 800;
}
.correlativa[data-cumple="si"] .marca-est { background: rgba(50,215,75,.18);  color: var(--ok); }
.correlativa[data-cumple="no"] .marca-est { background: rgba(255,69,58,.18);  color: var(--riesgo); }
.correlativa[data-cumple="?"]  .marca-est { background: rgba(255,214,10,.18); color: var(--media); }

/* --- Segmentos / sub-pestañas ------------------------------ */
/* Scroll horizontal + resplandor: el padding le da lugar al halo y
   el margen negativo lo devuelve, así los segmentos quedan alineados
   con el resto de la pantalla igual que antes. Ver --halo. */
.segmentos {
  display: flex; gap: 7px; overflow-x: auto; scrollbar-width: none;
  padding: var(--halo); margin: calc(var(--halo) * -1);
}
.segmentos::-webkit-scrollbar { display: none; }
/* Mientras la arrastrás con el mouse (ver iniciarEscuchas en app.js):
   sin `user-select: none` el gesto pinta de azul los nombres de las
   materias en vez de mover la tira. */
.arrastrando { cursor: grabbing; user-select: none; -webkit-user-select: none; }
.arrastrando * { cursor: grabbing; }
/* Con el dedo apoyado el navegador anima el desplazamiento y la tira
   va siempre un instante atrás de donde soltaste. */
.arrastrando { scroll-behavior: auto; }
.segmento {
  padding: 8px 15px; border-radius: 999px; font-size: .82rem; font-weight: 640;
  border: 1px solid var(--borde); background: var(--vidrio);
  color: var(--tenue); white-space: nowrap; flex-shrink: 0;
  transition: transform .28s var(--resorte), background .22s, color .22s, border-color .22s;
}
.segmento:hover { transform: translateY(-2px); color: var(--texto); }
/* El puntito de color hace que la elijas por color antes que por leer
   el nombre, que es lo que uno hace en el celular. */
.segmento-punto {
  display: inline-block; width: 7px; height: 7px; border-radius: 50%;
  background: var(--mat, var(--inerte)); margin-right: 7px; vertical-align: 1px;
}
.segmento.mas { color: var(--debil); border-style: dashed; }
.segmento[aria-pressed="true"] {
  background: color-mix(in srgb, var(--carrera) 16%, transparent);
  color: var(--carrera-2);
  border-color: color-mix(in srgb, var(--carrera) 32%, transparent);
  box-shadow: none;
}

/* Selector de tema de marca: cada opción muestra miniatura + texto,
   para no elegir a ciegas por nombre. */
.temas-logo { flex-wrap: wrap; overflow: visible; }
.segmento-tema {
  min-width: 146px; border-radius: 14px;
  display: grid; grid-template-columns: 24px 1fr; gap: 9px;
  align-items: center; text-align: left;
  padding: 8px 10px;
}
.segmento-tema[aria-pressed="true"] {
  background: rgba(255,255,255,.055);
  color: var(--texto);
  border-color: color-mix(in srgb, var(--carrera) 26%, rgba(255,255,255,.12));
  box-shadow: inset 0 0 0 1px rgba(255,255,255,.04);
}
.segmento-ico {
  width: 24px; height: 24px; display: block;
  border-radius: 7px; overflow: hidden; isolation: isolate;
}
.segmento-ico .logo-tema-svg { width: 100%; height: 100%; }
.segmento-txt { display: block; line-height: 1.2; }
.segmento-txt b { display: block; font-size: .78rem; color: var(--texto); }
.segmento-txt span { display: block; font-size: .68rem; color: var(--debil); }

/* Sub-pestañas dentro de una vista (Lista / Mapa) */
.subtabs {
  display: inline-flex; gap: 3px; padding: 4px; border-radius: 14px;
  background: var(--vidrio-hondo); border: 1px solid rgba(255,255,255,.07);
}
.subtab {
  padding: 8px 17px; border-radius: 11px; font-size: .85rem; font-weight: 650;
  color: var(--tenue); transition: .25s var(--resorte);
}
.subtab[aria-pressed="true"] {
  background: var(--vidrio-alto); color: var(--texto);
  box-shadow: 0 2px 10px rgba(0,0,0,.4);
}

/* --- Formularios ------------------------------------------- */
.campo { display: flex; flex-direction: column; gap: 6px; }
.campo > label { font-size: .81rem; color: var(--tenue); font-weight: 570; }
.entrada {
  width: 100%; padding: 11px 13px; min-height: 44px;
  background: var(--vidrio-hondo); border: 1px solid var(--borde);
  border-radius: var(--r-sm); color: var(--texto);
  transition: border-color .2s, box-shadow .2s;
}
.entrada:focus {
  outline: none;
  border-color: color-mix(in srgb, var(--carrera) 60%, transparent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--carrera) 15%, transparent);
}
.entrada::placeholder { color: var(--debil); }
textarea.entrada { resize: vertical; min-height: 110px; line-height: 1.6; }
select.entrada {
  appearance: none; padding-right: 36px; cursor: pointer;
  background-image: linear-gradient(45deg, transparent 50%, var(--tenue) 50%),
                    linear-gradient(135deg, var(--tenue) 50%, transparent 50%);
  background-position: calc(100% - 18px) 20px, calc(100% - 13px) 20px;
  background-size: 5px 5px; background-repeat: no-repeat;
}
select.entrada:hover { border-color: var(--borde-alto); }
/* La lista desplegable la dibuja el sistema operativo y casi no se
   puede tocar; al menos que no salga blanca sobre la app oscura. */
select.entrada option { background: #12161f; color: var(--texto); }
.campos-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }

/* --- Modal ------------------------------------------------- */
.velo {
  position: fixed; inset: 0; z-index: 60;
  background: rgba(0,0,0,.72); backdrop-filter: blur(6px);
  display: flex; align-items: flex-end; justify-content: center;
  animation: aparecer .18s;
}
@keyframes aparecer { from { opacity: 0; } }
@media (min-width: 640px) { .velo { align-items: center; padding: 24px; } }
.modal {
  width: 100%; max-width: 500px; overflow-y: auto;
  /* Menos la franja del reloj: un modal largo llegaba a taparla. */
  max-height: calc(90dvh - var(--cielo));
  background: rgba(19,24,38,.96); backdrop-filter: blur(30px);
  border: 1px solid var(--borde-alto);
  border-radius: var(--r-lg) var(--r-lg) 0 0;
  padding: 22px 22px calc(22px + env(safe-area-inset-bottom));
  box-shadow: 0 -20px 60px rgba(0,0,0,.8);
  animation: subir .32s cubic-bezier(.16,1,.3,1);
}
@keyframes subir { from { transform: translateY(24px); opacity: 0; } }
@media (min-width: 640px) { .modal { border-radius: var(--r-lg); padding-bottom: 22px; } }
.modal-cab { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; }
.modal-pie { display: flex; gap: 9px; justify-content: flex-end; margin-top: 22px; }
.modal-pie .btn { flex: 1; }
@media (min-width: 640px) { .modal-pie .btn { flex: 0 1 auto; } }

/* --- Dock flotante ----------------------------------------- */
.nav {
  position: fixed; left: 50%; transform: translateX(-50%);
  bottom: var(--piso);
  z-index: 50; display: flex; gap: 5px; padding: 9px;
  border-radius: 26px; max-width: calc(100vw - 20px);
  background: rgba(11,16,30,.84); backdrop-filter: blur(30px);
  border: 1px solid rgba(255,255,255,.16);
  box-shadow: 0 24px 55px -14px rgba(0,0,0,.9), inset 0 1px 0 rgba(255,255,255,.16);
}
.nav-item {
  --mat: var(--carrera);
  display: flex; flex-direction: column; align-items: center; gap: 3px;
  /* Todas del mismo ancho: "Hoy" mide 22 px menos que "Enfoque" y sin
     esto el botón del agente queda corrido del centro del dock. El
     número sale de medir: con 62 y este padding, el dock pide 337 de
     los 355 que hay en un celular de 375, y sigue entrando en uno de
     360. */
  min-width: 62px;
  padding: 9px 9px; border-radius: 19px;
  color: var(--tenue); font-size: .65rem; font-weight: 660;
  text-decoration: none;
  transition: transform .3s var(--resorte), background .25s, color .25s;
}
.nav-item svg {
  width: 21px; height: 21px; stroke: currentColor; fill: none;
  stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round;
}
.nav-item:hover { transform: translateY(-7px) scale(1.07); color: #fff; background: rgba(255,255,255,.09); }
.nav-item[aria-current="page"] {
  color: #fff;
  background: color-mix(in srgb, var(--mat) 20%, transparent);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mat) 32%, transparent);
}
.nav-item[aria-current="page"] svg { filter: none; }

/* El agente, en el medio del dock. No es una pestaña sino una acción:
   por eso va levantado, sin etiqueta y con el color de la carrera
   pleno. Sin etiqueta es también lo único que lo hace entrar — con
   una quinta pestaña de texto el dock se pasa de los 355 px que hay
   en un celular de 375. */
.nav-agente {
  position: relative; z-index: 1;
  display: grid; place-items: center; cursor: pointer;
  width: 50px; height: 50px; border-radius: 17px; margin: -1px 2px;
  border: 0; font-family: inherit; color: var(--sobre-carrera);
  background: linear-gradient(135deg, var(--carrera-2), var(--carrera));
  box-shadow: 0 8px 22px color-mix(in srgb, var(--carrera) 45%, transparent),
              inset 0 1px 0 rgba(255,255,255,.35);
  transition: transform .3s var(--resorte), box-shadow .3s ease;
}
.nav-agente svg {
  width: 23px; height: 23px; stroke: currentColor; fill: none; stroke-width: 2.1;
}
.nav-agente:hover {
  transform: translateY(-6px) scale(1.06);
  box-shadow: 0 14px 30px color-mix(in srgb, var(--carrera) 55%, transparent),
              inset 0 1px 0 rgba(255,255,255,.35);
}
.nav-agente:active { transform: translateY(-2px) scale(.97); }
/* El resplandor de atrás. Sin esto es un botón naranja más y no se
   despega del dock. */
.nav-agente::before {
  content: ''; position: absolute; inset: -3px; border-radius: 20px; z-index: -1;
  background: linear-gradient(135deg, #58c6d8, var(--carrera-2), #c96ab0);
  opacity: .55; filter: blur(5px);
}

/* ============================================================
   Novedades — la burbuja de abajo a la derecha

   Vive fuera de las pantallas y encima de todo. Se corre por encima
   del dock: en un celular el dock ocupa el centro de abajo y una
   burbuja ahí sería intocable.
   ============================================================ */
.novedades {
  position: fixed; right: 16px; z-index: 60;
  /* Los 26 son los mismos que el padding de abajo del body: el dock
     mide más que --alto-dock por su propio padding, y con menos la
     burbuja le toca la esquina. */
  bottom: calc(26px + var(--alto-dock) + var(--piso));
  display: flex; flex-direction: column; align-items: flex-end; gap: 10px;
}
@media (min-width: 861px) {
  /* En la compu el dock no llega hasta el borde: la burbuja baja a su
     altura y queda a la mano del mouse. */
  .novedades { bottom: calc(14px + var(--piso)); }
}

.nov-burbuja, .nov-tab {
  /* Sin esto el navegador interpreta el primer movimiento vertical como
     scroll de la página y nunca llega a nuestro `pointermove`: el
     arrastre se sentiría trabado o ni arrancaría en el celular. */
  touch-action: none;
}
/* Mientras se arrastra, sin transición: sigue al dedo en vez de venir
   detrás con el resorte de siempre, que se siente pegajoso. */
.novedades.nov-arrastrando .nov-burbuja,
.novedades.nov-arrastrando .nov-tab { transition: none; }

.nov-burbuja {
  position: relative; display: grid; place-items: center; cursor: pointer;
  width: 52px; height: 52px; border-radius: 50%; font-family: inherit;
  color: var(--texto);
  background: rgba(11,16,30,.86);
  backdrop-filter: blur(22px); -webkit-backdrop-filter: blur(22px);
  border: 1px solid var(--borde-alto);
  box-shadow: 0 14px 34px rgba(0,0,0,.55);
  transition: transform .3s var(--resorte), box-shadow .3s ease, border-color .3s ease;
}
.nov-burbuja:hover { transform: translateY(-4px) scale(1.05); }
.nov-burbuja svg { width: 22px; height: 22px; }
/* Sin nada nuevo la burbuja no se va: baja el contraste y nada más.
   El tamaño no se toca — el dedo tiene que encontrar siempre el mismo
   blanco, esté vacía o llena. */
.nov-burbuja.vacia { background: rgba(11,16,30,.72); border-color: var(--borde); }
.nov-burbuja.vacia svg { color: var(--tenue); }
.nov-burbuja.vacia:hover svg { color: var(--texto); }
/* Con algo sin ver, la burbuja toma el color de la carrera y late una
   sola vez: alcanza para que la veas sin que quede parpadeando. */
.nov-burbuja.con-novedad {
  border-color: color-mix(in srgb, var(--carrera) 55%, var(--borde));
  box-shadow: 0 14px 34px color-mix(in srgb, var(--carrera) 35%, transparent);
  animation: nov-latir .7s var(--resorte) 1;
}
.nov-burbuja.con-novedad svg { color: var(--carrera-2); }
@keyframes nov-latir {
  0% { transform: scale(1); } 45% { transform: scale(1.16); } 100% { transform: scale(1); }
}

.nov-globo {
  position: absolute; top: -3px; right: -3px; min-width: 21px; height: 21px;
  display: grid; place-items: center; padding: 0 5px;
  border-radius: 999px; font-size: .68rem; font-weight: 780;
  background: var(--carrera); color: var(--sobre-carrera);
  border: 2px solid var(--bg);
}

/* Lo que queda de la burbuja cuando la escondés (mantener apretado):
   bien chica y apagada — sacarla del medio es el punto — pero nunca
   invisible, porque un botón que desaparece del todo no se vuelve a
   encontrar. Sigue avisando con un puntito si hay algo sin ver. */
.nov-tab {
  position: relative; display: grid; place-items: center; cursor: pointer;
  width: 34px; height: 34px; border-radius: 50%; font-family: inherit;
  background: rgba(11,16,30,.6);
  backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px);
  border: 1px solid var(--borde);
  box-shadow: 0 10px 24px rgba(0,0,0,.4);
  opacity: .65;
  transition: opacity .2s ease, transform .3s var(--resorte);
}
.nov-tab:hover, .nov-tab:focus-visible { opacity: 1; transform: scale(1.08); }
.nov-tab.con-novedad {
  opacity: 1;
  border-color: color-mix(in srgb, var(--carrera) 55%, var(--borde));
  box-shadow: 0 10px 24px color-mix(in srgb, var(--carrera) 35%, transparent);
}
.nov-punto { width: 9px; height: 9px; border-radius: 50%; background: var(--carrera-2); }
.nov-girando-chico { width: 15px; height: 15px; }

/* Mientras revisa Autogestión. Sin texto: no es una tarea tuya. */
.nov-girando {
  width: 19px; height: 19px; border-radius: 50%;
  border: 2px solid color-mix(in srgb, var(--carrera) 30%, transparent);
  border-top-color: var(--carrera-2);
  animation: nov-girar .8s linear infinite;
}
@keyframes nov-girar { to { transform: rotate(360deg); } }

/* Mientras baja algo en segundo plano. Va arriba de la burbuja, en la
   misma columna: la burbuja está en todas las pantallas, así que te
   podés ir a donde quieras y seguir viendo por dónde va. Tocándola se
   abre el modal de Traer, que es donde está el detalle. */
.nov-progreso {
  width: min(250px, calc(100vw - 32px));
  display: flex; flex-direction: column; gap: 7px; cursor: pointer;
  padding: 10px 13px 11px; border-radius: 15px;
  font-family: inherit; text-align: left; color: var(--texto);
  background: rgba(11,16,30,.9);
  backdrop-filter: blur(22px); -webkit-backdrop-filter: blur(22px);
  border: 1px solid var(--borde-alto);
  box-shadow: 0 14px 34px rgba(0,0,0,.5);
  animation: nov-entrar .3s var(--resorte);
}
.nov-progreso-fila { display: flex; align-items: center; gap: 9px; }
.nov-progreso .nov-girando { width: 14px; height: 14px; flex: 0 0 auto; }
.nov-progreso-tit {
  font-size: .77rem; font-weight: 700;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nov-progreso-det {
  font-size: .68rem; color: var(--debil);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nov-barra {
  height: 3px; border-radius: 999px; overflow: hidden;
  background: color-mix(in srgb, var(--carrera) 20%, transparent);
}
.nov-barra i {
  display: block; height: 100%; border-radius: 999px;
  background: var(--carrera-2); transition: width .35s ease;
}

.nov-panel {
  width: min(360px, calc(100vw - 32px));
  max-height: min(60dvh, 460px);
  display: flex; flex-direction: column; overflow: hidden;
  border-radius: var(--r); border: 1px solid var(--borde-alto);
  background: rgba(11,16,30,.92);
  backdrop-filter: blur(28px); -webkit-backdrop-filter: blur(28px);
  box-shadow: 0 24px 60px rgba(0,0,0,.7);
  animation: nov-entrar .22s var(--resorte);
}
@keyframes nov-entrar {
  from { opacity: 0; transform: translateY(10px) scale(.97); }
}
.nov-cab {
  display: flex; align-items: center; gap: 10px; flex: 0 0 auto;
  padding: 14px 16px; border-bottom: 1px solid var(--borde);
}
.nov-cab h2 { font-size: .95rem; font-weight: 740; }
.nov-cuando { font-size: .7rem; color: var(--debil); margin-left: auto; }
.nov-cerrar {
  width: 26px; height: 26px; border-radius: 50%; cursor: pointer; flex: 0 0 auto;
  background: var(--vidrio); border: 1px solid var(--borde);
  color: var(--tenue); font-family: inherit; font-size: .8rem;
}
.nov-cerrar:hover { color: var(--texto); background: var(--vidrio-alto); }

.nov-lista { flex: 1; min-height: 0; overflow-y: auto; scrollbar-width: thin; padding: 8px; }
.nov-vacio { font-size: .82rem; color: var(--debil); line-height: 1.5; padding: 14px 10px; }

.nov-item {
  display: flex; align-items: flex-start; gap: 11px; width: 100%; cursor: pointer;
  text-align: left; font-family: inherit; padding: 11px 12px; margin-bottom: 3px;
  border-radius: var(--r-sm); border: 1px solid transparent;
  background: transparent; color: var(--texto);
  transition: background .18s ease, transform .18s var(--resorte);
}
.nov-item:hover { background: var(--vidrio); transform: translateX(2px); }
/* Lo que no viste queda con el punto de color; lo leído se apaga pero
   no se va: a veces querés volver a mirarlo. */
.nov-item.nueva { background: color-mix(in srgb, var(--m) 10%, transparent); }
.nov-item:not(.nueva) { opacity: .62; }
.nov-ico {
  flex: 0 0 auto; width: 30px; height: 30px; border-radius: 10px;
  display: grid; place-items: center; color: var(--m);
  background: color-mix(in srgb, var(--m) 15%, transparent);
  border: 1px solid color-mix(in srgb, var(--m) 30%, transparent);
}
.nov-ico svg { width: 15px; height: 15px; }
.nov-cuerpo { min-width: 0; flex: 1; }
.nov-tit { display: block; font-size: .83rem; font-weight: 700; }
.nov-det { display: block; font-size: .77rem; color: var(--tenue); line-height: 1.45; margin-top: 2px; }
.nov-hora { flex: 0 0 auto; font-size: .68rem; color: var(--debil); }

.nov-pie { flex: 0 0 auto; padding: 9px 12px; border-top: 1px solid var(--borde); text-align: right; }
.nov-limpiar {
  cursor: pointer; font-family: inherit; font-size: .76rem; font-weight: 640;
  color: var(--tenue); background: none; border: 0; padding: 4px 6px;
}
.nov-limpiar:hover { color: var(--texto); }

/* La tarjeta de nota nueva, arriba de todo en Hoy. */
.nota-nueva {
  position: relative; overflow: hidden; margin-bottom: 16px;
  border-radius: var(--r); padding: 16px 18px;
  border: 1px solid color-mix(in srgb, var(--carrera) 38%, var(--borde));
  background:
    radial-gradient(120% 150% at 0% 0%, color-mix(in srgb, var(--carrera) 20%, transparent) 0%, transparent 60%),
    var(--vidrio);
}
.nota-nueva-cab {
  display: flex; align-items: center; gap: 9px;
  font-size: .88rem; font-weight: 740; margin-bottom: 11px;
}
.nota-nueva-punto {
  width: 8px; height: 8px; border-radius: 50%; background: var(--carrera-2);
  box-shadow: 0 0 12px var(--carrera-2);
}
.nota-nueva-lista { list-style: none; display: flex; flex-direction: column; gap: 6px; }
.nota-nueva-lista li {
  position: relative; padding-left: 14px; font-size: .87rem; color: var(--tenue); line-height: 1.5;
}
.nota-nueva-lista li::before {
  content: ''; position: absolute; left: 0; top: .55em;
  width: 6px; height: 6px; border-radius: 50%; background: var(--m);
}
.nota-nueva-pie { display: flex; gap: 8px; margin-top: 14px; flex-wrap: wrap; }

/* --- El parcial que se viene ------------------------------- */
/* Todo esto vive DENTRO de .tarjeta.destacado, que ya pone la franja, el
   título, la fecha y la insignia de días. Acá abajo va sólo el cruce:
   qué entra, quién lo dijo y qué de eso no te sale. */

/* Las pestañas de los próximos parciales. Sin contenedor con scroll a
   propósito: `overflow-x: auto` recorta el halo en cuadrado, y escribir
   `overflow-y: visible` no salva porque el navegador lo computa `auto`
   igual. Con dos o tres entran; si fueran más, se envuelven. */
.par-tabs { display: flex; flex-wrap: wrap; gap: 6px; margin: 12px 0 14px; }
.par-tab {
  font: inherit; cursor: pointer; font-size: .79rem; font-weight: 600;
  border-radius: 999px; padding: 5px 12px;
  background: transparent; border: 1px solid var(--borde); color: var(--tenue);
  display: inline-flex; align-items: center; gap: 7px;
  transition: border-color .18s, color .18s, background .18s;
}
.par-tab:hover { color: var(--texto); }
.par-tab[aria-selected="true"] {
  background: color-mix(in srgb, var(--m) 14%, transparent);
  border-color: color-mix(in srgb, var(--m) 45%, transparent);
  color: var(--texto);
}
.par-tab i { width: 7px; height: 7px; border-radius: 50%; background: var(--m); flex: none; }

/* El sello de dónde salió el alcance. SIN colores de semáforo: la
   insignia de días ya usa verde/ámbar/rojo para urgencia, y dos
   semáforos con significados distintos en la misma tarjeta hacen que
   ninguno signifique nada. Acá la palabra carga el sentido. */
.par-sello {
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
  font-size: .72rem; letter-spacing: .1em; text-transform: uppercase;
  font-weight: 700; color: var(--texto);
  margin-top: 14px; padding-bottom: 9px; margin-bottom: 11px;
  border-bottom: 1px solid var(--borde);
}
.par-sello span {
  text-transform: none; letter-spacing: 0; font-weight: 500;
  font-size: .78rem; color: var(--debil);
}
.par-sello.sin { color: var(--debil); }

.par-cita {
  font-size: .91rem; line-height: 1.6; color: var(--texto);
  border-left: 2px solid color-mix(in srgb, var(--mat) 55%, transparent);
  padding-left: 12px; margin-bottom: 14px;
}
.par-clases { list-style: none; display: flex; flex-direction: column; gap: 6px; margin-bottom: 14px; }
.par-clases li {
  position: relative; padding-left: 15px; font-size: .87rem;
  color: var(--tenue); line-height: 1.5;
}
.par-clases li::before {
  content: ''; position: absolute; left: 0; top: .58em;
  width: 5px; height: 5px; border-radius: 50%; background: var(--mat); opacity: .65;
}
.par-clases li b { color: var(--texto); font-weight: 600; }
.par-clases-modal { max-height: none; margin-top: 14px; }
.par-clases-modal li.es-examen b { color: var(--carrera-2); }

.par-mini { font-size: .78rem; color: var(--debil); }
.par-aclara { margin: -8px 0 14px; }
.par-rot { font-size: .86rem; color: var(--tenue); margin-bottom: 8px; }
.par-rot b { color: var(--texto); }
.par-flojos { display: flex; flex-wrap: wrap; gap: 7px; }
.par-nodo {
  font-size: .82rem; border-radius: 999px; padding: 4px 11px;
  background: color-mix(in srgb, var(--riesgo) 13%, transparent);
  border: 1px solid color-mix(in srgb, var(--riesgo) 32%, transparent);
  color: color-mix(in srgb, var(--riesgo) 68%, var(--texto));
}

/* Que la cátedra no cargue el temario no es una falla de la app. Sin
   explicar qué es el temario, ese estado se lee como que algo se rompió
   — y nadie sabe que esa página de Autogestión existe. */
.par-explica {
  font-size: .87rem; color: var(--tenue); line-height: 1.6;
  background: color-mix(in srgb, var(--media) 7%, transparent);
  border: 1px solid color-mix(in srgb, var(--media) 22%, transparent);
  border-radius: var(--r-sm); padding: 12px 14px; margin-bottom: 14px;
}
.par-explica b { color: var(--texto); }
.par-barra {
  height: 5px; border-radius: 999px; background: var(--borde);
  overflow: hidden; margin: 10px 0 7px;
}
.par-barra i { display: block; height: 100%; background: var(--media); border-radius: 999px; }

/* --- Aviso ------------------------------------------------- */
.aviso {
  display: flex; gap: 11px; align-items: flex-start;
  border-radius: var(--r-sm); padding: 13px 15px; font-size: .89rem;
  background: color-mix(in srgb, var(--tono, var(--media)) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--tono, var(--media)) 30%, transparent);
}
.aviso b { color: var(--tono, var(--media)); flex-shrink: 0; }
.aviso[data-tono="ok"] { --tono: var(--ok); }

/* --- Toast ------------------------------------------------- */
.toast {
  position: fixed; z-index: 80; left: 50%; transform: translateX(-50%);
  bottom: calc(var(--alto-dock) + 24px + var(--piso));
  padding: 12px 20px; border-radius: 20px;
  background: rgba(255,255,255,.95); color: #0a0d16;
  font-size: .86rem; font-weight: 680;
  box-shadow: 0 14px 40px rgba(0,0,0,.6);
  animation: sube .25s var(--resorte);
}
@keyframes sube { from { opacity: 0; transform: translate(-50%, 14px); } }

/* Se puede tocar para sacarlo, así que se ve que se puede tocar. */
.toast { display: flex; align-items: center; gap: 14px; cursor: pointer;
  width: max-content; max-width: min(520px, calc(100vw - 32px)); }
/* Antes iba en una sola línea con puntos suspensivos: en el celular,
   cualquier cartel que dijera algo (el de la condición de una materia,
   por ejemplo) se cortaba a la mitad y no había forma de leer el
   final. Ahora baja de renglón — por eso el borde dejó de ser píldora:
   con dos líneas, una curva de 999px se come las esquinas del texto. */
.toast > span { line-height: 1.4; overflow-wrap: anywhere; text-align: center; }
.toast-deshacer {
  flex-shrink: 0; padding: 5px 13px; border-radius: 999px;
  font-size: .79rem; font-weight: 730; letter-spacing: -.01em;
  color: #fff; background: #0a0d16;
  transition: transform .25s var(--resorte), filter .2s;
}
.toast-deshacer:hover { filter: brightness(1.5); }
.toast-deshacer:active { transform: scale(.94); }

/* La flecha del acceso directo: mismo gris apagado que el resto del
   cartel, para no competir con el botón Deshacer, que es el que de
   verdad tiene urgencia. */
.toast-flecha { flex-shrink: 0; color: #0a0d16; opacity: .38; font-size: 1.05rem; font-weight: 800; }
.toast-clic:hover .toast-flecha { opacity: .7; }

/* --- Mapa de correlativas ---------------------------------- */
.mapa-caja {
  background: var(--vidrio); backdrop-filter: blur(28px);
  border: 1px solid var(--borde); border-radius: var(--r);
  overflow: hidden;
  box-shadow: 0 20px 50px -22px rgba(0,0,0,.75), inset 0 1px 0 rgba(255,255,255,.09);
}
.mapa-barra {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; padding: 14px 16px;
  border-bottom: 1px solid rgba(255,255,255,.07);
}
.mapa-leyenda { display: flex; gap: 14px; flex-wrap: wrap; font-size: .78rem; color: var(--tenue); }
.mapa-leyenda span { display: inline-flex; align-items: center; gap: 6px; }
.mapa-leyenda i { width: 9px; height: 9px; border-radius: 3px; display: block; }
.l-apr { background: var(--ok); }
.l-cur { background: var(--carrera); }
.l-hab { background: var(--media); }
.l-blo { background: #39414f; }
.mapa-zoom { display: flex; gap: 6px; flex-wrap: wrap; }
.mapa-zoom .btn { min-width: 38px; }
.mapa-zoom [data-electivas][aria-pressed="true"] {
  background: color-mix(in srgb, var(--carrera) 11%, transparent);
  border-color: color-mix(in srgb, var(--carrera) 45%, transparent);
  color: var(--carrera-2);
}

.pista-avance { height: 5px; background: rgba(255,255,255,.06); display: flex; }
.pista-avance i { display: block; height: 100%; transition: width 1s var(--resorte); }

.mapa-lienzo {
  position: relative; height: 62vh; min-height: 340px; max-height: 640px;
  overflow: hidden; cursor: grab; touch-action: none;
  /* Arrastrar el mapa hacia abajo no tiene que recargar la página ni
     mover la pantalla de atrás: el gesto es del mapa. */
  overscroll-behavior: contain;
  background:
    radial-gradient(circle at 1px 1px, rgba(255,255,255,.06) 1px, transparent 0) 0 0 / 26px 26px;
}
.mapa-lienzo.agarrando { cursor: grabbing; }
/* El `svg { max-width: 100% }` de la base achicaba el mapa de 1086 px
   a los 337 de un celular y lo dibujaba al 31% adentro de una caja con
   bandas vacías arriba y abajo: las fichas quedaban de 44×9 px y el
   zoom mentía, porque toda la cuenta de arrastre usa el ancho real.
   Acá el tamaño lo manda el transform, no el contenedor. */
.mapa-lienzo .mapa {
  transform-origin: 0 0; will-change: transform;
  max-width: none;
}

.mapa-nivel { fill: var(--debil); font-size: 10.5px; font-weight: 800; letter-spacing: 1.4px; }

.arista { stroke: #232a38; stroke-width: 1.4; fill: none; transition: stroke .25s, stroke-width .25s, opacity .25s; }
.arista.viva { stroke: var(--media); stroke-width: 2.2; filter: none; }
.arista.apagada { opacity: .12; }

.nodo { cursor: pointer; }
.nodo rect { stroke-width: 1.3; transition: opacity .25s; }
.nodo text { font-size: 11.5px; font-weight: 600; fill: var(--texto); pointer-events: none; letter-spacing: -.01em; }
.nodo .cod { font-size: 9.5px; font-weight: 800; fill: rgba(255,255,255,.45); }
.nodo.apagado { opacity: .15; }
.nodo.elegido rect { stroke-width: 2.4; }
/* La materia fijada con un toque se marca más fuerte que la que
   sólo estás mirando de paso. */
.mapa.con-eleccion .nodo.elegido rect {
  stroke: #fff; stroke-width: 2.6;
  filter: drop-shadow(0 0 5px rgba(255,255,255,.3));
}

.n-apr rect { fill: rgba(50,215,75,.16);  stroke: rgba(50,215,75,.5); }
.n-apr text { fill: #b9f5c4; }
.n-cur rect { fill: color-mix(in srgb, var(--carrera) 20%, transparent); stroke: color-mix(in srgb, var(--carrera) 60%, transparent); }
.n-cur text { fill: #ffd9c2; }
.n-hab rect { fill: rgba(255,214,10,.14); stroke: rgba(255,214,10,.6); }
.n-hab text { fill: #ffeC9b; }
.n-blo rect { fill: #131926; stroke: #29313f; }
.n-blo text { fill: #79839a; }
.pulso { animation: latido 2.4s ease-in-out infinite; }
@keyframes latido {
  0%, 100% { opacity: .82; }
  50%      { opacity: 1; }
}

.mapa-ayuda {
  font-size: .74rem; color: var(--debil); text-align: center;
  padding: 10px; border-top: 1px solid rgba(255,255,255,.07);
}
.mapa-ayuda kbd {
  font-family: ui-monospace, monospace; font-size: .68rem;
  background: rgba(255,255,255,.09); border: 1px solid var(--borde);
  padding: 1px 5px; border-radius: 5px;
}
/* La ayuda es distinta con dedo que con mouse: en un celular no hay
   rueda ni Ctrl, y leer "Ctrl + rueda" ahí es ruido. */
.mapa-ayuda .ayuda-dedo { display: none; }
@media (hover: none) {
  .mapa-ayuda .ayuda-mouse { display: none; }
  .mapa-ayuda .ayuda-dedo  { display: inline; }
  /* 38 px es el mínimo cómodo para un mouse, no para un pulgar. */
  .mapa-zoom .btn { min-width: 46px; min-height: 42px; }
  .mapa-barra { padding: 12px; }
}
.mapa-panel {
  margin-top: 13px; min-height: 150px;
  /* Al elegir una materia el panel se trae a la vista solo. Sin estos
     márgenes de scroll queda pegado abajo de la cabecera o tapado por
     el dock. */
  scroll-margin-top: calc(var(--alto-cab) + var(--cielo) + 10px);
  scroll-margin-bottom: calc(var(--alto-dock) + 26px + var(--piso));
}

/* --- Modo enfoque ------------------------------------------ */
.enfoque-grilla { display: grid; gap: 13px; grid-template-columns: 1fr; align-items: start; }
@media (min-width: 900px) {
  .enfoque-grilla { grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); }
}

.titulo-chico { font-size: 1rem; font-weight: 660; letter-spacing: -.015em; }

.reloj-caja { padding: 26px 20px 22px; text-align: center; border-radius: var(--r-lg); }

.reloj-aro { position: relative; width: 236px; max-width: 78vw; margin: 0 auto 4px; }
.reloj-aro svg { width: 100%; height: auto; display: block; transform: rotate(-90deg); }
.reloj-aro circle { fill: none; stroke-width: 9; stroke-linecap: round; }
.reloj-aro .fondo { stroke: rgba(255,255,255,.07); }
.reloj-aro .valor {
  stroke: var(--mat);
  transition: stroke-dashoffset .3s linear, stroke .4s;
}
/* Sólo cuando corre se enciende: en pausa el aro queda apagado y
   se nota de un vistazo, sin leer nada. */
.reloj-caja.corriendo .reloj-aro svg {
  filter: drop-shadow(0 0 9px color-mix(in srgb, var(--mat) 32%, transparent));
}

.reloj-centro {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
}
.reloj-fase {
  font-size: .7rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  color: var(--mat);
}
.reloj-centro b {
  font-size: clamp(2.5rem, 13vw, 3.2rem); font-weight: 750;
  letter-spacing: -.045em; line-height: 1;
}
.reloj-ciclo { font-size: .74rem; color: var(--debil); }

.reloj-materia {
  margin-top: 10px; font-size: .92rem; font-weight: 570; color: var(--tenue);
}
.reloj-botones { display: flex; gap: 9px; justify-content: center; flex-wrap: wrap; margin-top: 18px; }
.reloj-botones .btn { min-width: 104px; }
/* En celular los tres entran en una fila repartiéndose el ancho. */
@media (max-width: 480px) {
  .reloj-botones .btn { flex: 1; min-width: 0; padding: 11px 8px; }
}

/* --- Sonidos ----------------------------------------------- */
.sonidos { display: grid; grid-template-columns: repeat(2, 1fr); gap: 9px; }
.sonido {
  display: flex; align-items: center; gap: 10px;
  padding: 13px 14px; border-radius: var(--r-sm);
  background: var(--vidrio); border: 1px solid var(--borde);
  color: var(--tenue); font-size: .85rem; font-weight: 570; text-align: left;
  transition: transform .25s var(--resorte), background .25s, border-color .25s, color .25s;
}
.sonido:hover { transform: translateY(-2px); color: var(--texto); border-color: var(--borde-alto); }
.sonido-ico { font-size: 1.15rem; line-height: 1; }
.sonido[aria-pressed="true"] {
  color: var(--texto);
  background: color-mix(in srgb, var(--carrera) 13%, transparent);
  border-color: color-mix(in srgb, var(--carrera) 42%, transparent);
}
/* Late mientras suena: es la única señal de que está prendido si
   tenés el volumen bajo. */
.sonido[aria-pressed="true"] .sonido-ico { animation: latido 2.4s ease-in-out infinite; }

.volumen {
  -webkit-appearance: none; appearance: none;
  width: 100%; height: 6px; border-radius: 999px;
  background: rgba(255,255,255,.11); outline: none;
}
.volumen::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none;
  width: 19px; height: 19px; border-radius: 50%; cursor: pointer;
  background: var(--carrera-2);
  box-shadow: 0 0 0 1px rgba(0,0,0,.35), 0 0 12px color-mix(in srgb, var(--carrera) 45%, transparent);
}
.volumen::-moz-range-thumb {
  width: 19px; height: 19px; border: none; border-radius: 50%; cursor: pointer;
  background: var(--carrera-2);
}

/* --- Métricas chicas (3 en fila, también en celular) -------- */
.metricas-3 { grid-template-columns: repeat(3, 1fr); }
.metrica.chica { padding: 15px 10px; }
.metrica.chica b {
  display: block; font-size: 1.16rem; font-weight: 750;
  letter-spacing: -.03em; color: var(--mat); margin-bottom: 3px;
}

/* --- Presupuesto de faltas ---------------------------------
   La barra tiene el futuro adentro: sólido lo que ya gastaste,
   rayado a dónde vas a llegar, una línea blanca en el tope. */
.faltas-pista {
  position: relative; height: 15px; border-radius: 999px;
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.07);
  overflow: hidden;
}
.faltas-usado {
  position: absolute; left: 0; top: 0; bottom: 0; border-radius: 999px;
  background: var(--tono); box-shadow: 0 0 14px color-mix(in srgb, var(--tono) 45%, transparent);
  transition: width .8s var(--resorte);
}
/* Rayado = proyección. Tiene que leerse distinto de lo que ya pasó. */
.faltas-proyectado {
  position: absolute; top: 0; bottom: 0; border-radius: 0 999px 999px 0;
  background: repeating-linear-gradient(115deg,
    color-mix(in srgb, var(--tono) 42%, transparent) 0 5px,
    transparent 5px 11px);
  transition: left .8s var(--resorte), width .8s var(--resorte);
}
.faltas-tope {
  position: absolute; top: -3px; bottom: -3px; width: 2px;
  background: var(--texto); box-shadow: 0 0 8px rgba(255,255,255,.5);
  transition: left .8s var(--resorte);
}

.faltas-leyenda {
  display: flex; flex-wrap: wrap; gap: 14px; margin-top: 10px;
  font-size: .74rem; color: var(--debil);
}
.faltas-leyenda span { display: inline-flex; align-items: center; gap: 6px; }
.faltas-llave { width: 15px; height: 9px; border-radius: 3px; flex-shrink: 0; }
.faltas-llave.solido { background: var(--tenue); }
.faltas-llave.rayado { background: repeating-linear-gradient(115deg, var(--tenue) 0 4px, transparent 4px 8px); }
.faltas-llave.linea  { width: 2px; height: 13px; border-radius: 0; background: var(--texto); }

.faltas-titular {
  font-size: 1.02rem; font-weight: 680; letter-spacing: -.015em; margin-top: 16px;
}
.faltas-titular[data-estado="ok"]      { color: color-mix(in srgb, var(--ok) 82%, #fff); }
.faltas-titular[data-estado="cerrado"] { color: color-mix(in srgb, var(--ok) 82%, #fff); }
.faltas-titular[data-estado="media"]   { color: color-mix(in srgb, var(--media) 88%, #fff); }
.faltas-titular[data-estado="riesgo"]  { color: color-mix(in srgb, var(--riesgo) 85%, #fff); }
.faltas-titular[data-estado="libre"]   { color: color-mix(in srgb, var(--riesgo) 85%, #fff); }
.faltas-sub { color: var(--tenue); font-size: .88rem; margin-top: 5px; }

.faltas-cifras { display: grid; grid-template-columns: repeat(3, 1fr); gap: 9px; margin-top: 16px; }
.faltas-cifra {
  background: rgba(255,255,255,.045); border: 1px solid var(--borde);
  border-radius: var(--r-sm); padding: 10px 11px;
}
.faltas-cifra b {
  display: block; font-size: 1.12rem; font-weight: 740; letter-spacing: -.03em;
}
.faltas-cifra span { font-size: .71rem; color: var(--debil); }

/* El aviso de Hoy se tiñe del estado, no de la materia: si está en
   rojo tiene que gritar rojo aunque la materia sea verde. */
.faltas-aviso { margin-bottom: 16px; border-color: color-mix(in srgb, var(--tono) 26%, var(--borde)); }
.faltas-aviso .franja { background: var(--tono); box-shadow: 0 0 14px color-mix(in srgb, var(--tono) 40%, transparent); }
.faltas-aviso[data-estado="riesgo"], .faltas-aviso[data-estado="libre"] {
  background: color-mix(in srgb, var(--riesgo) 7%, var(--vidrio));
}

/* --- Elegir materia (reemplaza al <select> nativo) ----------
   El select del sistema abre una rueda gris que no tiene nada que
   ver con la app y no deja ver de qué materia se trata. Acá cada
   materia es una ficha con su color, que es como ya las reconocés
   en el resto de las pantallas. */
.picker { display: flex; flex-direction: column; gap: 9px; }
.picker-buscar { padding: 9px 13px; font-size: .87rem; }

/* overflow-y: auto obliga al navegador a poner overflow-x en auto
   también, así que esta caja recorta por los CUATRO lados. Sin el
   padding del halo, el resplandor de la ficha elegida se cortaba en
   cuadrado — que era justo lo que se veía mal. */
.picker-chips {
  display: flex; flex-wrap: wrap; gap: 7px;
  max-height: calc(190px + var(--halo) * 2); overflow-y: auto;
  padding: var(--halo); margin: calc(var(--halo) * -1);
  scrollbar-width: thin;
}

.chip-mat {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 8px 14px 8px 11px; border-radius: 999px;
  font-size: .83rem; font-weight: 600; line-height: 1.2;
  color: var(--tenue);
  background: rgba(255,255,255,.05);
  border: 1px solid var(--borde);
  transition: transform .25s var(--resorte), background .2s, border-color .2s, color .2s;
  max-width: 100%;
}
.chip-mat > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chip-punto {
  width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0;
  background: var(--mat); transition: box-shadow .25s, transform .25s var(--resorte);
}
.chip-mat[data-sin-color] .chip-punto { background: none; border: 1.5px dashed var(--debil); }

.chip-mat:hover { background: rgba(255,255,255,.09); border-color: var(--borde-alto); color: var(--texto); }
.chip-mat:active { transform: scale(.96); }

.chip-mat[aria-pressed="true"] {
  color: var(--texto);
  background: color-mix(in srgb, var(--mat) 17%, transparent);
  border-color: color-mix(in srgb, var(--mat) 45%, transparent);
  box-shadow: 0 0 18px -4px color-mix(in srgb, var(--mat) 40%, transparent);
}
.chip-mat[aria-pressed="true"] .chip-punto {
  transform: scale(1.25);
  box-shadow: 0 0 9px color-mix(in srgb, var(--mat) 75%, transparent);
}
.chip-mat[hidden] { display: none; }

/* "+ 42 más": tiene que estar, pero no competir con las materias.
   Sin punto de color, con el borde punteado de lo que todavía no
   está desplegado. */
.chip-mas {
  display: inline-flex; align-items: center;
  padding: 8px 14px; border-radius: 999px;
  font-size: .79rem; font-weight: 600; color: var(--debil);
  background: none; border: 1px dashed var(--borde-alto);
  transition: color .2s, border-color .2s, background .2s;
}
.chip-mas:hover { color: var(--texto); border-color: var(--tenue); background: rgba(255,255,255,.05); }
.chip-mas[hidden] { display: none; }

/* --- Interruptor --------------------------------------------
   El checkbox nativo es chico para el dedo y no se puede pintar. */
.interruptor {
  display: flex; align-items: center; gap: 12px; cursor: pointer;
  padding: 12px 14px; border-radius: var(--r-sm);
  background: rgba(255,255,255,.045); border: 1px solid var(--borde);
  transition: background .2s, border-color .2s;
}
.interruptor:hover { background: rgba(255,255,255,.075); border-color: var(--borde-alto); }
.interruptor input { position: absolute; opacity: 0; width: 0; height: 0; }

.interruptor-pista {
  position: relative; width: 44px; height: 25px; border-radius: 999px; flex-shrink: 0;
  background: rgba(255,255,255,.10); border: 1px solid var(--borde);
  transition: background .28s, border-color .28s;
}
.interruptor-pista > i {
  position: absolute; top: 2px; left: 2px; width: 19px; height: 19px;
  border-radius: 50%; background: var(--debil);
  transition: transform .28s var(--resorte), background .28s;
}
.interruptor input:checked + .interruptor-pista {
  background: color-mix(in srgb, var(--carrera) 34%, transparent);
  border-color: color-mix(in srgb, var(--carrera) 55%, transparent);
}
.interruptor input:checked + .interruptor-pista > i {
  transform: translateX(19px);
  background: var(--carrera-2);
  box-shadow: 0 0 10px color-mix(in srgb, var(--carrera) 60%, transparent);
}
.interruptor input:focus-visible + .interruptor-pista {
  outline: 2px solid var(--carrera-2); outline-offset: 2px;
}
.interruptor-txt { display: block; font-size: .89rem; font-weight: 600; }
.interruptor-ayuda { display: block; font-size: .77rem; color: var(--debil); margin-top: 2px; }

/* --- Notas ---------------------------------------------------- */
.nota-caja { display: flex; flex-direction: column; gap: 10px; }
.nota-pie { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.nota-pie .crece { font-size: .76rem; color: var(--debil); }

/* La tarjeta de la lista. Es un <button> entero: no lleva botoncitos
   adentro porque en el celular ✎ y ✕ pegados son una nota borrada sin
   querer. Editar y borrar viven adentro de la hoja. */
/* Singular a propósito: `.notas-grilla` ya es la de las burbujas de
   calificación. En esta app "notas" son dos cosas distintas y las dos
   tienen grilla. */
.nota-grilla { display: grid; gap: 11px; grid-template-columns: 1fr; }
@media (min-width: 760px) { .nota-grilla { grid-template-columns: repeat(2, 1fr); } }

.nota-tar {
  display: block; width: 100%; text-align: left; cursor: pointer;
  padding: 14px 15px 12px; border-radius: var(--r-sm);
  background: rgba(255,255,255,.045); border: 1px solid var(--borde);
  border-left: 3px solid var(--mat, var(--inerte));
  transition: transform .28s var(--resorte), background .22s, border-color .22s;
}
.nota-tar:hover { background: rgba(255,255,255,.075); transform: translateY(-2px); }
/* Importante: mismo lavado de --carrera que las tareas, no un color
   de semáforo. El borde de la izquierda sigue siendo el de la
   materia (--mat). */
.nota-tar.importante {
  background: color-mix(in srgb, var(--carrera) 7%, rgba(255,255,255,.045));
  border-color: color-mix(in srgb, var(--carrera) 30%, var(--borde));
}

/* El envoltorio existe sólo para poder poner el asa AFUERA de la
   tarjeta (que es el data-accion que la abre): un botón no puede ir
   adentro de otro botón. */
.nota-tar-envoltorio { position: relative; }
.nota-asa {
  position: absolute; top: 8px; right: 8px; z-index: 2;
  background: color-mix(in srgb, var(--vidrio-hondo) 85%, transparent);
  border-radius: 8px;
}
.nota-tar-envoltorio.arrastrando {
  position: fixed; z-index: 60; pointer-events: none; margin: 0;
}
.nota-tar-envoltorio.arrastrando .nota-tar {
  box-shadow: 0 28px 60px -18px rgba(0,0,0,.9), inset 0 1px 0 rgba(255,255,255,.12);
  transform: scale(1.02) rotate(-.3deg);
}
.nota-tit {
  display: flex; align-items: center; gap: 7px;
  font-size: .95rem; font-weight: 660; letter-spacing: -.01em;
  overflow-wrap: anywhere;
}
.nota-chinche { font-size: .8rem; flex-shrink: 0; }
.nota-prev {
  margin-top: 7px; display: flex; flex-direction: column; gap: 3px;
  font-size: .81rem; color: var(--tenue);
}
.nota-prev .ln { display: flex; gap: 7px; align-items: baseline; overflow-wrap: anywhere; }
.nota-prev .ln.tachada { color: var(--debil); text-decoration: line-through; }
.nota-prev .mrc { color: var(--debil); flex-shrink: 0; font-size: .78em; }
.nota-prev .ln.tachada .mrc { color: var(--ok); text-decoration: none; }
.nota-tar-pie {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 11px; font-size: .72rem; color: var(--debil);
}

/* Cuántos ítems te faltan, sin abrir la nota. */
.avance { display: inline-flex; align-items: center; gap: 6px; }
.avance-riel {
  width: 42px; height: 4px; border-radius: 999px;
  background: rgba(255,255,255,.1); overflow: hidden;
}
.avance-riel i { display: block; height: 100%; border-radius: 999px; background: var(--ok); }

/* --- La hoja: una nota abierta -------------------------------- */
/* Va sobre un .velo, o sea fuera del árbol de la vista: un
   redibujado de la pantalla de atrás no se lleva lo que estás
   escribiendo. */
.velo-hoja { align-items: stretch; padding: 0; }
@media (min-width: 640px) { .velo-hoja { align-items: center; padding: 24px; } }

.hoja {
  display: flex; flex-direction: column;
  width: 100%; max-width: 620px; max-height: 100%;
  background: var(--vidrio-hondo); border: 1px solid var(--borde);
  border-radius: 0; overflow: hidden;
}
@media (min-width: 640px) { .hoja { border-radius: var(--r-lg); min-height: 460px; } }

.hoja-cab {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 10px 12px; border-bottom: 1px solid var(--borde);
  background: var(--vidrio); flex-shrink: 0;
  padding-top: max(10px, env(safe-area-inset-top));
}
/* Vidrio: fondo translúcido y borde finito, nada de emoji con color
   propio. Fijada se prende con el color de la carrera. */
.hoja-vidrio {
  width: 34px; height: 34px; border-radius: 11px;
  display: grid; place-items: center; font-size: .9rem;
  color: var(--tenue); background: rgba(255,255,255,.05);
  border: 1px solid var(--borde); backdrop-filter: blur(10px);
  transition: transform .25s var(--resorte), background .2s, color .2s, border-color .2s;
}
.hoja-vidrio:hover { background: rgba(255,255,255,.1); color: var(--texto); transform: translateY(-1px); }
.hoja-vidrio[aria-pressed="true"] {
  color: var(--carrera-2);
  background: color-mix(in srgb, var(--carrera) 14%, transparent);
  border-color: color-mix(in srgb, var(--carrera) 34%, transparent);
}

/* El canal de la barra de scroll se reserva SIEMPRE. Sin esto, el
   renglón que hace pasar el texto de "entra" a "no entra" mete y saca
   la barra, y con ella se corre todo el ancho mientras escribís.

   El padding horizontal es el del halo entero: el picker de materias
   usa `margin: calc(var(--halo) * -1)` y con 13px se salía 3px por el
   costado — eso era la barra horizontal de abajo. */
.hoja-cuerpo {
  padding: 14px var(--halo) 18px; flex: 1;
  overflow-y: auto; scrollbar-gutter: stable;
  overscroll-behavior: contain;
}

.rengs { display: flex; flex-direction: column; gap: 2px; }
/* El renglón donde está el cursor se marca con una barrita al
   costado, no pintándole el fondo: pintado parecía un campo de
   formulario y confundía sobre dónde se escribe.

   La barrita es el borde del propio renglón y no un ::before: el
   margen negativo lo absorbe el padding del halo que tiene
   .hoja-cuerpo, así que no asoma ni abre scroll horizontal. */
.reng {
  display: flex; align-items: flex-start; gap: 9px;
  padding: 3px 4px 3px 7px; margin-left: -9px;
  border-left: 2px solid transparent; transition: border-color .2s;
}
.reng:focus-within { border-left-color: var(--carrera-2); }

/* Una línea fina abajo del título: separa el nombre del cuerpo sin
   que haya que explicar nada. */
.reng.titulo { padding-bottom: 9px; margin-bottom: 6px; border-bottom: 1px solid var(--borde); }

/* Cada renglón es un textarea de una fila que crece si el texto
   envuelve. Nada de contenteditable: en el celular se pelea con el
   teclado predictivo, con pegar desde WhatsApp y con el cursor. */
.reng textarea {
  flex: 1; min-width: 0; resize: none; border: 0; background: none; padding: 0;
  color: var(--texto); font: inherit; font-size: .9rem; line-height: 1.55;
  overflow: hidden;
}
.reng textarea:focus { outline: none; }
.reng textarea::placeholder { color: var(--debil); }
.reng.titulo textarea { font-size: 1.18rem; font-weight: 700; letter-spacing: -.02em; line-height: 1.35; }
.reng.hecho textarea { color: var(--debil); text-decoration: line-through; }

.reng .tick {
  flex-shrink: 0; margin-top: 3px; width: 20px; height: 20px; border-radius: 6px;
  border: 1.5px solid var(--borde-alto); background: none;
  display: grid; place-items: center; font-size: .68rem; color: transparent;
  transition: transform .25s var(--resorte), background .2s, border-color .2s;
}
.reng .tick:hover { border-color: var(--ok); transform: scale(1.12); }
.reng.hecho .tick { background: var(--ok); border-color: var(--ok); color: #06110a; }
.reng .punto {
  flex-shrink: 0; margin-top: 9px; width: 5px; height: 5px;
  border-radius: 50%; background: var(--tenue);
}

/* El pie: la materia y el pase a la Agenda, guardados en dos
   renglones. Antes el picker estaba siempre abierto y se comía media
   pantalla, que es lo que dejaba la nota en scroll permanente. */
.hoja-pie { margin-top: 22px; padding-top: 6px; border-top: 1px solid var(--borde); }
.hoja-fila {
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
  padding: 11px 4px; border-radius: 10px; color: var(--tenue);
  border-bottom: 1px solid var(--borde); transition: background .2s, color .2s;
}
.hoja-fila:last-child { border-bottom: 0; }
.hoja-fila:hover { background: rgba(255,255,255,.04); color: var(--texto); }
.hoja-fila-rot { font-size: .79rem; color: var(--debil); flex-shrink: 0; min-width: 62px; }
.hoja-fila-val {
  display: flex; align-items: center; gap: 8px; margin-left: auto;
  font-size: .85rem; font-weight: 600; color: var(--texto);
  text-align: right; overflow-wrap: anywhere;
}
.hoja-punto {
  width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
  background: var(--mat, var(--inerte));
}
.hoja-fila-flecha { color: var(--debil); flex-shrink: 0; transition: transform .25s var(--resorte); }
.hoja-fila[aria-expanded="true"] .hoja-fila-flecha { transform: rotate(90deg); color: var(--carrera-2); }
.hoja-picker { padding: 4px 0 10px; }

/* La barra de herramientas queda pegada abajo, donde en el celular
   está el teclado. */
.herr {
  display: flex; gap: 5px; align-items: center; flex-shrink: 0;
  padding: 9px 11px; border-top: 1px solid var(--borde); background: var(--vidrio);
  padding-bottom: max(9px, env(safe-area-inset-bottom));
}
.herr button {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 8px 11px; min-height: 38px; border-radius: 9px;
  font-size: .82rem; font-weight: 620; color: var(--tenue);
  border: 1px solid transparent; background: none; transition: .2s;
}
.herr button:hover { background: var(--vidrio-alto); color: var(--texto); }
.herr-ico { font-size: .95rem; line-height: 1; }
/* Con nombre al lado, "☑" y "¶" dejan de ser adivinanza. En pantallas
   angostas quedan sólo los símbolos, que es donde no entran. */
@media (max-width: 400px) { .herr-txt { display: none; } }
.herr-sep { width: 1px; height: 18px; background: var(--borde); margin: 0 3px; }
.herr-cuenta { margin-left: auto; font-size: .73rem; color: var(--debil); }

/* --- Archivos ------------------------------------------------- */
.archivo {
  border-radius: var(--r-sm); padding: 11px 12px;
  background: rgba(255,255,255,.045); border: 1px solid var(--borde);
}
.archivo-fila { display: flex; align-items: center; gap: 11px; min-width: 0; }
.archivo-icono {
  width: 34px; height: 34px; border-radius: 10px; flex-shrink: 0;
  display: grid; place-items: center; font-size: 1.05rem;
  background: rgba(255,255,255,.06); border: 1px solid var(--borde);
}
.archivo-fila b {
  display: block; font-size: .84rem; font-weight: 640;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.archivo-fila span > span { display: block; font-size: .73rem; color: var(--debil); }
.archivo-botones { display: flex; gap: 7px; margin-top: 11px; }
.archivo-botones .btn { min-height: 36px; padding: 7px 12px; font-size: .8rem; }

/* El input de archivo nativo es una caja gris con un botón del
   sistema; al menos que respete el vidrio del resto. */
.archivo-input { padding: 9px 12px; font-size: .82rem; cursor: pointer; }
.archivo-input::file-selector-button {
  margin-right: 11px; padding: 6px 13px; border-radius: 999px;
  border: 1px solid var(--borde); background: rgba(255,255,255,.07);
  color: var(--texto); font-size: .8rem; font-weight: 620; cursor: pointer;
}
.archivo-input::file-selector-button:hover { background: rgba(255,255,255,.13); }

/* --- Buscador ------------------------------------------------- */
/* La lista de resultados también hace scroll: mismo tratamiento. */
.buscar-lista {
  max-height: 48vh; overflow-y: auto;
  padding: var(--halo); margin: calc(6px - var(--halo)) calc(var(--halo) * -1) calc(var(--halo) * -1);
}
.buscar-grupo { margin-top: 16px; }
.buscar-grupo:first-of-type { margin-top: 0; }
.buscar-rotulo {
  font-size: .69rem; font-weight: 740; letter-spacing: .1em; text-transform: uppercase;
  color: var(--debil); padding: 0 2px 7px;
}
.buscar-item[aria-selected="true"] {
  background: color-mix(in srgb, var(--mat) 16%, transparent);
  border-color: color-mix(in srgb, var(--mat) 40%, transparent);
}
.buscar-pista {
  display: flex; gap: 14px; flex-wrap: wrap; justify-content: center;
  margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--borde);
  font-size: .72rem; color: var(--debil);
}
.buscar-pista kbd {
  font-family: ui-monospace, monospace; font-size: .68rem;
  background: rgba(255,255,255,.09); border: 1px solid var(--borde);
  padding: 1px 5px; border-radius: 5px;
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

/* ============================================================
   El agente
   ============================================================ */
.ayuda { font-size: .84rem; color: var(--tenue); line-height: 1.55; margin-bottom: 4px; }

/* ------------------------------------------------------------
   La pantalla del agente: canales a la izquierda, conversación a
   la derecha. En el celular es una sola columna y la conversación
   se monta encima de la lista.
   ------------------------------------------------------------ */
/* Mientras el agente está abierto la página NO scrollea: scrollean la
   lista y el hilo, cada uno por su cuenta. Si scrollea la página, el
   dock flotante se te sube encima del campo de escribir justo cuando
   vas a mandar el mensaje. */
body.en-agente { padding-bottom: 0; overflow: hidden; }

/* La primera vez que se abre la app (o después de "Borrar todo"), la
   única salida es elegir en la pantalla de importar: traer de
   Autogestión o cargar a mano. Ocultar el dock y la cabecera es lo que
   evita que se salga tocando "Hoy" antes de elegir. */
body.primera-vez .nav,
body.primera-vez .buscador,
body.primera-vez .cabecera-acciones,
body.primera-vez .novedades { display: none; }
body.primera-vez { padding-bottom: 0; }

/* Vista previa (Ajustes → "Vista previa"): la misma pantalla de
   arriba, pero de mentira. El único agregado sobre .primera-vez es
   este botón para salir, porque acá sí hay algo real debajo. */
.vista-previa-salir {
  display: none;
  position: fixed; right: 16px; bottom: 16px; z-index: 90;
  padding: 10px 16px; border-radius: 999px;
  background: var(--vidrio-alto); border: 1px solid var(--borde-alto);
  color: var(--texto); font: inherit; font-size: .84rem;
  backdrop-filter: blur(16px);
}
body.vista-previa .vista-previa-salir { display: block; }

.ag-pantalla {
  display: flex;
  /* Exactamente lo que queda entre la cabecera y el dock. La franja
     del reloj también se la come la cabecera: si no se descuenta, el
     chat termina justo debajo del dock. */
  height: calc(100dvh - var(--alto-cab) - var(--cielo) - var(--alto-dock)
               - 20px - var(--piso));
  min-height: 320px;
  border-radius: var(--r-lg);
  border: 1px solid var(--borde);
  background: var(--vidrio-hondo);
  overflow: hidden;
}

.ag-canales {
  width: 270px; flex: 0 0 auto;
  display: flex; flex-direction: column; min-height: 0;
  border-right: 1px solid var(--borde);
  background: rgba(255,255,255,.02);
}

.ag-cab {
  display: flex; align-items: center; gap: 10px; flex: 0 0 auto;
  padding: 14px 16px; border-bottom: 1px solid var(--borde);
}
.ag-cab h2 { font-size: 1rem; font-weight: 740; }

.ag-linea {
  font-size: .68rem; font-weight: 650; color: var(--ok);
  background: color-mix(in srgb, var(--ok) 15%, transparent);
  border: 1px solid color-mix(in srgb, var(--ok) 30%, transparent);
  padding: 2px 9px; border-radius: 999px;
}
.ag-conectar {
  font-family: inherit; font-size: .72rem; font-weight: 660; cursor: pointer;
  padding: 3px 11px; border-radius: 999px; color: var(--carrera-2);
  background: color-mix(in srgb, var(--carrera) 15%, transparent);
  border: 1px solid color-mix(in srgb, var(--carrera) 34%, transparent);
}

.ag-lista { flex: 1; min-height: 0; overflow-y: auto; scrollbar-width: thin; padding: 10px 9px 16px; }

.canales-rot {
  font-size: .66rem; text-transform: uppercase; letter-spacing: .1em;
  color: var(--debil); font-weight: 700; margin: 14px 8px 7px;
  display: flex; align-items: center; gap: 7px;
}
.canales-rot:first-child { margin-top: 2px; }
.canales-cuenta { color: var(--tenue); }
.canales-vacio { font-size: .78rem; color: var(--debil); line-height: 1.5; padding: 2px 9px 6px; }

/* Una fila por canal. El punto de color es el de la materia: después
   de una semana la reconocés por el color antes de leer el nombre. */
.canal {
  position: relative; display: flex; align-items: flex-start; gap: 10px;
  width: 100%; cursor: pointer; text-align: left; font-family: inherit;
  padding: 10px 11px; border-radius: var(--r-sm); margin-bottom: 2px;
  background: transparent; border: 1px solid transparent; color: var(--texto);
  transition: background .18s ease, border-color .18s ease, transform .18s var(--resorte);
}
.canal:hover { background: var(--vidrio); transform: translateX(2px); }
.canal[aria-current="true"] {
  background: color-mix(in srgb, var(--m, var(--carrera)) 13%, transparent);
  border-color: color-mix(in srgb, var(--m, var(--carrera)) 34%, transparent);
}
.canal-punto {
  flex: 0 0 auto; margin-top: 5px; width: 8px; height: 8px; border-radius: 50%;
  background: var(--m, var(--inerte));
  box-shadow: 0 0 9px color-mix(in srgb, var(--m, var(--inerte)) 70%, transparent);
}
.canal-cuerpo { min-width: 0; flex: 1; }
.canal-nom {
  display: block; font-size: .84rem; font-weight: 660; line-height: 1.25;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Las dos cosas que se ven sin entrar: qué tiene más cerca y con
   cuánto material contás. "Sin fuentes" se dice fuerte a propósito:
   es la materia donde peor te va a contestar. */
.canal-sub {
  display: block; font-size: .72rem; color: var(--debil); margin-top: 3px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.canal-sub .proximo { color: var(--tenue); }
.canal-sub .proximo.urge { color: var(--media); font-weight: 650; }
.canal-sub .sin { color: var(--riesgo); opacity: .8; }
.canal-sub .sin-fecha { color: var(--debil); }

.canal-marca {
  flex: 0 0 auto; margin-top: 2px; font-size: .66rem; font-weight: 720;
  padding: 2px 7px; border-radius: 999px; color: var(--media);
  background: color-mix(in srgb, var(--media) 16%, transparent);
  border: 1px solid color-mix(in srgb, var(--media) 30%, transparent);
}
.canal-marca[data-tono="riesgo"] {
  color: var(--riesgo);
  background: color-mix(in srgb, var(--riesgo) 16%, transparent);
  border-color: color-mix(in srgb, var(--riesgo) 30%, transparent);
}

/* Renombrar y borrar aparecen al pasar por encima. En el celular no
   hay hover: se muestran siempre en el chat elegido. */
.canal-manijas { display: none; gap: 2px; flex: 0 0 auto; }
.canal:hover .canal-manijas, .canal[aria-current="true"] .canal-manijas { display: flex; }
.canal:hover .canal-marca, .canal[aria-current="true"] .canal-marca { display: none; }
.manija {
  display: grid; place-items: center; width: 24px; height: 24px; cursor: pointer;
  border-radius: 8px; color: var(--debil);
  transition: color .18s ease, background .18s ease;
}
.manija:hover { color: var(--texto); background: var(--vidrio-alto); }
.manija svg { width: 13px; height: 13px; }

.canal-nuevo {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; cursor: pointer; font-family: inherit; margin-top: 8px;
  padding: 10px; border-radius: var(--r-sm);
  background: transparent; border: 1px dashed var(--borde-alto);
  color: var(--tenue); font-size: .79rem; font-weight: 640;
  transition: color .2s ease, border-color .2s ease, background .2s ease;
}
.canal-nuevo:hover { color: var(--texto); background: var(--vidrio); border-color: var(--tenue); }
.canal-nuevo svg { width: 14px; height: 14px; }

/* --- La conversación --------------------------------------- */
.ag-charla { flex: 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; }
.ag-volver { display: none; }

.ag-titulo { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
.ag-punto {
  flex: 0 0 auto; width: 9px; height: 9px; border-radius: 50%; background: var(--mat);
  box-shadow: 0 0 12px color-mix(in srgb, var(--mat) 70%, transparent);
}
.ag-titulo-txt { min-width: 0; }
.ag-tit {
  display: block; font-size: .94rem; font-weight: 700;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ag-de {
  display: block; font-size: .72rem; color: var(--debil);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Renombrar en el lugar: el título se convierte en el campo, sin
   modal de por medio. Los dos están siempre dibujados y esta clase
   decide cuál se ve — prenderlo no puede pasar por un redibujo, que
   te sacaría el cursor del campo y se comería el clic con el que te
   estás yendo (ver `modoRenombrar` en js/views/agente.js). */
.ag-titulo-editar { display: none; }
.ag-cab.renombrando .ag-titulo { display: none; }
.ag-cab.renombrando .ag-titulo-editar { display: block; }
.ag-titulo-editar {
  flex: 1; min-width: 0; font-size: .94rem; font-weight: 700;
  padding: 5px 11px; border-radius: 11px;
  border-color: color-mix(in srgb, var(--mat) 55%, var(--borde));
}
.ag-icono {
  display: grid; place-items: center; cursor: pointer; flex: 0 0 auto;
  width: 32px; height: 32px; border-radius: 50%; font-family: inherit;
  background: var(--vidrio); border: 1px solid var(--borde); color: var(--tenue);
  transition: transform .2s var(--resorte), color .2s ease, background .2s ease;
}
.ag-icono:hover { color: var(--texto); background: var(--vidrio-alto); transform: translateY(-2px); }
.ag-icono svg { width: 15px; height: 15px; }

/* El ojo con el número: cuántas cosas está mirando. Plegado ocupa
   nada y sigue diciendo que está ahí. */
.ag-visor {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer; flex: 0 0 auto;
  padding: 6px 11px; border-radius: 999px; font-family: inherit;
  background: var(--vidrio); border: 1px solid var(--borde);
  color: var(--tenue); font-size: .75rem; font-weight: 660;
  transition: color .2s ease, border-color .2s ease, background .2s ease;
}
.ag-visor:hover { color: var(--texto); background: var(--vidrio-alto); }
.ag-visor[aria-expanded="true"] { color: var(--texto); border-color: color-mix(in srgb, var(--mat) 50%, var(--borde)); }
.ag-visor svg { width: 13px; height: 13px; color: var(--mat); }

.ag-fichas {
  flex: 0 0 auto; padding: 12px 16px; border-bottom: 1px solid var(--borde);
  display: flex; flex-wrap: wrap; gap: 6px;
}
.ag-ayudita { width: 100%; font-size: .71rem; color: var(--debil); margin-top: 3px; }
.ctx {
  display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
  padding: 5px 10px; border-radius: 999px; font-family: inherit;
  background: var(--vidrio); border: 1px solid var(--borde);
  font-size: .74rem; color: var(--tenue); font-weight: 600;
  transition: opacity .2s ease, background .2s ease;
}
.ctx:hover { background: var(--vidrio-alto); }
.ctx svg { width: 12px; height: 12px; opacity: .85; color: var(--mat); }
.ctx b { color: var(--texto); font-weight: 720; }
.ctx .sin { color: var(--riesgo); }
/* Apagada = no viaja en el pedido. Que se vea tachada es el punto. */
.ctx[aria-pressed="false"] { opacity: .35; text-decoration: line-through; }

/* La materia (y el tema) no son un chip más: no se pueden apagar, así
   que no son un botón. Sin cursor, sin hover, sin tachado posible —
   la diferencia con .ctx se siente antes de leer nada. */
.ctx-fijo {
  display: flex; align-items: center; gap: 7px; width: 100%;
  font-size: .78rem; color: var(--tenue); padding: 1px 1px 3px;
}
.ctx-fijo svg { width: 12px; height: 12px; color: var(--mat); opacity: .85; flex-shrink: 0; }
.ctx-fijo b { color: var(--texto); font-weight: 720; }
.ctx-sep { width: 100%; height: 1px; background: var(--borde); margin: 6px 0 1px; opacity: .6; }

/* Lo que casi siempre le vas a pedir de esta materia, sin escribirlo.
   Se van apenas arranca la conversación. */
.ag-rapidos {
  display: flex; gap: 8px; overflow-x: auto; scrollbar-width: none; flex: 0 0 auto;
  border-bottom: 1px solid var(--borde);
  padding: 12px 16px calc(12px + var(--halo));
  margin-bottom: calc(var(--halo) * -1);
}
.ag-rapidos::-webkit-scrollbar { display: none; }
.rapido {
  flex: 0 0 auto; display: inline-flex; align-items: center; gap: 7px; cursor: pointer;
  padding: 8px 13px; border-radius: 999px; font-family: inherit;
  background: var(--vidrio); border: 1px solid var(--borde);
  color: var(--texto); font-size: .79rem; font-weight: 630;
  transition: transform .2s var(--resorte), box-shadow .2s ease, border-color .2s ease;
}
.rapido:hover {
  transform: translateY(-3px);
  border-color: color-mix(in srgb, var(--mat) 55%, var(--borde));
  box-shadow: 0 6px 20px color-mix(in srgb, var(--mat) 24%, transparent);
}
.rapido svg { width: 14px; height: 14px; color: var(--mat); }

.ag-parar { --carrera: var(--riesgo); --carrera-2: #e88a83; }

/* --- Charla · Mapa · Fichas ---------------------------------
   Tres formas de estudiar la misma materia, no tres pantallas. */
.ag-solapas {
  display: flex; gap: 6px; flex: 0 0 auto;
  padding: 10px 16px; border-bottom: 1px solid var(--borde);
}
.ag-solapa {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer;
  padding: 7px 13px; border-radius: 999px; font-family: inherit;
  background: transparent; border: 1px solid transparent;
  color: var(--tenue); font-size: .8rem; font-weight: 650;
  transition: color .2s ease, background .2s ease, border-color .2s ease;
}
.ag-solapa:hover { color: var(--texto); background: var(--vidrio); }
.ag-solapa[aria-pressed="true"] {
  color: var(--texto); background: color-mix(in srgb, var(--mat) 15%, transparent);
  border-color: color-mix(in srgb, var(--mat) 36%, transparent);
}
.ag-solapa svg { width: 14px; height: 14px; }
.ag-solapa[aria-pressed="true"] svg { color: var(--mat); }
/* Cuántas fichas te tocan hoy. Es el único número que te hace volver. */
.ag-pendientes {
  font-size: .66rem; font-weight: 760; padding: 1px 6px; border-radius: 999px;
  background: var(--mat); color: var(--bg);
}

/* --- La portada -----------------------------------------------
   Reemplaza a las pestañas + los chips + el globo de párrafo cuando
   el chat de una materia está recién abierto: en vez de explicar
   que hay mapa y mazo, los pone al frente como tres modos grandes.
   Ver `dibujarPortada` en views/agente.js. */
/* El único hijo flexible de .ag-charla, igual que .agente-hilo: sin
   esto, tres materias con descripciones largas no tienen dónde
   hacer scroll y se salen del panel. */
.apertura { flex: 1; min-height: 0; overflow-y: auto; scrollbar-width: thin; }
.apertura-sub {
  display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
  padding: 14px 16px 4px; color: var(--tenue); font-size: .82rem;
}
.apertura-sub b { color: var(--texto); font-weight: 700; }
.punto-sep { width: 3px; height: 3px; border-radius: 50%; background: var(--debil); flex: none; }

.apertura-tiles { display: grid; gap: 10px; grid-template-columns: 1fr; padding: 10px 16px 4px; }
.apertura-tile { padding: 15px; text-align: left; display: flex; gap: 13px; align-items: center; }
.apertura-tile .modo-ico {
  flex: 0 0 auto; width: 40px; height: 40px; border-radius: 13px;
  display: grid; place-items: center;
  background: color-mix(in srgb, var(--mat) 16%, transparent); color: var(--mat);
}
.apertura-tile .modo-ico svg { width: 19px; height: 19px; }
.apertura-tile .modo-cuerpo { flex: 1; min-width: 0; }
.apertura-tile b { display: flex; align-items: center; gap: 8px; font-size: .93rem; margin-bottom: 2px; }
.apertura-tile .modo-cuerpo > span { display: block; color: var(--tenue); font-size: .79rem; line-height: 1.45; }

.apertura-o {
  padding: 8px 16px 2px; color: var(--debil); font-size: .7rem;
  text-transform: uppercase; letter-spacing: .08em; font-weight: 700;
}
.apertura-chips {
  display: flex; gap: 8px; overflow-x: auto; scrollbar-width: none;
  padding: 8px 16px calc(14px + var(--halo)); margin-bottom: calc(var(--halo) * -1);
}
.apertura-chips::-webkit-scrollbar { display: none; }

.ag-estudio { flex: 1; min-height: 0; overflow-y: auto; scrollbar-width: thin; padding: 18px; }

.ag-esperando, .ag-aldia {
  display: grid; place-items: center; text-align: center;
  gap: 10px; padding: 40px 20px; max-width: 44ch; margin: 0 auto;
}
.ag-esperando h3, .ag-aldia h3 { font-size: 1.05rem; font-weight: 740; }
.ag-esperando p, .ag-aldia p { color: var(--tenue); font-size: .88rem; line-height: 1.55; }
.ag-aldia > svg {
  width: 34px; height: 34px; color: var(--ok);
  filter: drop-shadow(0 0 12px color-mix(in srgb, var(--ok) 55%, transparent));
}

/* Lo que salió mal se queda a la vista. Un toast de 6 segundos para
   "te frenaron por cuota, esperá un minuto" no alcanza: querés poder
   leerlo y volver a intentar cuando pase el rato. */
.ag-falla {
  text-align: left; font-size: .84rem; line-height: 1.55; color: var(--tenue);
  padding: 12px 14px; border-radius: var(--r-sm);
  background: color-mix(in srgb, var(--riesgo) 11%, transparent);
  border: 1px solid color-mix(in srgb, var(--riesgo) 30%, transparent);
}

/* La misma caja, pero adentro del mapa: por qué no se pudo abrir el
   nodo, y el botón para volver a intentarlo cuando pase el rato. */
.mapa-falla {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  margin-bottom: 14px;
}
.mapa-falla > div { flex: 1 1 260px; }
.mapa-falla strong { color: var(--texto); font-weight: 720; }
.mapa-falla span { display: block; margin-top: 3px; }

.ag-estudio-pie {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--borde);
}
.ag-estudio-cuando { font-size: .75rem; color: var(--debil); margin-right: auto; }

/* La señal de vida del cartel de espera: cuánto lleva escrito y cuánto
   tardó. Sin esto, treinta segundos de espera y "se colgó" se ven
   exactamente igual. En tabular para que el número no baile. */
.ag-esperando-señal {
  font-size: .78rem; color: var(--mat);
  font-variant-numeric: tabular-nums;
}

/* El mapa que se dibuja solo mientras el modelo todavía está
   escribiendo: sólo temas que ya cerraron del todo, así que la lista
   crece de a nodos enteros y nunca se ve uno a la mitad. */
.ag-parcial {
  text-align: left; width: 100%; margin-top: 2px;
  background: var(--vidrio-hondo); border: 1px solid var(--borde);
  border-radius: var(--r-sm); padding: 14px 16px;
}
.ag-parcial h4 { font-size: .86rem; font-weight: 740; color: var(--texto); margin-bottom: 8px; }
.ag-parcial p { font-size: .8rem; color: var(--debil); }
.ag-parcial-lista { list-style: none; display: grid; gap: 6px; max-height: 260px; overflow-y: auto; }
.ag-parcial-lista li {
  font-size: .83rem; color: var(--texto); padding: 8px 11px;
  border-radius: 9px; border: 1px solid color-mix(in srgb, var(--mat) 22%, transparent);
  background: color-mix(in srgb, var(--mat) 8%, transparent);
  animation: ag-parcial-entra .3s ease both;
}
.ag-parcial-etq {
  display: block; font-size: .68rem; font-weight: 650; color: var(--mat); margin-top: 2px;
}
@keyframes ag-parcial-entra {
  from { opacity: 0; transform: translateY(4px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* --- Elegir entre los mapas de la materia ---------------------
   Cada mapa nació de un tema y unas fuentes, así que se guarda con
   nombre y se cambia acá. Las manijas de renombrar y borrar salen
   sólo en el que estás mirando: tres chips con dos íconos cada uno es
   una barra de herramientas, no una fila para elegir. */
.mapa-elegir {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-bottom: 14px;
}
.mapa-chip {
  display: inline-flex; align-items: center; gap: 2px;
  border: 1px solid var(--borde); border-radius: 999px;
  background: var(--vidrio); padding: 2px 4px 2px 2px;
}
.mapa-chip.elegido {
  border-color: color-mix(in srgb, var(--mat) 55%, transparent);
  background: color-mix(in srgb, var(--mat) 14%, transparent);
}
.mapa-chip-ir {
  border: 0; background: none; cursor: pointer; color: var(--tenue);
  font: inherit; font-size: .8rem; font-weight: 640;
  padding: 5px 10px; border-radius: 999px;
  max-width: 22ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.mapa-chip.elegido .mapa-chip-ir { color: var(--texto); }
.mapa-chip-ir:hover { color: var(--texto); }
.mapa-chip .manija { width: 24px; height: 24px; }

.mapa-chip-nuevo {
  border: 1px dashed var(--borde); background: none; cursor: pointer;
  color: var(--tenue); font: inherit; font-size: .8rem; font-weight: 640;
  padding: 6px 12px; border-radius: 999px;
}
.mapa-chip-nuevo:hover {
  color: var(--texto);
  border-color: color-mix(in srgb, var(--mat) 55%, transparent);
  border-style: solid;
}

/* --- El mapa -------------------------------------------------
   En columna, de arriba abajo. Un grafo con nodos flotando es
   ilegible en un celular sin hacer zoom, y todo lo que tenga
   resplandor adentro de un contenedor con scroll se recorta en
   cuadrado. */
.mapa-raiz {
  position: relative; overflow: hidden;
  border-radius: var(--r); padding: 18px 20px;
  border: 1px solid color-mix(in srgb, var(--mat) 34%, var(--borde));
  background:
    radial-gradient(120% 150% at 0% 0%, color-mix(in srgb, var(--mat) 22%, transparent) 0%, transparent 60%),
    var(--vidrio);
}
.mapa-raiz h3 { font-size: 1.12rem; font-weight: 760; letter-spacing: -.02em; margin: 6px 0 6px; }
.mapa-raiz p { color: var(--tenue); font-size: .89rem; line-height: 1.55; }
.mapa-etiqueta {
  display: inline-block; font-size: .65rem; font-weight: 740;
  text-transform: uppercase; letter-spacing: .09em; color: var(--mat);
  padding: 2px 9px; border-radius: 999px;
  background: color-mix(in srgb, var(--mat) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--mat) 30%, transparent);
}
/* El hilo que baja de la raíz a los nodos: sin esto son fichas
   sueltas y no un mapa. */
.mapa-tronco {
  width: 2px; height: 22px; margin: 0 auto;
  background: linear-gradient(var(--mat), transparent);
}
.mapa-nodos {
  display: grid; gap: 10px;
  /* Más ancho que antes: ahora un nodo trae la explicación, la fórmula
     con sus variables, el paso a paso y el error típico. Con 260 px
     quedaban cuatro columnas de fideo. */
  grid-template-columns: repeat(auto-fill, minmax(330px, 1fr));
  /* Sin esto la grilla estira a TODOS los vecinos de la fila hasta el
     alto del más grande, y los nodos ya no miden parecido: uno lleno
     al lado de uno todavía escribiéndose eran 800 px de aire. */
  align-items: start;
  padding: var(--halo); margin: calc(var(--halo) * -1);
}
.mapa-nodo {
  position: relative; border-radius: var(--r-sm); padding: 14px 15px;
  border: 1px solid var(--borde); background: var(--vidrio);
  transition: transform .22s var(--resorte), box-shadow .22s ease, border-color .22s ease;
}
.mapa-nodo:hover {
  transform: translateY(-3px);
  border-color: color-mix(in srgb, var(--mat) 45%, var(--borde));
  box-shadow: 0 8px 24px color-mix(in srgb, var(--mat) 22%, transparent);
}
.mapa-nodo h4 { font-size: .95rem; font-weight: 720; margin: 7px 0 7px; }
.mapa-nodo .md { font-size: .86rem; color: var(--tenue); line-height: 1.55; }
.mapa-subtemas { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px; }
.mapa-subtemas span {
  font-size: .71rem; font-weight: 600; color: var(--tenue);
  padding: 3px 9px; border-radius: 999px;
  background: var(--vidrio-alto); border: 1px solid var(--borde);
}

/* El nodo que se está abriendo: trabaja en su lugar, entre sus
   hermanos, en vez de mandarte a un cartel a pantalla completa. */
.mapa-nodo.abriendo {
  border-color: color-mix(in srgb, var(--mat) 45%, var(--borde));
  box-shadow: 0 0 24px -10px var(--mat);
}
/* El hueco del subtema que todavía no llegó: el lugar ya está
   reservado, así la tarjeta no crece de golpe abajo del dedo. */
.mapa-subtemas .subtema-hueco {
  height: 22px; padding: 0; border-radius: 999px;
  background: linear-gradient(90deg, var(--vidrio-alto) 0%, rgba(255,255,255,.14) 50%, var(--vidrio-alto) 100%);
  background-size: 220% 100%;
  animation: hueso-correr 1.25s linear infinite;
}
@media (prefers-reduced-motion: reduce) {
  .mapa-subtemas .subtema-hueco { animation: none; }
}

/* Dónde estás y cómo salís del mapa que se abre hacia adentro. La
   miga de pan sola no alcanza: el que no conoce la app no la lee como
   algo que se puede tocar. El botón de volver dice a dónde va. */
.mapa-nav { margin-bottom: 14px; }
.mapa-atras {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer;
  font-family: inherit; font-size: .82rem; font-weight: 680;
  max-width: 100%; margin-bottom: 8px;
  padding: 7px 13px 7px 10px; border-radius: 999px;
  color: var(--texto); background: var(--vidrio);
  border: 1px solid color-mix(in srgb, var(--mat) 30%, var(--borde));
  transition: border-color .18s ease, background .18s ease, transform .18s var(--resorte);
}
.mapa-atras:hover {
  transform: translateX(-2px);
  background: var(--vidrio-alto);
  border-color: color-mix(in srgb, var(--mat) 55%, var(--borde));
}
.mapa-atras svg { width: 15px; height: 15px; flex: none; color: var(--mat); }
/* El título del padre puede ser largo y no tiene que empujar nada. */
.mapa-atras span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.mapa-miga {
  display: flex; align-items: center; gap: 4px; flex-wrap: wrap;
  font-size: .78rem;
}
.mapa-miga-paso {
  font-family: inherit; font-size: inherit; cursor: pointer;
  background: none; border: 0; padding: 4px 8px; border-radius: 999px;
  color: var(--tenue); font-weight: 640;
}
.mapa-miga-paso:hover { color: var(--texto); background: var(--vidrio); }
.mapa-miga-paso[aria-current] { color: var(--mat); }
.mapa-miga i { color: var(--debil); font-style: normal; }

/* El semáforo del nodo. Como en el resto de la app, el color
   SIGNIFICA algo: cómo te fue en las fichas que salieron de ese
   nodo. No decora. */
/* --- La espera que se puede leer ------------------------------
   Cuenta nodos terminados: no es una animación que gira sin saber
   nada. «3 de 6 listos» dice que va bien, cuánto falta y que no se
   colgó — un spinner no dice ninguna de las tres. */
.mapa-avance { display: grid; gap: 9px; margin-bottom: 14px; }
.mapa-avance-cab { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.mapa-avance-cab h4 { font-size: .95rem; font-weight: 740; }
.mapa-avance-cab .cuantos {
  font-size: .8rem; color: var(--mat); font-weight: 740;
  font-variant-numeric: tabular-nums;
}
.mapa-avance-cab .seg {
  margin-left: auto; font-size: .76rem; color: var(--debil);
  font-variant-numeric: tabular-nums;
}
.mapa-avance-cab .reint { font-size: .76rem; color: var(--media); flex-basis: 100%; }
.mapa-avance-parar {
  font-family: inherit; font-size: .74rem; font-weight: 680; color: var(--tenue);
  padding: 3px 11px; border-radius: 999px;
  border: 1px solid var(--borde); background: var(--vidrio);
}
.mapa-avance-parar:hover { color: var(--texto); border-color: var(--borde-alto); }
.mapa-avance-barra { height: 6px; border-radius: 999px; background: var(--vidrio-alto); overflow: hidden; }
.mapa-avance-barra b {
  display: block; height: 100%; border-radius: 999px;
  background: linear-gradient(90deg, var(--mat), var(--ok));
  transition: width .4s var(--resorte);
}

/* El nodo mientras se escribe. Dice QUÉ está leyendo, que es verdad
   y se entiende; «cargando» no es ninguna de las dos. */
.nodo-haciendo {
  display: flex; align-items: center; gap: 8px;
  font-size: .79rem; color: var(--mat); margin: 9px 0 3px;
}
.nodo-haciendo i {
  width: 12px; height: 12px; flex: none; border-radius: 50%;
  border: 2px solid color-mix(in srgb, var(--mat) 30%, transparent);
  border-top-color: var(--mat); animation: nodo-girar .8s linear infinite;
}
@keyframes nodo-girar { to { transform: rotate(360deg); } }

.hueso { display: grid; gap: 7px; margin: 8px 0 2px; }
.hueso i {
  display: block; height: 9px; border-radius: 999px;
  background: linear-gradient(90deg, var(--vidrio-alto) 0%, rgba(255,255,255,.16) 50%, var(--vidrio-alto) 100%);
  background-size: 220% 100%; animation: hueso-correr 1.25s linear infinite;
}
.hueso i:nth-child(2) { width: 88%; animation-delay: .12s; }
.hueso i:nth-child(3) { width: 62%; animation-delay: .24s; }
@keyframes hueso-correr {
  from { background-position: 120% 0; }
  to   { background-position: -120% 0; }
}
@media (prefers-reduced-motion: reduce) {
  .hueso i, .nodo-haciendo i { animation: none; }
}

/* El que se cayó queda en su lugar, con su botón. El resto del mapa
   anda: seis de seis o nada era lo que hacía que un mal segundo de
   Google se viera como «el mapa no funciona». */
.mapa-nodo.rota { border-color: color-mix(in srgb, var(--riesgo) 45%, var(--borde)); }
.nodo-rota {
  display: flex; align-items: center; gap: 9px; flex-wrap: wrap;
  font-size: .82rem; color: var(--tenue); margin: 8px 0 2px;
}
.nodo-rota svg { width: 15px; height: 15px; color: var(--riesgo); flex: none; }

/* --- El nodo que sirve para estudiar --------------------------
   Si un nodo sale con menos que esto, el mapa no sirve y da igual lo
   rápido que haya salido. Cada bloque es una de las cosas que hacen
   falta para no tener que ir al apunte igual. */
.nodo-formula {
  margin: 11px 0; padding: 11px 13px; border-radius: 12px;
  background: var(--vidrio-hondo);
  border: 1px solid color-mix(in srgb, var(--mat) 24%, var(--borde));
}
.nodo-formula > b {
  display: block; text-align: center; font-size: 1rem; font-weight: 700;
  letter-spacing: .01em; margin-bottom: 8px;
}
.nodo-formula dl { display: grid; grid-template-columns: auto 1fr; gap: 3px 9px; font-size: .78rem; }
.nodo-formula dt { color: var(--mat); font-weight: 740; }
.nodo-formula dd { color: var(--tenue); }

.nodo-caso, .nodo-ojo {
  margin: 11px 0; padding: 10px 13px; border-radius: 12px;
  font-size: .83rem; line-height: 1.55; color: var(--tenue);
}
.nodo-caso { background: var(--vidrio-hondo); border: 1px solid var(--borde); }
.nodo-caso > b { color: var(--texto); font-weight: 720; display: block; margin-bottom: 4px; }
.nodo-ojo {
  border: 1px solid color-mix(in srgb, var(--riesgo) 30%, var(--borde));
  background: color-mix(in srgb, var(--riesgo) 7%, transparent);
}
.nodo-ojo > b { color: var(--texto); font-weight: 720; }
.nodo-caso p, .nodo-ojo p { margin: 0; }
.nodo-caso ol, .nodo-caso ul { margin: 0; padding-left: 18px; }

/* De dónde salió. El gris —«esto lo puse yo»— es el que hace que le
   creas al verde y al ámbar: sin él, o le creés a todo o a nada. */
.nodo-fuente {
  display: flex; align-items: flex-start; gap: 7px;
  font-size: .75rem; color: var(--debil); line-height: 1.5;
  margin-top: 11px; padding-top: 10px; border-top: 1px dashed var(--borde);
}
.nodo-fuente svg { width: 13px; height: 13px; flex: none; margin-top: 2px; }
.nodo-fuente.apunte  { color: color-mix(in srgb, var(--ok) 75%, var(--tenue)); }
.nodo-fuente.temario { color: color-mix(in srgb, var(--media) 75%, var(--tenue)); }
.nodo-fuente.suelto  { color: var(--debil); }

.mapa-nodo[data-dominio] { border-left: 3px solid var(--tono); }
.mapa-nodo[data-dominio="firme"]  { --tono: var(--ok); }
.mapa-nodo[data-dominio="flojo"]  { --tono: var(--media); }
.mapa-nodo[data-dominio="caido"]  { --tono: var(--riesgo); }
.mapa-nodo[data-dominio="virgen"] { --tono: var(--inerte); }

.nodo-cab { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.nodo-estado {
  display: inline-flex; align-items: center; gap: 6px; flex: none;
  white-space: nowrap;          /* "Se te cae" partido en dos se lee como un error */
  font-size: .7rem; font-weight: 680; color: var(--tono);
}
.nodo-estado b { width: 7px; height: 7px; border-radius: 50%; background: var(--tono); display: block; }

.nodo-acciones {
  display: flex; gap: 6px; flex-wrap: wrap; margin-top: 12px;
  padding-top: 12px; border-top: 1px solid var(--borde);
}
.nodo-acc {
  display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
  font-family: inherit; font-size: .74rem; font-weight: 640;
  padding: 6px 11px; border-radius: 999px; color: var(--tenue);
  background: var(--vidrio); border: 1px solid var(--borde);
  transition: color .18s, background .18s, border-color .18s, transform .18s var(--resorte);
}
.nodo-acc:hover {
  color: var(--texto); background: var(--vidrio-alto); transform: translateY(-2px);
  border-color: color-mix(in srgb, var(--mat) 45%, var(--borde));
}
.nodo-acc svg { width: 13px; height: 13px; color: var(--mat); }
.nodo-acc.hondo { color: var(--mat); border-color: color-mix(in srgb, var(--mat) 40%, var(--borde)); }

/* --- Las fichas ---------------------------------------------- */
.fichas-cuenta {
  display: flex; align-items: center; gap: 12px;
  font-size: .74rem; color: var(--debil); font-weight: 640; margin-bottom: 14px;
}
.fichas-barra {
  flex: 1; height: 5px; border-radius: 999px; overflow: hidden;
  background: rgba(255,255,255,.09);
}
.fichas-barra > i {
  display: block; height: 100%; border-radius: 999px; background: var(--mat);
  box-shadow: 0 0 10px color-mix(in srgb, var(--mat) 45%, transparent);
  transition: width .3s ease;
}
.fichas-caja { color: var(--tenue); }

/* La ficha da vuelta de verdad. El truco es que las dos caras estén
   siempre en el mismo lugar: sin position absolute, la de atrás
   empuja a la de adelante y la tarjeta cambia de alto al girar. */
.ficha {
  position: relative; display: block; width: 100%; cursor: pointer;
  min-height: 230px; font-family: inherit; text-align: left;
  background: none; border: 0; padding: 0;
  perspective: 1400px;
}
.ficha-cara {
  position: absolute; inset: 0; display: flex; flex-direction: column;
  justify-content: center; gap: 12px; padding: 26px 24px;
  border-radius: var(--r); border: 1px solid var(--borde);
  background: var(--vidrio); color: var(--texto);
  backface-visibility: hidden; -webkit-backface-visibility: hidden;
  transition: transform .55s cubic-bezier(.4, .1, .2, 1), box-shadow .3s ease;
}
.ficha-frente { transform: rotateY(0deg); }
.ficha-dorso {
  transform: rotateY(180deg);
  background:
    radial-gradient(120% 150% at 100% 0%, color-mix(in srgb, var(--mat) 20%, transparent) 0%, transparent 60%),
    var(--vidrio);
  border-color: color-mix(in srgb, var(--mat) 34%, var(--borde));
  overflow-y: auto;
}
.ficha.vuelta .ficha-frente { transform: rotateY(-180deg); }
.ficha.vuelta .ficha-dorso  { transform: rotateY(0deg); }
.ficha:hover .ficha-cara { box-shadow: 0 12px 32px color-mix(in srgb, var(--mat) 20%, transparent); }

.ficha-rot {
  font-size: .65rem; font-weight: 740; text-transform: uppercase;
  letter-spacing: .1em; color: var(--mat);
}
.ficha-texto { font-size: 1.02rem; line-height: 1.5; font-weight: 600; }
.ficha-dorso .ficha-texto { font-weight: 500; font-size: .95rem; }
.ficha-pista { font-size: .72rem; color: var(--debil); margin-top: auto; }

/* --- Las fichas que se contestan -----------------------------
   No se dan vuelta: la respuesta aparece abajo al corregir, porque
   lo que importa es comparar lo que pusiste con lo que era. Por eso
   no comparten caja con .ficha, que tiene alto fijo y dos caras. */
/* Antes era un borde chato — se veía a formulario suelto al lado de
   la ficha de voltear, que sí tiene brillo de esquina y resplandor.
   Mismo tratamiento acá: reflejo teñido por la materia y el hover
   de .tarjeta-int, para que sea la misma familia. */
.ficha-viva {
  position: relative; border-radius: var(--r); padding: 26px 24px;
  border: 1px solid var(--borde);
  background:
    radial-gradient(140% 160% at 100% 0%, color-mix(in srgb, var(--mat) 16%, transparent) 0%, transparent 62%),
    var(--vidrio);
  display: flex; flex-direction: column; gap: 14px; min-height: 230px;
  overflow-wrap: anywhere;
  transition: transform .38s cubic-bezier(.16,1,.3,1), border-color .3s, box-shadow .38s, background .3s;
}
.ficha-viva:hover {
  transform: translateY(-4px);
  border-color: color-mix(in srgb, var(--mat) 40%, var(--borde));
  box-shadow: 0 26px 54px -24px rgba(0,0,0,.8), 0 0 28px color-mix(in srgb, var(--mat) 15%, transparent);
}
/* Estos dos van DESPUÉS del :hover a propósito: una vez corregida,
   el color cuenta si estuvo bien o mal, no si el mouse está encima. */
.ficha-viva[data-resuelta="bien"] { border-color: color-mix(in srgb, var(--ok) 45%, var(--borde)); }
.ficha-viva[data-resuelta="mal"]  { border-color: color-mix(in srgb, var(--riesgo) 45%, var(--borde)); }

.ficha-tipo {
  position: absolute; top: 14px; right: 16px;
  font-size: .62rem; font-weight: 740; text-transform: uppercase; letter-spacing: .09em;
  color: var(--debil); padding: 3px 9px; border-radius: 999px;
  background: var(--vidrio-alto); border: 1px solid var(--borde);
}

/* El hueco de las de completar. Va en línea con el texto: sacado
   aparte, la frase deja de leerse como una frase. */
.ficha-hueco {
  display: inline-block; min-width: 92px; font-family: inherit;
  font-size: inherit; font-weight: 700; color: var(--mat); text-align: center;
  background: color-mix(in srgb, var(--mat) 12%, transparent);
  border: 0; border-bottom: 2px solid var(--mat); border-radius: 6px 6px 0 0;
  padding: 2px 8px; margin: 0 2px;
}
.ficha-hueco[data-bien="si"] {
  color: var(--ok); border-bottom-color: var(--ok);
  background: color-mix(in srgb, var(--ok) 12%, transparent);
}
.ficha-hueco[data-bien="no"] {
  color: var(--riesgo); border-bottom-color: var(--riesgo);
  background: color-mix(in srgb, var(--riesgo) 12%, transparent);
}

.ficha-opciones { display: grid; gap: 8px; }
.ficha-opcion {
  display: flex; align-items: center; gap: 10px; cursor: pointer; width: 100%;
  font-family: inherit; font-size: .9rem; text-align: left; color: var(--texto);
  padding: 12px 14px; border-radius: var(--r-sm);
  background: var(--vidrio); border: 1px solid var(--borde);
  transition: border-color .18s, background .18s, transform .18s var(--resorte);
}
.ficha-opcion:hover:not(:disabled) {
  transform: translateY(-2px);
  border-color: color-mix(in srgb, var(--mat) 45%, var(--borde));
}
.ficha-opcion b {
  flex: none; width: 22px; height: 22px; border-radius: 7px; display: grid; place-items: center;
  font-size: .72rem; font-weight: 740; color: var(--debil);
  background: var(--vidrio-alto); border: 1px solid var(--borde);
}
.ficha-opcion[data-marca="bien"] { border-color: var(--ok); background: color-mix(in srgb, var(--ok) 12%, transparent); }
.ficha-opcion[data-marca="bien"] b { color: var(--ok); border-color: var(--ok); }
.ficha-opcion[data-marca="mal"] { border-color: var(--riesgo); background: color-mix(in srgb, var(--riesgo) 12%, transparent); }
.ficha-opcion[data-marca="mal"] b { color: var(--riesgo); border-color: var(--riesgo); }

/* El de cálculo: mismo hueco que "completar", más angosto porque
   adentro sólo va un número. Sin las flechitas del spinner: serían
   el único borde de caja que le queda, y la idea es que no tenga. */
.ficha-hueco.num { min-width: 64px; font-variant-numeric: tabular-nums; -moz-appearance: textfield; }
.ficha-hueco.num::-webkit-outer-spin-button,
.ficha-hueco.num::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }

/* La pista: para no trabarse, no para zafar. */
.ficha-pista-caja {
  display: block; font-size: .82rem; color: var(--media);
  background: color-mix(in srgb, var(--media) 10%, transparent);
  border: 1px solid color-mix(in srgb, var(--media) 28%, transparent);
  border-radius: var(--r-sm); padding: 10px 13px; line-height: 1.55;
}

.ficha-correcta { font-size: .9rem; color: var(--tenue); }
.ficha-correcta strong { color: var(--texto); }

/* El porqué es lo que realmente enseña: sin esto tenés la respuesta
   pero no sabés por qué el error que cometiste era un error. */
.ficha-porque {
  display: block; padding-top: 12px; border-top: 1px solid var(--borde);
  font-size: .84rem; color: var(--tenue); line-height: 1.6;
}
.ficha-porque strong { color: var(--texto); font-weight: 700; }

/* De qué nodo del mapa salió: cierra el círculo entre las dos. */
.ficha-origen {
  display: inline-flex; align-items: center; gap: 6px; margin-top: 12px;
  font-size: .71rem; font-weight: 640; color: var(--mat); cursor: pointer;
  background: none; border: 0; font-family: inherit; padding: 0;
}
.ficha-origen svg { width: 12px; height: 12px; }

.fichas-juicio { display: flex; gap: 9px; margin-top: 16px; }
/* Tres niveles: "me costó" no es lo mismo que "no me salió". */
.fichas-juicio.tres .btn { flex: 1; min-width: 0; font-size: .82rem; padding-inline: 10px; }
.btn-medio {
  background: color-mix(in srgb, var(--media) 16%, transparent);
  border-color: color-mix(in srgb, var(--media) 40%, var(--borde));
  color: var(--media);
}
.fichas-ayudita {
  font-size: .78rem; color: var(--debil); text-align: center;
  margin-top: 14px; line-height: 1.5;
}

@media (prefers-reduced-motion: reduce) {
  .ficha-cara { transition: none; }
}

/* Sin clave el agente no se rompe: se apaga y te dice cómo prenderlo. */
.ag-sin-clave { display: grid; place-items: center; padding: 24px; }
.ag-sin-clave .vacio-caja { max-width: 40ch; text-align: center; }
.ag-sin-clave h2 { font-size: 1.05rem; font-weight: 740; margin-bottom: 8px; }
.ag-sin-clave p { color: var(--tenue); font-size: .88rem; line-height: 1.55; margin-bottom: 16px; }

/* --- Markdown ------------------------------------------------
   .burbuja trae white-space: pre-wrap para el texto plano; con
   markdown renderizado eso mete espacios fantasma entre las listas,
   así que adentro de .md vuelve a normal. */
.md { white-space: normal; }
.md > *:first-child { margin-top: 0; }
.md > *:last-child { margin-bottom: 0; }
.md p { margin: 0 0 10px; }
.md h3 {
  font-size: .97rem; font-weight: 760; letter-spacing: -.01em;
  margin: 16px 0 8px; color: var(--texto);
  display: flex; align-items: center; gap: 9px;
}
.md h3::before {
  content: ''; width: 3px; height: 15px; border-radius: 2px;
  background: var(--mat); flex: 0 0 auto;
  box-shadow: 0 0 10px color-mix(in srgb, var(--mat) 65%, transparent);
}
.md h4 {
  font-size: .8rem; font-weight: 720; text-transform: uppercase;
  letter-spacing: .06em; color: var(--tenue); margin: 15px 0 7px;
}
.md strong { color: var(--texto); font-weight: 720; }
.md em { color: var(--tenue); font-style: italic; }
.md ul, .md ol { margin: 0 0 10px; padding-left: 4px; list-style: none; }
.md li { position: relative; padding-left: 20px; margin-bottom: 6px; }
.md ul > li::before {
  content: ''; position: absolute; left: 5px; top: .62em;
  width: 5px; height: 5px; border-radius: 50%; background: var(--mat); opacity: .8;
}
.md ol { counter-reset: paso; }
.md ol > li { counter-increment: paso; }
.md ol > li::before {
  content: counter(paso); position: absolute; left: 0; top: .05em;
  font-size: .7rem; font-weight: 760; color: var(--mat); width: 15px; text-align: center;
}
.md code {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: .84em; padding: 1px 6px; border-radius: 7px;
  background: color-mix(in srgb, var(--mat) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--mat) 24%, transparent);
  color: var(--texto);
}
.md pre {
  margin: 0 0 10px; padding: 12px 14px; border-radius: var(--r-sm);
  background: var(--vidrio-hondo); border: 1px solid var(--borde);
  overflow-x: auto; scrollbar-width: thin;
}
.md pre code { background: none; border: 0; padding: 0; font-size: .82rem; line-height: 1.6; }
.md blockquote {
  margin: 0 0 10px; padding: 10px 13px; border-radius: var(--r-sm);
  background: color-mix(in srgb, var(--media) 10%, transparent);
  border: 1px solid color-mix(in srgb, var(--media) 26%, transparent);
  color: var(--tenue); font-size: .87rem; line-height: 1.5;
}
.md blockquote strong { color: var(--media); }
/* No es LaTeX: es una línea suelta entre $$ y se muestra como lo que
   es, centrada y en monoespaciada. */
.md .fx {
  margin: 0 0 10px; padding: 13px 14px; border-radius: var(--r-sm);
  background: var(--vidrio); border: 1px solid var(--borde);
  text-align: center; font-size: 1.02rem; letter-spacing: .02em;
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  color: var(--texto);
}
.md hr { border: 0; border-top: 1px solid var(--borde); margin: 14px 0; }

/* --- Lector de Material (.md guardado desde el agente) --------
   Mismo cuerpo .md que las burbujas del chat, pero con título y
   subtítulo propios: acá no hay conversación alrededor que diga de
   qué materia es. */
.lector-md-cab {
  font-size: .74rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: .05em; color: var(--mat); margin-bottom: 6px;
}
.lector-md-titulo {
  font-size: 1.28rem; font-weight: 780; letter-spacing: -.02em;
  line-height: 1.3; margin: 0 0 18px; color: var(--texto);
}
.lector-md .md { font-size: .92rem; line-height: 1.6; }
/* Fórmula en medio de una frase: se nota que es una fórmula sin
   cortar el renglón. */
.md .fx-in {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: .92em; letter-spacing: .01em;
  padding: 0 3px; border-radius: 5px; white-space: nowrap;
  background: color-mix(in srgb, var(--mat) 10%, transparent);
  color: var(--texto);
}

/* El cursor mientras llega la respuesta. Es la mitad de la sensación
   de que hay alguien escribiendo del otro lado. */
.caret {
  display: inline-block; width: 7px; height: 1em; vertical-align: -2px;
  margin-left: 2px; border-radius: 2px; background: var(--mat);
  animation: parpadeo 1s steps(2, start) infinite;
}
@keyframes parpadeo { 0%, 100% { opacity: 1; } 50% { opacity: .15; } }

/* Acciones de la última respuesta. Sólo la última: en todas ensucian
   el hilo y nadie guarda la de hace seis turnos. */
.acc-msg {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  margin-top: 11px; padding-top: 10px; border-top: 1px solid var(--borde);
}
.acc {
  display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
  padding: 6px 11px; border-radius: 999px; font-family: inherit;
  background: transparent; border: 1px solid var(--borde);
  color: var(--tenue); font-size: .76rem; font-weight: 640;
  transition: transform .2s var(--resorte), border-color .2s ease,
              background .2s ease, color .2s ease;
}
.acc:hover {
  transform: translateY(-2px); color: var(--texto);
  background: var(--vidrio-alto); border-color: var(--borde-alto);
}
.acc svg { width: 13px; height: 13px; }
.acc.principal { color: var(--texto); border-color: color-mix(in srgb, var(--mat) 45%, var(--borde)); }
.acc.principal svg { color: var(--mat); }

/* Elegir carpeta al guardar una respuesta. */
.carpetas-elegir {
  display: flex; flex-direction: column; gap: 6px;
  max-height: 260px; overflow-y: auto; scrollbar-width: thin;
}
.carp-elegir {
  display: flex; align-items: center; gap: 9px; cursor: pointer;
  padding: 9px 12px; border-radius: var(--r-sm);
  background: var(--vidrio); border: 1px solid var(--borde);
  font-size: .85rem; font-weight: 600;
}
.carp-elegir:hover { background: var(--vidrio-alto); }
.carp-elegir input { accent-color: var(--carrera); }
.carp-punto { width: 8px; height: 8px; border-radius: 50%; background: var(--m, var(--tenue)); flex: 0 0 auto; }
.carp-auto { font-size: .7rem; color: var(--debil); }

/* En el celular es una columna: la lista es la pantalla y la
   conversación se monta encima. */
@media (max-width: 860px) {
  .ag-pantalla { position: relative; }
  .ag-canales { width: 100%; border-right: 0; }
  .ag-charla {
    position: absolute; inset: 0; z-index: 3;
    background: var(--bg); border-radius: var(--r-lg);
  }
  .ag-volver {
    display: grid; place-items: center; cursor: pointer; flex: 0 0 auto;
    width: 32px; height: 32px; border-radius: 50%; font-family: inherit;
    background: var(--vidrio); border: 1px solid var(--borde); color: var(--tenue);
  }
  .ag-volver svg { width: 17px; height: 17px; }
  /* Sin hover no hay forma de sacarlas: en el chat elegido van siempre. */
  .canal .canal-manijas { display: flex; }
  .canal .canal-marca { display: inline-block; }
  .canal:hover .canal-marca { display: inline-block; }
}

/* En el celular la charla es lo que hay que ver, y arriba se le
   apilan cuatro franjas (cabecera, solapas, visor y atajos) que en la
   pantalla ancha no cuestan nada: medidas en un teléfono se llevaban
   285 de los 640 px y el hilo quedaba con menos de la mitad. Acá se
   les baja el aire, y el panel va de borde a borde. El visor arranca
   plegado desde `views/agente.js`, no desde acá. */
@media (max-width: 560px) {
  .ag-pantalla {
    margin: 0 -18px; border-left: 0; border-right: 0; border-radius: 0;
  }
  .ag-charla { border-radius: 0; }
  .ag-cab { padding: 10px 12px; gap: 8px; }
  .ag-solapas { padding: 8px 12px; gap: 4px; }
  .ag-solapa { padding: 7px 11px; }
  .ag-fichas { padding: 10px 12px; }
  .ag-rapidos { padding: 10px 12px calc(10px + var(--halo)); }
  .ag-estudio { padding: 14px 12px; }
  .agente-hilo { padding: 14px 12px; gap: 12px; }
  .agente-pie { padding: 10px 12px; }
  /* Sin pantalla de sobra, la burbuja del agente ocupa casi todo el
     ancho: cortarla al 88% deja una canaleta que no dice nada. */
  .burbuja.suya { max-width: 96%; }
}

/* Hilo de mensajes */
.agente-hilo {
  flex: 1;
  /* Sin esto el hilo no se achica y el scroll se le escapa a la
     página, que es justo lo que no queremos acá. */
  min-height: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding: 18px;
  scrollbar-width: thin;
}

/* Burbujas de mensajes */
.burbuja {
  max-width: 88%;
  font-size: 0.9rem;
  line-height: 1.5;
  white-space: pre-wrap;
}

.burbuja.mia {
  align-self: flex-end;
  background: linear-gradient(135deg, var(--carrera), var(--carrera-2));
  color: #ffffff;
  padding: 10px 15px;
  border-radius: 18px 18px 4px 18px;
  box-shadow: 0 4px 14px color-mix(in srgb, var(--carrera) 30%, transparent);
}

.burbuja.suya {
  align-self: flex-start;
  background: var(--vidrio-alto);
  border: 1px solid var(--borde);
  padding: 12px 16px;
  border-radius: 18px 18px 18px 4px;
  color: var(--texto);
}

/* Citas a fuentes/PDFs */
.burbuja.suya .cita {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: rgba(217, 102, 58, 0.15);
  border: 1px solid rgba(217, 102, 58, 0.3);
  color: var(--carrera-2);
  padding: 3px 9px;
  border-radius: 6px;
  font-size: 0.73rem;
  font-weight: 600;
  margin-bottom: 8px;
}

/* La espera de la charla: la burbuja vacía respirando.
   Los tres puntitos que había acá los tiene idéntico cualquier chat
   desde 2014 y encima dicen lo mismo que si estuviera colgado. El
   resplandor es la firma de Aurora, así que la espera respira con él
   y quien informa es la línea de abajo, que dice qué está pasando y
   hace cuánto.

   Ojo: el halo se sale del borde, así que el hilo NO puede recortar.
   Por eso el ancho es fijo y chico —una burbuja vacía al 70% se lee
   como un mensaje que no cargó— y el alto es el de una línea. */
.burbuja.suya.aliento {
  min-width: 66px; min-height: 40px; padding: 0;
  animation: aliento 2.6s ease-in-out infinite;
}
@keyframes aliento {
  0%, 100% { box-shadow: 0 0 0 0 transparent; border-color: var(--borde); }
  50%      { box-shadow: 0 0 26px -8px var(--mat-2, var(--carrera-2));
             border-color: color-mix(in srgb, var(--mat-2, var(--carrera-2)) 45%, var(--borde)); }
}

/* La señal va debajo de la burbuja, alineada con ella. `.porfiando`
   es el reintento: ámbar, porque algo salió mal pero se está
   arreglando solo. Rojo sería mentira —todavía no falló nada. */
.señal-chat { align-self: flex-start; text-align: left; margin: -2px 0 2px 2px; }
.señal-chat.porfiando { color: var(--media); }
.señal-chat b { font-weight: 700; }

@media (prefers-reduced-motion: reduce) {
  .burbuja.suya.aliento {
    animation: none;
    border-color: color-mix(in srgb, var(--mat-2, var(--carrera-2)) 45%, var(--borde));
  }
}

/* Puntos animados de "está escribiendo..." (lo usan los carteles de
   espera de las pantallas de estudio, no la charla) */
.burbuja.tipeando { display: flex; gap: 5px; padding: 8px 0; }
.burbuja.tipeando i {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--tenue);
  animation: rebotar 1.25s ease-in-out infinite;
}
.burbuja.tipeando i:nth-child(2) { animation-delay: .16s; }
.burbuja.tipeando i:nth-child(3) { animation-delay: .32s; }

@keyframes rebotar {
  0%, 60%, 100% { transform: translateY(0); opacity: .35; }
  30% { transform: translateY(-5px); opacity: 1; }
}

/* Ficha de propuesta de acción antes de confirmar */
.propuesta {
  border: 1px solid color-mix(in srgb, var(--carrera) 45%, var(--borde));
  background: rgba(0, 0, 0, 0.3);
  border-radius: var(--r);
  padding: 14px 16px;
  margin-top: 8px;
}

.propuesta-rot {
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--carrera-2);
  font-weight: 700;
  margin-bottom: 8px;
}

.propuesta ul {
  margin: 0;
  padding-left: 18px;
  color: var(--tenue);
  font-size: 0.85rem;
}

.propuesta-pie {
  display: flex;
  gap: 8px;
  margin-top: 12px;
}

.propuesta-pie .btn {
  flex: 1;
  padding: 8px;
  border-radius: var(--r-sm);
  font-size: 0.8rem;
  font-weight: 700;
}

.propuesta-pie .btn-primario {
  background: var(--ok);
  color: #04180a;
  border: none;
}

/* Pie del modal: Campo de entrada estilo píldora */
.agente-pie {
  padding: 12px 16px;
  border-top: 1px solid var(--borde);
  display: flex;
  flex-direction: column;
  gap: 8px;
  background: rgba(255, 255, 255, 0.02);
}

.agente-fila {
  display: flex;
  gap: 8px;
  align-items: center;
}
/* En el celular el ancho no alcanza para el ancho natural del input
   (20 caracteres) más los dos botones: sin esto la fila se pasa de
   largo, el clip se sale por la izquierda y "Mandar" queda cortado
   contra el borde. */
.agente-fila > .btn { flex: 0 0 auto; }

.agente-pie .entrada {
  flex: 1;
  min-width: 0;
  background: var(--vidrio-alto);
  border: 1px solid var(--borde);
  border-radius: 999px;
  padding: 10px 18px;
  color: var(--texto);
  font-size: 0.88rem;
  outline: none;
  transition: border-color 0.2s, box-shadow 0.2s;
}

.agente-pie .entrada:focus {
  border-color: var(--carrera-2);
  box-shadow: 0 0 12px color-mix(in srgb, var(--carrera) 30%, transparent);
}

.agente-pie .btn-primario {
  border-radius: 999px;
  padding: 8px 18px;
  font-weight: 700;
  font-size: 0.85rem;
}

/* Lo que adjuntaste y todavía no mandaste */
.agente-adjuntos {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.adjunto-ficha {
  display: flex;
  align-items: center;
  gap: 8px;
  max-width: 220px;
  padding: 4px 4px 4px 6px;
  border: 1px solid var(--borde);
  border-radius: 999px;
  background: var(--vidrio-alto);
  font-size: 0.78rem;
  color: var(--debil);
}

.adjunto-ficha img {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  object-fit: cover;
}

.adjunto-ficha .adjunto-pdf {
  width: 28px;
  height: 28px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: color-mix(in srgb, var(--carrera) 22%, transparent);
  color: var(--carrera-2);
  font-size: 0.6rem;
  letter-spacing: 0.04em;
}

.adjunto-ficha .crece {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.adjunto-ficha .btn-icono {
  padding: 2px 6px;
  font-size: 0.72rem;
}

/* La marca de que ese mensaje llevaba una foto */
.burbuja-clip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-right: 6px;
  opacity: 0.65;
  font-size: 0.72rem;
  vertical-align: middle;
}

.burbuja-clip svg { width: 13px; height: 13px; }



/* --- Panel de materia (bento) --------------------------------
   El detalle de una materia. Todo va scopeado bajo .panel-materia:
   nombres cortos como .bento-card o .file-item son demasiado
   genéricos para andar sueltos por la hoja. */
.panel-materia {
  max-width: 580px;
  padding: 0; overflow: hidden;
  display: flex; flex-direction: column;
}
/* El modal general trae padding y scroll propios; acá manda la
   cabecera pegada arriba y el cuerpo con su propio scroll. */
.panel-materia > .panel-cuerpo {
  overflow-y: auto; overscroll-behavior: contain;
  padding-bottom: env(safe-area-inset-bottom);
}

/* --- Cabecera ---
   Nombres propios (detmat-*), no .panel-cab: esa clase la usa también
   la cabecera de panel genérico de hoy.js (más abajo en este archivo,
   .panel-cab a secas) con un `display` distinto, y la cascada la pisaba
   — la insignia y el aula quedaban flotando encima del título en vez
   de debajo de los botones. */
.detmat-cab {
  padding: 20px 22px 18px;
  border-top: 4px solid var(--mat);
  background: linear-gradient(180deg,
              color-mix(in srgb, var(--mat) 15%, transparent) 0%,
              transparent 100%);
  border-bottom: 1px solid var(--borde);
  flex-shrink: 0;
}
.detmat-cab-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.panel-titulo { font-size: 1.32rem; font-weight: 720; letter-spacing: -.025em; line-height: 1.2; }
.panel-sub { font-size: .81rem; color: var(--tenue); margin-top: 4px; }
.detmat-cab-pie { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 13px; flex-wrap: wrap; }
.panel-acciones { display: flex; gap: 8px; align-items: center; flex-shrink: 0; }

/* En el celular los botones se van a su propio renglón. Con ellos al
   lado, "Termodinámica y Máquinas Térmicas" se partía en tres líneas
   y el nombre de la materia es lo principal de esta ficha. */
@media (max-width: 560px) {
  .detmat-cab-top { flex-wrap: wrap; }
  .detmat-cab-top > .crece { flex: 1 0 100%; }
  .panel-acciones { margin-left: auto; }
}

/* El display de la clase le gana al [hidden] del navegador, así que
   los dos paneles se dibujaban encima. Hay que decirlo a mano. */
.bento[hidden], .cfg[hidden] { display: none; }

/* --- Grilla bento --- */
.bento { padding: 16px; display: grid; grid-template-columns: 1fr; gap: 13px; }
.bento-card {
  background: var(--vidrio); border: 1px solid var(--borde);
  border-radius: var(--r); padding: 15px 16px;
}
.bento-tit {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  font-size: .71rem; text-transform: uppercase; letter-spacing: .09em;
  color: var(--tenue); font-weight: 720; margin-bottom: 12px;
}
.bento-rot { font-size: .72rem; color: var(--debil); display: block; margin-bottom: 6px; }

/* --- Burbujas de calificación --------------------------------
   Una burbuja por nota. El color dice si esa nota alcanza, así que
   se lee el estado antes que el número. Vacía queda punteada para
   que se note que falta cargarla, no que valga cero. */
.notas-grilla {
  display: grid; gap: 9px;
  grid-template-columns: repeat(auto-fill, minmax(88px, 1fr));
}
.nota-burbuja {
  --tono: var(--inerte);
  position: relative; border-radius: var(--r);
  background: color-mix(in srgb, var(--tono) 11%, var(--vidrio-hondo));
  border: 1px solid color-mix(in srgb, var(--tono) 32%, transparent);
  padding: 9px 8px 10px; text-align: center;
  transition: border-color .25s, background .25s, transform .25s var(--resorte);
}
.nota-burbuja:focus-within {
  transform: translateY(-2px);
  border-color: color-mix(in srgb, var(--tono) 62%, transparent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--tono) 16%, transparent);
}
.nota-burbuja[data-vacia="si"] {
  border-style: dashed;
  border-color: var(--borde-alto);
  background: rgba(255,255,255,.03);
}
.nota-burbuja > label {
  display: block; font-size: .64rem; font-weight: 730;
  text-transform: uppercase; letter-spacing: .07em;
  color: var(--tenue); margin-bottom: 2px; cursor: pointer;
}
.nota-burbuja input {
  width: 100%; border: none; background: none; text-align: center;
  font-size: 1.5rem; font-weight: 760; letter-spacing: -.03em; line-height: 1.15;
  color: var(--tono); font-family: inherit; padding: 0;
  -moz-appearance: textfield;
}
.nota-burbuja input::-webkit-outer-spin-button,
.nota-burbuja input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.nota-burbuja input:focus { outline: none; }
.nota-burbuja input::placeholder { color: var(--debil); font-weight: 600; }
/* La puso la app sola desde un casillero que Autogestión no nombró:
   es una suposición, no un dato, y se tiene que notar hasta que la
   confirmes. */
.nota-burbuja[data-auto="si"] {
  border-style: dashed;
  border-color: color-mix(in srgb, var(--carrera-2) 52%, transparent);
}
.nota-burbuja[data-auto="si"] > label::after {
  content: " ?"; color: var(--carrera-2); font-weight: 850;
}
.nota-burbuja[data-tono="ok"]     { --tono: var(--ok); }
.nota-burbuja[data-tono="media"]  { --tono: var(--media); }
.nota-burbuja[data-tono="riesgo"] { --tono: var(--riesgo); }
.nota-burbuja[data-clave="final"] { --tono: var(--carrera-2); }

/* El promedio va aparte de las notas: no es algo que cargues. */
.promedio-burbuja {
  display: inline-flex; align-items: baseline; gap: 7px;
  padding: 5px 14px; border-radius: 999px;
  background: color-mix(in srgb, var(--tono, var(--inerte)) 13%, transparent);
  border: 1px solid color-mix(in srgb, var(--tono, var(--inerte)) 30%, transparent);
  font-size: .68rem; text-transform: uppercase; letter-spacing: .08em;
  color: var(--tenue); font-weight: 720;
}
.promedio-burbuja b { font-size: 1.02rem; letter-spacing: -.02em; color: var(--tono, var(--tenue)); }
.promedio-burbuja[data-tono="ok"]     { --tono: var(--ok); }
.promedio-burbuja[data-tono="media"]  { --tono: var(--media); }
.promedio-burbuja[data-tono="riesgo"] { --tono: var(--riesgo); }

/* --- Asistencia --- */
.asis-pie { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 10px; }
.asis-pie .menor { color: var(--debil); flex: 1; }

/* --- Material --- */
.file-item {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  background: var(--vidrio-hondo); border: 1px solid var(--borde);
  border-radius: var(--r-sm); padding: 9px 13px; margin-bottom: 7px;
  font-size: .84rem; width: 100%; text-align: left;
  transition: border-color .2s, background .2s;
}
.file-item:last-child { margin-bottom: 0; }
button.file-item:hover { border-color: var(--borde-alto); background: rgba(255,255,255,.06); }
.file-item .crece { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.file-item small { color: var(--debil); font-size: .74rem; flex-shrink: 0; }

/* --- Correlativas --- */
.corr-tag {
  display: inline-flex; align-items: center; gap: 5px;
  background: var(--vidrio-hondo); border: 1px solid var(--borde);
  border-radius: 999px; padding: 5px 12px; margin: 0 5px 5px 0;
  font-size: .77rem; color: var(--tenue);
}
.corr-tag.ok     { border-color: color-mix(in srgb, var(--ok) 38%, transparent); color: var(--ok); }
.corr-tag.no     { border-color: color-mix(in srgb, var(--riesgo) 38%, transparent); color: var(--riesgo); }
.corr-tag.abre   { border-color: color-mix(in srgb, var(--carrera) 45%, transparent); color: var(--carrera-2); }

/* --- Panel de ajustes ----------------------------------------
   Lo que es sí/no va con interruptor; lo que es elegir uno entre
   pocos va con fichas. Ningún desplegable: en el celular abren una
   rueda del sistema que tapa media pantalla. */
.cfg { padding: 18px 16px; display: flex; flex-direction: column; gap: 16px; }
.cfg-bloque { display: flex; flex-direction: column; gap: 9px; }
.cfg-bloque > label,
.cfg-rot {
  font-size: .71rem; text-transform: uppercase; letter-spacing: .09em;
  color: var(--tenue); font-weight: 720;
}
.cfg-fichas { display: flex; gap: 8px; flex-wrap: wrap; }
.cfg-ficha {
  padding: 9px 15px; border-radius: 999px; font-size: .85rem; font-weight: 620;
  background: var(--vidrio); border: 1px solid var(--borde); color: var(--tenue);
  transition: transform .25s var(--resorte), border-color .2s, color .2s, background .2s;
}
.cfg-ficha:hover { color: var(--texto); border-color: var(--borde-alto); transform: translateY(-2px); }
.cfg-ficha[aria-pressed="true"] {
  background: color-mix(in srgb, var(--mat) 20%, transparent);
  border-color: color-mix(in srgb, var(--mat) 62%, transparent);
  color: var(--texto);
  box-shadow: 0 0 18px color-mix(in srgb, var(--mat) 20%, transparent);
}
/* En el celular "3K1 · Aula 302" no entra en media columna. */
.cfg-2 { display: grid; grid-template-columns: 1fr; gap: 12px; }
@media (min-width: 460px) { .cfg-2 { grid-template-columns: 1fr 1fr; } }

@media (min-width: 560px) {
  .bento { grid-template-columns: 1fr 1fr; padding: 18px; }
  .bento-full { grid-column: 1 / -1; }
}
/* ============================================================
   Rediseño Agenda Académica (Timeline + Puntos de Alerta)
   ============================================================ */
.agenda-cab {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin: 24px 0 18px;
}
.agenda-tit h1 { font-size: 1.6rem; font-weight: 800; letter-spacing: -0.03em; }
.agenda-tit p { font-size: 0.88rem; color: var(--tenue); margin-top: 2px; }

/* Navegación Semanal */
.nav-semana {
  display: flex; align-items: center; justify-content: space-between;
  background: var(--vidrio); border: 1px solid var(--borde);
  border-radius: var(--r-sm); padding: 8px 14px; margin-bottom: 20px;
}
.btn-nav-sem { background: none; border: none; color: var(--texto); font-size: 1.2rem; cursor: pointer; padding: 2px 8px; }
.txt-sem { font-size: 0.88rem; font-weight: 700; }

/* La tira de días (.tira-dias, .dia-card, .badge-dia, .puntos-evento,
   .dot) se fue con la grilla de la semana: la reemplazó
   ui.semanaGrilla(), que además de dejarte elegir el día te muestra a
   qué hora entrás. Sus reglas se borraron acá para que nadie las
   herede sin querer. */

/* Timeline y Eventos */
.timeline-container { position: relative; padding-left: 54px; margin-top: 10px; }
.timeline-container::before {
  content: ""; position: absolute; left: 44px; top: 0; bottom: 0; width: 1px; background: var(--borde);
}
.hora-label {
  position: absolute; left: 0; font-size: 0.75rem; color: var(--debil); font-variant-numeric: tabular-nums;
  transform: translateY(-50%);
}

.bloque-tarjeta {
  background: var(--vidrio); border: 1px solid var(--borde);
  border-left: 4px solid var(--mat-color, var(--carrera));
  border-radius: 16px; padding: 16px; margin-bottom: 16px;
  backdrop-filter: blur(12px);
}
.bloque-tarjeta.destacado-parcial {
  background: linear-gradient(135deg, color-mix(in srgb, var(--riesgo) 18%, transparent), var(--vidrio));
  border-color: color-mix(in srgb, var(--riesgo) 40%, transparent);
}
.tag-examen {
  display: inline-block; font-size: 0.68rem; font-weight: 800; text-transform: uppercase;
  color: #fca5a5; background: rgba(217, 95, 87, 0.25); padding: 2px 8px; border-radius: 6px; margin-bottom: 8px;
}
.bloque-tarjeta h3 { font-size: 1rem; font-weight: 750; margin-bottom: 4px; }
.bloque-tarjeta p { font-size: 0.82rem; color: var(--tenue); margin: 0; }

/* Indicador AHORA */
.indicador-ahora {
  position: relative; margin: 20px 0 20px -10px; height: 2px;
  background: var(--riesgo); box-shadow: 0 0 10px var(--riesgo);
}
.indicador-ahora::after {
  content: "AHORA"; position: absolute; right: 0; top: -16px;
  font-size: 0.65rem; font-weight: 800; color: var(--riesgo); letter-spacing: 0.08em;
}

/* ============================================================
   Navegación Semanal Opción 1 (Cápsula Neumórfica Centrada)
   ============================================================ */
.nav-semana-v1 {
  display: flex;
  justify-content: center;
  margin-bottom: 24px;
}

.nav-capsula-v1 {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: rgba(20, 24, 36, 0.7);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border: 1px solid var(--borde);
  border-radius: 999px;
  padding: 6px 14px;
  box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4);
}

/* Botones Flecha (Chevrons) */
.btn-chevron {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid var(--borde);
  color: var(--texto);
  display: grid;
  place-items: center;
  cursor: pointer;
  transition: all 0.2s cubic-bezier(0.34, 1.4, 0.5, 1);
  outline: none;
  padding: 0;
}

.btn-chevron:hover {
  background: rgba(255, 255, 255, 0.15);
  border-color: var(--carrera);
  color: var(--carrera-2);
  transform: scale(1.08);
}

.btn-chevron svg {
  width: 16px;
  height: 16px;
  stroke: currentColor;
  fill: none;
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* Botón de Fecha Transparente */
.date-picker-wrap {
  position: relative;
  display: flex;
  align-items: center;
  gap: 8px;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid var(--borde);
  padding: 6px 14px;
  border-radius: 999px;
  cursor: pointer;
  transition: border-color 0.2s ease, background 0.2s ease;
}

.date-picker-wrap:hover {
  border-color: var(--carrera);
  background: rgba(255, 255, 255, 0.1);
}

.date-picker-wrap input[type="date"] {
  position: absolute;
  inset: 0;
  opacity: 0;
  width: 100%;
  height: 100%;
  cursor: pointer;
}

.date-picker-wrap span {
  font-size: 0.85rem;
  font-weight: 700;
  color: var(--texto);
}

.date-picker-wrap svg {
  width: 15px;
  height: 15px;
  stroke: var(--tenue);
  fill: none;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* Chip "Hoy" con Punto Pulsante */
.chip-hoy-v1 {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: rgba(86, 176, 106, 0.15);
  border: 1px solid rgba(86, 176, 106, 0.4);
  color: var(--ok);
  font-size: 0.72rem;
  font-weight: 800;
  padding: 5px 12px;
  border-radius: 999px;
  cursor: pointer;
  transition: all 0.2s ease;
  outline: none;
}

.chip-hoy-v1:hover {
  background: var(--ok);
  color: #000;
}

.dot-pulsante {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--ok);
  box-shadow: 0 0 8px var(--ok);
  animation: pulso 1.8s infinite;
}

@keyframes pulso {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.3; }
}

/* ============================================================
   Modal Calendario Mensual Interactivo
   ============================================================ */
.cal-popover { padding: 4px 0; }

.cal-hdr {
  display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px;
}
.cal-hdr strong { font-size: 1.15rem; font-weight: 800; letter-spacing: -0.02em; }

.cal-btn-nav {
  flex-shrink: 0;
}

.cal-dias-semana {
  display: grid; grid-template-columns: repeat(7, 1fr);
  text-align: center; font-size: 0.72rem; font-weight: 800; color: var(--debil); margin-bottom: 10px;
}

.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }

.cal-dia {
  position: relative; aspect-ratio: 1; background: rgba(255, 255, 255, 0.03);
  border: 1px solid var(--borde); border-radius: 12px; color: var(--texto);
  font-size: 0.9rem; font-weight: 700; cursor: pointer; display: flex;
  flex-direction: column; align-items: center; justify-content: center;
  transition: all 0.2s cubic-bezier(0.34, 1.4, 0.5, 1); padding: 0;
}
.cal-dia:hover {
  background: rgba(255, 255, 255, 0.12); border-color: var(--carrera); transform: scale(1.08);
}
.cal-dia.hoy {
  border-color: var(--ok); color: var(--ok); background: rgba(86, 176, 106, 0.12);
}
.cal-dia.sel {
  background: var(--carrera); color: #1a0a02; border-color: var(--carrera-2);
  box-shadow: 0 0 16px color-mix(in srgb, var(--carrera) 50%, transparent);
}
.cal-dia.feriado {
  background: #dc2626;
  border-color: #ef4444;
  color: #ffffff;
}

.cal-dia.feriado:hover {
  background: #ef4444;
  border-color: #f87171;
  transform: scale(1.08);
}
/* Los puntos estaban en position:absolute SIN left, así que los dos
   —parcial y clase— caían exactamente en el mismo lugar y el segundo
   tapaba al primero. Como el de clase se dibuja después, el del parcial
   no se veía nunca en un día con cursado. Ahora los ordena el flex del
   contenedor, que para eso estaba. */
.cal-dots-wrap {
  display: flex; gap: 3px; justify-content: center;
  position: absolute; left: 0; right: 0; bottom: 4px;
}
.cal-dot { width: 4px; height: 4px; border-radius: 50%; background: var(--riesgo); }
/* Tener clase es el día normal: va en gris y no compite. El color se lo
   quedan las cosas que te cambian el día. Con --carrera el punto de
   clase y el de examen quedaban en dos naranjas casi iguales, que a
   4px es lo mismo que no distinguirlos. */
.cal-dot.examen  { background: var(--riesgo); }
.cal-dot.entrega { background: var(--media); }
.cal-dot.clase   { background: var(--tenue); }
.cal-dia.sel .cal-dot { background: #1a0a02; }

/* Un examen no es "un tipo de día" como el feriado: es algo que pasa
   ESE día. Por eso va de contorno y no de relleno — un segundo rojo
   pleno al lado del feriado sería justo lo que no se distingue de un
   vistazo. Además así sobrevive a que el día esté elegido o sea hoy,
   que pisan el fondo. */
.cal-dia.con-examen {
  border-color: var(--riesgo);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--riesgo) 45%, transparent);
}
/* La entrega es una fecha límite, no un examen: mismo contorno, ámbar. */
.cal-dia.con-entrega {
  border-color: var(--media);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--media) 45%, transparent);
}

.cal-dia.con-examen::after,
.cal-dia.con-entrega::after {
  content: ''; position: absolute; top: 4px; right: 4px;
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--riesgo); box-sizing: border-box;
}
.cal-dia.con-entrega::after { background: var(--media); }

/* Recuperatorio solo: el mismo rojo, pero hueco. No es menos que un
   parcial —muchas veces es peor—, así que no se le baja el color: lo
   que cambia es que es la segunda vuelta, y eso se lee en la forma. */
.cal-dia.solo-recup::after {
  background: none; border: 1.5px solid var(--riesgo);
}

/* En el feriado no hace falta: no hay exámenes en un día sin clases. */
.cal-dia.feriado.con-examen,
.cal-dia.feriado.con-entrega { box-shadow: none; }

/* --- Estilos de Feriados --- */
.banner-feriado-dia {
  display: flex; align-items: center; gap: 10px;
  background: rgba(244, 63, 94, 0.12); border: 1px solid rgba(244, 63, 94, 0.35);
  border-radius: 14px; padding: 12px 16px; margin-bottom: 16px;
  color: #fca5a5; font-size: 0.88rem; font-weight: 600;
}

.banner-feriado-prox {
  display: flex; align-items: center; justify-content: space-between;
  background: rgba(255, 255, 255, 0.03); border: 1px solid var(--borde);
  border-radius: 12px; padding: 8px 14px; margin-top: 20px;
  font-size: 0.78rem; color: var(--tenue);
}

/* ============================================================
   Sección de Cuentas y Sincronización (Google + Autogestión)
   ============================================================ */
.tarjeta-cuenta {
  background: var(--vidrio);
  border: 1px solid var(--borde);
  border-radius: var(--r);
  padding: 20px;
  margin-bottom: 20px;
  backdrop-filter: blur(16px);
}

.cuenta-hdr {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 14px;
}

.cuenta-tit {
  display: flex;
  align-items: center;
  gap: 10px;
}

.cuenta-tit h3 {
  font-size: 1.05rem;
  font-weight: 750;
  margin: 0;
}

.badge-seguridad {
  display: flex;
  align-items: center;
  gap: 8px;
  background: rgba(86, 176, 106, 0.12);
  border: 1px solid rgba(86, 176, 106, 0.3);
  color: var(--ok);
  font-size: 0.76rem;
  padding: 8px 12px;
  border-radius: 12px;
  margin-top: 14px;
}

.campo-credencial {
  margin-top: 12px;
}

.campo-credencial label {
  display: block;
  font-size: 0.8rem;
  color: var(--tenue);
  margin-bottom: 6px;
  font-weight: 600;
}

.btn-vincular {
  background: var(--carrera);
  color: #1a0a02;
  font-weight: 700;
  border: none;
  padding: 9px 16px;
  border-radius: 999px;
  font-size: 0.85rem;
  cursor: pointer;
  transition: transform 0.2s ease;
}

.btn-vincular:hover {
  transform: translateY(-2px);
}

/* ============================================================
   Buzón de Avisos de Cátedra (Notificaciones de Autogestión)
   ============================================================ */
.pos-rel { position: relative; }

/* El punto de la campana no está siempre: aparece cuando hay avisos sin
   leer y late. Verde, el mismo del "nuevo" de la lista, para que se lean
   como la misma cosa. Lo prende js/views/avisos.js. */
.dot-aviso {
  position: absolute; top: 3px; right: 3px;
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--ok); box-shadow: 0 0 8px var(--ok);
  display: none;
}
.dot-aviso.hay { display: block; animation: latido-nuevo 1.6s ease-in-out infinite; }

@media (prefers-reduced-motion: reduce) {
  .dot-aviso.hay { animation: none; }
}

.aviso-item {
  background: var(--vidrio); border: 1px solid var(--borde);
  border-radius: 14px; padding: 14px 16px; margin-bottom: 12px;
  border-left: 3px solid var(--mat, var(--carrera));
}

/* La fecha no se parte nunca: es corta y sirve de ancla a la derecha.
   Lo que cede es el nombre de la materia, que puede ir a dos renglones. */
.aviso-hdr {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 10px; margin-bottom: 6px;
}
.aviso-materia {
  font-weight: 750; font-size: 0.92rem; color: var(--texto); min-width: 0;
  display: flex; align-items: center; gap: 8px;
}
.aviso-fecha { font-size: 0.72rem; color: var(--debil); white-space: nowrap; flex-shrink: 0; }

/* El docente, abajo y en chico: importa quién lo dijo, pero primero de
   qué materia es. */
.aviso-de {
  font-size: 0.73rem; color: var(--debil); margin: -2px 0 7px 16px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* Los docentes pegan links de Drive y de Zoom sin cortar, de 200
   caracteres. Sin esto empujan la tarjeta y desbordan la pantalla. */
.aviso-texto {
  font-size: 0.85rem; color: var(--tenue); line-height: 1.45;
  overflow-wrap: anywhere; white-space: pre-line;
}
.aviso-texto a { color: var(--mat, var(--carrera)); }

/* Plegado: los avisos largos se cortan a cuatro renglones con un
   degradado que insinúa que sigue. Nada de max-height fijo, que corta
   una letra por la mitad. */
.aviso-texto.plegado {
  display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical;
  overflow: hidden;
}
/* Toda tarjeta abre el aviso completo en un modal, como una materia. */
.aviso-item.es-abrible { cursor: pointer; transition: border-color .15s, transform .15s; }
.aviso-item.es-abrible:hover { border-color: var(--mat, var(--carrera)); }

/* El aviso abierto: sin recortes y con el texto más grande, que es todo
   el punto de abrirlo. */
.av-detalle-cab {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 10px; padding-bottom: 10px; margin-bottom: 12px;
  border-bottom: 1px solid var(--borde);
}
.av-detalle-profe { font-weight: 750; font-size: 0.9rem; color: var(--mat, var(--carrera)); }
.av-detalle-txt {
  font-size: 0.94rem; line-height: 1.6; color: var(--texto);
  overflow-wrap: anywhere; white-space: pre-line;
}
.av-detalle-txt a { color: var(--mat, var(--carrera)); }

/* El "nuevo" es verde porque es el color de lo que está bien, y late
   para que lo encuentres sin leer: es lo único de la pantalla que se
   mueve. */
.av-nuevo {
  display: inline-block; margin-left: 8px; vertical-align: 1px;
  background: var(--ok); color: #06120c;
  font-size: 0.6rem; font-weight: 850; letter-spacing: 0.04em;
  text-transform: uppercase; padding: 2px 7px; border-radius: 999px;
  animation: latido-nuevo 1.6s ease-in-out infinite;
}
.aviso-item.es-nuevo { border-color: color-mix(in srgb, var(--ok) 45%, var(--borde)); }
.av-nuevos-n { color: var(--ok); font-weight: 750; }

@keyframes latido-nuevo {
  0%, 100% { opacity: 1;    box-shadow: 0 0 0 0 color-mix(in srgb, var(--ok) 55%, transparent); }
  50%      { opacity: 0.72; box-shadow: 0 0 0 5px color-mix(in srgb, var(--ok) 0%, transparent); }
}

/* Si pediste menos movimiento, el verde queda igual pero quieto. */
@media (prefers-reduced-motion: reduce) {
  .av-nuevo { animation: none; }
}

/* ---- Filtro por materia ---- */
.av-resumen { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 18px; }
.av-chip {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer;
  background: var(--vidrio); border: 1px solid var(--borde); color: var(--tenue);
  border-radius: 999px; padding: 7px 13px; font-size: 0.8rem; font-weight: 650;
  font-family: inherit; transition: border-color .15s, color .15s;
}
.av-chip:hover,
.av-chip[aria-pressed="true"] { color: var(--texto); border-color: var(--mat, var(--carrera)); }
.av-punto { width: 8px; height: 8px; border-radius: 50%; background: var(--mat, var(--carrera)); flex-shrink: 0; }
.av-chip .n { color: var(--debil); font-weight: 600; }

/* "Todas" no es una materia: sin punto de color y con el naranja de la
   carrera cuando está elegida. */
.av-chip.es-todas { --mat: var(--carrera); }

/* Lo que no hace falta tocar nunca, plegado y sin llamar la atención. */
.avanzado { margin-top: 14px; }
/* El display del summary NO se toca: si deja de ser list-item, Chrome
   pierde el plegado y el contenido queda a la vista con el details
   cerrado. El marcador se saca con list-style, no con display. */
.avanzado > summary {
  cursor: pointer; font-size: 0.76rem; color: var(--debil);
  list-style: none; padding: 4px 0; width: fit-content;
}
.avanzado > summary::-webkit-details-marker { display: none; }
.avanzado > summary::before {
  content: '▸'; display: inline-block; margin-right: 6px;
  font-size: 0.7rem; transition: transform .15s;
}
.avanzado[open] > summary::before { transform: rotate(90deg); }
.avanzado > summary:hover { color: var(--tenue); }

/* Un renglón sobre la lista: o está buscando, o el puente falló y estás
   viendo la copia guardada. */
.av-nota {
  font-size: 0.78rem; color: var(--debil); margin: -6px 2px 14px;
}
.av-nota.es-falla { color: var(--media); }

.av-adj {
  display: inline-flex; align-items: center; gap: 8px; margin-top: 10px;
  background: rgba(255,255,255,.04); border: 1px solid var(--borde);
  border-radius: 10px; padding: 7px 11px; font-size: 0.76rem; color: var(--tenue);
  max-width: 100%;
}
.av-adj .nom { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.av-adj .pdf {
  background: rgba(192,57,43,.12); color: #e07a6e; font-size: 0.6rem;
  font-weight: 800; padding: 2px 5px; border-radius: 4px; flex-shrink: 0;
}

/* En el modal el adjunto es un botón: bajarlo es un login entero contra
   Autogestión, así que se hace sólo si lo pedís. */
.av-adj.es-bajable {
  cursor: pointer; font-family: inherit;
  transition: border-color .15s, color .15s;
}
.av-adj.es-bajable:hover { border-color: var(--mat, var(--carrera)); color: var(--texto); }
.av-adj.es-bajable:disabled { opacity: .6; cursor: progress; }
.av-adj .baja {
  margin-left: 4px; padding-left: 9px; border-left: 1px solid var(--borde);
  color: var(--mat, var(--carrera)); font-weight: 700; flex-shrink: 0;
}

/* ============================================================
   Vista "Hoy" — Bento Grid
   Saludo a lo ancho, destacado a lo ancho, y abajo dos columnas.
   ============================================================ */

.bento-view { display: flex; flex-direction: column; gap: 18px; }

/* .destacado trae su propio margen de abajo para cuando vive en
   otra pantalla; acá el espacio lo pone el gap y sumaban los dos. */
.bento-view > .destacado { margin-bottom: 0; }

/* --- Franja de saludo --- */
.bento-saludo {
  display: flex; flex-direction: column; align-items: flex-start;
  justify-content: space-between; gap: 16px;
  padding: 22px 24px; border-radius: var(--r-lg);
  background:
    linear-gradient(135deg,
      color-mix(in srgb, var(--carrera) 14%, transparent) 0%,
      color-mix(in srgb, var(--media) 6%, transparent) 52%,
      rgba(143, 127, 232, .11) 100%),
    var(--vidrio);
  border: 1px solid var(--borde);
}
@media (min-width: 760px) {
  .bento-saludo { flex-direction: row; align-items: center; }
}

.saludo-txt { min-width: 0; }
.saludo-meta { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.bento-saludo h2 { font-size: 1.55rem; letter-spacing: -.03em; }
.bento-saludo .sub { font-size: .89rem; color: var(--tenue); margin-top: 3px; }
.fecha-txt { font-size: .74rem; color: var(--debil); font-weight: 600; }

.racha-box {
  display: flex; align-items: center; gap: 9px; flex-shrink: 0;
  padding: 9px 14px; border-radius: var(--r-sm);
  background: var(--vidrio); border: 1px solid var(--borde);
  font-size: .78rem; font-weight: 600; white-space: nowrap;
}
.punto-vivo {
  width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
  background: var(--ok); box-shadow: 0 0 8px var(--ok);
}
.racha-box.apagada { color: var(--debil); }
.racha-box.apagada .punto-vivo { background: var(--inerte); box-shadow: none; }

/* --- La grilla de dos columnas ---
   7/5 como la maqueta. Recién a 1000px: más abajo, la columna
   angosta deja los ítems del semáforo en dos renglones. */
.bento-grid { display: grid; grid-template-columns: 1fr; gap: 18px; align-items: start; }
@media (min-width: 1000px) {
  .bento-grid { grid-template-columns: 7fr 5fr; }
}
.col-principal, .col-lateral {
  display: flex; flex-direction: column; gap: 18px; min-width: 0;
}

/* --- Personalizar Hoy: ocultar y reordenar las tarjetas -----
   Un solo gesto (arrastrar del asa) reemplaza subir/bajar/cambiar de
   columna: agarrás y soltás donde quieras, cruzando de columna
   incluido. Nada de HTML5 Drag & Drop —no anda bien en el celular—,
   es Pointer Events a mano en js/views/hoy.js. */
.hoy-barra-widgets { margin: 24px 0 14px; }

.panel-editando {
  outline: 2px dashed color-mix(in srgb, var(--carrera) 45%, transparent);
  outline-offset: 4px;
}
.wtools {
  display: flex; align-items: center; gap: 6px;
  margin: -2px 0 14px; padding-top: 12px;
  border-top: 1px dashed var(--borde);
}
.wbtn {
  width: 30px; height: 30px; border-radius: 10px; flex-shrink: 0;
  display: grid; place-items: center;
  background: var(--vidrio); border: 1px solid var(--borde); color: var(--tenue);
  cursor: pointer; transition: background .2s, border-color .2s, color .2s;
}
.wbtn svg { width: 15px; height: 15px; }
.wbtn:hover:not(:disabled) { background: var(--vidrio-alto); border-color: var(--borde-alto); color: var(--texto); }
.wbtn:active:not(:disabled) { transform: scale(.93); }
.wbtn:disabled { opacity: .3; cursor: default; }
.wbtn-ocultar {
  /* .wbtn es grid a propósito, para centrar un solo ícono — pero acá
     adentro van dos hijos (ícono + texto) y grid sin flow explícito
     los apila en filas en vez de ponerlos en línea. */
  width: auto; display: inline-flex; align-items: center; justify-content: center;
  padding: 0 12px; gap: 6px; font-size: .74rem; font-weight: 650;
}
/* 40px y no los 30 del resto de los .wbtn: es la que hay que sostener
   con el dedo mientras arrastrás, y ahí el margen de error importa
   más que en un botón de tocar-y-soltar. 44px es lo que recomiendan
   Apple y Google como mínimo; se queda cerca sin agrandar la fila. */
.wgrip { width: 40px; height: 40px; cursor: grab; touch-action: none; }
.wgrip:active { cursor: grabbing; }

/* El hueco mientras arrastrás reusa .placeholder-arrastre (ya definida
   para tareas y notas, más arriba) — mismo dibujo punteado, no hace
   falta uno nuevo. body.hay-arrastre también se reusa tal cual.

   La tarjeta que estás agarrando SÍ necesita su propia regla: es un
   `.tarjeta`, no un `.item`, y son bastante más grandes — mismo
   fundamento que `.item.arrastrando` (pointer-events:none para que
   elementFromPoint "vea a través" de ella). */
.tarjeta.arrastrando {
  position: fixed; z-index: 60; margin: 0; pointer-events: none;
  box-shadow: 0 34px 70px -20px rgba(0,0,0,.9), inset 0 1px 0 rgba(255,255,255,.14);
  transform: scale(1.015) rotate(-.4deg);
}

.col-vacia {
  border: 1.5px dashed var(--borde); border-radius: var(--r);
  padding: 4px 14px;
}

.bandeja-ocultos {
  display: flex; flex-wrap: wrap; align-items: center; gap: 9px;
  margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--borde);
}
.chip-oculto {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 7px 13px; border-radius: 999px; font-size: .8rem; font-weight: 620;
  background: var(--vidrio); border: 1px solid var(--borde); color: var(--tenue);
  cursor: pointer; transition: background .2s, border-color .2s, color .2s;
}
.chip-oculto svg { width: 14px; height: 14px; }
.chip-oculto:hover { background: var(--vidrio-alto); color: var(--texto); border-color: var(--borde-alto); }

/* --- Panel: una .tarjeta con cabecera propia ---
   Los paneles son hermanos de un flex con gap; el margin-top que
   .seccion trae de la navegación normal acá desalineaba las dos
   columnas 30px. */
/* El overflow:hidden que hereda de .tarjeta se queda: además del
   reflejo interno, es lo que recorta el backdrop-filter al radio.
   Liberarlo le pinta a la tarjeta un rectángulo de fondo desenfocado
   que asoma por las esquinas y se ve cuadrada.
   El halo de los ítems no lo necesita: su resplandor se extiende
   7px (offset 8 + blur 22/2 − spread 12) y el panel tiene 20 de
   padding, así que cae adentro. Ver --halo. */
.panel { padding: 20px; margin-top: 0; }
.panel-cab {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 12px; margin-bottom: 14px;
}
.panel-tit { min-width: 0; }
.panel-tit h3 {
  display: flex; align-items: center; gap: 8px;
  font-size: .98rem; font-weight: 700; letter-spacing: -.01em;
}
.panel-tit h3 .ico { color: var(--carrera-2); flex-shrink: 0; }
.panel-sub { font-size: .76rem; color: var(--debil); margin-top: 3px; }
.panel-nota { font-size: .76rem; color: var(--debil); margin: -6px 0 10px; }

.pildora-cuenta {
  flex-shrink: 0; font-size: .72rem; font-weight: 600; color: var(--tenue);
  padding: 4px 11px; border-radius: 99px;
  background: rgba(255, 255, 255, .05); border: 1px solid var(--borde);
}

.marca-autoguardado {
  display: inline-flex; align-items: center; gap: 5px; flex-shrink: 0;
  font-size: .72rem; font-weight: 600; color: var(--ok);
}

/* --- Progreso académico: cuatro números, dos por fila ---
   Nunca cuatro en una fila: en la columna angosta cada celda
   quedaba en 97px y el contenido se desbordaba. */
.rejilla-metricas { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
/* Mientras la grilla va en una sola columna el panel es ancho y dos
   chips por fila dejan cada número flotando en 330px de vacío. */
@media (min-width: 620px) and (max-width: 999px) {
  .rejilla-metricas { grid-template-columns: repeat(4, 1fr); }
}
.metrica-chip {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3px; padding: 15px 10px; text-align: center;
  border-radius: var(--r-sm);
  background: rgba(255, 255, 255, .045); border: 1px solid var(--borde);
  transition: border-color .2s, background .2s;
}
.metrica-chip:hover {
  background: rgba(255, 255, 255, .07);
  border-color: color-mix(in srgb, var(--mat) 45%, transparent);
}
.metrica-chip b {
  font-size: 1.5rem; font-weight: 780; letter-spacing: -.035em;
  font-variant-numeric: tabular-nums; color: var(--mat);
  line-height: 1.1;
}
.metrica-chip span { font-size: .72rem; font-weight: 600; color: var(--tenue); }

/* Las tres del historial son un filtro, no un cartel: hay que verlas
   apretables y hay que ver cuál está puesta. */
.rejilla-metricas.rejilla-3 { grid-template-columns: repeat(3, 1fr); }
.chip-filtro { cursor: pointer; }
.chip-filtro:active { transform: scale(.97); }
.chip-filtro[aria-pressed="true"] {
  background: color-mix(in srgb, var(--mat) 13%, transparent);
  border-color: color-mix(in srgb, var(--mat) 55%, transparent);
  box-shadow: 0 0 20px -6px color-mix(in srgb, var(--mat) 70%, transparent);
}
.chip-filtro[aria-pressed="true"] span { color: var(--texto); }

/* --- Semáforo de exámenes --- */
.lista-semaforo { display: flex; flex-direction: column; gap: 9px; }
.item-semaforo {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 11px 14px; border-radius: var(--r-sm);
  background: color-mix(in srgb, var(--tono) 9%, transparent);
  border: 1px solid color-mix(in srgb, var(--tono) 26%, transparent);
}
.item-semaforo[data-tono="ok"]     { --tono: var(--ok); }
.item-semaforo[data-tono="media"]  { --tono: var(--media); }
.item-semaforo[data-tono="riesgo"] { --tono: var(--riesgo); }
.item-semaforo .titulo { font-size: .87rem; font-weight: 650; }
.item-semaforo .meta { font-size: .74rem; color: var(--debil); margin-top: 2px; }
.item-semaforo .insignia { flex-shrink: 0; }

/* --- Historial de exámenes: el extracto, el más nuevo arriba --- */
.hist-lista { display: flex; flex-direction: column; gap: 8px; }
.hist-anio {
  font-size: .74rem; font-weight: 700; color: var(--debil);
  text-transform: uppercase; letter-spacing: .07em;
  margin: 16px 0 2px;
}
.hist-anio:first-child { margin-top: 0; }
.hist-item {
  display: flex; align-items: center; gap: 12px; width: 100%;
  padding: 11px 14px; border-radius: var(--r-sm); text-align: left;
  background: color-mix(in srgb, var(--tono) 8%, transparent);
  border: 1px solid color-mix(in srgb, var(--tono) 22%, transparent);
  border-left: 3px solid var(--mat);
}
.hist-item[data-tono="ok"]     { --tono: var(--ok); }
.hist-item[data-tono="riesgo"] { --tono: var(--riesgo); }
.hist-item:disabled { cursor: default; }
.hist-item:not(:disabled):hover { background: color-mix(in srgb, var(--tono) 14%, transparent); }
.hist-txt { flex: 1; min-width: 0; }
.hist-mat { font-size: .87rem; font-weight: 650; }
.hist-fecha { font-size: .74rem; color: var(--debil); margin-top: 2px; }
.hist-nota {
  flex-shrink: 0; font-size: 1.15rem; font-weight: 780;
  font-variant-numeric: tabular-nums; color: var(--tono);
  min-width: 30px; text-align: center;
}

/* --- Cabecera del destacado --- */
.destacado-cab {
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px; margin-bottom: 4px;
}
.destacado-cab .etiqueta { display: inline-flex; align-items: center; gap: 6px; }
.destacado-cab .etiqueta .ico { color: var(--mat); }

/* --- Píldora de saludo y colores sueltos --- */
.badge-brand {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: .72rem; font-weight: 700; padding: 4px 11px; border-radius: 99px;
  background: color-mix(in srgb, var(--carrera) 16%, transparent);
  color: var(--carrera-2);
  border: 1px solid color-mix(in srgb, var(--carrera) 32%, transparent);
}
.txt-blanco { color: var(--texto); }
.txt-media  { color: var(--media); }
.txt-ok     { color: var(--ok); }

/* El acceso directo del saludo: se lee igual que el <strong> que
   reemplaza (mismo peso, mismo color), pero es un botón. El subrayado
   sólo aparece al pasar el mouse o enfocarlo, así en reposo no parece
   un link roto en medio de la frase. */
.ancla-resumen {
  font: inherit; font-weight: 700; background: none; border: none; padding: 0;
  cursor: pointer; text-underline-offset: 3px; text-decoration: color-mix(in srgb, currentColor 45%, transparent);
}
.ancla-resumen:hover, .ancla-resumen:focus-visible { text-decoration: underline; }

/* Los íconos en línea heredan el color del texto que los rodea y
   no arrastran el renglón hacia abajo. */
.ico { vertical-align: -.14em; flex-shrink: 0; }

@media (max-width: 560px) {
  .bento-saludo { padding: 18px; }
  .bento-saludo h2 { font-size: 1.32rem; }
  .panel { padding: 16px; }
  .racha-box { width: 100%; justify-content: center; }

  /* En 375px, una fila de tarea es casilla + texto + insignia +
     editar + borrar: al texto le quedaban 53px y el título salía
     en ocho renglones. Se le reserva más de medio renglón y las
     acciones bajan solas al de abajo. */
  .panel .item { flex-wrap: wrap; row-gap: 8px; }
  .panel .item .item-txt { flex: 1 1 55%; }
  .panel .item .btn-fantasma:first-of-type { margin-left: auto; }

  /* El botón de la cabecera partía "+ Agre / gar" en dos. */
  .panel-cab .btn { white-space: nowrap; }

  /* Con la píldora al lado, "Semáforo de exámenes" caía en dos
     renglones y descolgaba la cabecera del panel. */
  .panel-tit h3 { font-size: .91rem; }
}

/* ============================================================
   Material — carpetas
   Las de materia y unidad se calculan al vuelo; las propias las
   arma el estudiante. Ver js/views/biblioteca.js.
   ============================================================ */

.carp-modos {
  display: flex; gap: 6px; width: max-content; max-width: 100%;
  background: var(--vidrio); border: 1px solid var(--borde);
  border-radius: 999px; padding: 4px; margin: 14px 0 16px;
}
.carp-modos button {
  background: none; border: 0; color: var(--tenue); font-family: inherit;
  font-size: .8rem; font-weight: 650; padding: 7px 15px; border-radius: 999px;
  cursor: pointer; white-space: nowrap;
  transition: background .15s, color .15s;
}
.carp-modos button:hover { color: var(--texto); }
.carp-modos button[aria-pressed="true"] { background: var(--carrera); color: #0b0d12; }

.carp-miga {
  display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
  font-size: .82rem; color: var(--debil); margin-bottom: 14px; min-height: 22px;
}
.carp-miga button {
  background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--tenue); font-family: inherit; font-size: .82rem; font-weight: 650;
}
.carp-miga button:hover { color: var(--texto); }
.carp-miga .sep { opacity: .5; }
.carp-miga .actual { color: var(--texto); font-weight: 700; }

/* El halo se sale del borde: sin este padding/margin, la rejilla lo
   recortaría en cuadrado. Ver CLAUDE.md → "El halo". */
.carp-rejilla {
  display: grid; gap: 11px; grid-template-columns: repeat(2, 1fr);
  padding: var(--halo); margin: calc(var(--halo) * -1) calc(var(--halo) * -1) 8px;
}
/* Con la tapa, tres columnas fijas daban tarjetas enormes en un
   monitor ancho. Con auto-fill entran las que quepan. */
@media (min-width: 620px) {
  .carp-rejilla { grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); }
}

.carpeta {
  position: relative; cursor: pointer; color: var(--texto);
  background: var(--vidrio); border: 1px solid var(--borde); border-radius: 16px;
  overflow: hidden; display: flex; flex-direction: column;
  transition: border-color .18s, transform .28s cubic-bezier(.34,1.4,.5,1), box-shadow .28s;
}
.carpeta:hover {
  transform: translateY(-3px);
  border-color: color-mix(in srgb, var(--mat, var(--carrera)) 55%, transparent);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--mat, var(--carrera)) 40%, transparent),
              0 14px 34px -18px var(--mat, var(--carrera));
}

/* La tapa: el mosaico de lo que hay adentro, el emoji elegido, o el
   ícono si está vacía. */
.carp-tapa {
  position: relative; width: 100%; aspect-ratio: 16 / 9;
  background: color-mix(in srgb, var(--mat, var(--carrera)) 9%, transparent);
  border-bottom: 1px solid var(--borde);
  display: grid; place-items: center; overflow: hidden;
}
.carp-mosaico {
  display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr;
  gap: 2px; width: 100%; height: 100%; padding: 8px;
}
.carp-mosaico > span {
  border-radius: 6px; overflow: hidden; display: grid; place-items: center;
  background: color-mix(in srgb, var(--mat, var(--carrera)) 14%, rgba(0,0,0,.25));
  font-size: .5rem; font-weight: 800; letter-spacing: .02em;
  color: var(--mat, var(--carrera));
}
.carp-mosaico img { width: 100%; height: 100%; object-fit: cover; }
.carp-mosaico .mas { color: var(--tenue); font-weight: 700; font-size: .62rem; }
.carp-emoji { font-size: 2.4rem; line-height: 1; }
.carp-vacia { color: color-mix(in srgb, var(--mat, var(--carrera)) 55%, transparent); }
.carp-vacia .carp-icono { width: 34px; height: 34px; }

.carp-pie { padding: 11px 13px 12px; display: flex; flex-direction: column; gap: 3px; }
.carp-icono { width: 30px; height: 30px; color: var(--mat, var(--carrera)); }
.carp-nom { font-size: .9rem; font-weight: 700; line-height: 1.25; letter-spacing: -.01em; }
.carp-cnt { font-size: .72rem; color: var(--debil); }
.carp-barra {
  position: absolute; left: 0; right: 0; bottom: 0; height: 2px;
  background: var(--mat, var(--carrera)); opacity: .6;
}

/* Fichas del emoji y del color, en el modal de personalizar. */
.chapas { display: flex; flex-wrap: wrap; gap: 6px; }
.chapa {
  min-width: 40px; height: 40px; padding: 0 10px; border-radius: 11px; cursor: pointer;
  background: var(--vidrio); border: 1px solid var(--borde); color: var(--tenue);
  font-family: inherit; font-size: 1.15rem; line-height: 1;
  display: grid; place-items: center;
  transition: border-color .15s, box-shadow .15s, color .15s;
}
.chapa:hover { color: var(--texto); border-color: var(--tenue); }
.chapa[aria-pressed="true"] {
  border-color: var(--carrera); color: var(--texto);
  box-shadow: 0 0 0 1px var(--carrera), 0 0 18px -6px var(--carrera);
}
.chapa-auto { font-size: .78rem; font-weight: 650; }
.chapa-color { background: color-mix(in srgb, var(--mat) 30%, transparent); border-color: var(--mat); }
.chapa-color[aria-pressed="true"] {
  box-shadow: 0 0 0 1px var(--mat), 0 0 18px -6px var(--mat); border-color: var(--mat);
}

/* El z-index NO es decoración: .carp-tapa también está posicionada y
   va después en el DOM, así que sin esto se dibuja encima y se come
   los clics. Los botones se veían igual (la tapa es translúcida) pero
   no se podían tocar. */
.carp-botones {
  position: absolute; top: 8px; right: 8px; z-index: 2; display: flex; gap: 2px;
  opacity: 0; transition: opacity .15s;
}
.carpeta:hover .carp-botones, .carpeta:focus-within .carp-botones { opacity: 1; }
/* En celular no hay hover: si se esconden, no se pueden tocar nunca. */
@media (hover: none) { .carp-botones { opacity: 1; } }

.carpeta.nueva { border-style: dashed; }
.carpeta.nueva .carp-nom, .carpeta.nueva .carp-vacia { color: var(--debil); }
.carpeta.nueva:hover { box-shadow: none; }
.carpeta.nueva:hover .carp-nom { color: var(--texto); }

.carp-rotulo {
  font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; font-weight: 780;
  color: var(--debil); margin: 4px 2px 10px;
}

/* --- Filas de archivo --- */
.archivos {
  display: flex; flex-direction: column; gap: 8px;
  padding: var(--halo); margin: calc(var(--halo) * -1);
}
.arch-caja {
  background: var(--vidrio); border: 1px solid var(--borde); border-radius: 13px;
  transition: border-color .15s;
}
.arch-caja:hover, .arch-caja.abierto {
  border-color: color-mix(in srgb, var(--mat, var(--carrera)) 45%, transparent);
}
.arch-fila {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  background: none; border: 0; padding: 11px 13px; cursor: pointer;
  color: var(--texto); font-family: inherit;
}
.arch-ext {
  flex-shrink: 0; width: 36px; height: 36px; border-radius: 9px;
  display: grid; place-items: center;
  font-size: .6rem; font-weight: 800; letter-spacing: .02em;
  background: color-mix(in srgb, var(--mat, var(--carrera)) 16%, transparent);
  color: var(--mat, var(--carrera));
}
.arch-txt { min-width: 0; flex: 1; }
.arch-t {
  display: block; font-size: .87rem; font-weight: 650; line-height: 1.3;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.arch-m { display: block; font-size: .72rem; color: var(--debil); margin-top: 2px; }
.arch-mano {
  flex-shrink: 0; color: var(--debil); font-size: 1rem;
  transition: transform .2s, color .2s;
}
.arch-caja.abierto .arch-mano { transform: rotate(90deg); color: var(--mat, var(--carrera)); }

.arch-detalle {
  display: flex; flex-direction: column; gap: 9px;
  padding: 12px 13px 13px; border-top: 1px solid var(--borde);
}
/* --- Que el agente lea el apunte -----------------------------------
   Pasa una vez por archivo y tarda un minuto, así que la espera se
   cuenta: qué fase va, hace cuánto, y el índice del apunte armándose
   de a una unidad. Sin barra a propósito: cuántas unidades tiene no se
   sabe hasta el final, y un porcentaje inventado es peor que ninguno. */
.lectura {
  display: grid; gap: 9px; padding: 12px 13px; border-radius: var(--r-sm);
  background: var(--vidrio-hondo); border: 1px solid var(--borde);
}
.lectura.leyendo { border-color: color-mix(in srgb, var(--mat) 40%, var(--borde)); }
.lectura-ayuda { font-size: .78rem; line-height: 1.55; color: var(--debil); }
.lectura-falla {
  font-size: .8rem; line-height: 1.5; color: var(--tenue);
  padding: 9px 11px; border-radius: 10px;
  background: color-mix(in srgb, var(--riesgo) 11%, transparent);
  border: 1px solid color-mix(in srgb, var(--riesgo) 30%, transparent);
}
.lectura-hecha { display: flex; align-items: center; gap: 9px; font-size: .84rem; color: var(--tenue); }
.lectura-hecha b { color: var(--texto); font-weight: 720; }
.lectura-hecha svg {
  width: 16px; height: 16px; flex: none; color: var(--ok);
  filter: drop-shadow(0 0 7px color-mix(in srgb, var(--ok) 55%, transparent));
}
.lectura-cab { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.lectura-cab h4 { font-size: .86rem; font-weight: 740; }
.lectura-dato { font-size: .78rem; color: var(--mat); font-variant-numeric: tabular-nums; }
.lectura-dato.porfiando { color: var(--media); }
.lectura-seg { margin-left: auto; font-size: .76rem; color: var(--debil); font-variant-numeric: tabular-nums; }
.lectura-parar {
  font-family: inherit; font-size: .74rem; font-weight: 680; color: var(--tenue);
  padding: 3px 11px; border-radius: 999px;
  border: 1px solid var(--borde); background: var(--vidrio);
}
.lectura-parar:hover { color: var(--texto); border-color: var(--borde-alto); }
.lectura .ag-parcial-lista { max-height: 220px; }

.arch-carpetas { display: flex; flex-wrap: wrap; gap: 6px; }
.arch-acciones { display: flex; gap: 6px; flex-wrap: wrap; }
.arch-acciones .btn { flex: 1; min-width: 88px; }

/* ============================================================
   La primera corrida — traer todo de Autogestión

   Se ve una vez: la invitación, la sincronización y el recibo de
   lo que entró. Todo va colgado de .primera-corrida a propósito;
   son nombres genéricos (.semana, .bloque, .horas) y sueltos en
   la hoja se pisarían con media app.
   ============================================================ */
.primera-corrida .cab-paso {
  display: flex; align-items: center; justify-content: space-between;
  gap: 14px; margin: 18px 0 20px;
}
.primera-corrida .cab-paso h1 {
  margin: 0; font-size: 1.5rem; font-weight: 800; letter-spacing: -.025em;
}
.primera-corrida .cab-paso p { margin: 3px 0 0; font-size: .85rem; color: var(--tenue); }

/* La invitación y la sincronización son una columna sola: no hay nada
   que comparar todavía y a ancho completo la línea se vuelve ilegible. */
.primera-corrida .angosto { max-width: 500px; margin: 0 auto; }

.primera-corrida .trae { list-style: none; margin: 0 0 16px; padding: 0; display: grid; gap: 9px; }
.primera-corrida .trae li { display: flex; align-items: flex-start; gap: 10px; font-size: .88rem; }
.primera-corrida .trae svg { flex: none; margin-top: 3px; color: var(--ok); }

/* Los pasos de la sincronización */
.primera-corrida .pasos { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; }
.primera-corrida .pasos li {
  display: flex; align-items: center; gap: 12px; font-size: .89rem;
  color: var(--debil); opacity: .35;
  transition: opacity .35s ease, color .35s ease;
}
.primera-corrida .pasos li.yendo { opacity: 1; color: var(--texto); }
.primera-corrida .pasos li.listo { opacity: 1; color: var(--tenue); }
.primera-corrida .tilde {
  flex: none; width: 20px; height: 20px; border-radius: 50%;
  border: 2px solid var(--borde-alto); display: grid; place-items: center;
  transition: border-color .3s, background .3s;
}
.primera-corrida .pasos li.yendo .tilde {
  border-color: var(--carrera); border-right-color: transparent;
  animation: gira-tilde .7s linear infinite;
}
.primera-corrida .pasos li.listo .tilde { border-color: var(--ok); background: var(--ok); }
.primera-corrida .tilde svg { opacity: 0; color: var(--bg); transition: opacity .2s; }
.primera-corrida .pasos li.listo .tilde svg { opacity: 1; }
@keyframes gira-tilde { to { transform: rotate(360deg); } }

/* Entrada escalonada del recibo */
.primera-corrida .aparece > * { animation: sube-paso .5s var(--resorte) backwards; }
.primera-corrida .aparece > *:nth-child(2) { animation-delay: .06s; }
.primera-corrida .aparece > *:nth-child(3) { animation-delay: .12s; }
.primera-corrida .aparece > *:nth-child(4) { animation-delay: .18s; }
.primera-corrida .aparece > *:nth-child(5) { animation-delay: .24s; }
.primera-corrida .aparece > *:nth-child(6) { animation-delay: .30s; }
@keyframes sube-paso { from { opacity: 0; transform: translateY(16px); } }

/* El halo del hover se sale del borde: hay que dejarle lugar o la
   grilla lo recorta en cuadrado. */
.primera-corrida .con-halo { padding: var(--halo); margin: 0 calc(var(--halo) * -1); }

/* ============================================================
   La grilla de la semana

   La usan DOS pantallas: la Agenda (con fechas, parciales y feriados)
   y el recibo de la primera corrida (la semana pelada). La dibuja
   ui.semanaGrilla() y el scope es `.semana-grilla`, no la pantalla:
   duplicar estas reglas es garantía de que se separen.

   Una fila cada 5 minutos, de 4px, así cada bloque ocupa exactamente
   lo que dura y el peso de una materia se lee sin numeritos.
   ============================================================ */
.semana-grilla .semana-scroll {
  /* La semana no entra en un celular, así que scrollea de costado.
     Y acá pega la trampa de siempre: `overflow-y: visible` NO sirve
     para salvar el halo — con un eje en `auto`, el navegador computa
     el otro `auto` igual, lo diga la hoja o no. Comprobado en Chrome:
     pedía visible y devolvía auto.

     Entonces se hace a la manera de la casa: se le da lugar al halo
     con padding y se recupera con margen negativo. */
  overflow-x: auto;
  padding: var(--halo) 4px;
  margin: calc(var(--halo) * -1) -4px;
}
.semana-grilla .semana {
  display: grid; column-gap: 7px; min-width: 660px;
  /* Aire entre la cabecera del día y la primera clase. Sin esto, la
     burbuja del día elegido queda pegada al bloque de las 8 y se leen
     como una sola cosa. Va de row-gap y no de padding en la cabecera
     porque la regla de horas está en la misma fila que las columnas:
     el gap las corre a las dos y la alineación se mantiene. */
  row-gap: 14px;
}
.semana-grilla .dia-rot {
  font-size: .71rem; font-weight: 780; color: var(--tenue);
  text-transform: uppercase; letter-spacing: .08em; text-align: center;
}
.semana-grilla .horas { display: grid; }
.semana-grilla .horas span {
  font-size: .67rem; color: var(--debil); font-variant-numeric: tabular-nums;
  line-height: 1; transform: translateY(-3px);
}
.semana-grilla .dia-col {
  display: grid;
  background: repeating-linear-gradient(to bottom,
    rgba(255,255,255,.045) 0 1px, transparent 1px 48px);
  border-radius: 12px;
}
.semana-grilla .bloque {
  margin-bottom: 4px; border-radius: 11px; padding: 8px 9px;
  display: flex; flex-direction: column; gap: 3px; min-width: 0; overflow: hidden;
  background: color-mix(in srgb, var(--mat) 19%, transparent);
  border: 1px solid color-mix(in srgb, var(--mat) 38%, transparent);
  border-left: 3px solid var(--mat);
  transition: transform .22s var(--resorte), box-shadow .22s;
}
.semana-grilla .bloque:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 20px -6px color-mix(in srgb, var(--mat) 45%, transparent);
}
/* Cuando el bloque lleva a la materia es un <button> de verdad, así
   entra por teclado. Hay que devolverle lo que el navegador le saca. */
.semana-grilla button.bloque {
  font: inherit; color: inherit; text-align: left; width: 100%; cursor: pointer;
}
.semana-grilla .bloque b {
  font-size: .75rem; font-weight: 720; line-height: 1.22; color: var(--texto);
}
.semana-grilla .bloque span { font-size: .66rem; color: var(--tenue); line-height: 1.3; }

/* --- Lo que sólo tiene la semana con fechas (la Agenda) --- */

/* La cabecera de día es el selector: reemplaza a la tira de fichas. */
.semana-grilla .cab-dia {
  background: none; border: 1px solid transparent; border-radius: 12px;
  padding: 7px 4px 8px; cursor: pointer; display: grid; gap: 3px;
  font: inherit; color: inherit; text-align: center; width: 100%;
  transition: background .2s, border-color .2s;
}
.semana-grilla .cab-dia:hover { background: rgba(255,255,255,.05); }
.semana-grilla .cab-dia[aria-pressed="true"] {
  background: color-mix(in srgb, var(--carrera) 14%, transparent);
  border-color: color-mix(in srgb, var(--carrera) 40%, transparent);
}
.semana-grilla .cab-dia .nom {
  font-size: .68rem; font-weight: 780; color: var(--tenue);
  text-transform: uppercase; letter-spacing: .08em;
}
.semana-grilla .cab-dia .num { font-size: 1.05rem; font-weight: 750; line-height: 1; }
.semana-grilla .cab-dia.es-hoy .num { color: var(--carrera); }

/* El parcial va en la cabecera y NO adentro de la grilla: Autogestión
   reserva la fecha pero no la hora, y ponerlo a las 8 sería inventar. */
.semana-grilla .chip-parcial {
  display: block; font-size: .63rem; font-weight: 700; line-height: 1.25;
  border-radius: 7px; padding: 3px 5px; margin-top: 3px;
  background: color-mix(in srgb, var(--mat) 26%, transparent);
  border: 1px solid color-mix(in srgb, var(--mat) 55%, transparent);
  color: var(--texto);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.semana-grilla .col-feriado {
  background: repeating-linear-gradient(135deg,
    rgba(255,255,255,.035) 0 6px, transparent 6px 12px);
  opacity: .55;
}
.semana-grilla .sello-feriado {
  align-self: start; margin-top: 10px; text-align: center;
  font-size: .66rem; color: var(--tenue); padding: 0 6px; line-height: 1.3;
}

/* Los tres números del recibo */
.primera-corrida .cifras { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.primera-corrida .cifra { text-align: center; }
.primera-corrida .cifra .num { font-variant-numeric: tabular-nums; }
.primera-corrida .cifra p {
  margin: 4px 0 0; font-size: .74rem; color: var(--tenue); font-weight: 650;
  text-transform: uppercase; letter-spacing: .07em;
}
@media (max-width: 560px) { .primera-corrida .cifra .num { font-size: 2.2rem; } }

/* --- Traer archivos (Material) ------------------------------
   Una fila por fuente: aula virtual y Autogestión. Vive adentro
   del modal, que lleva overflow-y:auto, así que NO puede tener
   resplandor: se saldría del borde y quedaría recortado en
   cuadrado (ver --halo). Se marca aclarando el borde. */
.fuente {
  display: grid; grid-template-columns: 38px 1fr auto;
  gap: 13px; align-items: center;
  padding: 13px 14px;
  border: 1px solid var(--borde); border-radius: 15px;
  background: var(--vidrio);
  transition: border-color .16s, background .16s;
}
.fuente:hover { border-color: var(--borde-alto); background: var(--vidrio-alto); }
.fuente + .fuente { margin-top: 10px; }

.fuente-ico {
  width: 38px; height: 38px; border-radius: 11px;
  display: grid; place-items: center;
  background: color-mix(in srgb, var(--tono, var(--carrera)) 17%, transparent);
  border: 1px solid color-mix(in srgb, var(--tono, var(--carrera)) 34%, transparent);
  color: var(--tono, var(--carrera-2));
}
.fuente-ico svg { width: 19px; height: 19px; }
.fuente[data-fuente="aula"] { --tono: #6f8ede; }
.fuente[data-fuente="auto"] { --tono: var(--carrera); }

/* min-width:0 o el mail largo del legajo le pone piso a la columna
   1fr y la fila se sale de la pantalla en el celular. Con eso solo
   no alcanza: el mail no tiene dónde cortarse. */
.fuente-txt { min-width: 0; }
.fuente-txt strong { display: block; font-size: .95rem; font-weight: 650; letter-spacing: -.01em; }
.fuente-txt p { margin: 3px 0 0; font-size: .8rem; color: var(--tenue); line-height: 1.45; overflow-wrap: anywhere; }
.fuente-txt .apagado { color: var(--debil); }

/* Sin conectar la fila no desaparece: se apaga y dice qué falta.
   Un botón que aparece y se va solo no se aprende nunca. */
.fuente[data-estado="off"] { border-style: dashed; background: none; }
.fuente[data-estado="off"] .fuente-ico {
  background: rgba(255,255,255,.045); border-color: var(--borde); color: var(--debil);
}
.fuente[data-estado="off"] .fuente-txt strong { color: var(--tenue); }

/* El relato de la bajada cuelga de la fila y se queda escrito: lo
   que NO entró es justo lo que hay que leer, y un toast se va solo. */
.fuente-relato {
  grid-column: 1 / -1;
  border-top: 1px solid var(--borde); margin-top: 3px; padding-top: 12px;
  font-size: .81rem; color: var(--tenue); line-height: 1.65; word-break: break-word;
}
.fuente-relato[hidden] { display: none; }
/* "Podés cerrar esto: sigue bajando". Es la línea que hace que el
   modal deje de ser una sala de espera, así que no va en gris de
   adorno: va del color de la carrera, que es el de las cosas que la
   app hace por vos. */
.traer-fondo {
  margin: 12px 2px 0; padding-top: 11px; border-top: 1px solid var(--borde);
  font-size: .79rem; line-height: 1.6; color: var(--tenue);
}
.traer-fondo button {
  cursor: pointer; font: inherit; font-weight: 640;
  color: var(--carrera-2); background: none; border: 0; padding: 0;
  text-decoration: underline; text-underline-offset: 3px;
}
.traer-fondo button:hover { filter: brightness(1.2); }
.fuente-relato .mal  { color: var(--riesgo); }
.fuente-relato .bien { color: var(--ok); }

/* Burbuja del botón "Traer archivos". Se llama `burbuja-cuenta` y no
   `burbuja` a propósito: `.burbuja` ya es el mensaje del chat del
   agente, y como esta regla vive más abajo le ganaba. El saludo del
   agente se iba `position: absolute` al ángulo de la pantalla, encima
   del título, y el hilo quedaba vacío. */
.con-burbuja { position: relative; display: inline-flex; }
.burbuja-cuenta {
  position: absolute; top: -5px; right: -5px;
  min-width: 19px; height: 19px; padding: 0 5px;
  border-radius: 10px; background: var(--carrera); color: #10131c;
  font-size: .68rem; font-weight: 800; line-height: 19px; text-align: center;
  border: 2px solid var(--bg); pointer-events: none;
}
