/* ==========================================================================
   identidad.css
   Sistema de identidad visual CMCH (Colegio Marista Champagnat).
   Extiende los colores institucionales (azul/rojo/amarillo) a un sistema
   de tokens con propósito, tipografía propia y tratamiento de componentes
   (navbar, tablas, badges, cards, botones, footer). Bootstrap 5 sigue
   siendo la base funcional (grid, utilidades responsive); este archivo
   sobrescribe su apariencia visual por defecto a propósito.
   ========================================================================== */

:root {
  --cmch-azul: #0b3d91;
  --cmch-azul-oscuro: #062a66;
  --cmch-azul-claro: #e8edf9;

  --cmch-rojo: #c0392b;
  --cmch-rojo-oscuro: #a5281d;
  --cmch-rojo-pastel: #f8e2df;

  --cmch-amarillo: #f1c40f;
  --cmch-amarillo-oscuro: #d8b40d;
  --cmch-amarillo-texto: #3a2e00;
  --cmch-amarillo-pastel: #fdf3d0;

  --cmch-verde: #2f6b4f;
  --cmch-verde-oscuro: #204a37;
  --cmch-verde-pastel: #e3f1ea;

  --cmch-tinta: #1a2333;
  --cmch-piedra: #5b6472;
  --cmch-piedra-claro: #dde1e8;
  --cmch-piedra-pastel: #e7e9ed;
  --cmch-fondo: #f3f5f9;
  --cmch-superficie: #ffffff;

  --cmch-font-display: "Fraunces", Georgia, serif;
  --cmch-font-body: "Public Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;

  --cmch-radius: 12px;
  --cmch-radius-sm: 8px;

  /* Escudo simplificado en SVG: marca de agua en login/registro y sello
     discreto en las tarjetas de resumen (ver más abajo). Un solo trazo
     reutilizado en dos tamaños/opacidades en vez de cargar el logo
     rasterizado para un elemento puramente decorativo. */
  --cmch-shield: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%230b3d91'><path d='M12 2 3 6v6c0 5 4 9 9 10 5-1 9-5 9-10V6z'/></svg>");
}

/* --------------------------------------------------------------------
   Base, layout y tipografía
   -------------------------------------------------------------------- */
html {
  height: 100%;
}

body {
  min-height: 100%;
  display: flex;
  flex-direction: column;
  background-color: var(--cmch-fondo);
  color: var(--cmch-tinta);
  font-family: var(--cmch-font-body);
}

/* El contenido principal (el único <div class="container"> hijo directo
   de <body>, distinto del .container-fluid interno del navbar) crece
   para empujar el footer al fondo en páginas cortas, en vez de dejarlo
   flotando a mitad de pantalla. */
body > .container {
  flex: 1 0 auto;
}

h1, h2, h3 {
  font-family: var(--cmch-font-display);
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--cmch-tinta);
}

h1 { font-size: 2.25rem; }
h2 { font-size: 1.85rem; }
h3 { font-size: 1.4rem; }

a { color: var(--cmch-azul); }
a:hover, a:focus { color: var(--cmch-amarillo-oscuro); }

/* Foco/hover institucional: amarillo en toda la UI, no el azul default
   de Bootstrap. El anillo (outline/box-shadow) puede usar el amarillo
   puro porque no es texto; para texto se usa amarillo-oscuro (más arriba
   y en .btn-outline-primary:hover) por legibilidad sobre fondo blanco. */
:focus-visible {
  outline: 3px solid var(--cmch-amarillo);
  outline-offset: 2px;
}

.form-control:focus, .form-select:focus {
  border-color: var(--cmch-amarillo);
  box-shadow: 0 0 0 0.2rem rgba(241, 196, 15, 0.35);
}

/* :focus-visible (no :focus a secas) para que el anillo solo aparezca
   con teclado, no en cada clic de mouse. El outline se mantiene junto
   al box-shadow -a propósito, no es redundancia sin sentido- porque
   Modo de alto contraste de Windows ignora box-shadow por completo;
   sin el outline, un usuario que navega con teclado en ese modo no ve
   ningún foco en los botones. */
.btn:focus-visible {
  box-shadow: 0 0 0 0.2rem rgba(241, 196, 15, 0.5) !important;
  outline: 3px solid var(--cmch-amarillo);
  outline-offset: 2px;
}

/* --------------------------------------------------------------------
   Navbar
   -------------------------------------------------------------------- */
/* Anidado con CSS nesting nativo (soporte amplio desde 2023: Chrome
   112+, Safari 16.5+, Firefox 117+). Selectores con "&" explícito en
   vez de la forma corta ("span { }" suelto) para que el resultado sea
   idéntico sin importar la versión exacta de navegador — sigue
   compilando exactamente a ".navbar-institucional .navbar-brand span",
   etc., mismo resultado visual, solo mejor agrupado para leer. */
.navbar-institucional {
  background: linear-gradient(90deg, var(--cmch-azul-oscuro), var(--cmch-azul));
  border-bottom: 4px solid var(--cmch-amarillo);
  padding-top: 0.6rem;
  padding-bottom: 0.6rem;

  & .navbar-brand {
    display: flex;
    align-items: center;
    gap: 0.6rem;

    & span {
      font-family: var(--cmch-font-display);
      font-weight: 500;
      font-size: 1.1rem;
      letter-spacing: 0;
    }

    & img {
      height: 42px;
      width: auto;
    }
  }

  & .navbar-toggler {
    border: 0;
    padding: 0.25rem 0.5rem;

    &:focus {
      box-shadow: 0 0 0 0.2rem rgba(241, 196, 15, 0.4);
    }
  }

  /* Links de navegación: sin fondo de botón, con subrayado animado */
  & .nav-link {
    position: relative;
    color: rgba(255, 255, 255, 0.85) !important;
    font-family: var(--cmch-font-body);
    font-weight: 500;
    font-size: 0.92rem;
    padding: 0.7rem 0.85rem !important;
    margin: 0 0.1rem;
    border-radius: var(--cmch-radius-sm);
    transition: color 0.15s ease, background-color 0.15s ease;

    &::after {
      content: "";
      position: absolute;
      left: 0.85rem;
      right: 0.85rem;
      bottom: 0.32rem;
      height: 2px;
      background: var(--cmch-amarillo);
      transform: scaleX(0);
      transform-origin: center;
      transition: transform 0.18s ease;
    }

    &:hover,
    &:focus,
    &.active {
      color: #fff !important;
      background-color: rgba(255, 255, 255, 0.1);
    }

    &:hover::after,
    &.active::after {
      transform: scaleX(1);
    }
  }

  & .dropdown-toggle::after {
    vertical-align: 0.15em;
  }

  & .dropdown-menu {
    border: 0;
    border-radius: var(--cmch-radius);
    box-shadow: 0 10px 30px rgba(6, 42, 102, 0.25);
    margin-top: 0.6rem;
    padding: 0.4rem;
    min-width: 220px;
  }

  & .dropdown-item {
    border-radius: var(--cmch-radius-sm);
    padding: 0.5rem 0.75rem;
    font-size: 0.9rem;

    &:active,
    &.active {
      background-color: var(--cmch-azul);
      color: #fff;
    }
  }

  & .user-name {
    max-width: 170px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  & .user-rol {
    text-transform: capitalize;
  }
}

.btn-cta-nav {
  background-color: var(--cmch-amarillo);
  border-color: var(--cmch-amarillo);
  color: var(--cmch-amarillo-texto) !important;
  font-weight: 600;
  border-radius: var(--cmch-radius-sm);

  &:hover,
  &:focus {
    background-color: var(--cmch-amarillo-oscuro);
    border-color: var(--cmch-amarillo-oscuro);
    color: var(--cmch-amarillo-texto) !important;
  }
}

.avatar-nav {
  width: 30px;
  height: 30px;
  border-radius: 50%;
  object-fit: cover;
  border: 2px solid var(--cmch-amarillo);
}

/* --------------------------------------------------------------------
   Botones y formularios
   -------------------------------------------------------------------- */
/* Área táctil mínima de 44x44px (WCAG 2.5.5) en todos los botones,
   incluido .btn-sm: se logra solo con más padding vertical, no con
   min-height + flex, porque algunos botones combinan .btn con
   utilidades de Bootstrap que si dependen del flujo normal del texto
   (.text-start + .text-truncate en el selector de tareas de Registro
   diario) y forzar flex ahí les rompería el truncado con "...". */
.btn {
  border-radius: var(--cmch-radius-sm);
  font-weight: 600;
  padding-top: 0.6rem;
  padding-bottom: 0.6rem;
}
.btn-sm {
  padding-top: 0.65rem;
  padding-bottom: 0.65rem;
}
.btn-lg {
  min-height: 48px;
}

.btn-primary {
  background-color: var(--cmch-rojo);
  border-color: var(--cmch-rojo);
}
.btn-primary:hover, .btn-primary:focus {
  background-color: var(--cmch-rojo-oscuro);
  border-color: var(--cmch-rojo-oscuro);
}

.btn-outline-primary {
  color: var(--cmch-rojo);
  border-color: var(--cmch-rojo);
}
.btn-outline-primary:hover, .btn-outline-primary:focus {
  background-color: var(--cmch-amarillo);
  border-color: var(--cmch-amarillo);
  color: var(--cmch-amarillo-texto);
}

/* --------------------------------------------------------------------
   Validación de formularios con :has() — sin JS ni cambios de
   template. Ninguna plantilla (estudiantes/nuevo, evaluación,
   registro diario, etc.) usa is-invalid/invalid-feedback de
   Bootstrap: la validación es 100% nativa del navegador (required,
   type="email", etc.), así que hoy no hay ningún estilo propio para
   un campo inválido, solo el globo nativo -inconsistente entre
   navegadores-.

   :user-invalid (no :invalid a secas) para no pintar de rojo un
   campo obligatorio vacío apenas se carga la página, antes de que el
   usuario haya alcanzado a escribir nada: solo se activa después de
   que el usuario interactuó con el campo y lo dejó inválido.

   El selector de contenedor es genérico (.mb-3 y cualquier columna
   .col-*) porque son los dos wrappers de campo que ya se usan en todo
   el sistema — no target de :has() : solo se activa si adentro hay
   un campo realmente inválido, así que no hay riesgo de falsos
   positivos en un .mb-3/.col-* que no es un campo de formulario. ---
   -------------------------------------------------------------- */
.mb-3:has(:user-invalid),
[class*="col-"]:has(:user-invalid) {
  background-color: var(--cmch-rojo-pastel);
  border-radius: var(--cmch-radius-sm);
  padding: 0.6rem 0.6rem 0.1rem;
  margin-left: -0.6rem;
  margin-right: -0.6rem;
}
.mb-3:has(:user-invalid) .form-label,
[class*="col-"]:has(:user-invalid) .form-label {
  color: var(--cmch-rojo-oscuro);
}
:user-invalid {
  border-color: var(--cmch-rojo) !important;
}

/* Asterisco en el label de campos obligatorios (ver _form_macros.html:
   macro field(), que agrega la clase "required" cuando el validador
   DataRequired/InputRequired del campo lo marca). */
.form-label.required::after {
  content: " *";
  color: var(--cmch-rojo);
}

/* --------------------------------------------------------------------
   Lista de casillas tipo "tarjeta" (ej. motivos de visita del Acta de
   Supervisión): cada opción es su propio bloque con borde, en vez de la
   lista plana de checkboxes nativos de Bootstrap uno bajo el otro — más
   fácil de escanear en una lista larga. Con :has() se resalta el borde y
   el fondo cuando la opción queda marcada, sin JS. Clase propia
   (.checklist-cards), no aplicada a .form-check en general, para no
   afectar los checkboxes sueltos que ya existen en el resto del sistema
   (ej. "pertenece_pie" en el formulario de usuario).
   -------------------------------------------------------------------- */
.checklist-cards .form-check {
  position: relative;
  margin: 0;
  padding: 0.65rem 0.85rem 0.65rem 2.5rem;
  min-height: 44px;
  display: flex;
  align-items: center;
  border: 1px solid var(--cmch-piedra-claro);
  border-radius: var(--cmch-radius-sm);
  background-color: var(--cmch-superficie);
  transition: border-color 0.15s ease, background-color 0.15s ease;
}
.checklist-cards .form-check:has(.form-check-input:checked) {
  border-color: var(--cmch-azul);
  background-color: var(--cmch-azul-claro);
}
.checklist-cards .form-check-input {
  position: absolute;
  left: 0.9rem;
  margin: 0;
  flex-shrink: 0;
}
.checklist-cards .form-check-label {
  font-size: 0.92rem;
  cursor: pointer;
}

/* --------------------------------------------------------------------
   Feedback de éxito: check breve al guardar un formulario, sobre el
   alert-success que ya se muestra en base.html vía
   get_flashed_messages. Nada más -sin animación en el resto de
   alert-*- y respeta prefers-reduced-motion.
   -------------------------------------------------------------------- */
.alert-success::before {
  content: "✓";
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  margin-right: 0.5rem;
  border-radius: 50%;
  background-color: var(--cmch-verde);
  color: #fff;
  font-size: 0.75rem;
  font-weight: 700;
}
@media (prefers-reduced-motion: no-preference) {
  .alert-success::before {
    animation: cmch-check-pop 250ms ease;
  }
}
@keyframes cmch-check-pop {
  from {
    transform: scale(0);
    opacity: 0;
  }
  to {
    transform: scale(1);
    opacity: 1;
  }
}

/* --------------------------------------------------------------------
   Tablas de listados

   Bootstrap pinta el fondo de cada celda con `background-color:
   var(--bs-table-bg)` (opaco, default blanco) directamente sobre el
   <th>/<td> — un background-color puesto en el <thead> (su ancestro)
   queda tapado por esa capa y nunca se ve. Por eso el color de fondo
   del header va en el selector "thead th", no en "thead".
   -------------------------------------------------------------------- */
.table-stack thead th,
.table thead th {
  background-color: var(--cmch-tinta);
  color: #fff;
  font-size: 0.75rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  padding-top: 0.9rem;
  padding-bottom: 0.9rem;
  border: 0;
  vertical-align: middle;
}

.table td, .table th {
  border-left: 0;
  border-right: 0;
  border-bottom: 1px solid var(--cmch-piedra-claro);
}

.table > tbody > tr:last-child > td {
  border-bottom: 0;
}

.table-hover > tbody > tr:hover > * {
  background-color: rgba(11, 61, 145, 0.05);
}

/* El contenedor solo se enmarca como "tarjeta" en tablet+, que es donde
   .table-stack vuelve a ser una tabla real (ver responsive.css). En
   mobile cada <tr> ya es su propia tarjeta con borde/sombra propios;
   sumarle un marco al contenedor ahí generaría una caja dentro de otra. */
@media (min-width: 768px) {
  .table-responsive {
    border: 1px solid var(--cmch-piedra-claro);
    border-radius: var(--cmch-radius);
    background-color: var(--cmch-superficie);
  }
}

/* --------------------------------------------------------------------
   Badges de estado: pastel derivado de cada color institucional + texto
   en su versión oscura, en vez de los verdes/celestes genéricos de
   Bootstrap.
   -------------------------------------------------------------------- */
.badge {
  font-family: var(--cmch-font-body);
  font-weight: 700;
  border-radius: 999px;
  padding: 0.42em 0.75em;
  border: 0;
}
/* Los badges de estado (Activo/Inactivo/Abandonada/etc.) ya llevan la
   palabra en texto, así que técnicamente no dependen "solo" del color
   -pero un glifo agiliza el escaneo visual para cualquiera, y en
   particular para quien tiene dificultad para distinguir el pastel
   verde del rojo o el amarillo a simple vista. Vía ::before, sin tocar
   ningún template: aplica automáticamente a los badges de estudiantes,
   usuarios, autoridades, prácticas y documentos por igual. Se excluyen
   a propósito bg-info/bg-primary: ahí se usan como etiqueta de
   categoría (rol, "PIE"), no como estado, y un glifo genérico no
   aportaría información real. */
.badge.bg-success {
  background-color: var(--cmch-verde-pastel) !important;
  color: var(--cmch-verde-oscuro) !important;
}
.badge.bg-success::before {
  content: "✓ ";
}
.badge.bg-secondary {
  background-color: var(--cmch-piedra-pastel) !important;
  color: var(--cmch-piedra) !important;
}
.badge.bg-secondary::before {
  content: "– ";
}
.badge.bg-danger {
  background-color: var(--cmch-rojo-pastel) !important;
  color: var(--cmch-rojo-oscuro) !important;
}
.badge.bg-danger::before {
  content: "✕ ";
}
.badge.bg-warning {
  background-color: var(--cmch-amarillo-pastel) !important;
  color: var(--cmch-amarillo-texto) !important;
}
.badge.bg-warning::before {
  content: "⚠ ";
}
.badge.bg-info {
  background-color: var(--cmch-azul-claro) !important;
  color: var(--cmch-azul-oscuro) !important;
}
.badge.bg-primary {
  background-color: var(--cmch-azul-claro) !important;
  color: var(--cmch-azul) !important;
}
.badge.bg-light {
  background-color: var(--cmch-piedra-pastel) !important;
  color: var(--cmch-tinta) !important;
}

/* --------------------------------------------------------------------
   Cards
   -------------------------------------------------------------------- */
.card {
  border: 0;
  border-radius: var(--cmch-radius);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
  background-color: var(--cmch-superficie);
}
.shadow-sm {
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08) !important;
}

/* Tarjetas de resumen tipo "etiqueta + valor" (ficha de práctica, etc.):
   se identifican por el patrón <strong>Etiqueta</strong><span>Valor</span>
   como primeros hijos, no por una clase propia (no existía una). Con
   :has() se les da un borde superior de color contextual sin afectar el
   resto de ".card.card-body", que en este sistema también se usa como
   wrapper genérico de formularios y bloques de sección. Azul por
   defecto (info general); amarillo/verde/rojo cuando la tarjeta trae un
   badge de ese color (estado en progreso, activo, crítico). */
.card.card-body:has(> strong:first-child + span) {
  position: relative;
  border-top: 3px solid var(--cmch-azul);
}
.card.card-body:has(.badge.bg-warning) { border-top-color: var(--cmch-amarillo); }
.card.card-body:has(.badge.bg-success) { border-top-color: var(--cmch-verde); }
.card.card-body:has(.badge.bg-danger) { border-top-color: var(--cmch-rojo); }

.card.card-body:has(> strong:first-child + span)::after {
  content: "";
  position: absolute;
  top: 0.7rem;
  right: 0.8rem;
  width: 15px;
  height: 17px;
  background-image: var(--cmch-shield);
  background-repeat: no-repeat;
  background-size: contain;
  opacity: 0.16;
  pointer-events: none;
}
.card.card-body > strong:first-child {
  display: block;
  font-size: 0.72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--cmch-piedra);
  margin-bottom: 0.35rem;
}
.card.card-body > strong:first-child + span:not(.badge) {
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--cmch-tinta);
}

/* --------------------------------------------------------------------
   Firma visual: marca de agua del escudo en pantallas de acceso
   (login/registro/recuperar contraseña/etc.), muy discreta, activada con
   body.pagina-auth (ver {% block body_class %} en esas plantillas).

   Va en ::before de la propia .card (position:absolute + inset:0), no de
   body (antes era position:fixed + inset:0 sobre toda la pantalla): un
   background-image nunca pinta fuera de la caja del elemento que lo
   tiene, así que al anclarlo a la tarjeta en vez de al viewport completo,
   queda recortado solo a su alto real -- sin esto, en tarjetas cortas
   (ej. "Recuperar contraseña", con un solo campo) se alcanzaba a ver el
   borde inferior del escudo asomando por debajo de la tarjeta.
   -------------------------------------------------------------------- */
body.pagina-auth .card {
  position: relative;
}
body.pagina-auth .card::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: var(--cmch-shield);
  background-repeat: no-repeat;
  background-position: center 15%;
  background-size: min(60vw, 420px);
  opacity: 0.035;
  pointer-events: none;
  z-index: 0;
}
body.pagina-auth .card-body {
  position: relative;
  z-index: 1;
}

/* --------------------------------------------------------------------
   Vista "Mi perfil"
   -------------------------------------------------------------------- */
.perfil-avatar {
  border: 3px solid var(--cmch-azul);
}

.card-divisor {
  border: 0;
  border-top: 1px solid var(--cmch-piedra-claro);
  opacity: 1;
  margin: 1.25rem 0;
}

.titulo-con-icono {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}
.titulo-con-icono svg {
  color: var(--cmch-azul);
  flex-shrink: 0;
}

.dropzone-foto {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.35rem;
  text-align: center;
  padding: 1.5rem 1rem;
  border: 2px dashed var(--cmch-piedra-claro);
  border-radius: var(--cmch-radius-sm);
  color: var(--cmch-piedra);
  cursor: pointer;
  transition: border-color 0.15s ease, background-color 0.15s ease;
}
.dropzone-foto:hover,
.dropzone-foto.dropzone-activa {
  border-color: var(--cmch-azul);
  background-color: var(--cmch-azul-claro);
}
.dropzone-foto svg {
  color: var(--cmch-azul);
}
.dropzone-texto strong {
  color: var(--cmch-azul);
  font-weight: 600;
}
.dropzone-archivo {
  font-weight: 600;
  font-size: 0.85rem;
  color: var(--cmch-tinta);
}
.dropzone-input {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  overflow: hidden;
}

.campo-password {
  position: relative;
}
.campo-password input {
  padding-right: 3.5rem;
}
/* 44x44 de área táctil real (no solo el ícono de 18px): el botón mide
   44px con el ícono centrado adentro, en vez de crecer solo por el
   padding alrededor de un SVG chico. */
.password-toggle {
  position: absolute;
  top: 50%;
  right: 0.25rem;
  transform: translateY(-50%);
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: none;
  border: 0;
  padding: 0;
  line-height: 1;
  color: var(--cmch-piedra);
}
.password-toggle:hover {
  color: var(--cmch-azul);
}
.password-toggle .icon-eye-off {
  display: none;
}
.password-toggle.mostrando .icon-eye {
  display: none;
}
.password-toggle.mostrando .icon-eye-off {
  display: inline;
}

.password-strength {
  display: flex;
  gap: 0.3rem;
  margin-top: 0.5rem;
}
.password-strength span {
  height: 4px;
  flex: 1;
  border-radius: 999px;
  background-color: var(--cmch-piedra-claro);
}
.password-strength span.activo.n1 { background-color: var(--cmch-rojo); }
.password-strength span.activo.n2 { background-color: var(--cmch-amarillo); }
.password-strength span.activo.n3 { background-color: var(--cmch-verde); }
.password-strength span.activo.n4 { background-color: var(--cmch-verde-oscuro); }

/* --------------------------------------------------------------------
   Footer institucional: mismo tono que el navbar para enmarcar la
   página entre header y footer. Estructura en grid de Bootstrap
   (row/col), tipografía y colores propios.
   -------------------------------------------------------------------- */
.footer-institucional {
  flex-shrink: 0;
  background-color: var(--cmch-azul-oscuro);
  color: rgba(255, 255, 255, 0.8);
  margin-top: 3rem;
}
.footer-institucional a {
  color: rgba(255, 255, 255, 0.85);
  text-decoration: none;
  font-size: 0.9rem;
  font-weight: 500;
}
.footer-institucional a:hover, .footer-institucional a:focus {
  color: var(--cmch-amarillo);
}
.footer-escudo {
  height: 28px !important;
  width: auto !important;
  max-width: 28px;
}
.footer-marca {
  font-family: var(--cmch-font-display);
  font-weight: 500;
  font-size: 1rem;
  color: #fff;
}
.footer-sub {
  font-size: 0.78rem;
  color: rgba(255, 255, 255, 0.6);
}
.footer-copy {
  font-size: 0.78rem;
  color: rgba(255, 255, 255, 0.6);
}

/* --------------------------------------------------------------------
   Selector con textos largos (ej. tareas del plan de práctica): un
   <select> nativo no permite controlar el ancho de su lista desplegada,
   así que en pantallas angostas el texto se corta fuera de la ventana.
   Este dropdown de Bootstrap sí se puede acotar al viewport y hacer que
   el texto baje de línea en vez de desbordar.
   -------------------------------------------------------------------- */
.js-task-select .dropdown-menu {
  max-width: min(520px, 92vw);
  max-height: 60vh;
  overflow-y: auto;
}
.js-task-select .dropdown-item {
  white-space: normal;
  word-break: break-word;
}

/* --------------------------------------------------------------------
   Panel flotante de conversación: se abre encima de la página actual,
   sin navegar a otra, para poder cerrarlo con la X y volver a donde se
   estaba. Compartido por cualquier página con un botón [data-chat-url]
   (lista de Mensajes, Seguimiento de práctica, listado de Estudiantes).
   -------------------------------------------------------------------- */
.chat-panel {
  position: fixed;
  right: 24px;
  /* 100px, no 24px: deja despejado el footer institucional (~120-130px de
     alto) y los botones al final de los formularios largos, que quedaban
     tapados por el panel/burbuja flotante en pantallas cortas. */
  bottom: 100px;
  width: 360px;
  height: 520px;
  max-height: calc(100vh - 124px);
  background: var(--cmch-superficie);
  border-radius: 16px;
  box-shadow: 0 8px 30px rgba(15, 23, 42, 0.22);
  overflow: hidden;
  z-index: 1050;

  & iframe {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }

  @media (max-width: 480px) {
    & {
      right: 10px;
      left: 10px;
      bottom: 10px;
      width: auto;
    }
  }
}

/* Burbuja flotante de soporte: siempre visible para abrir la conversación
   de atención de current_user en el mismo .chat-panel de arriba (se tapa
   cuando el panel está abierto, igual que en widgets de chat típicos). */
.help-bubble {
  position: fixed;
  right: 24px;
  bottom: 100px; /* ver comentario en .chat-panel: despeja el footer y los botones al pie de los formularios */
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--cmch-azul);
  color: #fff;
  border: none;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 4px 18px rgba(15, 23, 42, 0.28);
  z-index: 1040;

  &:hover {
    background: var(--cmch-azul-oscuro);
  }

  & .help-bubble-badge {
    position: absolute;
    top: -4px;
    right: -4px;
    background: var(--cmch-rojo);
    color: #fff;
    font-size: 0.62rem;
    line-height: 1;
    padding: 0.22rem 0.35rem;
    border-radius: 999px;
    min-width: 16px;
  }
}

/* --------------------------------------------------------------------
   Landing pública (/): pensada para lectores de cualquier edad y nivel
   de destreza digital (estudiantes, profesores, representantes de
   empresa). Texto base más grande y sin ninguna interacción que
   dependa solo de :hover — todo funciona con un clic/tap directo.

   Escala tipográfica fija para toda la landing:
   eyebrow (0.85rem mayúsculas) -> h2 de sección (2.3rem, Fraunces) ->
   subtítulo de apoyo (1.1rem, piedra) -> cuerpo (1.08rem) -> contenido
   de card (1rem).
   -------------------------------------------------------------------- */
.landing {
  font-size: 1.08rem;
  line-height: 1.65;
}

.landing h2 {
  font-size: 2.3rem;
}

.landing-eyebrow {
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--cmch-rojo);
  margin-bottom: 0.6rem;
}

.landing-subtitulo {
  color: var(--cmch-piedra);
  font-size: 1.1rem;
  max-width: 42rem;
  margin-left: auto;
  margin-right: auto;
}

/* ---- Hero: mucho más aire, titular grande ---- */
.landing-hero {
  background: linear-gradient(135deg, var(--cmch-azul-oscuro), var(--cmch-azul));
  border-radius: 16px;
  color: #fff;
  padding: 4.5rem 3rem;
}
.landing-hero h1 {
  color: #fff;
  font-size: 3.25rem;
  line-height: 1.15;
}
.landing-lead {
  font-size: 1.25rem;
  color: rgba(255, 255, 255, 0.92);
  max-width: 46rem;
  margin-left: auto;
  margin-right: auto;
  text-align: justify;
}
.landing-cta-caption {
  font-size: 0.95rem;
  color: rgba(255, 255, 255, 0.8);
  max-width: 40rem;
  margin-left: auto;
  margin-right: auto;
  text-align: center;
}

/* ---- Ritmo vertical: 90px de aire por sección en desktop, 48px en
   mobile (ver media query al final). Se aplica a toda sección,
   tenga o no fondo propio. ---- */
.landing-section {
  padding: 90px 0;
}

/* ---- Franjas de ancho completo (rompen el <div class="container">
   de base.html vía el truco 100vw/left:50%) para separar visualmente
   "Así se hacía antes", "Confianza" y el cierre del resto de la
   página. El contenido real vive en .landing-band-inner, acotado al
   ancho del container para no pegarse a los bordes del viewport. ---- */
.landing-band {
  position: relative;
  left: 50%;
  right: 50%;
  width: 100vw;
  margin-left: -50vw;
  margin-right: -50vw;
}
.landing-band-inner {
  max-width: 1140px;
  margin: 0 auto;
  padding: 0 1rem;
}
.landing-band--problema {
  background-color: var(--cmch-fondo);
}
.landing-band--confianza {
  background-color: var(--cmch-azul-claro);
}

/* ---- "Así se hacía antes": ícono en badge circular + borde rojo,
   para que se lean claramente como "problemas". ---- */
.problema-item {
  height: 100%;
  border-left: 3px solid var(--cmch-rojo);
}
.problema-icono-badge {
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background-color: var(--cmch-rojo-pastel);
  color: var(--cmch-rojo-oscuro);
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 1rem;
}
.problema-icono-badge svg {
  width: 26px;
  height: 26px;
}
.problema-item h4 {
  font-size: 1.15rem;
  font-weight: 700;
  margin-bottom: 0.5rem;
}
.problema-item p {
  font-size: 1rem;
}

/* ---- "Mucho más que registro de horas": mismo patrón que .problema-item
   (ícono en badge circular + borde de color), pero en verde -- para que se
   lea como algo positivo/nuevo, no como un problema. ---- */
.modulo-item {
  height: 100%;
  border-left: 3px solid var(--cmch-verde);
}
.modulo-icono-badge {
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background-color: var(--cmch-verde-pastel);
  color: var(--cmch-verde-oscuro);
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 1rem;
}
.modulo-icono-badge svg {
  width: 26px;
  height: 26px;
}
.modulo-item h4 {
  font-size: 1.15rem;
  font-weight: 700;
  margin-bottom: 0.5rem;
}
.modulo-item p {
  font-size: 1rem;
}

/* ---- Centro de ayuda: caja de contacto a soporte, con color propio para
   que resalte junto a las tarjetas blancas de "Qué gana cada uno". ---- */
.caja-soporte {
  background-color: var(--cmch-azul-claro);
  border: 1px solid var(--cmch-azul);
}
.caja-soporte h5 {
  color: var(--cmch-azul-oscuro);
}
.caja-soporte p {
  color: var(--cmch-tinta);
}

/* ---- "Qué gana cada uno": ícono grande por rol, borde superior de
   color distinto, sombra + elevación al pasar el mouse (puramente
   decorativo: el clic no hace nada, así que no hace falta que
   funcione sin hover, pero tampoco depende de él para ver el
   contenido). ---- */
.rol-bloque {
  border-top: 4px solid var(--cmch-azul);
  transition: transform 0.18s ease, box-shadow 0.18s ease;
}
.rol-bloque:hover {
  transform: translateY(-4px);
  box-shadow: 0 14px 28px rgba(15, 23, 42, 0.14);
}
.rol-bloque--estudiante { border-top-color: var(--cmch-azul); }
.rol-bloque--colegio { border-top-color: var(--cmch-amarillo-oscuro); }
.rol-bloque--empresa { border-top-color: var(--cmch-rojo); }

.rol-icono-badge {
  width: 56px;
  height: 56px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 1.1rem;
}
.rol-icono-badge svg {
  width: 28px;
  height: 28px;
}
.rol-icono-badge--estudiante {
  background-color: var(--cmch-azul-claro);
  color: var(--cmch-azul-oscuro);
}
.rol-icono-badge--colegio {
  background-color: var(--cmch-amarillo-pastel);
  color: var(--cmch-amarillo-texto);
}
.rol-icono-badge--empresa {
  background-color: var(--cmch-rojo-pastel);
  color: var(--cmch-rojo-oscuro);
}

.rol-lista {
  padding-left: 1.2rem;
  margin-bottom: 0;
  font-size: 1rem;
}
.rol-lista li {
  margin-bottom: 0.6rem;
}
.rol-lista li:last-child {
  margin-bottom: 0;
}

/* ---- Costo emocional del problema: una segunda frase, más corta y
   con más peso, debajo de la descripción factual de cada card. ---- */
.problema-item p {
  font-size: 1rem;
}
.problema-costo {
  font-weight: 600;
  color: var(--cmch-rojo-oscuro);
  font-style: italic;
}

/* ---- Cómo funciona: 3 pasos secuenciales reales (no decorativos),
   por eso llevan número visible además del ícono, a diferencia de los
   badges puramente decorativos del resto de la landing. ---- */
.paso-item {
  padding: 0 0.5rem;
}
.paso-badge {
  position: relative;
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background-color: var(--cmch-azul-claro);
  color: var(--cmch-azul-oscuro);
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto 1.25rem;
}
.paso-badge svg {
  width: 28px;
  height: 28px;
}
.paso-numero {
  position: absolute;
  top: -6px;
  left: -6px;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background-color: var(--cmch-azul);
  color: #fff;
  font-weight: 700;
  font-size: 0.9rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 2px solid var(--cmch-superficie);
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);
}
.paso-item p {
  font-size: 1rem;
  color: var(--cmch-piedra);
  max-width: 24rem;
  margin-left: auto;
  margin-right: auto;
}

/* ---- FAQ: lista estática (sin acordeón) a propósito — todo el
   contenido queda visible sin necesitar clic ni hover, coherente con
   el resto de la landing pensada para usuarios de cualquier destreza
   digital. ---- */
.faq-lista {
  max-width: 46rem;
  margin: 0 auto;
}
.faq-item {
  padding: 1.25rem 0;
  border-bottom: 1px solid var(--cmch-piedra-claro);
}
.faq-item:last-child {
  border-bottom: 0;
}
/* <details>/<summary> nativo: acordeón accesible sin JS (funciona con
   teclado y lectores de pantalla) -- mismo patrón que ya usa
   practicas/evaluacion.html para las Competencias de Empleabilidad. */
.faq-item summary {
  font-size: 1.15rem;
  font-weight: 700;
  color: var(--cmch-tinta);
  text-align: center;
  cursor: pointer;
  list-style: none;
  position: relative;
  padding: 0.25rem 2rem;
}
.faq-item summary::-webkit-details-marker {
  display: none;
}
.faq-item summary::after {
  content: "+";
  position: absolute;
  right: 0.25rem;
  top: 0.25rem;
  font-weight: 400;
  color: var(--cmch-azul);
}
.faq-item[open] summary::after {
  content: "−";
}
.faq-item summary:hover {
  color: var(--cmch-azul-oscuro);
}
.faq-item p {
  font-size: 1rem;
  text-align: center;
  max-width: 40rem;
  margin: 0.75rem auto 0;
}

/* Color sólido, no rgba/opacity: sobre el degradado amarillo del
   cierre, un opacity < 1 aquí bajaba el contraste a ~4.89:1 en el
   extremo más oscuro del degradado -pasa 4.5:1 pero sin margen-. */
.landing-objecion {
  font-size: 1rem;
  color: var(--cmch-amarillo-texto);
  max-width: 34rem;
  margin-left: auto;
  margin-right: auto;
}

/* ---- Confianza: card grande, ícono de sello arriba, para que se
   sienta como una pausa distinta en el scroll. ---- */
.confianza-card {
  padding: 3.5rem 3rem;
  text-align: center;
  max-width: 50rem;
  margin: 0 auto;
}
.confianza-icono-badge {
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background-color: var(--cmch-azul);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto 1.25rem;
}
.confianza-icono-badge svg {
  width: 34px;
  height: 34px;
}
.confianza-card .landing-eyebrow {
  color: var(--cmch-azul);
}
.confianza-card p {
  max-width: 42rem;
  margin-left: auto;
  margin-right: auto;
}
.chip-confianza {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.75rem 1.4rem;
  border-radius: 999px;
  background-color: var(--cmch-superficie);
  color: var(--cmch-azul-oscuro);
  font-weight: 700;
  font-size: 1rem;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
}
.chip-confianza svg {
  width: 20px;
  height: 20px;
  flex-shrink: 0;
}

/* ---- Cierre: franja amarilla plena (no pastel), con rojo/azul del
   escudo por contraste en los botones. ---- */
.landing-band--cierre {
  background: linear-gradient(135deg, var(--cmch-amarillo), var(--cmch-amarillo-oscuro));
  padding: 90px 0;
}
.landing-band--cierre h2 {
  font-size: 2.6rem;
  color: var(--cmch-amarillo-texto);
}
.landing-band--cierre p {
  color: var(--cmch-amarillo-texto);
  font-size: 1.2rem;
  max-width: 42rem;
  margin-left: auto;
  margin-right: auto;
}

@media (max-width: 767px) {
  .landing-hero {
    padding: 2.5rem 1.5rem;
  }
  .landing-hero h1 {
    font-size: 2rem;
  }
  .landing h2 {
    font-size: 1.85rem;
  }
  .landing-section {
    padding: 48px 0;
  }
  .landing-band--cierre {
    padding: 48px 0;
  }
  .confianza-card {
    padding: 2rem 1.5rem;
  }
}

/* Banner de Modo Entrenamiento (ver base.html): usa el token amarillo, a
   propósito distinto de los alert-success/alert-danger de los flashes, para
   que se lea como "estás en otro modo", no como un mensaje puntual. */
/* Botón "Modo entrenamiento" del menú (ver base.html): un <button> dentro
   de un <form>, pero visualmente igual a los demás .nav-link (que son <a>). */
.nav-link-boton {
  background: none;
  border: 0;
  width: 100%;
  text-align: left;
}

.banner-entrenamiento {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  padding: 0.6rem 1rem;
  background: var(--cmch-amarillo-pastel);
  color: var(--cmch-amarillo-texto);
  border-bottom: 3px solid var(--cmch-amarillo-oscuro);
  font-weight: 600;
  text-align: center;
  position: sticky;
  top: 0;
  z-index: 1050;
}

.banner-entrenamiento form {
  margin: 0;
}

.banner-entrenamiento button {
  border: 1px solid var(--cmch-amarillo-oscuro);
  background: transparent;
  color: var(--cmch-amarillo-texto);
  border-radius: var(--cmch-radius-sm);
  padding: 0.15rem 0.6rem;
  font-weight: 600;
  cursor: pointer;
}

.banner-entrenamiento button:hover {
  background: var(--cmch-amarillo-oscuro);
  color: var(--cmch-superficie);
}

.banner-ver-como {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  padding: 0.6rem 1rem;
  background: var(--cmch-rojo-pastel);
  color: var(--cmch-rojo-oscuro);
  border-bottom: 3px solid var(--cmch-rojo);
  font-weight: 600;
  text-align: center;
  position: sticky;
  top: 0;
  z-index: 1051;
}

.banner-ver-como form {
  margin: 0;
}

.banner-ver-como button {
  border: 1px solid var(--cmch-rojo);
  background: transparent;
  color: var(--cmch-rojo-oscuro);
  border-radius: var(--cmch-radius-sm);
  padding: 0.15rem 0.6rem;
  font-weight: 600;
  cursor: pointer;
}

.banner-ver-como button:hover {
  background: var(--cmch-rojo);
  color: var(--cmch-superficie);
}

/* Switch Superadmin <-> Jefe de Especialidad en el navbar (ver base.html):
   alterna entre "ver todo el sistema" y "ver como" con un solo clic, sin
   pasar por /usuarios/. */
.toggle-rol {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0 0.75rem;
}

.toggle-rol-label {
  font-size: 0.75rem;
  font-weight: 600;
  color: rgba(255, 255, 255, 0.55);
  white-space: nowrap;
  transition: color 0.2s;
}

.toggle-rol-label-activo {
  color: #fff;
}

.toggle-rol-switch {
  position: relative;
  width: 42px;
  height: 22px;
  padding: 2px;
  border: none;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.3);
  cursor: pointer;
  transition: background 0.2s;
  flex-shrink: 0;
}

.toggle-rol-switch:hover {
  background: rgba(255, 255, 255, 0.45);
}

.toggle-rol-switch-on {
  background: var(--cmch-rojo);
}

.toggle-rol-switch-on:hover {
  background: var(--cmch-rojo-oscuro);
}

.toggle-rol-knob {
  display: block;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: #fff;
  transition: transform 0.2s;
}

.toggle-rol-switch-on .toggle-rol-knob {
  transform: translateX(20px);
}
