/* ==========================================================================
   TEMA GENERAL — diseño limpio y moderno (Tarea 11.4)
   Reemplaza el anterior tema "Matrix". Paleta índigo/slate, tarjetas suaves,
   buena legibilidad y modo oscuro funcional. Se carga al final para afinar
   los componentes de Bootstrap sin reescribirlos.
   ========================================================================== */

:root {
  --c-primary: #4f46e5;       /* índigo */
  --c-primary-dark: #4338ca;
  --c-primary-soft: #eef2ff;
  --c-bg: #f1f5f9;            /* slate-100 */
  --c-surface: #ffffff;
  /* Fondo de las tarjetas sueltas (los paquetes de la mochila, los tableros del
     dominó). Se usaba en esas vistas sin haberla declarado nunca: `background:
     var(--c-card)` sin valor de reserva es una regla inválida y el fondo
     quedaba transparente.

     Va un color literal, NO var(--c-surface): una variable que apunta a otra se
     resuelve donde se DEFINE, no donde se usa. Como el modo oscuro redefine
     --c-surface en el <body> y esto es :root, se habría quedado con el blanco
     del tema claro y la tarjeta habría salido blanca de noche. Su pareja oscura
     está en el bloque body.dark-mode. */
  --c-card: #ffffff;
  --c-text: #1e293b;          /* slate-800 */
  --c-muted: #5b6979;         /* slate-500 oscurecido: 5.1:1 sobre el fondo (AA) */
  --c-border: #e2e8f0;        /* slate-200 */
  --c-radius: 0.75rem;
  --c-shadow: 0 4px 16px rgba(15, 23, 42, 0.08);
  --c-shadow-sm: 0 2px 8px rgba(15, 23, 42, 0.06);
}

body {
  background-color: var(--c-bg);
  color: var(--c-text);
  font-family: 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
}

h1, h2, h3, h4, h5, h6 {
  font-weight: 600;
  color: var(--c-text);
}

a { color: var(--c-primary); }
a:hover { color: var(--c-primary-dark); }

/* ----------- Color primario (navbar, sidebar, footer, encabezados) ----------- */
.bg-primary {
  background: linear-gradient(90deg, var(--c-primary), var(--c-primary-dark)) !important;
}

.navbar.bg-primary {
  box-shadow: var(--c-shadow-sm);
}

.navbar-brand {
  font-weight: 700;
  letter-spacing: 0.3px;
}

/*=============================================
MARCA "BIRRETÓN": el birrete siempre va arriba, centrado sobre el nombre.
Mismo patrón dondequiera que aparezcan juntos: el cabezote, el menú lateral,
el login y el pie de la landing. Cada sitio pone su propio tamaño de letra;
esta clase solo fija la disposición (icono encima, centrado).
=============================================*/
.marca-birreton {
  display: flex;
  flex-direction: column;
  align-items: center;
  line-height: 1.15;
  gap: 0.15rem;
}

/* Sin relleno propio: a diferencia del login/menú lateral/pie (que apilan
   icono + texto y necesitan aire alrededor), aquí el único hijo es la
   imagen del logo, que ya trae su propio relleno (.logo-cabezote, abajo).
   Un segundo relleno aquí encima solo le restaba alto disponible al logo
   sin ganar nada a cambio. */
.navbar-brand.marca-birreton {
  padding: 0;
}

/* El PNG no trae fondo sólido detrás de "Birretón": es un blanco
   semitransparente (pensado para ir sobre una página clara, como la
   landing), así que sobre el azul del cabezote esas zonas se veían como
   manchas grisáceas desiguales en vez de un bloque limpio. El fondo propio
   de aquí hace que esa transparencia compare contra un color sólido (queda
   limpia) y de paso le da contraste en forma de tarjeta contra el cabezote.
   Literal y NO var(--c-bg): esa variable se oscurece en modo oscuro (pensada
   para el fondo de toda la página) y aquí se quiere ese mismo tono de modo
   claro siempre, sin importar el tema. Es a propósito el mismo color que el
   fondo del sistema en modo claro (--c-bg): el blanco puro, junto al blanco
   casi total del propio PNG, deslumbraba de más.

   El alto es a propósito el máximo que cabe SIN engordar el cabezote: junto
   con su propio relleno vertical (0.1rem arriba y abajo) suma exactamente
   lo mismo que antes ocupaban el alto del logo viejo (2.5rem) más el
   relleno que tenía .navbar-brand.marca-birreton (ya quitado arriba) — el
   cabezote no crece ni un píxel, pero el logo sí. El ancho se deja en
   "auto": la proporción del PNG manda, nunca se estira.

   El contorno usa el mismo dorado del propio logo (los lentes y "Es tu
   día"): es el --gold de vistas/css/landing.css, pero ese variable solo
   existe dentro de .landing-page, que no envuelve al cabezote, así que va
   literal aquí. Con box-sizing:border-box (Bootstrap), el borde se descuenta
   del alto de 3rem igual que el relleno: sigue sin engordar el cabezote. */
.logo-cabezote {
  height: 3rem;
  width: auto;
  background: #f1f5f9;
  border: 2px solid #e6ab1e;
  border-radius: 0.5rem;
  padding: 0.1rem 0.6rem;
}

.encabezado-seccion {
  color: var(--c-primary-dark);
  font-weight: 700;
}

/* ----------- Tarjetas ----------- */
.card {
  background-color: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--c-radius);
  box-shadow: var(--c-shadow-sm);
}

.card-header {
  background-color: var(--c-surface);
  border-bottom: 1px solid var(--c-border);
  font-weight: 600;
  border-top-left-radius: var(--c-radius) !important;
  border-top-right-radius: var(--c-radius) !important;
}

.card-header.bg-primary,
.modal-header.bg-primary {
  color: #fff;
}

/* Secciones colapsables de una tarjeta (p.ej. "Mi cuenta"): un círculo
   translúcido que toma el color del encabezado donde vaya (currentColor),
   para que se lea igual sobre un encabezado normal que sobre uno de color
   sólido como .modal-header-premium. Una sola flecha gira 180° al abrir en
   vez de alternar fa-plus/fa-minus: el estado lo lleva Bootstrap solo
   (aria-expanded, que alterna en el encabezado disparador) sin JS propio
   para el icono. */
.cuenta-toggle-seccion.btn {
  width: 2.1rem;
  height: 2.1rem;
  padding: 0;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: rgba(127, 127, 127, 0.14);
  border: 1px solid rgba(127, 127, 127, 0.3);
  color: inherit;
}
.cuenta-toggle-seccion.btn:hover,
.cuenta-toggle-seccion.btn:focus {
  background: rgba(127, 127, 127, 0.24);
  color: inherit;
}
.cuenta-toggle-seccion i {
  transition: transform 0.25s ease;
}
.cuenta-seccion-header[aria-expanded="true"] .cuenta-toggle-seccion i {
  transform: rotate(180deg);
}

/* ----------- Botones ----------- */
/* Botones del sistema: delgados (menos alto, mismo ancho) y con el icono
   siempre a la derecha, pegado al margen. El icono se escribe primero en el
   HTML de casi todas las vistas, así que en vez de reordenar decenas de
   plantillas se le manda al final con `order`. */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.45rem;
  padding-top: 0.3rem;
  padding-bottom: 0.3rem;
  border-radius: 0.5rem;
  font-weight: 500;
  line-height: 1.4;
  transition: transform 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}

/* El icono va al final aunque en el HTML esté escrito antes del texto. */
.btn > i:first-child { order: 1; }

/* En los botones que ocupan todo el ancho, el icono se va hasta el margen
   derecho. Se hace con el margen (y no con space-between) para que un botón
   ancho SIN icono siga con su texto centrado. */
.btn.w-100 > i { margin-left: auto; }

/* Los botones que piden texto a la izquierda (las opciones del examen) lo
   conservan: el flex no debe centrárselo. */
.btn.text-start { justify-content: flex-start; }

/* Los botones redondos son solo el icono: ahí no hay nada que separar. */
.btn.rounded-circle { justify-content: center; gap: 0; }
.btn.rounded-circle > i { margin-left: 0; }

.btn-lg { padding-top: 0.42rem; padding-bottom: 0.42rem; }

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

.btn-primary {
  background-color: var(--c-primary);
  border-color: var(--c-primary);
}

/* El color real lo pone vistas/plantilla.php desde "Colores del sistema"
   (--c-boton); aquí solo queda el realce, en gris neutro para que combine
   con cualquier color que elija el administrador. */
.btn-primary:hover,
.btn-primary:focus {
  box-shadow: 0 4px 12px rgba(15, 23, 42, 0.25);
}

.btn-outline-light:hover {
  color: var(--c-primary-dark);
}

/* Botón verde: acciones que AÑADEN algo (agregar un paquete de libros a la
   mochila). El verde se lee como "sumar" sin tener que leer el texto, igual que
   el rojo de "Eliminar cuenta" se lee como "quitar".

   No usa --c-boton a propósito: ese color lo cambia el administrador desde
   "Colores del sistema", y aquí el verde es parte del significado del botón,
   no de la paleta.

   El tono (#047857) da 5,48:1 de contraste con el texto blanco, por encima del
   4,5:1 que pide la norma; sirve igual en modo claro y oscuro, así que no
   necesita variante nocturna. El realce del hover es el mismo gris neutro de
   .btn-primary, para que todos los botones se comporten igual al pasar por
   encima. */
.btn-verde {
  background-color: #047857;
  border-color: #047857;
  color: #ffffff;
}

.btn-verde:hover,
.btn-verde:focus {
  background-color: #036249;
  border-color: #036249;
  color: #ffffff;
  box-shadow: 0 4px 12px rgba(15, 23, 42, 0.25);
}

/* ----------- Formularios ----------- */
.form-control,
.form-select {
  border-radius: 0.5rem;
  border-color: var(--c-border);
}

.form-control:focus,
.form-select:focus {
  border-color: var(--c-primary);
  box-shadow: 0 0 0 0.2rem rgba(79, 70, 229, 0.15);
}

/* Icono nativo de "ver contraseña" / "limpiar" que Edge dibuja dentro de los
   <input>: es un glifo oscuro fijo que se pierde contra el fondo casi negro
   del campo en modo oscuro (#0f172a). Se oculta y en su lugar el sistema pone
   su propio botón ".toggle-password" (login y alta/edición de usuario), que
   sí adapta el color al tema. */
input::-ms-reveal,
input::-ms-clear {
  display: none;
}

.input-group-text {
  background-color: var(--c-primary-soft);
  border-color: var(--c-border);
  color: var(--c-primary-dark);
}

/* Casillas de verificación: mismo color de marcado que los botones del sistema
   y, en modo oscuro, un fondo y un borde que se distingan del papel.
   Va ANTES del bloque de interruptores: los dos juegos de reglas tienen la
   misma especificidad, así que el de los interruptores debe quedar después
   para poder afinar su riel. */
.form-check-input:checked {
  background-color: var(--c-boton, var(--c-primary));
  border-color: var(--c-boton, var(--c-primary));
}

body.dark-mode .form-check-input:not(:checked) {
  background-color: #1e293b;
  border-color: #64748b;
}

/* ----------- Interruptores (form-switch) -----------
   Todos los interruptores del sistema comparten este diseño: el del
   temporizador del examen y del repaso, el de aprobar una reseña, y cualquiera
   que se añada después. Se hacen más grandes que los de Bootstrap para que se
   puedan tocar con el pulgar, la palanca es siempre blanca (se ve igual sobre
   fondo claro que oscuro) y encendidos toman el color de los botones del
   sistema, el que se edita en "Colores del sistema". */
/* El hueco reservado a la izquierda (padding-left) es el ancho del riel más el
   aire que lo separa de su etiqueta: 2.85rem + 1.2rem. */
.form-switch {
  padding-left: 4.05rem;
  min-height: 1.75rem;
}

.form-switch .form-check-input {
  width: 2.85rem;
  height: 1.55rem;
  margin-left: -4.05rem;
  margin-top: 0.1rem;
  background-color: #cbd5e1;        /* apagado: riel gris claro */
  border: 1px solid #b6c2d2;
  /* Palanca blanca fija: la de Bootstrap es gris translúcida y se pierde
     contra el riel oscuro del modo nocturno. */
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e");
  box-shadow: inset 0 1px 3px rgba(15, 23, 42, 0.2);
  cursor: pointer;
  transition: background-color 0.2s ease, border-color 0.2s ease, background-position 0.2s ease;
}

.form-switch .form-check-input:checked {
  background-color: var(--c-boton, var(--c-primary));
  border-color: var(--c-boton, var(--c-primary));
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e");
  box-shadow: inset 0 1px 3px rgba(15, 23, 42, 0.25);
}

.form-switch .form-check-input:focus {
  border-color: var(--c-boton, var(--c-primary));
  box-shadow: 0 0 0 0.2rem rgba(79, 70, 229, 0.2);
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e");
}

.form-switch .form-check-input:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}

.form-switch .form-check-label {
  cursor: pointer;
  padding-top: 0.12rem;
  font-weight: 500;
}

/* Modo oscuro: el riel apagado se oscurece (antes quedaba un bloque blanco
   sobre el fondo nocturno) y conserva un borde visible. */
body.dark-mode .form-switch .form-check-input {
  background-color: #475569;
  border-color: #64748b;
}

body.dark-mode .form-switch .form-check-input:checked {
  background-color: var(--c-boton, var(--c-primary));
  border-color: var(--c-boton, var(--c-primary));
}

body.dark-mode .form-switch .form-check-label { color: #e2e8f0; }

/* Caja del interruptor: le da cuerpo al control (borde, fondo y aire) para que
   se lea como un paso más del formulario, y para que el destello de la luz
   intermitente tenga un borde donde encenderse. */
/* Dentro de la caja el riel y su etiqueta son dos elementos de una fila flex:
   ahí quien los separa es el `gap`, no el hueco reservado con padding que usa
   Bootstrap (y que aquí se anula, o el riel quedaría descolgado). */
.interruptor-caja {
  display: flex;
  align-items: center;
  gap: 0.9rem;
  background-color: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: 0.65rem;
  padding: 0.55rem 0.9rem;
  box-shadow: var(--c-shadow-sm);
  transition: border-color 0.2s ease, background-color 0.2s ease;
}

.interruptor-caja .form-check-input {
  margin-left: 0;
  flex: 0 0 auto;                   /* el riel no se encoge con etiquetas largas */
}

.interruptor-caja:hover { border-color: var(--c-boton, var(--c-primary)); }

body.dark-mode .interruptor-caja {
  background-color: #1e293b;
  border-color: #334155;
}

/* ----------- Tablas ----------- */
.table {
  --bs-table-hover-bg: var(--c-primary-soft);
}

.table thead th {
  color: var(--c-muted);
  text-transform: uppercase;
  font-size: 0.78rem;
  letter-spacing: 0.4px;
}

/* Encabezados ordenables de las tablas ".tabla-paginada" (vistas/js/ordenarTabla.js).
   La flechita se ve tenue en reposo y se enciende con el color de los botones
   del sistema en la columna por la que está ordenada. */
.table thead th.orden-th {
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
}
.table thead th.orden-th:hover {
  color: var(--c-text);
}
.orden-icono {
  margin-left: 0.35rem;
  font-size: 0.85em;
  opacity: 0.35;
}
.table thead th.orden-th:hover .orden-icono {
  opacity: 0.7;
}
.table thead th.orden-activa {
  color: var(--c-text);
}
.table thead th.orden-activa .orden-icono {
  opacity: 1;
  color: var(--c-boton, var(--c-primary));
}

/* ----------- Login ----------- */
.login-wrapper {
  height: 100vh;
  overflow-y: auto;               /* el propio contenedor gestiona el scroll */
  display: flex;
  padding: 1rem;
  background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 50%, #f1f5f9 100%);
}

/* margin:auto centra cuando cabe y permite ver todo (scroll) cuando no cabe */
.login-wrapper .login-card {
  margin: auto;
}

/* Formulario de registro compacto para que quepa sin scroll */
.login-card .card-body { padding: 1.25rem 1.5rem; }
#bloqueRegistro .mb-3 { margin-bottom: 0.6rem !important; }
#bloqueRegistro .mb-4 { margin-bottom: 0.8rem !important; }
#bloqueRegistro .form-label { margin-bottom: 0.15rem; }
#bloqueRegistro p.text-muted { margin-bottom: 0.8rem !important; }
#bloqueRegistro .invalid-feedback,
#bloqueRegistro .valid-feedback { font-size: 0.78rem; }

.login-card .card-header {
  background: linear-gradient(90deg, var(--c-primary), var(--c-primary-dark)) !important;
  color: #fff;
}

/* ----------- Contexto de la pregunta en el examen -----------
   "De qué trata esta pregunta" (materia · tema · subtema · microtema ·
   nanotema), arriba del "Pregunta N". Plegable: el estudiante lo oculta si no
   lo quiere ver (se recuerda en localStorage — ver PasarelaExamen.js). */
.examen-contexto {
  background-color: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: 0.5rem;
  margin-bottom: 0.5rem;
  overflow: hidden;
}
.examen-contexto-toggle {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  width: 100%;
  border: 0;
  background: transparent;
  color: var(--c-muted);
  font-size: 0.8rem;
  font-weight: 600;
  padding: 0.45rem 0.8rem;
  cursor: pointer;
}
.examen-contexto-toggle:hover { color: var(--c-text); }
.examen-contexto-flecha { margin-left: auto; font-size: 0.75rem; }
.examen-contexto-cuerpo {
  padding: 0 0.8rem 0.5rem;
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--c-muted);
}

/* ----------- Preguntas pendientes por responder (examen) -----------
   Bajo "Anterior/Siguiente": un botón con el número de cada pregunta sin
   contestar. La lista se pagina (5 en celular, 10 de tablet en adelante) —lo
   gobierna vistas/js/PasarelaExamen.js—. */
.preguntas-pendientes-titulo { color: var(--c-muted); }
.pendientes-num {
  min-width: 2.5rem;
  padding: 0.25rem 0.5rem;
  font-weight: 700;
  background-color: var(--c-surface);
  color: var(--c-text);
  border: 1px solid var(--c-border);
}
.pendientes-num:hover {
  border-color: var(--c-boton);
  color: var(--c-boton);
}
.pendientes-num.activa {
  background-color: var(--c-boton);
  border-color: var(--c-boton);
  color: var(--c-boton-texto);
}

/* ----------- Opciones del examen -----------
   Compactas a propósito: en el examen, el repaso y los exámenes propios
   interesa que la pregunta y sus tres opciones quepan juntas en pantalla, sin
   tener que hacer scroll para ver la última. */
.opcion {
  padding: 0.55rem 0.9rem;
  font-size: 0.95rem;
  line-height: 1.35;
  white-space: normal;              /* los enunciados largos parten en varias líneas */
}

.opcion.btn-primary {
  background-color: var(--c-surface);
  color: var(--c-text);
  border: 1px solid var(--c-border);
  box-shadow: var(--c-shadow-sm);
  text-align: left;
}

.opcion.btn-primary:hover {
  background-color: var(--c-primary-soft);
  border-color: var(--c-primary);
  color: var(--c-primary-dark);
}

/* Al responder se bloquean las tres opciones. La que no se coloreó tiene que
   seguir viéndose exactamente igual que antes: ni con el color de los botones
   del sistema ni con el "apagado" (opacity) que Bootstrap da a los botones
   deshabilitados. Solo la correcta y la fallada cambian de color. */
.opcion.btn-primary:disabled,
.opcion.btn-primary.disabled {
  background-color: var(--c-surface);
  color: var(--c-text);
  border-color: var(--c-border);
}
.opcion:disabled,
.opcion.disabled { opacity: 1; }

/* Correcta / fallada: fondo suave y translúcido (no un relleno sólido) para
   que el verde y el rojo no "griten" — mismo criterio que las alertas
   .alert-success/.alert-danger de aquí abajo, aplicado a las opciones. */
.opcion.btn-success {
  background-color: rgba(22, 163, 74, 0.15) !important;
  border-color: #16a34a !important;
  color: #14532d !important;
}

.opcion.btn-danger {
  background-color: rgba(220, 38, 38, 0.15) !important;
  border-color: #dc2626 !important;
  color: #7f1d1d !important;
}

/* ----------- Alertas Bootstrap — modo claro ----------- */
/* Borde izquierdo de acento + fondo suave + texto de alta legibilidad        */
.alert {
  border: none;
  border-left: 4px solid transparent;
  border-radius: 0.5rem;
  font-weight: 500;
}

.alert-success {
  background-color: #f0fdf4;
  border-left-color: #16a34a;
  color: #14532d;
}

.alert-danger {
  background-color: #fff1f2;
  border-left-color: #dc2626;
  color: #7f1d1d;
}

.alert-warning {
  background-color: #fffbeb;
  border-left-color: #d97706;
  color: #78350f;
}

.alert-info {
  background-color: #eff6ff;
  border-left-color: #3b82f6;
  color: #1e3a5f;
}

/* ----------- Animación de entrada ----------- */
.fade-in {
  animation: aparecer 0.4s ease;
}

@keyframes aparecer {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ==========================================================================
   MODO OSCURO
   ========================================================================== */
body.dark-mode {
  --c-bg: #0f172a;            /* slate-900 */
  --c-surface: #1e293b;       /* slate-800 */
  --c-text: #e2e8f0;          /* slate-200 */
  --c-muted: #94a3b8;         /* slate-400 */
  --c-border: #334155;        /* slate-700 */
  --c-primary-soft: #1e1b4b;
  /* Un punto más claro que --c-surface a propósito: así la tarjeta del paquete
     se despega del panel que la contiene en vez de fundirse con él. Con el
     texto del tema (#e2e8f0) da 10,06:1. */
  --c-card: #273549;
  background-color: var(--c-bg);
  color: var(--c-text);
}

body.dark-mode h1, body.dark-mode h2, body.dark-mode h3,
body.dark-mode h4, body.dark-mode h5, body.dark-mode h6 {
  color: var(--c-text);
}

/* ----------- El índigo oscuro, aclarado para el modo nocturno -----------
   --c-primary-dark (#4338ca) se pensó para escribir sobre fondo blanco. En
   modo oscuro se quedaba sobre el slate-800 de las tarjetas dando 2,07:1 de
   contraste (la norma pide 4,5:1): el título de la sección casi no se leía.
   Pasa a indigo-300, que sobre ese mismo fondo da 7,34:1 y conserva el acento
   de color en vez de convertir el título en texto corriente.

   Se cambian los sitios donde ese color es LETRA, no la variable entera: el
   cabezote y la cabecera del login la usan como final de un degradado de
   fondo, y aclararla ahí les cambiaría el aspecto. */
body.dark-mode .encabezado-seccion,
body.dark-mode .input-group-text {
  color: #a5b4fc;
}

/* Enlaces SUELTOS de contenido nada más (un "<a>" a secas, sin ningún
   componente propio): el color de reposo sin esto es --c-primary (2,33:1,
   ilegible) y solo el hover tenía uno decente (el mismo indigo-300 de arriba).
   Se excluyen a propósito los que YA fijan su propio color con una sola
   clase (misma especificidad que "a" con etiqueta+clase, así que sin el
   :not() este selector se las ganaba y los dejaba en índigo en vez de
   blanco): botones, accesos de menú ("ma-btn"), accesos del pie
   ("footer-acceso"), enlaces del menú lateral y la marca "Birretón". */
body.dark-mode a:not(.btn):not(.ma-btn):not(.footer-acceso):not(.nav-link):not(.navbar-brand):not(.marca-birreton) {
  color: #818cf8;
}

body.dark-mode a:hover:not(.btn):not(.ma-btn):not(.footer-acceso):not(.nav-link):not(.navbar-brand):not(.marca-birreton) {
  color: #a5b4fc;
}

body.dark-mode .card,
body.dark-mode .modal-content,
body.dark-mode .card-header {
  background-color: var(--c-surface);
  border-color: var(--c-border);
  color: var(--c-text);
}

body.dark-mode .form-control,
body.dark-mode .form-select {
  background-color: #0f172a;
  border-color: var(--c-border);
  color: var(--c-text);
}

body.dark-mode .form-select option { background-color: #0f172a; }

/* El texto de sugerencia (placeholder) de los buscadores y demás campos no
   tenía color propio: dependía del gris por defecto del navegador, pensado
   para un fondo claro, sobre el input casi negro (#0f172a) del modo oscuro. */
body.dark-mode .form-control::placeholder {
  color: var(--c-muted);
  opacity: 1;
}

/* Listas (list-group): resultados de búsqueda de ranking/mochila en modo oscuro */
body.dark-mode .list-group-item {
  background-color: var(--c-surface);
  color: var(--c-text);
  border-color: var(--c-border);
}
body.dark-mode .list-group-item-action:hover,
body.dark-mode .list-group-item-action:focus,
body.dark-mode .list-group-item.active {
  background-color: rgba(79, 70, 229, 0.20);
  color: var(--c-text);
}

/* El .text-muted de Bootstrap se alinea con la paleta del sistema en ambos
   modos: en claro garantiza el contraste AA (el gris translúcido por defecto
   se quedaba corto sobre el fondo slate). */
.text-muted { color: var(--c-muted) !important; }
body.dark-mode .text-muted { color: var(--c-muted) !important; }

/* .text-warning de Bootstrap (#ffc107) da 1,63:1 sobre una tarjeta blanca en
   modo claro (falla grave) y de rebote queda perfecto en oscuro (8,97:1): es
   el caso opuesto a los demás colores de esta sección. Un tono por modo,
   igual que --c-muted. Usados hoy en KPIs de "pendientes"
   (estadisticas.php, pagos_suscripciones.php) además de varios iconos. */
.text-warning { color: #b45309 !important; }
body.dark-mode .text-warning { color: #fbbf24 !important; }

/* .text-danger/.text-success (#dc3545/#198754) están bien en claro (4,53:1)
   pero rozan la falla en oscuro (3,23:1, por debajo del 4,5:1 de texto) —
   mismos tonos ya usados para ".btn-outline-danger"/".btn-outline-success". */
body.dark-mode .text-danger  { color: #f87171 !important; }
body.dark-mode .text-success { color: #34d399 !important; }

/* .btn-outline-secondary de Bootstrap usa un gris fijo (#6c757d) pensado para
   fondo claro: sobre el panel oscuro de las tarjetas/modales se ve deslavado
   y casi ilegible (p. ej. "Marcar todas"/"Ninguna"/"Capítulos" del modal
   "Crear paquete"). Bootstrap 5 arma el botón con variables propias
   (--bs-btn-color, --bs-btn-border-color...), así que hay que redefinir esas
   mismas variables, no "color" a secas. */
body.dark-mode .btn-outline-secondary {
  --bs-btn-color: var(--c-muted);
  --bs-btn-border-color: var(--c-muted);
  --bs-btn-hover-color: #0f172a;
  --bs-btn-hover-bg: var(--c-muted);
  --bs-btn-hover-border-color: var(--c-muted);
  --bs-btn-active-color: #0f172a;
  --bs-btn-active-bg: var(--c-muted);
  --bs-btn-active-border-color: var(--c-muted);
}

/* Mismo caso que ".btn-outline-secondary" arriba, para las otras variantes
   que sí se usan sobre tarjetas/modales oscuros (primary: 2,33:1; success y
   danger: 3,23:1 — los tres por debajo del 4,5:1 de texto). Colores más
   claros que ya usa el proyecto en otros sitios de modo oscuro (indigo-400,
   emerald-400, red-400), para no inventar una paleta nueva. */
body.dark-mode .btn-outline-primary {
  --bs-btn-color: #818cf8;
  --bs-btn-border-color: #818cf8;
  --bs-btn-hover-color: #0f172a;
  --bs-btn-hover-bg: #818cf8;
  --bs-btn-hover-border-color: #818cf8;
  --bs-btn-active-color: #0f172a;
  --bs-btn-active-bg: #818cf8;
  --bs-btn-active-border-color: #818cf8;
}
body.dark-mode .btn-outline-success {
  --bs-btn-color: #34d399;
  --bs-btn-border-color: #34d399;
  --bs-btn-hover-color: #0f172a;
  --bs-btn-hover-bg: #34d399;
  --bs-btn-hover-border-color: #34d399;
  --bs-btn-active-color: #0f172a;
  --bs-btn-active-bg: #34d399;
  --bs-btn-active-border-color: #34d399;
}
body.dark-mode .btn-outline-danger {
  --bs-btn-color: #f87171;
  --bs-btn-border-color: #f87171;
  --bs-btn-hover-color: #0f172a;
  --bs-btn-hover-bg: #f87171;
  --bs-btn-hover-border-color: #f87171;
  --bs-btn-active-color: #0f172a;
  --bs-btn-active-bg: #f87171;
  --bs-btn-active-border-color: #f87171;
}

body.dark-mode .opcion.btn-primary {
  background-color: #0f172a;
  color: var(--c-text);
  border-color: var(--c-border);
}

body.dark-mode .opcion.btn-primary:hover {
  background-color: #312e81;
  border-color: var(--c-primary);
  color: #fff;
}

body.dark-mode .table {
  --bs-table-color:         var(--c-text);
  --bs-table-bg:            var(--c-surface);
  --bs-table-border-color:  var(--c-border);

  /* Filas rayadas (table-striped) */
  --bs-table-striped-color: var(--c-text);
  --bs-table-striped-bg:    rgba(255, 255, 255, 0.05);

  /* Hover */
  --bs-table-hover-color:   var(--c-text);
  --bs-table-hover-bg:      rgba(79, 70, 229, 0.15);

  /* Activa */
  --bs-table-active-color:  var(--c-text);
  --bs-table-active-bg:     rgba(255, 255, 255, 0.1);

  color: var(--c-text);
}

/* Celdas: forzar color de texto para que ninguna herencia de Bootstrap lo pise */
body.dark-mode .table td,
body.dark-mode .table th {
  color: var(--c-text) !important;
  border-color: var(--c-border);
}

/* Resaltado de fila tras edición asíncrona (table-warning) en modo oscuro */
body.dark-mode .table-warning,
body.dark-mode .table-warning > td,
body.dark-mode .table-warning > th {
  --bs-table-warning-color: var(--c-text);
  background-color: rgba(202, 138, 4, 0.25) !important;
  color: var(--c-text) !important;
}

body.dark-mode .login-wrapper {
  background: linear-gradient(135deg, #0f172a 0%, #1e1b4b 50%, #0f172a 100%);
}

/* ----------- Alertas Bootstrap — modo oscuro ----------- */
/* Fondo oscuro con tinte de color + borde izquierdo brillante + texto claro  */
body.dark-mode .alert-success {
  background-color: rgba(22, 163, 74, 0.15);
  border-left-color: #4ade80;
  color: #86efac;
}

body.dark-mode .alert-danger {
  background-color: rgba(220, 38, 38, 0.15);
  border-left-color: #f87171;
  color: #fca5a5;
}

/* Correcta / fallada en modo oscuro: mismo criterio translúcido que en claro,
   con los tonos claros de verde/rojo que ya usan las alertas oscuras. */
body.dark-mode .opcion.btn-success {
  background-color: rgba(22, 163, 74, 0.2) !important;
  border-color: #4ade80 !important;
  color: #86efac !important;
}

body.dark-mode .opcion.btn-danger {
  background-color: rgba(220, 38, 38, 0.2) !important;
  border-color: #f87171 !important;
  color: #fca5a5 !important;
}

body.dark-mode .alert-warning {
  background-color: rgba(217, 119, 6, 0.15);
  border-left-color: #fbbf24;
  color: #fde68a;
}

body.dark-mode .alert-info {
  background-color: rgba(59, 130, 246, 0.15);
  border-left-color: #60a5fa;
  color: #93c5fd;
}

/* ----------- SweetAlert 2 — modo oscuro ----------- */
/* El popup se inyecta fuera del árbol de la app, así que se sobreescribe       */
/* usando los selectores de SweetAlert2 condicionados a body.dark-mode          */

body.dark-mode .swal2-popup {
  background-color: #1e293b;
  color: #e2e8f0;
  border: 1px solid #334155;
}

body.dark-mode .swal2-title {
  color: #f1f5f9;
}

body.dark-mode .swal2-html-container {
  color: #cbd5e1;
}

body.dark-mode .swal2-close {
  color: #94a3b8;
}
body.dark-mode .swal2-close:hover {
  color: #e2e8f0;
}

/* Icono de éxito */
body.dark-mode .swal2-icon.swal2-success {
  border-color: rgba(74, 222, 128, 0.3);
  color: #4ade80;
}
body.dark-mode .swal2-icon.swal2-success [class^="swal2-success-line"] {
  background-color: #4ade80;
}
body.dark-mode .swal2-icon.swal2-success .swal2-success-ring {
  border-color: rgba(74, 222, 128, 0.3);
}
body.dark-mode .swal2-icon.swal2-success .swal2-success-fix {
  background-color: #1e293b;
}

/* Icono de error */
body.dark-mode .swal2-icon.swal2-error {
  border-color: rgba(248, 113, 113, 0.3);
  color: #f87171;
}
body.dark-mode .swal2-icon.swal2-error [class^="swal2-x-mark-line"] {
  background-color: #f87171;
}

/* Icono de advertencia */
body.dark-mode .swal2-icon.swal2-warning {
  border-color: rgba(251, 191, 36, 0.3);
  color: #fbbf24;
}

/* Icono de info */
body.dark-mode .swal2-icon.swal2-info {
  border-color: rgba(96, 165, 250, 0.3);
  color: #60a5fa;
}

/* Fondo del overlay más oscuro */
body.dark-mode .swal2-container.swal2-backdrop-show {
  background: rgba(0, 0, 0, 0.75) !important;
}

/* Toast en modo oscuro */
body.dark-mode .swal2-popup.swal2-toast {
  background-color: #1e293b !important;
  color: #e2e8f0 !important;
  border: 1px solid #334155;
}
body.dark-mode .swal2-popup.swal2-toast .swal2-title {
  color: #e2e8f0 !important;
}
body.dark-mode .swal2-timer-progress-bar {
  background: var(--c-primary) !important;
}

/* ===== Destello intermitente en selects de materia/capítulo ===== */
@keyframes destello-borde {
  0%, 100% {
    border-color: #dee2e6;
    box-shadow: 0 0 0 0 rgba(245, 124, 0, 0);
  }
  50% {
    border-color: #f57c00;
    box-shadow: 0 0 0 4px rgba(245, 124, 0, 0.45);
  }
}

.select-destello {
  animation: destello-borde 1.1s ease-in-out infinite;
  outline: none;
}

/* Destello para botones: solo halo, sin alterar el color del borde propio */
@keyframes destello-btn {
  0%, 100% { box-shadow: 0 0 0 0 rgba(245, 124, 0, 0); }
  50%       { box-shadow: 0 0 0 5px rgba(245, 124, 0, 0.6); }
}

.btn-destello {
  animation: destello-btn 1.1s ease-in-out infinite;
}

/* Destello que se apaga solo tras 3 parpadeos: el JS escucha animationend
   para pasarle la luz al siguiente campo del formulario. */
.destello-limitado {
  animation-iteration-count: 3 !important;
}

body.dark-mode .select-destello {
  animation: destello-borde-dark 1.1s ease-in-out infinite;
}

body.dark-mode .btn-destello {
  animation: destello-btn-dark 1.1s ease-in-out infinite;
}

@keyframes destello-btn-dark {
  0%, 100% { box-shadow: 0 0 0 0 rgba(251, 146, 60, 0); }
  50%       { box-shadow: 0 0 0 5px rgba(251, 146, 60, 0.55); }
}

/* Destello para botones btn-warning (amarillo) — halo ámbar oscuro para contraste */
@keyframes destello-btn-amarillo {
  0%, 100% { box-shadow: 0 0 0 0 rgba(180, 83, 9, 0); }
  50%       { box-shadow: 0 0 0 6px rgba(180, 83, 9, 0.65); }
}

.btn-destello-amarillo {
  animation: destello-btn-amarillo 1.1s ease-in-out infinite;
}

@keyframes destello-btn-amarillo-dark {
  0%, 100% { box-shadow: 0 0 0 0 rgba(251, 191, 36, 0); }
  50%       { box-shadow: 0 0 0 6px rgba(251, 191, 36, 0.6); }
}

body.dark-mode .btn-destello-amarillo {
  animation: destello-btn-amarillo-dark 1.1s ease-in-out infinite;
}

/* Layout principal: contenido scrollable, footer siempre visible.
   La altura la fija Bootstrap con .vh-100 (100vh), pero en el navegador de un
   celular 100vh incluye la barra de direcciones y deja el pie por debajo del
   área visible. Con 100dvh (dynamic viewport height) el alto es el realmente
   visible en cada momento, así que el pie siempre queda a la vista. */
body.vh-100 {
  height: 100dvh !important;
}

/* SweetAlert2 le agrega a <body> su propia clase "swal2-height-auto"
   (height: auto !important) mientras hay una alerta abierta -no un toast,
   esas no la agregan-, para un ajuste suyo de scroll. Su regla es
   "body.swal2-height-auto" (misma especificidad que la de arriba,
   "body.vh-100"): como su <style> se inyecta en tiempo de ejecución,
   siempre queda después del nuestro en el documento y gana el empate,
   dejando el body a la altura de su contenido en vez de 100dvh -el pie,
   como último hijo del flex de columna, sube pegado al contenido corto en
   vez de quedarse abajo del todo-. Esta regla, con una clase más, tiene
   más especificidad que la suya y gana pase lo que pase. */
body.vh-100.swal2-height-auto {
  height: 100dvh !important;
}

.area-contenido {
  flex: 1 1 0;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  /* Columna flexible para poder empujar el botón "Volver" al fondo (pegado al
     footer) cuando el contenido no llena la pantalla. */
  display: flex;
  flex-direction: column;
}

/* Los hijos directos no se encogen: si el contenido es más alto que el área, se
   desplaza (scroll) en vez de comprimirse, que hacía que el contenido de una
   pantalla se solapara con el botón "Volver" del fondo. */
.area-contenido > * {
  flex-shrink: 0;
}

/* Encabezado y pie delgados: menos alto para ellos es más alto para lo que el
   usuario viene a ver. */
.navbar.bg-primary {
  padding-top: 0.3rem;
  padding-bottom: 0.3rem;
}

/* ============ TAMAÑO DE PANTALLA ("Mi cuenta" → "Tamaño de pantalla") ============
   Casi todo el sistema mide sus letras (y buena parte de sus espacios) en
   rem, que es relativo al tamaño de fuente de <html>: bajarlo aquí basta
   para achicar el sistema entero de manera pareja, sin tocar cada regla una
   por una. 16px es el "normal" (el de siempre, no declarado aparte); 14px es
   "chica", un 12.5% más pequeño, y 18px es "grande", un 12.5% más grande.
   Lo activa vistas/js/tamanoLetra.js. */
html.letra-chica {
  font-size: 14px;
}
html.letra-grande {
  font-size: 18px;
}

/* Grupo de 3 botones "Chica / Normal / Grande": mismo look que un
   interruptor (borde + fondo de tarjeta) pero como segmento, porque un solo
   switch on/off no alcanza para tres estados. */
.tamano-letra-grupo {
  display: flex;
  border: 1px solid var(--c-border);
  border-radius: 0.5rem;
  overflow: hidden;
}
.tamano-letra-btn {
  flex: 1 1 0;
  padding: 0.5rem 0.75rem;
  border: none;
  border-right: 1px solid var(--c-border);
  background: transparent;
  color: var(--c-text);
  font-weight: 600;
  cursor: pointer;
}
.tamano-letra-btn:last-child {
  border-right: none;
}
.tamano-letra-btn.activo {
  background: var(--c-boton, var(--c-primary));
  color: #fff;
}

/* Secciones de "Mi cuenta" (Suscripción, Tamaño de pantalla, Configuración de
   cuenta, Ayuda y Califica nuestra aplicación): un mismo diseño para todas. El
   borde y el fondo por defecto de .card/.card-header (var(--c-surface), casi
   idéntico al fondo de la página) las dejaba perdidas contra el fondo —sobre
   todo en modo claro, blanco sobre un gris casi blanco—, sin leerse como
   secciones aparte. Contorno propio (color de los botones del sistema) y un
   tinte suave (--c-primary-soft, ya pensado para despegarse del fondo sin ser
   tan fuerte como un color sólido) para toda la tarjeta, colapsada o abierta.

   Selector con DOS clases (.card.cuenta-seccion) porque con una sola
   "body.dark-mode .card" (más abajo en este archivo) igualaba en columna de
   clases (2 vs 2) y ganaba por su "body" —un selector de tipo, que cuenta
   en la tercera columna de especificidad, la que se compara al final—: hace
   falta repetir "body.dark-mode" aquí también para no depender del orden.

   El encabezado dorado del plan Premium (.modal-header-premium, solo en
   "Suscripción" cuando hay plan activo) se queda fuera de la regla del fondo
   transparente: ahí el dorado es la señal de estado. */
.card.cuenta-seccion {
  border: 2px solid var(--c-boton, var(--c-primary));
  background-color: var(--c-primary-soft);
}
.cuenta-seccion .card-header:not(.modal-header-premium),
.cuenta-seccion .card-body {
  background-color: transparent;
}
.cuenta-seccion .card-header:not(.modal-header-premium) {
  border-bottom-color: var(--c-boton, var(--c-primary));
}
body.dark-mode .card.cuenta-seccion {
  border-color: var(--c-boton, var(--c-primary));
  background-color: var(--c-primary-soft);
}
body.dark-mode .cuenta-seccion .card-header:not(.modal-header-premium),
body.dark-mode .cuenta-seccion .card-body {
  background-color: transparent;
}
body.dark-mode .cuenta-seccion .card-header:not(.modal-header-premium) {
  border-bottom-color: var(--c-boton, var(--c-primary));
}

/* Encabezado de sección colapsable ("Mi cuenta"): toda el área es
   clicable, no solo el círculo de la flecha (ver .cuenta-toggle-seccion
   más arriba, que sigue siendo el disparador visual). */
.cuenta-seccion-header {
  cursor: pointer;
}

/* ============ MODO ESTUDIO COMPACTO ============
   Mientras se juega de verdad (incluida la Revancha) o se contesta un examen,
   el cabezote y el pie se afinan todavía más: la pregunta o el tablero son lo
   que importa en ese momento, así que se les cede el alto que normalmente
   ocupan los dos. .area-contenido usa flex:1 1 0 (más arriba), así que no
   hace falta recalcular nada más: al encogerse el cabezote y el pie, el
   contenido crece solo.

   Solo en celular: es la pantalla que más aprieta de espacio vertical: en
   tablet o escritorio ya sobra alto de sobra y afinar el cabezote y el pie
   ahí no se notaba en nada útil.

   La clase la pone JavaScript (no el servidor) justo al pulsar "Jugar"/
   "Comenzar" de cada pantalla (PasarelaExamen.js, pasosJuego.js,
   saludMental.js, psicometrico.js): antes se aplicaba desde que se cargaba la
   pantalla, así que el cabezote y el pie ya se veían chicos durante los pasos
   de elegir materia/capítulo/cantidad, antes de que hubiera nada que jugar. */

/* La ruta del sistema ("Inicio / Examen") no aporta nada mientras se está
   contestando -no hay a dónde navegar desde ahí- y le resta alto útil a la
   pregunta. A diferencia de las reglas de aquí abajo, esta aplica en
   cualquier tamaño de pantalla, no solo en celular. */
.modo-estudio-compacto .breadcrumb {
  display: none;
}

@media (max-width: 575.98px) {

  /* .cabezote-estudiante ya achica este mismo padding en celular por su
     cuenta (más abajo en este archivo, misma especificidad de 3 clases): para
     ganarle a esa regla —el estudiante SIEMPRE trae esa clase en las
     pantallas donde aplica el modo compacto— hace falta la especificidad
     extra de nombrarla aquí también, no solo confiar en el orden. */
  .modo-estudio-compacto .cabezote-estudiante.navbar.bg-primary,
  .modo-estudio-compacto .navbar.bg-primary {
    padding-top: 0.1rem;
    padding-bottom: 0.1rem;
  }

  .modo-estudio-compacto footer {
    padding: 0.05rem 0;
  }

  .modo-estudio-compacto .footer-accesos {
    padding: 0.1rem 0;
    gap: 0.1rem 1rem;
  }

  .modo-estudio-compacto .footer-acceso {
    padding: 0.1rem 0.4rem;
    gap: 0.05rem;
  }

  .modo-estudio-compacto .footer-acceso span {
    font-size: 0.62rem;
  }

  .modo-estudio-compacto .footer-acceso i {
    font-size: 0.92rem;
  }

}

/* ============ CABEZOTE Y PIE EN TABLET ACOSTADA ============
   Una tablet en horizontal es más ancha que alta: al revés que en celular
   (donde el ancho es el que aprieta), aquí sobra ancho pero el alto es el
   que se queda corto. Por eso esta regla NO toca nada horizontal —iconos,
   texto ni distribución siguen igual, a diferencia del celular—, solo el
   relleno vertical del cabezote y el pie, para cederle ese alto al
   contenido.

   "orientation: landscape" es lo que de verdad decide si aplica: la MISMA
   tablet, en vertical, tiene alto de sobra y se queda con el tamaño normal
   (nada de esta regla actúa ahí, tal como se pidió). El rango de ancho
   (576px-1366px) cubre las tablets típicas en horizontal, pero por sí solo
   también atraparía una ventana de escritorio angosta con el mouse (mismas
   medidas, otro dispositivo); "pointer: coarse" es la señal real de
   "esto se maneja con el dedo, no con mouse/trackpad" y es lo que de verdad
   distingue una tablet de una laptop con esa misma resolución. */
@media (min-width: 576px) and (max-width: 1366px) and (orientation: landscape) and (pointer: coarse) {

  .navbar.bg-primary {
    padding-top: 0.15rem;
    padding-bottom: 0.15rem;
  }

  footer {
    padding: 0.15rem 0;
  }

  .footer-accesos {
    padding: 0.2rem 0;
  }

  .footer-acceso {
    padding: 0.2rem 0.55rem;
  }

}

/* La ruta del sistema (breadcrumb) casi pegada al encabezado: el contenido de
   cada pantalla arranca con poco margen arriba, así la ruta se ve de inmediato
   y cabe más en pantalla. */
.area-contenido > .container,
.area-contenido > .container-fluid {
  margin-top: 0.5rem !important;
}
.breadcrumb {
  margin-bottom: 0.6rem;
}

/* El botón "Volver" del pie se empuja al fondo del área de contenido para que
   quede siempre pegado al footer (con un respiro) y a la vista sin buscarlo.
   Cuando el contenido es largo, fluye al final con normalidad. */
.btn-volver-pie {
  margin-top: auto;
}

@keyframes destello-borde-dark {
  0%, 100% {
    border-color: var(--c-border);
    box-shadow: 0 0 0 0 rgba(251, 146, 60, 0);
  }
  50% {
    border-color: #fb923c;
    box-shadow: 0 0 0 4px rgba(251, 146, 60, 0.4);
  }
}

/* ===== Tarjeta de felicitación (retroalimentación sin pendientes) ===== */
.felicitacion-card {
  border: 2px dashed #d1d5db;
  border-radius: 1rem;
  animation: felicitacion-entrada 0.5s ease-out;
}

@keyframes felicitacion-entrada {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ===== Botón "Volver" unificado (todas las páginas) ===== */
.btn-volver {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  border-radius: 999px;
  padding: 0.32rem 1.5rem;
  font-weight: 600;
  color: #475569;
  background: #fff;
  border: 1.5px solid #cbd5e1;
  box-shadow: 0 2px 8px rgba(15, 23, 42, 0.06);
  transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.15s ease, color 0.15s ease;
}
.btn-volver:hover,
.btn-volver:focus {
  color: #1e293b;
  background: #f1f5f9;
  border-color: #94a3b8;
  transform: translateY(-2px);
  box-shadow: 0 6px 16px rgba(15, 23, 42, 0.12);
}
.btn-volver i { transition: transform 0.15s ease; }
.btn-volver:hover i { transform: translateX(-3px); }

body.dark-mode .btn-volver {
  color: #e2e8f0;
  background: #1e293b;
  border-color: #475569;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
}
body.dark-mode .btn-volver:hover,
body.dark-mode .btn-volver:focus {
  color: #fff;
  background: #334155;
  border-color: #64748b;
}

/* ===== Botón "Revolver" (juego de cartas) ===== */
.btn-revolver {
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  border-radius: 999px;
  padding: 0.36rem 1.7rem;
  font-weight: 600;
  color: #fff;
  border: none;
  background: linear-gradient(135deg, #8b5cf6 0%, #6d28d9 100%);
  box-shadow: 0 4px 16px rgba(109, 40, 217, 0.35);
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.btn-revolver:hover,
.btn-revolver:focus {
  color: #fff;
  transform: translateY(-2px);
  box-shadow: 0 8px 22px rgba(109, 40, 217, 0.5);
}
.btn-revolver i { transition: transform 0.4s ease; }
.btn-revolver:hover i { transform: rotate(180deg); }

body.dark-mode .btn-revolver {
  background: linear-gradient(135deg, #8b5cf6 0%, #5b21b6 100%);
  box-shadow: 0 4px 16px rgba(139, 92, 246, 0.4);
}

/* ===== Calendario para congelar la racha ===== */
.calendario-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.calendario-grid .cal-dow {
  text-align: center; font-size: 0.7rem; font-weight: 700;
  color: #94a3b8; padding: 2px 0;
}
.calendario-grid .cal-dia {
  text-align: center; padding: 8px 0; border-radius: 8px; cursor: pointer;
  border: 1px solid #e2e8f0; user-select: none; font-size: 0.9rem;
  transition: background 0.12s ease;
}
.calendario-grid .cal-dia:hover:not(.cal-disabled):not(.cal-congelado) { background: #e0f2fe; }
.calendario-grid .cal-vacio { visibility: hidden; }
.calendario-grid .cal-disabled { color: #cbd5e1; cursor: not-allowed; background: transparent; border-color: transparent; }
.calendario-grid .cal-congelado { background: #0ea5e9; color: #fff; border-color: #0ea5e9; cursor: default; }
.calendario-grid .cal-seleccionado { background: #22c55e; color: #fff; border-color: #22c55e; }
.cal-muestra { display: inline-block; width: 14px; height: 14px; border-radius: 3px; vertical-align: middle; margin-right: 3px; }
.cal-muestra.cal-seleccionado { background: #22c55e; }
.cal-muestra.cal-congelado { background: #0ea5e9; }
body.dark-mode .calendario-grid .cal-dia { border-color: #334155; color: var(--c-text); }
body.dark-mode .calendario-grid .cal-dia:hover:not(.cal-disabled):not(.cal-congelado) { background: #1e3a5f; }
body.dark-mode .calendario-grid .cal-disabled { color: #475569; }

.felicitacion-icono {
  animation: trofeo-rebote 0.8s ease-out 0.3s both;
}

@keyframes trofeo-rebote {
  0%   { transform: scale(0.5); opacity: 0; }
  60%  { transform: scale(1.15); opacity: 1; }
  80%  { transform: scale(0.95); }
  100% { transform: scale(1); }
}

body.dark-mode .felicitacion-card {
  border-color: #334155;
  background-color: var(--c-surface);
}

/* ===== Menú desplegable del usuario (navbar) en modo oscuro ===== */
body.dark-mode .dropdown-menu {
  background-color: var(--c-surface);
  border-color: var(--c-border);
}

body.dark-mode .dropdown-item {
  color: var(--c-text);
}

body.dark-mode .dropdown-item:hover,
body.dark-mode .dropdown-item:focus {
  background-color: rgba(255, 255, 255, 0.06);
  color: #fff;
}

/* Conservamos el tono rojo para acciones peligrosas, más claro sobre fondo oscuro */
body.dark-mode .dropdown-item.text-danger {
  color: #f87171 !important;
}

body.dark-mode .dropdown-item.text-danger:hover,
body.dark-mode .dropdown-item.text-danger:focus {
  background-color: rgba(248, 113, 113, 0.15);
  color: #fca5a5 !important;
}

body.dark-mode .dropdown-divider {
  border-color: var(--c-border);
}

/* ===== Pestañas (.nav-tabs), usadas en "Salud mental" del admin ===== */
body.dark-mode .nav-tabs {
  border-bottom-color: var(--c-border);
}
body.dark-mode .nav-tabs .nav-link {
  color: var(--c-muted);
}
body.dark-mode .nav-tabs .nav-link:hover,
body.dark-mode .nav-tabs .nav-link:focus {
  border-color: var(--c-border) var(--c-border) var(--c-border);
  color: var(--c-text);
}
body.dark-mode .nav-tabs .nav-link.active {
  background-color: var(--c-surface);
  border-color: var(--c-border) var(--c-border) var(--c-surface);
  color: var(--c-text);
}

/* Sangría nivel 2 (sub-opciones de Configuración) */
.dropdown-subitem {
  padding-left: 2.75rem !important;
  font-size: 0.9rem;
}

/* Sangría nivel 3 (sub-opciones de Cuenta) */
.dropdown-subsubitem {
  padding-left: 4.25rem !important;
  font-size: 0.85rem;
}

/*=============================================
ESTADÍSTICAS DEL USUARIO
=============================================*/
/* Tarjetas de resumen (KPI) con leve realce al pasar el cursor */
.kpi-card {
  transition: transform 0.18s ease, box-shadow 0.18s ease;
}

.kpi-card:hover {
  transform: translateY(-3px);
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
}

/* Contenedor de altura fija para cada gráfica (patrón responsive de Chart.js) */
.grafica-caja {
  position: relative;
  height: 300px;
}

/* Botón de ayuda (?) circular en los encabezados de cada gráfica */
.btn-ayuda {
  width: 2rem;
  height: 2rem;
  padding: 0;
  line-height: 1;
  flex: 0 0 auto;
}

/* Ícono de racha (flama) y de la cuenta regresiva de oferta, en la barra
   superior: como esos botones también llevan la clase ".btn", heredan la
   regla de más arriba que manda el icono al final
   (".btn > i:first-child { order: 1 }"), pensada para los botones de texto
   normales del sistema. Aquí el icono va PRIMERO (como en "vidas"/"monedas",
   que son <span> sin esa regla): se restablece el orden natural para que
   todas las parejas icono+número coincidan, tanto en pantalla grande
   (icono-número) como en celular, donde ".hdr-stat" ya se encarga de
   apilarlos con el número arriba. */
.racha-flama > i:first-child,
.oferta-cuenta-regresiva > i:first-child { order: 0; }

.racha-flama {
  font-size: 1.05rem;
  cursor: pointer;
  transition: transform 0.15s ease;
}

.racha-flama:hover { transform: scale(1.12); }

.racha-flama .flama-activa {
  color: #fb923c;
  animation: latido-flama 1.6s ease-in-out infinite;
}

.racha-flama .flama-apagada {
  color: rgba(255, 255, 255, 0.45);
}

@keyframes latido-flama {
  0%, 100% { transform: scale(1); filter: drop-shadow(0 0 0 rgba(251, 146, 60, 0)); }
  50%      { transform: scale(1.15); filter: drop-shadow(0 0 4px rgba(251, 146, 60, 0.7)); }
}

/*=============================================
ÍCONOS CON NÚMERO DEL CABEZOTE (racha, vidas, monedas)
En celular el cabezote se queda sin sitio para tantos íconos seguidos: aquí
el número pasa arriba de su ícono (column-reverse: en el HTML el ícono va
primero y el número después, así que no hace falta reordenar nada) para que
cada bloque ocupe menos a lo ancho.
=============================================*/
@media (max-width: 575.98px) {
  .hdr-stat {
    flex-direction: column-reverse !important;
    gap: 0 !important;
    line-height: 1.05;
  }
  .hdr-stat strong { font-size: 0.68rem; }
}

/* Cabezote del estudiante en celular: sin menú lateral ni marca, todo el
   ancho es para racha/notificaciones/vidas/monedas, que además crecen y el
   cabezote queda más delgado (menos relleno arriba/abajo). */
@media (max-width: 575.98px) {
  .cabezote-estudiante.navbar.bg-primary {
    padding-top: 0.2rem;
    padding-bottom: 0.2rem;
  }
  .cabezote-estudiante .marca-birreton {
    display: none;
  }
  .cabezote-estudiante #cabezoteStats {
    margin-left: 0 !important;
    width: 100%;
    justify-content: space-evenly;
  }
  .cabezote-estudiante .racha-flama,
  .cabezote-estudiante .campanita,
  .cabezote-estudiante .hdr-stat i,
  .cabezote-estudiante .oferta-cuenta-regresiva i {
    font-size: 1.3rem;
  }
  .cabezote-estudiante .hdr-stat strong {
    font-size: 0.78rem;
  }
  /* Con el cabezote tan delgado (0.2rem de relleno arriba), el globo de
     notificaciones con su "top: -6px" de siempre quedaba pegado al borde
     superior de la pantalla. Aquí sube menos, para que le quede un poco de
     aire. */
  .cabezote-estudiante .campanita-globo {
    top: -2px;
  }
}

/*=============================================
CALENDARIO DE DÍAS PRACTICADOS (estadísticas)
=============================================*/
.calendario-cabecera {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 0.75rem;
}

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

.calendario-grid .dia-nombre {
  text-align: center;
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--c-muted, #6b7280);
  padding-bottom: 0.25rem;
}

.calendario-celda {
  aspect-ratio: 1 / 1;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 0.5rem;
  font-size: 0.85rem;
  background-color: rgba(0, 0, 0, 0.04);
  color: inherit;
}

.calendario-celda.vacia {
  background-color: transparent;
}

/* Día con al menos un examen practicado. Se puede pulsar para abrir el
   detalle de ese día (qué materias, temas y subtemas se practicaron). El
   número del día va CENTRADO en el cuadro; la racha que se llevaba acumulada
   ese día se ancla al borde inferior (position:absolute, ver .celda-racha). */
.calendario-celda.practicado {
  background-color: #16a34a;
  color: #fff;
  font-weight: 600;
  cursor: pointer;
  line-height: 1;
  position: relative;
}
.calendario-celda.practicado:hover,
.calendario-celda.practicado:focus-visible {
  background-color: #15803d;
  outline: 2px solid #15803d;
  outline-offset: 1px;
}
/* Racha del día: anclada al borde inferior de la celda para que el número del
   día quede centrado en el cuadro. Mismo cuerpo de letra que el número (hereda
   el font-size de .calendario-celda) y en el mismo naranja que la flama de
   racha del cabezote (#fb923c). El naranja sobre el verde es de contraste bajo
   por naturaleza; la sombra le da filo a las letras. */
.calendario-celda .celda-racha {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 1px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 2px;
  font-size: inherit;
  font-weight: 700;
  color: #fb923c;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
}
.calendario-celda .celda-racha i {
  font-size: 1em;
}

/* Día de hoy: borde resaltado */
.calendario-celda.hoy {
  outline: 2px solid #2563eb;
  outline-offset: -2px;
}

body.dark-mode .calendario-celda {
  background-color: rgba(255, 255, 255, 0.06);
}

body.dark-mode .calendario-celda.vacia {
  background-color: transparent;
}

body.dark-mode .calendario-celda.practicado {
  background-color: #16a34a;
}

/*=============================================
PAGINACIÓN — compatibilidad con modo oscuro (Tarea 13)
=============================================*/
body.dark-mode .pagination .page-link {
  background-color: var(--c-surface);
  border-color: var(--c-border);
  color: var(--c-text);
}

body.dark-mode .pagination .page-link:hover {
  background-color: #0f172a;
  color: var(--c-text);
}

body.dark-mode .pagination .page-item.active .page-link {
  background-color: var(--c-primary);
  border-color: var(--c-primary);
  color: #fff;
}

body.dark-mode .pagination .page-item.disabled .page-link {
  background-color: var(--c-surface);
  border-color: var(--c-border);
  color: var(--c-muted);
}

/*=============================================
BREADCRUMB — compatibilidad con modo oscuro (Tarea 13)
=============================================*/
body.dark-mode .breadcrumb {
  color: var(--c-muted);
}

body.dark-mode .breadcrumb-item.active {
  color: var(--c-text);
}

body.dark-mode .breadcrumb-item a {
  color: #818cf8; /* índigo claro, legible sobre fondo oscuro */
}

body.dark-mode .breadcrumb-item + .breadcrumb-item::before {
  color: var(--c-muted);
}

/*=============================================
MAPA DE REGISTROS (Leaflet) — página de estadísticas
=============================================*/
#mapaRegistros {
  border-radius: 0.5rem;
  overflow: hidden;
  border: 1px solid var(--c-border);
  z-index: 0; /* evita que el mapa se monte sobre los modales */
}

#mapaRegistros .leaflet-popup-content-wrapper,
#mapaRegistros .leaflet-popup-tip {
  background: var(--c-surface);
  color: var(--c-text);
}

/* En modo oscuro se atenúan los mosaicos para que no deslumbren */
body.dark-mode #mapaRegistros .leaflet-tile-pane {
  filter: brightness(0.7) contrast(1.05) saturate(0.85);
}

body.dark-mode #mapaRegistros .leaflet-control-attribution {
  background: rgba(15, 23, 42, 0.85);
  color: var(--c-muted);
}

body.dark-mode #mapaRegistros .leaflet-control-attribution a {
  color: #818cf8;
}

/*=============================================
LOGIN — acabado tipográfico y botones (Tarea 21)
Solo forma y tipografía: los colores los define la paleta del sistema.
=============================================*/

/* Marca "Birretón": enlace de regreso a la landing */
.login-marca {
  display: inline-flex;
  color: inherit;
  text-decoration: none;
  transition: transform 0.18s ease, opacity 0.18s ease;
}

.login-marca:hover {
  color: inherit;
  transform: translateY(-1px);
  opacity: 0.92;
}

/* Logo del login: mismo tratamiento que .logo-cabezote (fondo claro y borde
   dorado detrás del blanco semitransparente del PNG), un poco más grande
   porque aquí es la única marca del encabezado, sin texto aparte. */
.logo-login {
  height: 4.5rem;
}

/* Tarjeta con un borde suave y sombra más profunda */
.login-wrapper .login-card {
  border: none;
  border-radius: 1rem;
  overflow: hidden;
  box-shadow: 0 18px 45px rgba(15, 23, 42, 0.18);
}

.login-card .card-header { border-bottom: none; }

.login-card .form-label {
  font-size: 0.82rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: var(--c-muted);
}

.login-card .form-control,
.login-card .input-group-text {
  border-color: var(--c-border);
}

.login-card .form-control:focus {
  box-shadow: 0 0 0 0.2rem var(--c-primary-soft);
  border-color: var(--c-primary);
}

/* Botones principales: forma y realce (el color viene de la paleta) */
.login-card .btn-login-principal,
.login-card .btn-login-registro,
.login-card #btnEntrarInvitado {
  padding: 0.42rem 1rem;
  border-radius: 0.6rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  transition: transform 0.15s ease, box-shadow 0.15s ease, filter 0.15s ease;
}

.login-card .btn-login-principal:hover,
.login-card .btn-login-registro:hover,
.login-card #btnEntrarInvitado:hover {
  transform: translateY(-1px);
  box-shadow: 0 6px 16px rgba(15, 23, 42, 0.18);
}

.login-card .btn-login-principal:active,
.login-card .btn-login-registro:active,
.login-card #btnEntrarInvitado:active {
  transform: translateY(0);
}

/* Botón discreto para regresar a la landing */
.login-card .btn-login-volver {
  padding: 0.3rem 1.1rem;
  border: 1px solid var(--c-border);
  border-radius: 2rem;
  font-size: 0.85rem;
  font-weight: 500;
  letter-spacing: 0.04em;
  color: var(--c-muted);
  background: transparent;
  transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

.login-card .btn-login-volver:hover {
  background: var(--c-primary-soft);
  border-color: var(--c-primary);
  color: var(--c-primary-dark);
}

/* Enlaces secundarios del login */
.login-card a:not(.btn):not(.login-marca) {
  text-decoration: none;
  transition: opacity 0.15s ease;
}

.login-card a:not(.btn):not(.login-marca):hover {
  text-decoration: underline;
  opacity: 0.85;
}

body.dark-mode .login-card .btn-login-volver:hover {
  color: var(--c-text);
}

/*=============================================
PASARELA PARA CREAR EXÁMENES (página crearExamen)
=============================================*/

/* Recordatorio de la pregunta mientras se escriben las opciones */
.pasarela-recordatorio {
  margin-bottom: 1rem;
  padding: 0.6rem 0.85rem;
  border-left: 4px solid var(--c-primary);
  border-radius: 0.4rem;
  background: var(--c-primary-soft);
}

.pasarela-recordatorio-titulo {
  display: block;
  font-size: 0.7rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--c-muted);
  margin-bottom: 0.2rem;
}

.pasarela-recordatorio p {
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--c-text);
  /* Preguntas largas: se limita la altura para no empujar el formulario */
  max-height: 5.5rem;
  overflow-y: auto;
}

/* Botones del pie: compactos para que los cuatro quepan en una sola fila */
.pasarela-botones .btn {
  font-size: 0.78rem;
  padding: 0.35rem 0.6rem;
  white-space: nowrap;
}

@media (max-width: 400px) {
  .pasarela-botones .btn { font-size: 0.7rem; padding: 0.3rem 0.45rem; }
  .pasarela-botones .btn i { display: none; }   /* solo el texto en pantallas muy angostas */
}

/*=============================================
BOTONES EN PANTALLAS PEQUEÑAS (celular)
El texto se ajusta al ancho disponible en vez de desbordar el botón.
=============================================*/
@media (max-width: 576px) {
  .btn {
    font-size: 0.875rem;
    padding: 0.45rem 0.7rem;
    white-space: normal;      /* el texto largo salta de línea, no se sale */
    word-break: break-word;
  }

  .btn-lg { font-size: 1rem; padding: 0.42rem 1rem; }
  .btn-sm { font-size: 0.78rem; padding: 0.3rem 0.5rem; }

  /* Botones de acción de las tablas: solo el ícono para que quepan */
  .btn-group .btn { padding: 0.35rem 0.5rem; }

  /* Los accesos grandes de los menús (mochila, juegos, menú principal) */
  .mp-btn, .mochila-btn, .juegos-btn {
    font-size: 1rem;
    padding: 1.75rem 1rem;
  }

  .mp-btn i, .mochila-btn i, .juegos-btn i { font-size: 2.6rem; }

  /* Modales: los pies con varios botones se reparten sin desbordar */
  .modal-footer .btn { flex: 1 1 auto; }
}

/* Pantallas muy angostas: se prioriza que el texto del botón se lea completo */
@media (max-width: 380px) {
  .btn { font-size: 0.8rem; padding: 0.3rem 0.55rem; }
  .mp-btn, .mochila-btn, .juegos-btn { font-size: 0.95rem; padding: 1.4rem 0.75rem; }
  .mp-btn i, .mochila-btn i, .juegos-btn i { font-size: 2.2rem; }
}

/*=============================================
MODO INVITADO
Las funciones que piden cuenta se ven apagadas y con candado, para que se
note a simple vista que no están disponibles sin iniciar sesión.
=============================================*/
body.modo-invitado [data-requiere-sesion] {
  position: relative;
  filter: grayscale(1);
  opacity: 0.6;
  cursor: not-allowed;
}

/* Sin efecto de elevación: un botón bloqueado no debe parecer pulsable. */
body.modo-invitado [data-requiere-sesion]:hover,
body.modo-invitado [data-requiere-sesion]:focus,
body.modo-invitado [data-requiere-sesion]:active {
  transform: none;
  box-shadow: 0 4px 18px rgba(0, 0, 0, 0.15);
}

body.modo-invitado [data-requiere-sesion]::after {
  content: "\f023";                  /* candado de Font Awesome */
  /* La familia cambia de nombre con cada versión mayor: se listan las que ha
     usado el proyecto para que el candado se pinte con cualquiera de ellas. */
  font-family: "Font Awesome 7 Free", "Font Awesome 6 Free", "Font Awesome 5 Free";
  font-weight: 900;
  position: absolute;
  top: 0.7rem;
  right: 0.9rem;
  font-size: 1rem;
  opacity: 0.9;
}

/*=============================================
MENÚ PRINCIPAL Y PIE CON LA MOCHILA VACÍA
Sin ninguna materia agregada, solo "Mochila virtual" queda activo en el menú y,
en el pie, se apagan "Estadísticas", "Examen" y "Juegos" ("Inicio" y "Regresar"
siguen). Todo hasta que el estudiante elija un paquete o un libro suelto. El
clic apagado lo intercepta vistas/js/menuMochilaVacia.js con un aviso. El PHP
(menuPrincipal.php / footer.php) pone "data-mochila-vacia" en cada acceso.
=============================================*/
.ma-btn[data-mochila-vacia] {
  filter: grayscale(1);
  opacity: 0.55;
  cursor: not-allowed;
}
/* Sin elevación al pasar el ratón: un acceso apagado no debe parecer pulsable. */
.ma-btn[data-mochila-vacia]:hover,
.ma-btn[data-mochila-vacia]:focus,
.ma-btn[data-mochila-vacia]:active {
  transform: none;
  box-shadow: 0 4px 18px rgba(0, 0, 0, 0.15);
}
.ma-btn[data-mochila-vacia]::after {
  content: "\f023";                  /* mismo candado que el bloqueo del invitado */
  font-family: "Font Awesome 7 Free", "Font Awesome 6 Free", "Font Awesome 5 Free";
  font-weight: 900;
  position: absolute;
  top: 0.7rem;
  right: 0.9rem;
  font-size: 1rem;
  opacity: 0.9;
}

/* Acceso del pie apagado: sin candado (el botón es diminuto), solo atenuado y
   sin cursor de "pulsable". */
.footer-acceso-apagado {
  opacity: 0.4;
  cursor: not-allowed;
}

/* Durante el recorrido de bienvenida NADA se ve apagado (menú ni pie): es solo
   una inducción del sistema, el estudiante todavía no interactúa con ellos (los
   clics los atrapa la capa del recorrido). El bloqueo real vuelve al terminar. */
body.induccion-activa .ma-btn[data-mochila-vacia] {
  filter: none;
  opacity: 1;
}
body.induccion-activa .ma-btn[data-mochila-vacia]::after { content: none; }
body.induccion-activa .footer-acceso-apagado { opacity: 1; }

/* Aviso "elige tus materias" encima de la cuadrícula mientras la mochila está
   vacía. Sin avatar ni pico: es una nota, no una burbuja de diálogo. Durante
   el recorrido se esconde.

   Fondo verde muy transparente (10% en claro, 14% en oscuro —los fondos
   oscuros se comen el tinte y necesitan un pelo más) y un contorno de 1px
   rojo también translúcido: da el aire de "aviso" sin gritar. El verde se
   compone sobre el fondo de la página (var(--c-bg)), no sobre una tarjeta
   blanca, así que en claro queda un menta pálido (~rgb(220,240,234): el
   texto slate-800 da 11:1) y en oscuro un verde muy apagado (el texto
   slate-200 da 12:1). Las palabras en <strong> van en verde —a juego con el
   fondo— con su tono por modo para no perder contraste (verde-800 sobre el
   menta claro = 5.2:1; verde-400 sobre el verde oscuro = 8.6:1). */
.mp-aviso-mochila {
  width: 100%;
  max-width: 460px;
  margin: 0 auto 1.4rem;
  background: rgba(34, 197, 94, 0.10);
  border: 1px solid rgba(239, 68, 68, 0.30);
  border-radius: 1.1rem;
  padding: 0.85rem 1.15rem;
  box-shadow: var(--c-shadow-sm);
}
body.induccion-activa .mp-aviso-mochila { display: none; }
.mp-aviso-mochila p {
  margin: 0;
  font-size: 1rem;
  font-weight: 500;
  line-height: 1.4;
  color: var(--c-text);
  text-align: center;
}
.mp-aviso-mochila strong { color: #166534; font-weight: 700; white-space: nowrap; }

body.dark-mode .mp-aviso-mochila {
  background: rgba(34, 197, 94, 0.14);
  border-color: rgba(248, 113, 113, 0.35);
}
body.dark-mode .mp-aviso-mochila strong { color: #4ade80; }

/*=============================================
ACCESO BLOQUEADO POR PREMIUM (p. ej. "Ranking" o las pruebas de perfil)
Mismo aspecto apagado que el bloqueo del invitado, pero con una etiqueta
"Premium Imparable" en vez de solo el candado, porque el acceso sí lleva a
algún lado (la pantalla que invita a suscribirse).
=============================================*/
.ma-btn-bloqueado { position: relative; filter: grayscale(0.7); opacity: 0.85; }
.ma-btn-bloqueado:hover,
.ma-btn-bloqueado:focus { transform: none; box-shadow: 0 4px 18px rgba(0, 0, 0, 0.15); }

.ma-candado {
  position: absolute;
  top: 0.6rem; right: 0.6rem;
  display: inline-flex; align-items: center; gap: 0.25rem;
  max-width: calc(100% - 1.2rem);
  padding: 0.1rem 0.45rem; border-radius: 99px;
  background: rgba(0, 0, 0, 0.35);
  font-size: 0.64rem; font-weight: 700; letter-spacing: .02em;
  white-space: nowrap;
}

/*=============================================
RETOS DEL ESTUDIANTE (punto 25)
Modal que propone el reto de racha al terminar un examen o un juego.
=============================================*/

/* Emblema con la flama del reto */
.reto-emblema {
  width: 92px; height: 92px;
  margin: 0 auto 1rem;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(135deg, #f97316 0%, #dc2626 100%);
  box-shadow: 0 10px 26px rgba(249, 115, 22, 0.45);
  animation: retoLatido 1.8s ease-in-out infinite;
}

.reto-emblema i {
  font-size: 2.7rem;
  color: #fff;
  animation: retoFlama 1.1s ease-in-out infinite alternate;
}

@keyframes retoLatido {
  0%, 100% { transform: scale(1); box-shadow: 0 10px 26px rgba(249, 115, 22, 0.45); }
  50%      { transform: scale(1.06); box-shadow: 0 14px 34px rgba(249, 115, 22, 0.6); }
}

@keyframes retoFlama {
  from { transform: translateY(0) rotate(-4deg); }
  to   { transform: translateY(-3px) rotate(4deg); }
}

/* Los tres días del reto */
.reto-dias {
  display: flex; justify-content: center; gap: 0.6rem;
  margin: 1rem 0 0.25rem;
}

.reto-dia {
  width: 46px; height: 46px;
  border-radius: 0.7rem;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  font-size: 0.7rem; font-weight: 700;
  border: 2px dashed var(--c-border);
  color: var(--c-muted);
  opacity: 0;
  animation: retoAparece 0.4s ease forwards;
}

.reto-dia:nth-child(1) { animation-delay: 0.10s; }
.reto-dia:nth-child(2) { animation-delay: 0.25s; }
.reto-dia:nth-child(3) { animation-delay: 0.40s; }

/* Día ya conseguido */
.reto-dia.reto-dia-hecho {
  border-style: solid;
  border-color: #16a34a;
  background: rgba(22, 163, 74, 0.12);
  color: #16a34a;
}

@keyframes retoAparece {
  from { opacity: 0; transform: translateY(10px) scale(0.85); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

/* Premio en monedas */
.reto-premio {
  display: inline-flex; align-items: center; gap: 0.45rem;
  margin-top: 0.9rem; padding: 0.45rem 1.1rem;
  border-radius: 99px;
  background: rgba(245, 158, 11, 0.15);
  border: 1px solid rgba(245, 158, 11, 0.45);
  font-weight: 700; color: #b45309;
}

.reto-premio i { animation: retoMoneda 2.2s ease-in-out infinite; }

@keyframes retoMoneda {
  0%, 70%, 100% { transform: rotateY(0); }
  85%           { transform: rotateY(180deg); }
}

body.dark-mode .reto-premio { color: #fbbf24; }

.reto-texto { font-size: 0.95rem; color: var(--c-text); }
.reto-nota  { font-size: 0.8rem; color: var(--c-muted); }

/* Checkbox "no mostrar este reto": toda la etiqueta es clicable (mejor blanco
   de toque que el cuadrito solo) y va en su propia tarjeta con borde, para que
   se note tanto como el resto del modal (antes era un checkbox diminuto de
   Bootstrap, gris sobre gris, que se perdía de vista). */
.reto-omitir {
  display: flex; align-items: center; justify-content: center; gap: 0.6rem;
  margin-top: 1.1rem; padding: 0.65rem 1rem;
  border-radius: 0.75rem;
  border: 1px dashed rgba(249, 115, 22, 0.45);
  background: rgba(249, 115, 22, 0.07);
  font-size: 0.85rem; font-weight: 600; color: var(--c-text);
  text-align: left;
  cursor: pointer;
  transition: background-color .15s ease, border-color .15s ease;
}

/* Marcado: la tarjeta se enciende del mismo naranja del reto, para que se
   note de un vistazo que quedó activado. */
.reto-omitir:has(.reto-omitir-check:checked) {
  border-style: solid;
  background: rgba(249, 115, 22, 0.16);
}

.reto-omitir-check {
  flex: none;
  width: 22px; height: 22px;
  margin: 0;
  accent-color: #f97316;
  cursor: pointer;
}

.reto-omitir span i { color: #f97316; margin-right: 0.15rem; }

/*=============================================
RESCATE DE LA RACHA PERDIDA (vistas/js/racha.js)
Reaprovecha el emblema del reto, pero apagado: la flama está a punto de
extinguirse, que es justo lo que se le ofrece evitar.
=============================================*/
.racha-emblema {
  width: 92px; height: 92px;
  margin: 0 auto 1rem;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(135deg, #94a3b8 0%, #475569 100%);
  box-shadow: 0 10px 26px rgba(71, 85, 105, 0.4);
}

.racha-emblema i { font-size: 2.7rem; color: #fff; opacity: 0.85; }

.racha-precio {
  display: inline-flex; align-items: center; gap: 0.45rem;
  margin-top: 0.9rem; padding: 0.45rem 1.1rem;
  border-radius: 99px;
  background: rgba(245, 158, 11, 0.15);
  border: 1px solid rgba(245, 158, 11, 0.45);
  font-weight: 700; color: #b45309;
}

body.dark-mode .racha-precio { color: #fbbf24; }

/* Flama del cabezote mientras se puede rescatar la racha: parpadea en ámbar
   para que el estudiante la vea antes de que se le pase el plazo. */
.racha-flama.racha-rescate {
  animation: rachaRescate 1.1s ease-in-out infinite;
  border-radius: 0.5rem;
}

@keyframes rachaRescate {
  0%, 100% { box-shadow: 0 0 0 0 rgba(251, 191, 36, 0); }
  50%      { box-shadow: 0 0 0 6px rgba(251, 191, 36, 0.55); }
}

/* Entrada del modal de reto (sin depender de librerías externas) */
.reto-popup-entra { animation: retoEntra 0.35s cubic-bezier(0.2, 0.9, 0.3, 1.2); }

@keyframes retoEntra {
  from { opacity: 0; transform: scale(0.85) translateY(14px); }
  to   { opacity: 1; transform: scale(1) translateY(0); }
}

/*=============================================
SUSCRIPCIÓN (punto 11)
Planes premium: vidas y juegos ilimitados y días de congelado gratis.
El dorado distingue lo premium del resto de la tienda.
=============================================*/

/*=============================================
AVATAR DE USUARIO (controladores/seguridad.php → avatarUsuario())

Con foto se ve la foto; sin ella, un círculo con sus iniciales en dorado —el
color de Birretón— sobre el azul oscuro de la marca. Se lee mucho mejor que la
misma silueta anónima repetida por toda la pantalla.
=============================================*/
.avatar-usuario {
  border-radius: 50%;
  object-fit: cover;
  flex: 0 0 auto;
  vertical-align: middle;
}

.avatar-iniciales {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(135deg, #123a72 0%, #0d2d5e 100%);
  color: #fbbf24;
  font-weight: 700;
  letter-spacing: .02em;
  line-height: 1;
  /* Sin selección de texto: es un adorno, no un dato que se copie. */
  -webkit-user-select: none; user-select: none;
}

/* En el cabezote lleva el aro claro que separa el avatar del color de la barra. */
.avatar-cabezote { border: 2px solid rgba(255, 255, 255, 0.3); }

/*=============================================
RESUMEN DE LOS PASOS YA ELEGIDOS (juegos)
Sustituye a los selectores en cuanto están elegidos materia, capítulo y
cantidad, para dejarle la pantalla al tablero (vistas/js/pasosJuego.js).
=============================================*/
.pasos-resumen {
  border: 1px solid var(--c-border);
  border-radius: .65rem;
  padding: .6rem .85rem;
  background: var(--c-surface);
}
.pasos-resumen-texto {
  font-weight: 600;
  overflow-wrap: anywhere;
}
.pasos-resumen-texto i { color: #16a34a; margin-right: .35rem; }

/* Corona del cabezote: señal de que la cuenta está suscrita */
.hdr-premium i {
  color: #fbbf24;
  font-size: 1.05rem;
  filter: drop-shadow(0 0 4px rgba(251, 191, 36, 0.65));
}

/* Botón dorado, usado tanto para "Suscríbete" como para elegir plan.
   La letra va en azul oscuro y no en blanco: sobre el dorado, el blanco solo
   llegaba a 2.15:1 de contraste (el mínimo legible es 4.5:1) y el texto se
   perdía. Con el azul de la marca el mismo dorado da entre 6:1 y 8:1. */
.btn-premium {
  background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);
  border: none;
  color: #0d2d5e;
  font-weight: 700;
  box-shadow: 0 4px 14px rgba(245, 158, 11, 0.35);
}

.btn-premium:hover,
.btn-premium:focus {
  background: linear-gradient(135deg, #fcd34d 0%, #fbbf24 100%);
  color: #0d2d5e;
  box-shadow: 0 6px 20px rgba(245, 158, 11, 0.5);
}

.btn-premium:focus-visible {
  outline: 3px solid #0d2d5e;
  outline-offset: 2px;
}

.modal-header-premium {
  background: linear-gradient(135deg, #f59e0b 0%, #b45309 100%);
  color: #fff;
}

/* Botón "Ver origen" (examen, retroalimentación y Cartas: lo crea
   vistas/js/verOrigen.js para las tres). Va con el color sólido de marca
   desde el principio (antes era un fondo muy tenue y a primera vista casi no
   se notaba); al pasar el puntero se oscurece un poco, como cualquier hover. */
.btn-ver-origen {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  padding: .3rem .9rem;
  border: 1px solid transparent;
  border-radius: 50rem;
  background: var(--c-primary);
  color: #fff;
  font-size: .8rem;
  font-weight: 600;
  transition: background-color .15s ease, color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.btn-ver-origen:hover,
.btn-ver-origen:focus {
  background: var(--c-primary-dark);
  color: #fff;
  box-shadow: 0 3px 10px rgba(79, 70, 229, .35);
  transform: translateY(-1px);
}
.btn-ver-origen:focus-visible {
  outline: 2px solid var(--c-primary);
  outline-offset: 2px;
}

/* Botón "Comodín" (examen y retroalimentación): elimina una opción
   incorrecta por 2 monedas, con cupo de 1 por cada 10 preguntas del intento
   (vistas/js/comodin.js). Chip dorado —el mismo lenguaje de "esto cuesta
   monedas" que ya usan la corona y los planes Premium— para que se note que
   es una ayuda que se paga, no una acción cualquiera. */
.btn-comodin {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  padding: .3rem .9rem;
  border: 1px solid transparent;
  border-radius: 50rem;
  background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
  color: #92400e;
  font-size: .8rem;
  font-weight: 700;
  transition: background-color .15s ease, box-shadow .15s ease, transform .15s ease, opacity .15s ease;
}
.btn-comodin:hover,
.btn-comodin:focus {
  background: linear-gradient(135deg, #fde68a 0%, #fbbf24 100%);
  box-shadow: 0 3px 10px rgba(245, 158, 11, .35);
  transform: translateY(-1px);
}
.btn-comodin:focus-visible {
  outline: 2px solid #b45309;
  outline-offset: 2px;
}
.btn-comodin:disabled {
  opacity: .6;
  cursor: default;
  transform: none;
  box-shadow: none;
}
.badge-comodin {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 1.2rem; height: 1.2rem; padding: 0 .3rem;
  border-radius: 50rem;
  background: #92400e; color: #fff7ed;
  font-size: .68rem; font-weight: 700;
}
body.dark-mode .btn-comodin {
  background: linear-gradient(135deg, #78350f 0%, #92400e 100%);
  color: #fde68a;
}
body.dark-mode .btn-comodin:hover,
body.dark-mode .btn-comodin:focus {
  background: linear-gradient(135deg, #92400e 0%, #b45309 100%);
}
body.dark-mode .badge-comodin { background: #451a03; color: #fde68a; }

/* Lista de beneficios del plan */
.lista-beneficios {
  list-style: none;
  padding: 0;
  margin: 0 0 0.5rem;
}

.lista-beneficios li {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  padding: 0.45rem 0;
  font-size: 0.92rem;
  color: var(--c-text);
}

.lista-beneficios i {
  color: #f59e0b;
  width: 1.2rem;
  text-align: center;
  margin-top: 0.15rem;
}

/* Dentro de la tarjeta de un plan la lista es más menuda (hay tres tarjetas
   una al lado de otra) y va alineada a la izquierda aunque la tarjeta esté
   centrada: una lista centrada de renglones desiguales no se lee. */
.lista-beneficios-plan li {
  font-size: 0.8rem;
  padding: 0.28rem 0;
  text-align: left;
  line-height: 1.3;
}
.lista-beneficios-plan i { margin-top: 0.12rem; }

/* Lo que el plan SÍ incluye va en verde; lo que no, en gris tachado de tache:
   así se distingue de un vistazo sin tener que leer cada renglón. */
.lista-beneficios .beneficio-si i { color: #16a34a; }
.lista-beneficios .beneficio-no i { color: #94a3b8; }
.lista-beneficios .beneficio-no { color: var(--c-muted); }

/* Tarjetas de los tres planes */
.tarjeta-plan {
  position: relative;
  border: 1px solid var(--c-border);
  border-radius: var(--c-radius);
  background: var(--c-surface);
  transition: transform 0.18s ease, box-shadow 0.18s ease;
}

.tarjeta-plan:hover {
  transform: translateY(-3px);
  box-shadow: var(--c-shadow);
}

/* Plan sugerido: se resalta con el borde dorado */
.tarjeta-plan-destacada {
  border-color: #f59e0b;
  border-width: 2px;
  box-shadow: 0 4px 18px rgba(245, 158, 11, 0.25);
}

.etiqueta-plan {
  position: absolute;
  top: -0.7rem;
  left: 50%;
  transform: translateX(-50%);
  /* Misma razón que en .btn-premium: el blanco sobre dorado no se leía. */
  background: #f59e0b;
  color: #0d2d5e;
  font-size: 0.68rem;
  font-weight: 700;
  padding: 0.15rem 0.7rem;
  border-radius: 99px;
  white-space: nowrap;
}

.precio-plan {
  /* Con descuento el importe trae decimales ("$178.5") y es más largo: se
     deja encoger en tarjetas angostas para que no se parta en dos renglones. */
  font-size: clamp(1.5rem, 4.6vw, 1.9rem);
  font-weight: 700;
  color: #b45309;
  line-height: 1.1;
  white-space: nowrap;
}

/* La moneda acompaña al precio sin competir con él. Va sobre la misma línea
   base (no en superíndice): junto a un importe con centavos, flotando arriba,
   se leía como si fuera parte de la cifra. */
.moneda-plan {
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--c-muted);
  margin-left: 0.22rem;
}

body.dark-mode .precio-plan { color: #fbbf24; }

/* Precio de lista tachado cuando hay una oferta vigente */
.precio-antes {
  font-size: 0.95rem;
  color: var(--c-muted);
  text-decoration: line-through;
}

/* El "-N%" acompaña al precio tachado, no al importe final. La etiqueta es
   inline-block, así que la línea del tachado no la atraviesa. */
.precio-antes .badge-descuento {
  font-size: 0.62rem;
  font-weight: 700;
  vertical-align: 0.12em;
  margin-left: 0.35rem;
}

/* Precio especial por invitación en la landing (punto 19): resplandor
   dorado en la tarjeta mientras corren las 24 horas del enlace ?ref=. */
.tarjeta-plan-invitacion-activa {
  border-color: #f59e0b;
  animation: invitacionResplandor 1.8s ease-in-out infinite;
}

@keyframes invitacionResplandor {
  0%, 100% { box-shadow: 0 4px 18px rgba(245, 158, 11, 0.25); }
  50%      { box-shadow: 0 6px 30px rgba(245, 158, 11, 0.65); }
}

.tarjeta-plan-invitacion-activa .precio-invitacion {
  text-shadow: 0 0 10px rgba(245, 158, 11, 0.55);
}

.invitacion-cuenta-regresiva {
  display: inline-block;
  font-variant-numeric: tabular-nums;
}

/* Aviso del descuento que el sistema le regaló por su constancia */
.aviso-oferta {
  display: flex;
  gap: 0.75rem;
  align-items: center;
  padding: 0.85rem 1rem;
  margin-bottom: 1rem;
  border-radius: var(--c-radius);
  background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);
  color: #fff;
  box-shadow: 0 6px 18px rgba(220, 38, 38, 0.3);
}

.aviso-oferta i { font-size: 1.6rem; }
.aviso-oferta p { font-size: 0.85rem; opacity: 0.95; }

/* Estados de la pantalla de resultado del pago */
.pago-tarjeta { margin: 0 auto; }

/* Campo del código de invitación dentro del modal de planes */
.caja-codigo {
  padding: 0.9rem 1rem;
  border: 1px dashed var(--c-border);
  border-radius: var(--c-radius);
  background: var(--c-primary-soft);
}

.caja-codigo label { color: var(--c-text); font-weight: 600; }
.caja-codigo i { color: #f59e0b; }

/*=============================================
NOTIFICACIONES (punto 14)
Campanita del cabezote y bandeja de avisos del estudiante.
=============================================*/

/* El color del cabezote es fijo (se elige en "Colores del sistema") e igual
   en modo claro y oscuro: su texto no debe depender del color de la página,
   que sí cambia con el tema — y con "body.modo-transicion" (cabezote.css)
   ese cambio anima durante 0.5s. Sin esto, ".campanita { color: inherit }"
   terminaba heredando ese color de PÁGINA (a través del <nav> del cabezote,
   que tampoco tenía su propio color fijado) en vez del color de cabezote
   configurado, y se veía "cambiar" junto con el resto de la página al
   alternar el modo. Con el color fijado aquí, en el propio <nav>, deja de
   heredar nada que transicione con el tema. */
.navbar.bg-primary { color: var(--c-cabezote-texto, #fff); }

.campanita { color: inherit; }
.campanita i { font-size: 1.1rem; }

/* Cuenta regresiva de la oferta por constancia (punto 16) */
.oferta-cuenta-regresiva {
  padding: 0.2rem 0.55rem !important;
  border-radius: 999px;
  background: rgba(220, 38, 38, 0.85);
  color: #fff;
  font-size: 0.78rem;
  line-height: 1.2;
}
.oferta-cuenta-regresiva i { font-size: 0.85rem; }
.oferta-cuenta-regresiva strong { font-variant-numeric: tabular-nums; }

/* Reloj digital (punto 11): números de las cuentas regresivas (oferta por
   constancia y precio de invitación) con aspecto de pantalla LCD en vez de
   texto plano — mismo aspecto sin importar dónde se use. */
.reloj-digital {
  display: inline-block;
  font-family: "Courier New", Consolas, monospace;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.12em;
  padding: 0.15rem 0.5rem;
  border-radius: 0.35rem;
  background: #0b1220;
  color: #4ade80;
  border: 1px solid rgba(74, 222, 128, 0.45);
  text-shadow: 0 0 6px rgba(74, 222, 128, 0.7);
  box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.6);
}

/* Punto 13: el reloj del precio de invitación (15%) se agranda y su
   contorno parpadea en tono de advertencia para captar la atención del
   visitante. Selector combinado a propósito: .reloj-digital sola también la
   usa #ofertaCountdown en el cabezote, que debe quedarse chica. */
.invitacion-cuenta-regresiva.reloj-digital {
  display: block;
  width: -moz-fit-content;
  width: fit-content;
  margin: 0.35rem auto;
  font-size: clamp(1.3rem, 5vw, 2rem);
  padding: 0.35rem 1rem;
  border-width: 3px;
  animation: relojInvitacionParpadeo 1.2s ease-in-out infinite;
}

/* En celular el reloj es la pieza que debe captar la atención: se planta
   centrado en la pantalla, más grande y con más aire alrededor. */
@media (max-width: 575.98px) {
  .invitacion-cuenta-regresiva.reloj-digital {
    margin: 0.7rem auto;
    font-size: clamp(1.7rem, 9vw, 2.4rem);
    padding: 0.5rem 1.15rem;
    letter-spacing: 0.06em;
    border-radius: 0.5rem;
  }
}

@keyframes relojInvitacionParpadeo {
  0%, 100% {
    border-color: rgba(74, 222, 128, 0.45);
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.6), 0 0 6px rgba(245, 158, 11, 0.3);
  }
  50% {
    border-color: #f59e0b;
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.6), 0 0 16px rgba(245, 158, 11, 0.95);
  }
}

/* Globo con el número de avisos sin leer */
.campanita-globo {
  position: absolute;
  top: -6px;
  right: -8px;
  min-width: 18px;
  height: 18px;
  padding: 0 4px;
  border-radius: 99px;
  background: #dc2626;
  color: #fff;
  font-size: 0.68rem;
  font-weight: 700;
  line-height: 18px;
  text-align: center;
  box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.15);
}

/* Lista con scroll propio: los botones del pie siguen visibles aunque se
   acumulen muchos avisos */
.notif-lista {
  max-height: min(55vh, 380px);
  overflow-y: auto;
  overscroll-behavior: contain;
  padding-right: 0.25rem;
}

/* Un aviso de la bandeja */
.notif-item {
  display: flex;
  gap: 0.75rem;
  align-items: flex-start;
  padding: 0.85rem 0.6rem;
  border-bottom: 1px solid var(--c-border);
  cursor: pointer;
  transition: background 0.15s ease;
}

.notif-item:last-child { border-bottom: none; }
.notif-item:hover { background: var(--c-primary-soft); }

/* Los ya leídos se apagan para que resalten los nuevos */
.notif-item.notif-leida { opacity: 0.6; }

.notif-icono {
  flex: 0 0 2rem;
  height: 2rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--c-primary-soft);
  color: var(--c-primary);
  font-size: 0.9rem;
}

.notif-cuerpo { flex: 1; min-width: 0; }

.notif-titulo {
  margin: 0 0 0.15rem;
  font-weight: 600;
  font-size: 0.92rem;
  color: var(--c-text);
}

.notif-mensaje {
  margin: 0 0 0.25rem;
  font-size: 0.85rem;
  color: var(--c-muted);
}

.notif-fecha {
  margin: 0;
  font-size: 0.72rem;
  color: var(--c-muted);
  opacity: 0.8;
}

/* Botón de quitar un aviso suelto (se resalta al pasar por encima) */
.notif-borrar {
  flex: 0 0 auto;
  align-self: center;
  border: none;
  background: transparent;
  color: var(--c-muted);
  padding: 0.25rem 0.4rem;
  border-radius: 0.4rem;
  line-height: 1;
  opacity: 0.5;
  transition: opacity 0.15s ease, color 0.15s ease, background 0.15s ease;
}

.notif-item:hover .notif-borrar { opacity: 1; }
.notif-borrar:hover { color: #dc2626; background: rgba(220, 38, 38, 0.12); }

/*=============================================
ESTRELLAS DE "MI RESEÑA" (punto 12)
Los radios van en el HTML de 5 a 1 y aquí se enderezan con row-reverse: es lo
que permite iluminar las estrellas anteriores con el selector ~ (que solo mira
hacia adelante en el DOM).
=============================================*/
.estrellas-resena {
  display: inline-flex;
  flex-direction: row-reverse;
  justify-content: flex-end;
  gap: 0.25rem;
  font-size: 1.9rem;
}

.estrellas-resena input { display: none; }

.estrellas-resena label {
  color: #cbd5e1;
  cursor: pointer;
  transition: color 0.15s ease, transform 0.15s ease;
}

.estrellas-resena label:hover { transform: scale(1.15); }

/* La marcada y todas las que tiene a su izquierda visual (a su derecha en el
   DOM, por el row-reverse) se pintan de dorado. */
.estrellas-resena input:checked ~ label,
.estrellas-resena label:hover,
.estrellas-resena label:hover ~ label {
  color: #e6ab1e;
}

body.dark-mode .estrellas-resena label { color: #475569; }
body.dark-mode .estrellas-resena input:checked ~ label,
body.dark-mode .estrellas-resena label:hover,
body.dark-mode .estrellas-resena label:hover ~ label { color: #f4c443; }

/*=============================================
MENÚS DE ACCESOS (MenuAdmin y menuPrincipal)
Los dos menús de inicio —el de los perfiles de administración y el del
estudiante— comparten el mismo botón grande: mismo tamaño, mismo redondeo y
la misma reacción al pasar el cursor. Solo cambia el color de cada acceso.
=============================================*/
/* Solo padding vertical: el horizontal lo pone el .container (12px), que antes
   se anulaba con el atajo `padding: 1rem 0 2rem` y dejaba los botones pegados
   al borde de la pantalla en celular. */
.ma-wrap { padding-top: 1rem; padding-bottom: 2rem; }

/* En celular, un poco más de aire a los lados que los 12px del container, para
   que ningún menú quede pegado al filo de la pantalla. */
@media (max-width: 575.98px) {
  .ma-wrap { padding-left: 1.1rem; padding-right: 1.1rem; }
}

.ma-grupo { margin-bottom: 2.25rem; }

.ma-grupo-titulo {
  display: flex; align-items: center; gap: 0.5rem;
  font-size: 0.78rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.09em; color: var(--c-muted);
  margin-bottom: 0.9rem;
}
.ma-grupo-titulo::after {
  content: ""; flex: 1; height: 1px; background: var(--c-border);
}

.ma-tarjetas {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
  gap: 1.1rem;
}

.ma-btn {
  position: relative;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 0.7rem; padding: 1.6rem 1rem; border-radius: 1.1rem; border: none;
  text-decoration: none; font-weight: 600; font-size: 1rem; color: #fff;
  text-align: center;
  transition: transform 0.18s ease, box-shadow 0.18s ease;
  box-shadow: 0 4px 18px rgba(0, 0, 0, 0.15);
}
.ma-btn:hover, .ma-btn:focus {
  transform: translateY(-4px) scale(1.03);
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.22);
  color: #fff; text-decoration: none;
}
.ma-btn i { font-size: 2.4rem; }

/* Precio en monedas de un juego, visible antes de entrar a jugar. */
.ma-precio {
  position: absolute;
  top: 0.6rem; right: 0.7rem;
  display: inline-flex; align-items: center; gap: 0.25rem;
  padding: 0.1rem 0.45rem; border-radius: 99px;
  background: rgba(0, 0, 0, 0.35);
  font-size: 0.68rem; font-weight: 700; letter-spacing: .02em;
}
.ma-precio i { font-size: 0.75rem !important; }

/* Accesos del menú de administración */
.ma-btn-usuarios     { background: linear-gradient(135deg, var(--ma-usuarios, #1d6ef5) 0%, var(--ma-usuarios-d, #0a47c2) 100%); }
.ma-btn-estadisticas { background: linear-gradient(135deg, var(--ma-estadisticas, #0ea5e9) 0%, var(--ma-estadisticas-d, #0369a1) 100%); }
.ma-btn-resenas      { background: linear-gradient(135deg, var(--ma-resenas, #ec4899) 0%, var(--ma-resenas-d, #9d174d) 100%); }
.ma-btn-materias     { background: linear-gradient(135deg, var(--ma-materias, #16a34a) 0%, var(--ma-materias-d, #0d7234) 100%); }
.ma-btn-temas        { background: linear-gradient(135deg, var(--ma-temas, #14b8a6) 0%, var(--ma-temas-d, #0f766e) 100%); }
.ma-btn-subtemas     { background: linear-gradient(135deg, var(--ma-subtemas, #06b6d4) 0%, var(--ma-subtemas-d, #0e7490) 100%); }
.ma-btn-microtemas   { background: linear-gradient(135deg, var(--ma-microtemas, #0891b2) 0%, var(--ma-microtemas-d, #0e7490) 100%); }
.ma-btn-nanotemas    { background: linear-gradient(135deg, var(--ma-nanotemas, #0e7490) 0%, var(--ma-nanotemas-d, #164e63) 100%); }
.ma-btn-preguntas    { background: linear-gradient(135deg, var(--ma-preguntas, #6366f1) 0%, var(--ma-preguntas-d, #4338ca) 100%); }
.ma-btn-opciones     { background: linear-gradient(135deg, var(--ma-opciones, #a855f7) 0%, var(--ma-opciones-d, #6d28d9) 100%); }
.ma-btn-saludmentaladmin { background: linear-gradient(135deg, var(--ma-saludmentaladmin, #0d9488) 0%, var(--ma-saludmentaladmin-d, #115e59) 100%); }
.ma-btn-faqadmin     { background: linear-gradient(135deg, var(--ma-faqadmin, #334155) 0%, var(--ma-faqadmin-d, #1e293b) 100%); }
.ma-btn-paquetes     { background: linear-gradient(135deg, var(--ma-paquetes, #f59e0b) 0%, var(--ma-paquetes-d, #b45309) 100%); }
.ma-btn-config       { background: linear-gradient(135deg, var(--ma-config, #64748b) 0%, var(--ma-config-d, #334155) 100%); }
.ma-btn-avatares     { background: linear-gradient(135deg, var(--ma-avatares, #f59e0b) 0%, var(--ma-avatares-d, #b45309) 100%); }
.ma-btn-cupones      { background: linear-gradient(135deg, var(--ma-cupones, #f97316) 0%, var(--ma-cupones-d, #c2410c) 100%); }
.ma-btn-soporte      { background: linear-gradient(135deg, var(--ma-soporte, #059669) 0%, var(--ma-soporte-d, #065f46) 100%); }
.ma-btn-pagos        { background: linear-gradient(135deg, #059669 0%, #065f46 100%); }
.ma-btn-ranking      { background: linear-gradient(135deg, var(--ma-ranking, #eab308) 0%, var(--ma-ranking-d, #a16207) 100%); }
/* Gris pizarra: el modo incógnito es "salirse" del panel de administración. */
.ma-btn-incognito    { background: linear-gradient(135deg, var(--ma-incognito, #475569) 0%, var(--ma-incognito-d, #1e293b) 100%); }

/* Accesos del menú del estudiante y de las pantallas que cuelgan de él
   (mochila virtual, juegos y "Mis exámenes"), todos con el mismo botón. */
.ma-btn-mochila      { background: linear-gradient(135deg, var(--ma-mochila, #1d6ef5) 0%, var(--ma-mochila-d, #0a47c2) 100%); }
.ma-btn-examen       { background: linear-gradient(135deg, var(--ma-examen, #14b8a6) 0%, var(--ma-examen-d, #0f766e) 100%); }
/* Fucsia y no violeta: el violeta quedaba a un paso del índigo del cabezote y
   el botón se perdía contra la barra de arriba. Misma razón en ".ma-btn-unir"
   y en las fichas de los cuatro juegos. */
.ma-btn-juegos       { background: linear-gradient(135deg, var(--ma-juegos, #d946ef) 0%, var(--ma-juegos-d, #a21caf) 100%); }
.ma-btn-examenes     { background: linear-gradient(135deg, var(--ma-examenes, #f97316) 0%, var(--ma-examenes-d, #c2410c) 100%); }
.ma-btn-retro        { background: linear-gradient(135deg, var(--ma-retro, #16a34a) 0%, var(--ma-retro-d, #0d7234) 100%); }
/* Magenta (no violeta): el violeta se pierde contra el índigo del cabezote,
   misma razón que ".ma-btn-juegos" y ".ma-btn-visorpdf". */
.ma-btn-chatia       { background: linear-gradient(135deg, var(--ma-chatia, #c026d3) 0%, var(--ma-chatia-d, #86198f) 100%); }
.ma-btn-estad        { background: linear-gradient(135deg, var(--ma-estad, #0ea5e9) 0%, var(--ma-estad-d, #0369a1) 100%); }
.ma-btn-resena       { background: linear-gradient(135deg, var(--ma-resena, #ec4899) 0%, var(--ma-resena-d, #9d174d) 100%); }
.ma-btn-cuenta       { background: linear-gradient(135deg, var(--ma-cuenta, #64748b) 0%, var(--ma-cuenta-d, #334155) 100%); }
.ma-btn-faq          { background: linear-gradient(135deg, var(--ma-faq, #0891b2) 0%, var(--ma-faq-d, #0e7490) 100%); }
/* Terracota y no violeta, por la misma razón que ".ma-btn-juegos": el violeta
   se pierde contra el índigo del cabezote. */
.ma-btn-visorpdf     { background: linear-gradient(135deg, var(--ma-visorpdf, #9a3412) 0%, var(--ma-visorpdf-d, #7c2d12) 100%); }
.ma-btn-buscar       { background: linear-gradient(135deg, var(--ma-buscar, #0ea5e9) 0%, var(--ma-buscar-d, #0369a1) 100%); }
.ma-btn-elegidas     { background: linear-gradient(135deg, #16a34a 0%, #0d7234 100%); }
.ma-btn-crear        { background: linear-gradient(135deg, var(--ma-crear, #f97316) 0%, var(--ma-crear-d, #c2410c) 100%); }
.ma-btn-estudiar     { background: linear-gradient(135deg, var(--ma-estudiar, #0ea5e9) 0%, var(--ma-estudiar-d, #0369a1) 100%); }
.ma-btn-cartas       { background: linear-gradient(135deg, var(--ma-cartas, #ec4899) 0%, var(--ma-cartas-d, #be185d) 100%); }
.ma-btn-pares        { background: linear-gradient(135deg, var(--ma-pares, #14b8a6) 0%, var(--ma-pares-d, #0f766e) 100%); }
.ma-btn-rompecabezas { background: linear-gradient(135deg, var(--ma-rompecabezas, #f59e0b) 0%, var(--ma-rompecabezas-d, #b45309) 100%); }
.ma-btn-unir         { background: linear-gradient(135deg, var(--ma-unir, #06b6d4) 0%, var(--ma-unir-d, #0e7490) 100%); }
.ma-btn-domino       { background: linear-gradient(135deg, var(--ma-domino, #8b5cf6) 0%, var(--ma-domino-d, #5b21b6) 100%); }
.ma-btn-saludmental  { background: linear-gradient(135deg, var(--ma-saludmental, #10b981) 0%, var(--ma-saludmental-d, #047857) 100%); }
.ma-btn-psicometrico { background: linear-gradient(135deg, var(--ma-psicometrico, #0ea5e9) 0%, var(--ma-psicometrico-d, #0369a1) 100%); }

body.dark-mode .ma-btn { box-shadow: 0 4px 18px rgba(0, 0, 0, 0.45); }

/* =============================================
   MENÚ DE ADMINISTRACIÓN COMPACTO

   El super-administrador tiene catorce accesos repartidos en cinco grupos con
   su título: con el tamaño normal de .ma-btn no cabían en pantalla y había que
   bajar con la rueda para ver los últimos, que además son los menos obvios
   (Modo incógnito, Mi cuenta).

   Aquí se aprieta todo lo justo para que entren de una vez: botones más bajos,
   iconos algo menores, y menos aire entre grupos. Solo aplica al menú de
   administración; el del estudiante mantiene su tamaño porque tiene menos
   accesos y un único grupo.

   Los tamaños se dan en función del alto de la ventana (vh) con un mínimo y un
   máximo, para que en un portátil de pantalla baja encoja y en un monitor
   grande no se quede diminuto.
   ============================================= */
@media (min-width: 768px) {

  .ma-wrap-admin { padding-top: 0.5rem; padding-bottom: 0.75rem; }

  .ma-wrap-admin .ma-grupo { margin-bottom: clamp(0.7rem, 1.6vh, 1.4rem); }

  .ma-wrap-admin .ma-tarjetas {
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    gap: clamp(0.5rem, 1.1vh, 0.9rem);
  }

  .ma-wrap-admin .ma-btn {
    padding: clamp(0.6rem, 1.7vh, 1.2rem) 0.75rem;
    gap: clamp(0.25rem, 0.7vh, 0.5rem);
    border-radius: 0.9rem;
    font-size: clamp(0.82rem, 1.5vh, 0.95rem);
  }

  .ma-wrap-admin .ma-btn i { font-size: clamp(1.3rem, 3.1vh, 2rem); }

  /* El encabezado de la pantalla también ocupa: se recorta su margen y el
     saludo se esconde, que es puramente decorativo. */
  .ma-wrap-admin > header { margin-bottom: clamp(0.6rem, 1.5vh, 1.2rem) !important; }
  .ma-wrap-admin > header h1 { font-size: clamp(1.05rem, 2.4vh, 1.5rem); }
}

/* Por debajo de 900px de alto el saludo sobra: lo que importa son los accesos. */
@media (min-width: 768px) and (max-height: 900px) {
  .ma-wrap-admin > header p { display: none; }
}

/* Rejilla de los menús del estudiante: siempre centrada y de dos en dos en
   pantallas chicas. Los modificadores dicen cuántas columnas caben en pantalla
   grande, según cuántos accesos tenga cada menú.

   "grid-auto-rows: 1fr" iguala el alto de TODAS las filas al de la más alta:
   las columnas ya son iguales (minmax(0, 1fr)) y los accesos de una misma fila
   se estiran solos, pero sin esto una fila con un rótulo que se parte en tres
   renglones ("Crear mis exámenes" en móvil) quedaba más alta que las demás. En
   un grid de alto automático, cada fila "1fr" toma el alto del contenido más
   alto, así que todos los accesos quedan del mismo tamaño en chica, mediana y
   grande. Vale para todos los menús que usan esta rejilla (menú principal,
   Juegos, portada de la mochila…). */
.mp-tarjetas {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-auto-rows: 1fr;
  gap: 1.1rem;
  width: 100%;
  max-width: 430px;
  margin: 0 auto;
}

@media (min-width: 992px) {
  .mp-tarjetas-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); max-width: 700px; }
  .mp-tarjetas-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); max-width: 900px; }
}

/* Recado pequeño dentro de un acceso del menú ("Elige tus materias que quieres
   estudiar" cuando la mochila está vacía). Va debajo del rótulo, en letra
   chica, sin robarle protagonismo al botón. */
.mp-recado {
  display: block;
  margin-top: -0.35rem;
  font-size: 0.72rem;
  font-weight: 500;
  line-height: 1.2;
  opacity: 0.9;
}

/* El aviso "elige tus materias" (mochila vacía) y su bloqueo de accesos están
   con el resto del bloqueo, más arriba: "MENÚ PRINCIPAL CON LA MOCHILA VACÍA". */

/*=============================================
MI CUENTA (pantalla "cuenta")
=============================================*/
.cuenta-foto {
  width: 96px;
  height: 96px;
  object-fit: cover;
  border-radius: 50%;
  border: 3px solid var(--c-border);
  box-shadow: var(--c-shadow-sm);
}

body.dark-mode .cuenta-foto { border-color: #334155; }

/* Botones de las secciones "Configuración de cuenta", "Ayuda" y "Califica
   nuestra aplicación": compactos, en una rejilla que se adapta —una columna
   en el celular, varias en pantalla ancha— para no ocupar el alto de los
   accesos grandes ".ma-btn". Un botón solo (p. ej. "Reseña") se queda en el
   ancho de una celda, no se estira de lado a lado. */
.cuenta-acciones {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
  gap: 0.55rem;
}
.cuenta-accion {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  width: 100%;
  padding: 0.65rem 0.8rem;
  border: 1px solid var(--c-border);
  border-radius: 0.7rem;
  background: var(--c-card);
  color: var(--c-text);
  font-family: inherit;
  font-weight: 600;
  font-size: 0.9rem;
  line-height: 1.25;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
  transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
}
/* El fondo NO cambia al pasar el puntero: la tarjeta de la sección ya es
   var(--c-primary-soft), así que un hover con ese mismo tono haría desaparecer
   el botón. La elevación la marcan el borde, la sombra y el pequeño salto. */
.cuenta-accion:hover,
.cuenta-accion:focus {
  border-color: var(--c-boton, var(--c-primary));
  color: var(--c-text);
  text-decoration: none;
  transform: translateY(-1px);
  box-shadow: var(--c-shadow-sm);
}
.cuenta-accion i {
  flex: none;
  width: 2rem;
  height: 2rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 0.5rem;
  background: var(--c-primary-soft);
  color: var(--c-boton, var(--c-primary));
  font-size: 0.95rem;
}
.cuenta-accion span { flex: 1 1 auto; }

/* "Eliminar cuenta": el único acceso de verdad destructivo, en rojo a
   propósito (misma excepción que anota CLAUDE.md para los ".ma-btn"). */
.cuenta-accion-peligro i {
  background: rgba(220, 38, 38, 0.12);
  color: #dc2626;
}
.cuenta-accion-peligro:hover,
.cuenta-accion-peligro:focus {
  border-color: #dc2626;
  color: #b91c1c;
}
body.dark-mode .cuenta-accion-peligro:hover,
body.dark-mode .cuenta-accion-peligro:focus {
  color: #fca5a5;
}

/*=============================================
PERFIL DE INTELIGENCIA (seis dimensiones del Dominó)
Compartido por el resumen del juego (vistas/modulos/domino.php) y por "Mis
estadísticas" (vistas/modulos/estadisticaEstudiante.php), así que vive aquí
en vez de duplicarse en cada pantalla.
=============================================*/
.dm-dim { margin-bottom: 0.85rem; }
.dm-dim-cab {
  display: flex; justify-content: space-between; align-items: center;
  font-size: 0.9rem; margin-bottom: 0.25rem;
}
.dm-dim-riel { height: 0.7rem; border-radius: 999px; background: rgba(0,0,0,0.08); overflow: hidden; }
body.dark-mode .dm-dim-riel { background: rgba(255,255,255,0.14); }
.dm-dim-barra { height: 100%; border-radius: 999px; transition: width 0.6s ease; }

/*=============================================
AVISO DE PRIVACIDAD
El texto es largo, así que se lee dentro de un panel con su propio scroll
(en vez de estirar toda la página): el encabezado y el botón "Regresar"
quedan siempre a la vista sin tener que bajar hasta el final.
=============================================*/
.privacidad-scroll {
  max-height: 65vh;
  overflow-y: auto;
  padding-right: 0.9rem;
  scrollbar-width: thin;
  scrollbar-color: var(--c-boton, #0f766e) transparent;
}
.privacidad-scroll::-webkit-scrollbar { width: 10px; }
.privacidad-scroll::-webkit-scrollbar-track { background: transparent; }
.privacidad-scroll::-webkit-scrollbar-thumb {
  background: var(--c-boton, #0f766e);
  border-radius: 999px;
}
.privacidad-scroll::-webkit-scrollbar-thumb:hover { filter: brightness(0.9); }

/* Botón "Regresar": mismo diseño de píldora con el color del cabezote que los
   botones de entrada de la landing ("Ingresar / Crear cuenta"). Va por id
   porque el <style> en línea de plantilla.php trae ".btn-primary:not(.opcion)"
   con la misma especificidad que una clase sola y, al cargarse después de
   este archivo, ganaría el empate y lo repintaría del color de los botones
   del sistema en vez del índigo del cabezote. */
#btnRegresarPrivacidad {
  border-radius: 999px;
  padding: 0.5rem 1.6rem;
  font-weight: 600;
  background-color: var(--c-cabezote, var(--c-primary));
  border-color: var(--c-cabezote, var(--c-primary));
  color: var(--c-cabezote-texto, #fff);
}
#btnRegresarPrivacidad:hover,
#btnRegresarPrivacidad:focus,
#btnRegresarPrivacidad:active {
  background-color: var(--c-cabezote, var(--c-primary));
  border-color: var(--c-cabezote, var(--c-primary));
  color: var(--c-cabezote-texto, #fff);
  filter: brightness(1.12);
}

/*=============================================
AYUDA / FAQ SIN SESIÓN
Pública desde que Google puede indexarla (vistas/modulos/faq.php): sin
sesión no hay <main class="area-contenido"> que le dé scroll a la pantalla
(el body de la app es overflow:hidden), así que el contenedor se da su
propio scroll, mismo criterio que .landing-page (landing.css). El botón
"Regresar" reutiliza el diseño de #btnRegresarPrivacidad.
=============================================*/
.faq-sin-sesion {
  height: 100vh;
  height: 100dvh;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}

#btnRegresarFaq {
  border-radius: 999px;
  padding: 0.5rem 1.6rem;
  font-weight: 600;
  background-color: var(--c-cabezote, var(--c-primary));
  border-color: var(--c-cabezote, var(--c-primary));
  color: var(--c-cabezote-texto, #fff);
}
#btnRegresarFaq:hover,
#btnRegresarFaq:focus,
#btnRegresarFaq:active {
  background-color: var(--c-cabezote, var(--c-primary));
  border-color: var(--c-cabezote, var(--c-primary));
  color: var(--c-cabezote-texto, #fff);
  filter: brightness(1.12);
}

/* Botón "Subir al inicio" de Estadísticas del estudiante y las flechas de
   "Progreso por examen" (retroceder / avanzar de 10 en 10 exámenes): color del
   footer, no el de los botones del sistema. Van por id por la misma razón que
   #btnRegresarPrivacidad de arriba (empate de especificidad con la regla
   ".btn-primary:not(.opcion)" de plantilla.php, que carga después).

   El mismo azul lo comparten, en esa pantalla: los botones "Limpiar filtros"
   de "Aciertos por materia" y "Progreso por examen", las flechas del
   calendario "Días que practicaste" (dentro de .calendario-cabecera, para no
   pisar el #calPrev del calendario de "Congelar racha" del cabezote) y el
   círculo de extender/contraer de las secciones "lo que menos prácticas"
   (acotado a [id^="colMenos"] para no tocar el mismo círculo en "Mi cuenta"). */
#estadSubirArriba,
#progresoAnteriores,
#progresoSiguientes,
#btnLimpiarFiltrosAciertos,
#btnLimpiarFiltrosProgreso,
.calendario-cabecera #calPrev,
.calendario-cabecera #calSig,
[id^="colMenos"] .cuenta-toggle-seccion.btn {
  background-color: var(--c-footer, var(--c-cabezote));
  border-color: var(--c-footer, var(--c-cabezote));
  color: var(--c-footer-texto, #fff);
}
#estadSubirArriba:hover, #estadSubirArriba:focus, #estadSubirArriba:active,
#progresoAnteriores:hover, #progresoAnteriores:focus, #progresoAnteriores:active,
#progresoSiguientes:hover, #progresoSiguientes:focus, #progresoSiguientes:active,
#btnLimpiarFiltrosAciertos:hover, #btnLimpiarFiltrosAciertos:focus, #btnLimpiarFiltrosAciertos:active,
#btnLimpiarFiltrosProgreso:hover, #btnLimpiarFiltrosProgreso:focus, #btnLimpiarFiltrosProgreso:active,
.calendario-cabecera #calPrev:hover, .calendario-cabecera #calPrev:focus, .calendario-cabecera #calPrev:active,
.calendario-cabecera #calSig:hover, .calendario-cabecera #calSig:focus, .calendario-cabecera #calSig:active,
[id^="colMenos"] .cuenta-toggle-seccion.btn:hover,
[id^="colMenos"] .cuenta-toggle-seccion.btn:focus {
  background-color: var(--c-footer, var(--c-cabezote));
  border-color: var(--c-footer, var(--c-cabezote));
  color: var(--c-footer-texto, #fff);
  filter: brightness(1.12);
}
