/**
 * ONLAB Campus — Componentes globales reutilizables.
 * Un mismo componente sirve para todas las pantallas; no se duplica por
 * módulo. Reutilizado responsablemente desde el prototipo visual previo
 * (identidad visual únicamente — sin datos ni lógica simulada). Se
 * omiten deliberadamente los componentes fuera de alcance de
 * CAMPUS-REAL 1.0A (kanban, stepper de admisión, tarjetas de acceso
 * rápido de demostración, carga documental).
 */

/* ---- Botones ---- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-3xs);
  border: 1px solid transparent;
  border-radius: var(--radius-md);
  padding: 0.65rem 1.1rem;
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-semibold);
  line-height: 1;
  transition: background var(--transition-base), border-color var(--transition-base), color var(--transition-base);
  min-height: 44px;
}
.btn:hover { text-decoration: none; }
.btn svg { width: 18px; height: 18px; flex-shrink: 0; }

.btn--primary { background: var(--color-primary); color: var(--color-on-primary); }
.btn--primary:hover { background: var(--color-primary-deep); }

.btn--accent { background: var(--color-accent-deep); color: var(--color-on-status); }
.btn--accent:hover { background: var(--color-accent-deep-hover); }

.btn--outline { background: transparent; border-color: var(--color-border-strong); color: var(--color-text); }
.btn--outline:hover { border-color: var(--color-primary); color: var(--color-primary); }

.btn--ghost { background: transparent; color: var(--color-text-secondary); }
.btn--ghost:hover { background: var(--color-surface-muted); color: var(--color-text); }

.btn--danger { background: var(--color-danger); color: var(--color-on-status); }
.btn--danger:hover { background: var(--color-danger-hover); }

.btn--sm { padding: 0.4rem 0.75rem; min-height: 36px; font-size: var(--font-size-xs); }
.btn--block { width: 100%; }
.btn:disabled { opacity: 0.5; cursor: not-allowed; }

.icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: var(--radius-md);
  border: 1px solid transparent;
  background: transparent;
  color: var(--color-text-secondary);
}
.icon-btn:hover { background: var(--color-surface-muted); color: var(--color-text); }
.icon-btn svg { width: 20px; height: 20px; }

/* ---- Tags / estados ---- */
.tag {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-semibold);
  padding: 0.25rem 0.6rem;
  border-radius: var(--radius-pill);
  border: 1px solid transparent;
  white-space: nowrap;
}
.tag svg { width: 14px; height: 14px; }
.tag--neutral { background: var(--color-neutral-bg); color: var(--color-text-secondary); }
.tag--info { background: var(--color-info-bg); color: var(--color-info); }
.tag--success { background: var(--color-success-bg); color: var(--color-success); }
.tag--warning { background: var(--color-warning-bg); color: var(--color-warning); }
.tag--danger { background: var(--color-danger-bg); color: var(--color-danger); }
.tag--blue { background: var(--color-primary-soft); color: var(--color-primary); }
.tag--green { background: var(--color-accent-soft); color: var(--color-accent-deep); }
.tag--sm { font-size: 0.7rem; padding: 0.15rem 0.5rem; }

/* ---- Tarjetas ---- */
.card {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
}
.card__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-sm);
  padding: var(--space-sm) var(--space-md);
  border-bottom: 1px solid var(--color-border);
}
.card__title { font-size: var(--font-size-md); font-weight: var(--font-weight-semibold); color: var(--color-text); }
.card__body { padding: var(--space-md); }
.card__header-actions { display: flex; align-items: center; gap: var(--space-2xs); flex-wrap: wrap; }

/* CAMPUS-REAL 1.0B.2C.1 — importación académica (preview) */
.link-button {
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  color: var(--color-primary);
  cursor: pointer;
  text-align: left;
  text-decoration: underline;
}
.link-button:hover,
.link-button:focus-visible { color: var(--color-primary-deep); }
.import-file-row { display: flex; flex-direction: column; gap: var(--space-3xs); }
.import-validate-row { display: flex; align-items: center; gap: var(--space-xs); flex-wrap: wrap; margin-top: var(--space-sm); }
.card--pad-sm .card__body { padding: var(--space-sm); }
.card--flat { box-shadow: none; }

/* CAMPUS-REAL 1.0B.2C.1.2 — panel de revisión de fila */
.review-panel-summary { padding: var(--space-sm); border-radius: var(--radius-md); background: var(--color-surface-alt); }
.review-panel-summary p { margin: 0 0 var(--space-3xs); }
.review-panel-summary p:last-child { margin-bottom: 0; }
fieldset.review-panel-section {
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  padding: var(--space-sm);
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
}
fieldset.review-panel-section legend {
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-semibold);
  padding: 0 var(--space-2xs);
}
.field--inline { flex-direction: row; align-items: center; gap: var(--space-2xs); }
.field--inline input[type="radio"] { width: auto; }

/* ---- Estructura académica: ciclo → nivel → grado → grupos ---- */
.structure-level { display: flex; flex-direction: column; gap: var(--space-xs); }
.structure-level__title {
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-semibold);
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--color-text-secondary);
}
.structure-level__grades { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: var(--space-sm); }
.structure-grade {
  background: var(--color-surface-alt);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: var(--space-sm);
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
}
.structure-grade__header { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2xs); }
.structure-grade__name { font-weight: var(--font-weight-medium); }
.structure-grade__empty { font-size: var(--font-size-sm); margin: 0; }
.structure-grade__groups { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--space-2xs); }
.structure-group-item {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2xs);
  font-size: var(--font-size-sm);
  padding: var(--space-3xs) 0;
}

/* Tarjeta de estado (métrica) */
.stat-card {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  padding: var(--space-sm) var(--space-md);
  display: flex;
  flex-direction: column;
  gap: var(--space-3xs);
}
.stat-card__label { font-size: var(--font-size-xs); color: var(--color-text-secondary); font-weight: var(--font-weight-medium); }
.stat-card__value { font-size: var(--font-size-2xl); font-weight: var(--font-weight-bold); color: var(--color-primary-deep); line-height: 1; }
.stat-card__meta { font-size: var(--font-size-xs); color: var(--color-text-muted); }
.stat-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-sm); }
@media (max-width: 1279px) and (min-width: 900px) { .stat-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 899px) and (min-width: 640px) { .stat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 639px) { .stat-grid { grid-template-columns: minmax(0, 1fr); } }

/* ---- Tablas ---- */
.data-table-wrap { overflow-x: auto; border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-surface); }
.data-table { width: 100%; min-width: 560px; }
.data-table th {
  text-align: left;
  font-size: var(--font-size-xs);
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--color-text-muted);
  padding: var(--space-xs) var(--space-sm);
  background: var(--color-surface-alt);
  border-bottom: 1px solid var(--color-border);
  white-space: nowrap;
}
.data-table td { padding: var(--space-xs) var(--space-sm); border-bottom: 1px solid var(--color-border); font-size: var(--font-size-sm); vertical-align: middle; }
.data-table tr:last-child td { border-bottom: none; }
.data-table tr:hover td { background: var(--color-surface-alt); }

/* Tabla → tarjetas en móvil */
@media (max-width: 640px) {
  .data-table--cards thead { display: none; }
  .data-table--cards, .data-table--cards tbody, .data-table--cards tr, .data-table--cards td { display: block; width: 100%; }
  .data-table--cards tr { border: 1px solid var(--color-border); border-radius: var(--radius-md); margin-bottom: var(--space-sm); padding: var(--space-2xs) var(--space-sm); }
  .data-table--cards td { border-bottom: none; display: flex; justify-content: space-between; gap: var(--space-sm); padding: 0.4rem 0; }
  .data-table--cards td::before { content: attr(data-label); font-weight: var(--font-weight-semibold); color: var(--color-text-muted); font-size: var(--font-size-xs); }
}

/* ---- Filtros y buscador ---- */
.filter-bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2xs); margin-bottom: var(--space-sm); }
.filter-bar select,
.filter-bar input[type="search"] {
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  padding: 0.5rem 0.75rem;
  font-size: var(--font-size-sm);
  background: var(--color-surface);
  min-height: 40px;
}
.search-input { position: relative; flex: 1 1 220px; min-width: 180px; }
.search-input svg { position: absolute; left: 0.7rem; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; color: var(--color-text-muted); }
.search-input input { width: 100%; padding-left: 2.2rem; }

/* ---- Paginación ---- */
.pagination { display: flex; align-items: center; justify-content: space-between; gap: var(--space-sm); padding: var(--space-sm); font-size: var(--font-size-xs); color: var(--color-text-secondary); flex-wrap: wrap; }
.pagination__pages { display: flex; gap: 0.3rem; }
.pagination__pages button { min-width: 32px; height: 32px; border-radius: var(--radius-sm); border: 1px solid var(--color-border); background: var(--color-surface); font-size: var(--font-size-xs); }
.pagination__pages button[aria-current="page"] { background: var(--color-primary); border-color: var(--color-primary); color: var(--color-on-primary); }

/* ---- Modal / Toast ---- */
.overlay-backdrop { position: fixed; inset: 0; background: var(--color-overlay); z-index: var(--z-modal); display: flex; align-items: center; justify-content: center; padding: var(--space-sm); }
.modal { background: var(--color-surface); border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); width: min(560px, 100%); max-height: 88vh; display: flex; flex-direction: column; }
.modal__header { display: flex; align-items: center; justify-content: space-between; padding: var(--space-sm) var(--space-md); border-bottom: 1px solid var(--color-border); }
.modal__title { font-size: var(--font-size-md); font-weight: var(--font-weight-semibold); }
.modal__body { padding: var(--space-md); overflow-y: auto; }
.modal__footer { display: flex; justify-content: flex-end; gap: var(--space-2xs); padding: var(--space-sm) var(--space-md); border-top: 1px solid var(--color-border); }

.toast-region { position: fixed; bottom: var(--space-md); right: var(--space-md); display: flex; flex-direction: column; gap: var(--space-2xs); z-index: var(--z-toast); max-width: 340px; }
.toast { background: var(--color-primary-deep); color: var(--color-on-primary); border-radius: var(--radius-md); padding: var(--space-xs) var(--space-sm); font-size: var(--font-size-sm); box-shadow: var(--shadow-md); display: flex; align-items: flex-start; gap: var(--space-2xs); }
.toast--success { background: var(--color-success); }
.toast--warning { background: var(--color-warning); }
.toast--danger { background: var(--color-danger); }

/* ---- Alertas ---- */
.alert { display: flex; gap: var(--space-2xs); align-items: flex-start; padding: var(--space-xs) var(--space-sm); border-radius: var(--radius-md); border: 1px solid transparent; font-size: var(--font-size-sm); }
.alert svg { width: 20px; height: 20px; flex-shrink: 0; margin-top: 0.1rem; }
/* Sin icono no hace falta flex: con flex, el texto y cada <strong>/<em> sueltos serían columnas. */
.alert:not(:has(> svg)) { display: block; }
.alert--info { background: var(--color-info-bg); border-color: var(--color-info-border); color: var(--color-info-text); }
.alert--success { background: var(--color-success-bg); border-color: var(--color-success-border); color: var(--color-success-text); }
.alert--warning { background: var(--color-warning-bg); border-color: var(--color-warning-border); color: var(--color-warning-text); }
.alert--danger { background: var(--color-danger-bg); border-color: var(--color-danger-border); color: var(--color-danger-text); }

/* ---- Tabs ---- */
.tabs__list { display: flex; flex-wrap: wrap; gap: 0.2rem; border-bottom: 1px solid var(--color-border); margin-bottom: var(--space-md); overflow-x: auto; }
.tabs__tab { background: transparent; border: 0; border-bottom: 2px solid transparent; padding: 0.65rem 0.9rem; font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--color-text-secondary); border-bottom: 2px solid transparent; white-space: nowrap; }
.tabs__tab[aria-selected="true"] { color: var(--color-primary); border-color: var(--color-primary); font-weight: var(--font-weight-semibold); }

/* ---- Personas académicas (#/servicios-escolares/personas) ----
   El listado/tabla reutiliza .data-table + .data-table--cards (ya
   resuelve el degradado a tarjetas en móvil, ver arriba) y las
   etiquetas de estado reutilizan .tag--success/neutral/warning ya
   existentes. Lo único genuinamente nuevo: el contenedor de las
   pestañas fuera de una .card (necesita su propio padding lateral) y un
   modificador de .tag para "Acceso" — informativo, nunca un estado real
   ni un botón — visualmente distinto de un estado real para que no se
   confunda con Activo/Inactivo. */
.academic-people-tabs { padding: var(--space-sm) var(--space-md) 0; }
.academic-people-tabs .tabs__list { margin-bottom: 0; }
.tag--access-info { background: transparent; border: 1px dashed var(--color-border-strong); color: var(--color-text-muted); }

/* ---- Acordeón ---- */
.accordion-item { border: 1px solid var(--color-border); border-radius: var(--radius-md); margin-bottom: var(--space-2xs); overflow: hidden; }
.accordion-trigger { width: 100%; display: flex; justify-content: space-between; align-items: center; gap: var(--space-sm); padding: var(--space-xs) var(--space-sm); background: var(--color-surface); text-align: left; font-weight: var(--font-weight-semibold); font-size: var(--font-size-sm); }
.accordion-trigger svg { width: 18px; height: 18px; transition: transform var(--transition-base); flex-shrink: 0; color: var(--color-text-muted); }
.accordion-trigger[aria-expanded="true"] svg { transform: rotate(180deg); }
.accordion-panel { padding: 0 var(--space-sm) var(--space-sm); font-size: var(--font-size-sm); color: var(--color-text-secondary); }

/* ---- Perfil resumido ---- */
.profile-summary { display: flex; align-items: center; gap: var(--space-sm); }
.avatar { display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--color-primary-soft); color: var(--color-primary); font-weight: var(--font-weight-bold); flex-shrink: 0; overflow: hidden; }
.avatar--sm { width: 32px; height: 32px; font-size: var(--font-size-xs); }
.avatar--md { width: 48px; height: 48px; font-size: var(--font-size-sm); }
.avatar--lg { width: 72px; height: 72px; font-size: var(--font-size-lg); }
.profile-summary__name { font-weight: var(--font-weight-semibold); }
.profile-summary__meta { font-size: var(--font-size-xs); color: var(--color-text-muted); }

/* ---- Historial (auditoría, actividad reciente) ---- */
.history-list { display: flex; flex-direction: column; gap: 0.5rem; }
.history-row { display: flex; justify-content: space-between; gap: var(--space-sm); font-size: var(--font-size-sm); padding: 0.5rem 0; border-bottom: 1px dashed var(--color-border); }
.history-row:last-child { border-bottom: none; }

/* ---- Estados vacíos / carga / acceso denegado / próximamente ---- */
.empty-state { text-align: center; padding: var(--space-xl) var(--space-md); color: var(--color-text-secondary); }
.empty-state svg { width: 48px; height: 48px; margin: 0 auto var(--space-2xs); color: var(--color-text-muted); }
.empty-state__title { font-weight: var(--font-weight-semibold); color: var(--color-text); margin-bottom: 0.25rem; }

.skeleton {
  background: linear-gradient(90deg, var(--color-surface-muted) 25%, var(--color-border) 37%, var(--color-surface-muted) 63%);
  background-size: 400% 100%;
  animation: skeleton-shine 1.4s ease infinite;
  border-radius: var(--radius-sm);
}
@keyframes skeleton-shine { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } }
@media (prefers-reduced-motion: reduce) { .skeleton { animation: none; background: var(--color-surface-muted); } }

.access-denied { text-align: center; padding: var(--space-2xl) var(--space-md); max-width: 480px; margin-inline: auto; }
.access-denied svg { width: 56px; height: 56px; color: var(--color-danger); margin: 0 auto var(--space-sm); }

.coming-soon-tag {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-muted);
  background: var(--color-surface-muted);
  border: 1px dashed var(--color-border-strong);
  padding: 0.25rem 0.6rem;
  border-radius: var(--radius-pill);
}
.coming-soon-tag .ui-icon { width: 14px; height: 14px; }

/* ---- Formularios ---- */
.field { display: flex; flex-direction: column; gap: 0.3rem; margin-bottom: var(--space-sm); }
.field label { font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); color: var(--color-text); }
.field .hint { font-size: var(--font-size-xs); color: var(--color-text-muted); }
.field input:not([type]),
.field input[type="text"],
.field input[type="search"],
.field input[type="email"],
.field input[type="password"],
.field input[type="date"],
.field input[type="tel"],
.field input[type="number"],
.field select,
.field textarea {
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  padding: 0.65rem 0.8rem;
  font-size: var(--font-size-base);
  background: var(--color-surface);
  min-height: 44px;
  width: 100%;
}
.field textarea { min-height: 96px; resize: vertical; }
.field input:focus-visible,
.field select:focus-visible,
.field textarea:focus-visible { border-color: var(--color-primary); }
.field[data-invalid="true"] input,
.field[data-invalid="true"] select { border-color: var(--color-danger); }
.field__error { font-size: var(--font-size-xs); color: var(--color-danger); }
.field-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 0 var(--space-sm); }
.checkbox-row, .radio-row { display: flex; align-items: flex-start; gap: 0.5rem; font-size: var(--font-size-sm); }
.password-field { position: relative; }
.password-field button { position: absolute; right: 0.4rem; top: 50%; transform: translateY(-50%); }

/* ---- Sección genérica ---- */
.section-heading { display: flex; align-items: center; justify-content: space-between; gap: var(--space-sm); margin-bottom: var(--space-sm); flex-wrap: wrap; }
.section-heading h2 { font-size: var(--font-size-lg); font-weight: var(--font-weight-bold); color: var(--color-primary-deep); }
.section-heading p { color: var(--color-text-secondary); font-size: var(--font-size-sm); }

.legend-box { border: 1px dashed var(--color-border-strong); border-radius: var(--radius-md); padding: var(--space-sm); font-size: var(--font-size-sm); color: var(--color-text-secondary); background: var(--color-surface-alt); }

/* ---- Estado de carga de página completa ---- */
.route-loading { display: flex; align-items: center; justify-content: center; min-height: 40vh; gap: var(--space-2xs); color: var(--color-text-secondary); font-size: var(--font-size-sm); }
.route-loading__spinner {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 3px solid var(--color-border);
  border-top-color: var(--color-primary);
  animation: route-spin 0.7s linear infinite;
}
@keyframes route-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .route-loading__spinner { animation-duration: 1.6s; } }

/* =====================================================================
   CAMPUS-REAL 1.0B.2E.4 — Dashboard Operativo de Servicios Escolares
   ===================================================================== */
.stat-card--clickable {
  text-decoration: none;
  color: inherit;
  transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
}
.stat-card--clickable:hover {
  text-decoration: none;
  border-color: var(--color-primary);
  box-shadow: var(--shadow-sm);
  transform: translateY(-1px);
}
.stat-card--clickable:focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 2px;
}
.dashboard-section { gap: var(--space-sm); }
.dashboard-cycle-layout {
  display: grid;
  grid-template-columns: minmax(260px, 1fr) minmax(280px, 1fr);
  gap: var(--space-md);
  align-items: end;
}
.dashboard-cycle-select { min-width: 0; }
.dashboard-cycle-select .field { margin-bottom: var(--space-2xs); }
.dashboard-quick-actions {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: var(--space-2xs);
}
.dashboard-actions-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--space-2xs);
}
.dashboard-domain-summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-sm);
  margin-bottom: var(--space-sm);
  padding-bottom: var(--space-sm);
  border-bottom: 1px solid var(--color-border);
}
.dashboard-attention-list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-2xs);
}
.dashboard-attention-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-sm);
  min-height: 48px;
  padding: var(--space-xs) var(--space-sm);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface);
  color: var(--color-text);
  text-decoration: none;
}
.dashboard-attention-item:hover {
  text-decoration: none;
  border-color: var(--color-primary);
  background: var(--color-surface-alt);
}
.dashboard-access-grid {
  display: grid;
  gap: var(--space-md);
}
@media (max-width: 899px) {
  .dashboard-cycle-layout { grid-template-columns: minmax(0, 1fr); }
  .dashboard-quick-actions { align-items: flex-start; }
  .dashboard-actions-row { justify-content: flex-start; }
  .dashboard-attention-list { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 639px) {
  .dashboard-domain-summary { align-items: flex-start; flex-direction: column; }
}

/* =====================================================================
   CAMPUS-REAL 1.0B.2F.0 — Finanzas y pagos
   ===================================================================== */
.finance-workspace-head { overflow: hidden; }
.finance-workspace-head .card__body { padding-bottom: var(--space-sm); }
.finance-tabs { padding: 0 var(--space-md); margin-bottom: 0; }
.finance-cycle-row {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--space-md);
  flex-wrap: wrap;
}
.finance-cycle-field { min-width: min(100%, 360px); margin-bottom: 0; }
.finance-scope-note {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2xs);
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
  max-width: 520px;
}
.finance-scope-note svg { width: 18px; height: 18px; flex-shrink: 0; }
.finance-stat-row { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.finance-stat-card--attention { border-color: var(--color-warning-border); background: var(--color-warning-bg); }
.finance-result-count {
  margin-bottom: var(--space-2xs);
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  text-align: right;
}
.finance-table-wrap { border-radius: var(--radius-md); }
.finance-table { min-width: 1320px; }
.finance-payment-table { min-width: 1500px; }
.finance-row--attention td { background: color-mix(in srgb, var(--color-warning-bg) 55%, var(--color-surface)); }
.finance-row--attention:hover td { background: var(--color-warning-bg); }
.finance-inline-note {
  display: inline-block;
  margin-top: 0.3rem;
  max-width: 260px;
  color: var(--color-text-muted);
  font-size: 0.72rem;
  line-height: 1.25;
}
.finance-modal-grid { margin-top: var(--space-sm); }
.finance-period-filter { margin-bottom: 0; align-items: flex-end; }
.finance-period-field { min-width: min(100%, 420px); margin-bottom: 0; }
.finance-period-help { flex: 1 1 280px; padding-bottom: 0.55rem; }
.finance-period-summary > p:first-child { margin-top: 0; }
.finance-window-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  gap: var(--space-2xs);
  margin-top: var(--space-sm);
}
.finance-window-item {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  padding: var(--space-xs);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
  font-size: var(--font-size-xs);
}
.finance-window-item strong { color: var(--color-text); }

@media (max-width: 899px) {
  .finance-stat-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 640px) {
  .finance-cycle-row { align-items: stretch; }
  .finance-cycle-field { width: 100%; min-width: 0; }
  .finance-tabs { padding-inline: var(--space-sm); }
  .finance-stat-row { grid-template-columns: minmax(0, 1fr); }
  .finance-table,
  .finance-payment-table { min-width: 0; }
  .finance-row--attention { border-color: var(--color-warning-border) !important; background: var(--color-warning-bg); }
  .finance-row--attention td { background: transparent; }
  .finance-inline-note { max-width: 58vw; text-align: right; }
}

/* =====================================================================
   CAMPUS-REAL 1.0B.2G.0 — EXPEDIENTES DOCUMENTALES DE ALUMNOS
   ===================================================================== */
.student-doc-workspace-head { overflow: hidden; }
.student-doc-workspace-head .card__body { padding-bottom: var(--space-sm); }
.student-doc-tabs { padding: 0 var(--space-md); margin-bottom: 0; }
.student-doc-cycle-row,
.student-doc-requirement-toolbar,
.student-doc-case-actions,
.student-doc-admin-actions {
  display: flex;
  align-items: flex-end;
  gap: var(--space-sm);
  flex-wrap: wrap;
}
.student-doc-cycle-row,
.student-doc-requirement-toolbar { justify-content: space-between; }
.student-doc-cycle-field,
.student-doc-level-field { min-width: min(100%, 360px); margin-bottom: 0; }
.student-doc-security-note,
.student-doc-modal-note {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
  max-width: 620px;
}
.student-doc-modal-note {
  padding: var(--space-xs);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
}
.student-doc-filters {
  display: grid;
  grid-template-columns: minmax(240px, 2fr) minmax(220px, 1fr);
  gap: 0 var(--space-sm);
}
.student-doc-filters .field { margin-bottom: 0; }
.student-doc-stat-grid { margin: var(--space-md) 0; }
.student-doc-table { min-width: 980px; }
.student-doc-requirements-table { min-width: 920px; }
.student-doc-mini-progress,
.student-doc-progress-line {
  height: 7px;
  overflow: hidden;
  border-radius: 999px;
  background: var(--color-neutral-bg);
}
.student-doc-mini-progress { width: 120px; margin-bottom: 0.35rem; }
.student-doc-mini-progress span,
.student-doc-progress-line span {
  display: block;
  height: 100%;
  background: var(--color-primary);
  border-radius: inherit;
}
.student-doc-check-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-xs);
  margin-bottom: var(--space-sm);
}
.student-doc-check-grid label,
.student-doc-format-fieldset label {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  font-size: var(--font-size-sm);
}
.student-doc-check-grid input,
.student-doc-format-fieldset input { width: auto; }
.student-doc-format-fieldset {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: var(--space-sm);
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-sm);
  margin-bottom: var(--space-sm);
}
.student-doc-format-fieldset legend {
  padding: 0 0.35rem;
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-semibold);
}
.student-doc-detail-nav { margin-bottom: var(--space-xs); }
.student-doc-student-head,
.student-doc-admin-item__head,
.student-doc-link-history-row {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: var(--space-sm);
}
.student-doc-student-head h2,
.student-doc-admin-item__head h3 { margin: 0.15rem 0; }
.student-doc-student-head p { margin: 0; color: var(--color-text-secondary); }
.student-doc-progress-line { margin: var(--space-sm) 0 var(--space-2xs); }
.student-doc-case-actions { align-items: center; margin-top: var(--space-sm); }
.student-doc-detail-list { display: grid; gap: var(--space-sm); }
.student-doc-admin-item__head { margin-bottom: var(--space-xs); }
.student-doc-item-tags { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-top: 0.35rem; }
.student-doc-admin-actions { align-items: center; margin-top: var(--space-sm); }
.student-doc-generated-link { margin-top: var(--space-sm); }
.student-doc-generated-link textarea {
  width: 100%;
  min-height: 108px;
  resize: vertical;
  margin: var(--space-xs) 0;
  padding: var(--space-xs);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
  color: var(--color-text);
}
.student-doc-link-history-row {
  padding: var(--space-xs) 0;
  border-bottom: 1px solid var(--color-border);
}
.student-doc-link-history-row:last-child { border-bottom: 0; }

/* Portal público de familias */
.family-doc-page {
  min-height: 100vh;
  background: var(--color-surface-alt);
  padding: clamp(1rem, 3vw, 2.5rem) 1rem;
}
.family-doc-shell { width: min(780px, 100%); margin: 0 auto; }
.family-doc-brand {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-2xs);
  margin-bottom: var(--space-md);
}
.family-doc-brand .brand-header { margin-bottom: 0; }
.family-doc-brand__name { color: var(--color-text); font-size: var(--font-size-xl); font-weight: var(--font-weight-bold); }
.family-doc-card,
.family-doc-item {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
}
.family-doc-card { padding: clamp(1rem, 3vw, 1.6rem); }
.family-doc-card--message { text-align: center; padding-block: var(--space-xl); }
.family-doc-card--message h1,
.family-doc-summary h1 { margin: 0.2rem 0 0.4rem; }
.family-doc-message-icon {
  width: 48px;
  height: 48px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  margin: 0 auto var(--space-sm);
  background: var(--color-warning-bg);
  color: var(--color-warning);
  font-weight: var(--font-weight-bold);
  font-size: var(--font-size-xl);
}
.family-doc-summary__label { color: var(--color-text-muted); font-size: var(--font-size-sm); }
.family-doc-summary > p { margin-top: 0; color: var(--color-text-secondary); }
.family-doc-progress-row {
  display: flex;
  justify-content: space-between;
  align-items: end;
  gap: var(--space-sm);
  margin-top: var(--space-md);
}
.family-doc-progress-row div { display: flex; flex-direction: column; }
.family-doc-progress-row span { color: var(--color-text-muted); font-size: var(--font-size-xs); }
.family-doc-progress {
  height: 9px;
  overflow: hidden;
  border-radius: 999px;
  background: var(--color-neutral-bg);
  margin-top: var(--space-2xs);
}
.family-doc-progress span { display: block; height: 100%; border-radius: inherit; background: var(--color-primary); }
.family-doc-complete {
  margin-top: var(--space-sm);
  padding: var(--space-xs);
  border-radius: var(--radius-md);
  background: var(--color-success-bg);
  color: var(--color-success);
  font-weight: var(--font-weight-semibold);
}
.family-doc-section-head { margin: var(--space-lg) 0 var(--space-sm); }
.family-doc-section-head h2 { margin-bottom: 0.25rem; }
.family-doc-section-head p { margin: 0; color: var(--color-text-muted); font-size: var(--font-size-sm); }
.family-doc-list { display: grid; gap: var(--space-sm); }
.family-doc-item { padding: var(--space-md); }
.family-doc-item__head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: var(--space-sm);
}
.family-doc-item__head h3 { margin: 0; }
.family-doc-item__badges { display: flex; gap: 0.3rem; flex-wrap: wrap; margin-top: 0.35rem; }
.family-doc-description,
.family-doc-note { color: var(--color-text-secondary); font-size: var(--font-size-sm); }
.family-doc-note { display: block; margin-top: var(--space-2xs); }
.family-doc-observation {
  margin-top: var(--space-sm);
  padding: var(--space-xs);
  border-radius: var(--radius-md);
  background: var(--color-warning-bg);
  color: var(--color-text);
  font-size: var(--font-size-sm);
}
.family-doc-upload { margin-top: var(--space-sm); padding-top: var(--space-sm); border-top: 1px solid var(--color-border); }
.family-doc-upload .field { margin-bottom: var(--space-xs); }
.family-doc-file-picker {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  flex-wrap: wrap;
}
.family-doc-file-name {
  color: var(--color-text-secondary);
  font-size: var(--font-size-sm);
  overflow-wrap: anywhere;
}
.family-doc-upload__status { margin-top: var(--space-xs); color: var(--color-text-secondary); }
.family-doc-received { margin: var(--space-sm) 0 0; color: var(--color-success); font-weight: var(--font-weight-medium); font-size: var(--font-size-sm); }
.family-doc-footer { padding: var(--space-lg) var(--space-xs) var(--space-md); text-align: center; color: var(--color-text-muted); font-size: var(--font-size-xs); }
.family-doc-footer p { margin: 0.2rem 0; }

@media (max-width: 700px) {
  .student-doc-tabs { padding-inline: var(--space-sm); }
  .student-doc-filters { grid-template-columns: minmax(0, 1fr); gap: 0; }
  .student-doc-filters .field { margin-bottom: var(--space-sm); }
  .student-doc-cycle-field,
  .student-doc-level-field { width: 100%; min-width: 0; }
  .student-doc-check-grid { grid-template-columns: minmax(0, 1fr); }
  .student-doc-table,
  .student-doc-requirements-table { min-width: 0; }
  .student-doc-mini-progress { width: min(150px, 42vw); }
  .student-doc-student-head,
  .student-doc-admin-item__head,
  .student-doc-link-history-row,
  .family-doc-item__head { flex-direction: column; align-items: stretch; }
  .family-doc-page { padding-inline: 0.75rem; }
  .family-doc-item { padding: var(--space-sm); }
}


/* =====================================================================
   CAMPUS-REAL 1.0B.2H.0 — Dashboard Alumno
   ===================================================================== */
.student-home-hero { overflow: hidden; }
.student-home-hero__row { display:flex; align-items:flex-start; justify-content:space-between; gap:var(--space-md); }
.student-home-hero h2 { margin:0.2rem 0 0.35rem; color:var(--color-primary-deep); }
.student-home-hero p { margin:0; color:var(--color-text-secondary); }
.student-home-eyebrow { display:block; font-size:var(--font-size-xs); font-weight:var(--font-weight-semibold); color:var(--color-text-muted); letter-spacing:0.03em; }
.student-home-stat-grid { margin:var(--space-md) 0; }
.student-home-stat { min-height:112px; }
.student-home-stat__value { font-size:var(--font-size-lg); font-weight:var(--font-weight-bold); color:var(--color-primary-deep); line-height:1.2; }
.student-home-grid { display:grid; grid-template-columns:minmax(0,1.15fr) minmax(280px,0.85fr); gap:var(--space-md); margin-bottom:var(--space-md); }
.student-home-actions { display:grid; gap:var(--space-2xs); }
.student-home-action { display:flex; gap:var(--space-sm); align-items:center; padding:var(--space-sm); border:1px solid var(--color-border); border-radius:var(--radius-md); color:var(--color-text); text-decoration:none; }
.student-home-action:hover { text-decoration:none; border-color:var(--color-primary); background:var(--color-surface-alt); }
.student-home-action > span { width:40px; height:40px; display:grid; place-items:center; border-radius:999px; background:var(--color-info-bg); color:var(--color-primary-deep); flex-shrink:0; }
.student-home-action > span svg { width:20px; height:20px; }
.student-home-action small { display:block; margin-top:0.2rem; color:var(--color-text-muted); }
.student-home-card-head { display:flex; align-items:flex-start; justify-content:space-between; gap:var(--space-sm); }
.student-home-card-head h2 { margin-bottom:0.2rem; }
.student-home-card-head p { margin:0; color:var(--color-text-muted); font-size:var(--font-size-sm); }
.student-home-subject-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--space-sm); }
.student-home-subject-card { display:flex; align-items:center; gap:var(--space-sm); padding:var(--space-sm); border:1px solid var(--color-border); border-radius:var(--radius-md); background:var(--color-surface); }
.student-home-subject-card__icon { width:38px; height:38px; display:grid; place-items:center; flex-shrink:0; border-radius:999px; background:var(--color-info-bg); color:var(--color-primary-deep); }
.student-home-subject-card__icon svg { width:19px; height:19px; }
.student-home-subject-empty { margin:0; }
@media (max-width:899px) {
  .student-home-grid { grid-template-columns:minmax(0,1fr); }
  .student-home-subject-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:639px) {
  .student-home-hero__row, .student-home-card-head { flex-direction:column; align-items:flex-start; }
  .student-home-subject-grid { grid-template-columns:minmax(0,1fr); }
}

/* ====================================================================
   CAMPUS-REAL 1.0B.2I.0 — Dashboard Tutor / Portal de Padres
   ==================================================================== */
.guardian-home-hero,
.guardian-student-hero { overflow:hidden; }
.guardian-home-hero__body,
.guardian-student-hero__body { display:flex; align-items:flex-start; justify-content:space-between; gap:var(--space-md); }
.guardian-home-hero h2,
.guardian-student-hero h2 { margin:0.2rem 0 0.35rem; color:var(--color-primary-deep); }
.guardian-home-hero p,
.guardian-student-hero p { margin:0; color:var(--color-text-secondary); }
.guardian-home-hero .btn { display:inline-flex; align-items:center; gap:0.4rem; }
.guardian-home-hero .btn svg { width:18px; height:18px; }
.guardian-child-switcher { display:flex; gap:var(--space-xs); overflow-x:auto; padding:var(--space-md) 0 var(--space-xs); scrollbar-width:thin; }
.guardian-child-chip { min-width:210px; text-align:left; border:1px solid var(--color-border); background:var(--color-surface); border-radius:var(--radius-md); padding:var(--space-sm); cursor:pointer; color:var(--color-text); transition:border-color .15s ease, background .15s ease, box-shadow .15s ease; }
.guardian-child-chip span { display:block; font-weight:var(--font-weight-semibold); }
.guardian-child-chip small { display:block; margin-top:0.2rem; color:var(--color-text-muted); }
.guardian-child-chip:hover { border-color:var(--color-primary); }
.guardian-child-chip.is-active { border-color:var(--color-primary); background:var(--color-info-bg); box-shadow:0 0 0 1px var(--color-primary); }
.guardian-student-hero { margin-top:var(--space-sm); }
.guardian-portal-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-md); margin-top:var(--space-md); }
.guardian-portal-card--wide { grid-column:1 / -1; }
.guardian-portal-card .card__header > div > p { margin:0.2rem 0 0; color:var(--color-text-muted); font-size:var(--font-size-sm); }
.guardian-summary-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-sm); }
.guardian-summary-item { border:1px solid var(--color-border); border-radius:var(--radius-md); padding:var(--space-sm); background:var(--color-surface-alt); }
.guardian-summary-item span { display:block; font-size:var(--font-size-xs); color:var(--color-text-muted); margin-bottom:0.25rem; }
.guardian-summary-item strong { display:block; color:var(--color-primary-deep); overflow-wrap:anywhere; }
.guardian-subsection { margin-top:var(--space-md); }
.guardian-subsection h3 { margin:0 0 var(--space-xs); font-size:var(--font-size-md); }
.guardian-subject-list { display:flex; flex-wrap:wrap; gap:var(--space-2xs); }
.guardian-payment-counts { display:flex; flex-wrap:wrap; gap:var(--space-2xs); margin:var(--space-sm) 0; }
.guardian-table-wrap { margin-top:var(--space-sm); }
.guardian-document-progress { margin-bottom:var(--space-md); }
.guardian-document-progress > div:first-child { display:flex; justify-content:space-between; align-items:center; gap:var(--space-sm); margin-bottom:0.45rem; }
.guardian-document-progress > div:first-child span { color:var(--color-text-muted); font-size:var(--font-size-sm); }
.guardian-progress-track { height:8px; background:var(--color-border); border-radius:999px; overflow:hidden; }
.guardian-progress-track span { display:block; height:100%; background:var(--color-primary); border-radius:inherit; }
.guardian-document-list { display:grid; gap:var(--space-2xs); }
.guardian-document-row { display:flex; align-items:flex-start; justify-content:space-between; gap:var(--space-sm); border:1px solid var(--color-border); border-radius:var(--radius-md); padding:var(--space-sm); }
.guardian-document-row > div { min-width:0; }
.guardian-document-row strong { display:block; }
.guardian-document-row small { display:block; margin-top:0.2rem; color:var(--color-text-muted); }
.guardian-family-message { margin-top:0.45rem; padding:0.5rem 0.65rem; border-radius:var(--radius-sm); background:var(--color-warning-bg); color:var(--color-warning-text); font-size:var(--font-size-sm); }
.guardian-document-help { margin:var(--space-md) 0 0; }

@media (max-width: 900px) {
  .guardian-portal-grid { grid-template-columns:minmax(0,1fr); }
  .guardian-portal-card--wide { grid-column:auto; }
}

@media (max-width: 640px) {
  .guardian-home-hero__body,
  .guardian-student-hero__body,
  .guardian-document-row { flex-direction:column; align-items:flex-start; }
  .guardian-summary-grid { grid-template-columns:minmax(0,1fr); }
  .guardian-child-chip { min-width:82vw; }
}

/* =====================================================================
   CAMPUS-REAL 1.0B.2J.0 — Dashboard Dirección
   ===================================================================== */
.director-hero__body,.director-level-head,.director-subsection__head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md)}
.director-hero__eyebrow,.director-level-eyebrow{display:block;font-size:.75rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:var(--space-2xs)}
.director-hero h2,.director-level-head h2{margin:0}.director-hero p{margin:.35rem 0 0;color:var(--color-text-muted)}
.director-stat-grid{margin-bottom:var(--space-lg)}.director-stat__value{display:block;font-size:1.65rem;font-weight:750;line-height:1.1;color:var(--color-text)}
.director-actions{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--space-sm)}
.director-action{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-md);border:1px solid var(--color-border);border-radius:var(--radius-md);text-decoration:none;color:inherit;background:var(--color-surface)}
.director-action:hover{border-color:var(--color-primary);box-shadow:var(--shadow-sm)}.director-action svg{flex:0 0 auto;margin-top:2px}.director-action strong,.director-action small{display:block}.director-action small{margin-top:.25rem;color:var(--color-text-muted);line-height:1.4}
.director-level-list{display:grid;gap:var(--space-lg);margin-top:var(--space-lg)}
.director-level-metrics,.director-admission-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--space-sm)}
.director-level-metrics>div,.director-admission-grid>div{padding:var(--space-sm);border-radius:var(--radius-md);background:var(--color-surface-muted);border:1px solid var(--color-border)}
.director-level-metrics span,.director-admission-grid span{display:block;color:var(--color-text-muted);font-size:.78rem}.director-level-metrics strong,.director-admission-grid strong{display:block;font-size:1.25rem;margin-top:.2rem}
.director-subsection{margin:var(--space-lg) 0}.director-subsection__head{margin-bottom:var(--space-sm)}.director-subsection__head h3{margin:0}.director-no-finance,.director-assignment-alert{margin-top:var(--space-lg)}
@media (max-width:900px){.director-actions,.director-level-metrics,.director-admission-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:620px){.director-hero__body,.director-level-head,.director-subsection__head{align-items:flex-start;flex-direction:column}.director-actions,.director-level-metrics,.director-admission-grid{grid-template-columns:1fr}}

/* =====================================================================
   CAMPUS-REAL 1.0B.2K.0 — Materias y carga académica
   ===================================================================== */
.academic-load-toolbar-card{margin-bottom:var(--space-md)}
.academic-load-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--space-md);flex-wrap:wrap}
.academic-load-cycle-field{min-width:min(100%,380px);margin-bottom:0}
.academic-load-cycle-meta{display:flex;flex-direction:column;align-items:flex-end;gap:.2rem;color:var(--color-text-muted);font-size:var(--font-size-sm)}
.academic-load-cycle-meta strong{color:var(--color-text)}
.academic-load-tabs{margin-bottom:var(--space-lg)}
.academic-load-stat-grid{margin-bottom:var(--space-lg)}
.academic-load-stat strong{display:block;font-size:1.55rem;color:var(--color-primary-deep);line-height:1.15}
.academic-load-overview-grid,.academic-load-import-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md)}
.academic-load-flow{display:grid;gap:var(--space-xs)}
.academic-load-flow>div{display:grid;grid-template-columns:34px minmax(120px,.65fr) minmax(0,1fr);gap:var(--space-sm);align-items:center;padding:var(--space-xs) 0;border-bottom:1px solid var(--color-border)}
.academic-load-flow>div:last-child{border-bottom:none}
.academic-load-flow>div>span{width:30px;height:30px;border-radius:999px;display:grid;place-items:center;background:var(--color-info-bg);color:var(--color-primary-deep);font-weight:700}
.academic-load-flow small{color:var(--color-text-muted)}
.academic-load-access-list{display:grid;gap:var(--space-xs)}
.academic-load-access-list>div{display:flex;justify-content:space-between;gap:var(--space-md);padding:var(--space-xs) 0;border-bottom:1px solid var(--color-border)}
.academic-load-access-list>div:last-child{border-bottom:none}
.academic-load-empty-alert{margin-top:var(--space-lg)}
.academic-load-section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-bottom:var(--space-sm)}
.academic-load-section-head h2{margin:0}.academic-load-section-head p{margin:.25rem 0 0;color:var(--color-text-muted)}
.academic-load-section-head--spaced{margin-top:var(--space-xl)}
.academic-load-table{min-width:900px}
.academic-load-assignment-chip{display:inline-flex;flex-direction:column;gap:.1rem;padding:.35rem .55rem;margin:.1rem;border-radius:var(--radius-sm);background:var(--color-surface-muted);border:1px solid var(--color-border)}
.academic-load-assignment-chip small{color:var(--color-text-muted)}
.academic-load-note{margin-top:var(--space-sm)}
.academic-load-preview-card{margin-top:var(--space-lg)}
.academic-load-preview-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md)}
.academic-load-preview-head h2{margin-bottom:.2rem}.academic-load-preview-head p{margin:0;color:var(--color-text-muted)}
.academic-load-preview-stats{margin-bottom:var(--space-lg)}
.academic-load-preview-table{min-width:980px}
.academic-load-row--blocked td{background:color-mix(in srgb,var(--color-danger-bg) 55%,var(--color-surface))}
.academic-load-message{display:flex;flex-direction:column;gap:.12rem;margin-bottom:.35rem;font-size:var(--font-size-xs)}
.academic-load-message--error strong{color:var(--color-danger)}
.academic-load-message--warning strong{color:var(--color-warning-strong)}
.academic-load-preview-actions{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-sm);margin-top:var(--space-md);flex-wrap:wrap}
.academic-load-confirm-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--space-xs);margin:var(--space-md) 0}
.academic-load-confirm-summary>div{padding:var(--space-sm);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface-muted)}
.academic-load-confirm-summary span,.academic-load-confirm-summary strong{display:block}.academic-load-confirm-summary span{font-size:var(--font-size-xs);color:var(--color-text-muted)}.academic-load-confirm-summary strong{font-size:1.2rem;margin-top:.15rem}
@media(max-width:900px){.academic-load-overview-grid,.academic-load-import-grid{grid-template-columns:1fr}.academic-load-confirm-summary{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:640px){.academic-load-toolbar,.academic-load-section-head,.academic-load-preview-head{align-items:flex-start;flex-direction:column}.academic-load-cycle-meta{align-items:flex-start}.academic-load-table,.academic-load-preview-table{min-width:0}.academic-load-confirm-summary{grid-template-columns:1fr}.academic-load-flow>div{grid-template-columns:34px 1fr}.academic-load-flow small{grid-column:2}}
.academic-load-download-actions{display:flex;align-items:center;gap:var(--space-xs);flex-wrap:wrap;margin-top:var(--space-sm)}
@media(max-width:640px){.academic-load-download-actions{align-items:stretch;flex-direction:column}.academic-load-download-actions .btn{justify-content:center;width:100%}}

/* ================================================================
   CAMPUS-REAL 1.0B.2L.0 — Dashboard Docente
   ================================================================ */
.teacher-hero__body,.teacher-section__head,.teacher-group-card__head,.teacher-account-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md)}
.teacher-hero__eyebrow,.teacher-group-eyebrow{display:block;font-size:.75rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:var(--space-2xs)}
.teacher-hero h2,.teacher-group-card h3,.teacher-section h2{margin:0}.teacher-hero p,.teacher-section__head p,.teacher-account-row p{margin:.3rem 0 0;color:var(--color-text-muted)}
.teacher-stat-grid{margin:var(--space-md) 0}.teacher-stat{min-height:112px}.teacher-stat__value{font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-primary-deep);line-height:1.2}
.teacher-section{margin:var(--space-lg) 0}.teacher-section__head{margin-bottom:var(--space-sm)}
.teacher-group-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md)}
.teacher-group-card{overflow:hidden}.teacher-group-card__head{align-items:flex-start}.teacher-group-card__head h3{font-size:1rem;color:var(--color-primary-deep)}
.teacher-group-block h4{margin:0 0 var(--space-xs);font-size:var(--font-size-sm)}
.teacher-subject-list{display:flex;flex-wrap:wrap;gap:var(--space-xs)}.teacher-subject-chip{display:inline-flex;align-items:center;gap:.35rem;padding:.4rem .65rem;border-radius:999px;background:var(--color-info-bg);color:var(--color-primary-deep);font-weight:600;font-size:var(--font-size-sm)}.teacher-subject-chip small{color:var(--color-text-muted);font-weight:500}
.teacher-roster-details{margin-top:var(--space-md);padding-top:var(--space-sm);border-top:1px solid var(--color-border)}.teacher-roster-details summary{cursor:pointer;font-weight:600;color:var(--color-primary-deep)}
.teacher-roster{display:grid;gap:var(--space-2xs);margin-top:var(--space-sm);max-height:320px;overflow:auto}.teacher-roster__row{display:flex;align-items:center;gap:var(--space-xs);padding:.55rem .2rem;border-bottom:1px solid var(--color-border)}.teacher-roster__row:last-child{border-bottom:0}.teacher-roster__avatar{width:32px;height:32px;display:grid;place-items:center;border-radius:999px;background:var(--color-surface-alt);color:var(--color-primary-deep);flex-shrink:0}.teacher-roster__avatar svg{width:18px;height:18px}.teacher-roster__row strong,.teacher-roster__row small{display:block}.teacher-roster__row small{color:var(--color-text-muted);margin-top:.1rem}
.teacher-schedule-card{margin-top:var(--space-md)}.teacher-schedule-days{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md)}.teacher-schedule-day{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-sm)}.teacher-schedule-day h3{margin:0 0 var(--space-xs);font-size:var(--font-size-sm);color:var(--color-primary-deep)}.teacher-schedule-list{display:grid;gap:var(--space-xs)}.teacher-schedule-row{display:grid;grid-template-columns:105px minmax(0,1fr);gap:var(--space-sm);align-items:start}.teacher-schedule-time{font-weight:700;color:var(--color-primary-deep);font-variant-numeric:tabular-nums}.teacher-schedule-row strong,.teacher-schedule-row small{display:block}.teacher-schedule-row small{color:var(--color-text-muted);margin-top:.15rem}
.teacher-empty-card{margin:var(--space-lg) 0}.teacher-empty-state{text-align:center;padding:clamp(2rem,5vw,4rem)}.teacher-empty-state__icon{width:64px;height:64px;display:grid;place-items:center;margin:0 auto var(--space-md);border-radius:999px;background:var(--color-info-bg);color:var(--color-primary-deep)}.teacher-empty-state__icon svg{width:32px;height:32px}.teacher-empty-state h2{margin:0;color:var(--color-primary-deep)}.teacher-empty-state p{max-width:620px;margin:.65rem auto 0;color:var(--color-text-muted)}.teacher-empty-note{display:inline-flex;align-items:center;gap:.45rem;margin-top:var(--space-md);padding:.55rem .8rem;border-radius:999px;background:var(--color-surface-alt);color:var(--color-text-secondary);font-size:var(--font-size-sm)}.teacher-empty-note svg{width:17px;height:17px}
.teacher-account-card{margin-top:var(--space-md)}.teacher-account-row .btn{display:inline-flex;align-items:center;gap:.4rem;white-space:nowrap}.teacher-account-row .btn svg{width:18px;height:18px}.teacher-privacy-note{margin-top:var(--space-md)}
@media (max-width:900px){.teacher-group-grid,.teacher-schedule-days{grid-template-columns:1fr}}
@media (max-width:620px){.teacher-hero__body,.teacher-section__head,.teacher-group-card__head,.teacher-account-row{align-items:flex-start;flex-direction:column}.teacher-schedule-row{grid-template-columns:1fr;gap:.2rem}.teacher-account-row .btn{width:100%;justify-content:center}}

/* =====================================================================
   CAMPUS-REAL 1.0B.2M.0 — Finanzas 2.0 / movimientos de pago
   ===================================================================== */
.finance-stat-row--five { grid-template-columns: repeat(5, minmax(0, 1fr)); }
/* G.10H.5B.1 — seis tarjetas. Meter seis en el layout de cinco dejaba
   la última sola en una segunda fila, desalineada con el resto. El
   bloque histórico que sí lleva cinco no se toca. */
.finance-stat-row--six { grid-template-columns: repeat(6, minmax(0, 1fr)); }
.finance-stat-row--seven { grid-template-columns: repeat(7, minmax(0, 1fr)); }
/* G.10I.1 — ocho tarjetas: entra «Condonadas». Mismo criterio que el
   bloque de seis: la rejilla se amplía en vez de dejar huérfana la
   última. Las de cinco, seis y siete no se tocan. */
.finance-stat-row--eight { grid-template-columns: repeat(8, minmax(0, 1fr)); }
.finance-payment-table--ledger { min-width: 1580px; }
.finance-transactions-table { min-width: 1480px; }
.finance-ledger-table { min-width: 920px; }
.finance-actions-inline {
  display: flex;
  gap: var(--space-2xs);
  align-items: center;
  flex-wrap: wrap;
}
.finance-payment-summary { margin-bottom: var(--space-sm); }
.finance-payment-balance-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-xs);
  margin-top: var(--space-sm);
}
.finance-payment-balance-grid > span {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  padding: var(--space-xs);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
}
.finance-payment-balance-grid small {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}
.finance-payment-balance-grid strong { font-size: var(--font-size-md); }
.finance-modal-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-sm);
}
.finance-receipt-success {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: var(--space-2xs);
  padding: var(--space-sm) 0 var(--space-md);
}
.finance-receipt-success svg {
  width: 42px;
  height: 42px;
  color: var(--color-success);
}
.finance-receipt-success p { margin: 0; }
.finance-receipt-folio {
  font-size: clamp(1.25rem, 3vw, 1.75rem);
  font-weight: var(--font-weight-bold);
  letter-spacing: 0.03em;
  color: var(--color-text);
}
.finance-transactions-intro { margin-top: 0; max-width: 900px; }
.finance-transactions-note { margin: var(--space-xs) 0 0; max-width: 900px; }
.finance-transactions-filter {
  align-items: flex-end;
  gap: var(--space-xs);
}
.finance-transactions-filter .field { margin-bottom: 0; min-width: 150px; }
.finance-transactions-search { flex: 1 1 260px; }
.finance-stat-money { font-size: clamp(1.05rem, 2vw, 1.45rem); }
.finance-row--voided td {
  background: color-mix(in srgb, var(--color-danger-bg) 35%, var(--color-surface));
  color: var(--color-text-muted);
}
.finance-row--voided:hover td { background: var(--color-danger-bg); }

/* ---------------------------------------------------------------------
   CAMPUS-REAL 1.0B.2M.1 — G.10C.1 histórico financiero unificado
   --------------------------------------------------------------------- */
.finance-transactions-table { min-width: 1660px; }
.finance-row--legacy td {
  background: color-mix(in srgb, var(--color-surface-alt) 65%, var(--color-surface));
}
.finance-row--legacy:hover td { background: var(--color-surface-alt); }
.finance-legacy-detail {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
  padding: var(--space-sm);
}
.finance-legacy-detail__head {
  display: flex;
  align-items: center;
  gap: var(--space-2xs);
  margin-bottom: var(--space-xs);
}
.finance-legacy-detail__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-xs);
  margin: 0;
}
.finance-legacy-detail__grid > div {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  min-width: 0;
}
.finance-legacy-detail__grid dt {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}
.finance-legacy-detail__grid dd {
  margin: 0;
  font-weight: var(--font-weight-semibold);
  overflow-wrap: anywhere;
}

/* ---------------------------------------------------------------------
   CAMPUS-REAL 1.0B.2M.2 — G.10C.2 consistencia de históricos con ficha
   financiera incompleta. El estado de pago y el estado de la ficha son
   dos conceptos distintos y se muestran como tales.
   --------------------------------------------------------------------- */
.finance-ledger-states {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-xs);
  margin: var(--space-sm) 0 0;
}
.finance-ledger-states > div {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  min-width: 0;
}
.finance-ledger-states dt {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}
.finance-ledger-states dd { margin: 0; }
.finance-inline-note--review {
  color: var(--color-warning);
  font-weight: var(--font-weight-semibold);
}
.finance-row--profile-review td {
  background: color-mix(in srgb, var(--color-warning-bg) 35%, var(--color-surface));
}
.finance-row--profile-review:hover td { background: var(--color-warning-bg); }

/* ---------------------------------------------------------------------
   CAMPUS-REAL 1.0B.2M.4 — G.10C.3 beca por periodo
   --------------------------------------------------------------------- */
.finance-scholarship-panel {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
  padding: var(--space-sm);
  margin-bottom: var(--space-sm);
}
.finance-scholarship-toggle {
  display: flex;
  align-items: center;
  gap: var(--space-2xs);
  font-weight: var(--font-weight-semibold);
  cursor: pointer;
}
.finance-scholarship-toggle input[disabled] { cursor: not-allowed; }
.finance-scholarship-toggle input[disabled] + span { color: var(--color-text-muted); }
.finance-scholarship-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-xs);
  margin: var(--space-xs) 0 0;
}
.finance-scholarship-grid > div {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  min-width: 0;
}
.finance-scholarship-grid dt {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}
.finance-scholarship-grid dd {
  margin: 0;
  overflow-wrap: anywhere;
}
#correct-student-resolved { display: block; margin-bottom: var(--space-2xs); max-width: none; }
#correct-student-lookup { margin-bottom: var(--space-sm); }

/* ---------------------------------------------------------------------
   CAMPUS-REAL 1.0B.2M.7 — G.10D.3 parcialidades y atribución de pagos.
   Reutiliza el lenguaje visual existente (card, tag, data-table,
   alert): no introduce una segunda arquitectura de estilos.
   --------------------------------------------------------------------- */
.finance-payment-table--ledger { min-width: 1720px; }
.finance-schedule-table { min-width: 1080px; }
.finance-unallocated-table { min-width: 1120px; }
.finance-allocation-table { min-width: 820px; }
.finance-schedule-editor-table { min-width: 720px; }

.finance-plan-cell {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  align-items: flex-start;
}

.finance-schedule-detail__nav { display: flex; }
.finance-schedule-detail__nav .btn {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
}
.finance-schedule-detail__nav svg { width: 18px; height: 18px; }

.finance-schedule-summary {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: var(--space-xs);
}
.finance-schedule-summary > span {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  padding: var(--space-xs);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
  min-width: 0;
}
.finance-schedule-summary small { color: var(--color-text-muted); font-size: var(--font-size-xs); }
.finance-schedule-summary strong { font-size: var(--font-size-md); overflow-wrap: anywhere; }

.finance-schedule-warnings ul { margin: var(--space-2xs) 0 0; padding-left: 1.1rem; }
.finance-schedule-warnings li { margin-bottom: 0.2rem; }
.finance-schedule-warnings p { margin: var(--space-2xs) 0 0; }

.finance-allocation-chip {
  display: inline-flex;
  align-items: center;
  margin: 0 0.25rem 0.25rem 0;
  padding: 0.2rem 0.5rem;
  border-radius: 999px;
  background: var(--color-info-bg);
  color: var(--color-primary-deep);
  font-size: var(--font-size-xs);
  font-weight: var(--font-weight-semibold);
}

.finance-allocation-heading {
  margin: var(--space-md) 0 var(--space-2xs);
  font-size: var(--font-size-sm);
  color: var(--color-primary-deep);
}
.finance-allocation-splitter { display: grid; gap: var(--space-xs); }
.finance-allocation-input { width: 100%; min-width: 110px; text-align: right; }
.finance-allocation-totals {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-xs);
}
.finance-allocation-totals > span {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  padding: var(--space-xs);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
  min-width: 0;
}
.finance-allocation-totals small { color: var(--color-text-muted); font-size: var(--font-size-xs); }
.finance-allocation-totals strong { font-size: var(--font-size-md); }
.finance-allocation-totals .is-balanced {
  border-color: var(--color-success);
  background: var(--color-success-bg);
}
.finance-allocation-totals .is-pending {
  border-color: var(--color-warning);
  background: var(--color-warning-bg);
}

.finance-allocation-history { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--space-xs); }
.finance-allocation-history__item {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
  padding: var(--space-xs);
}
.finance-allocation-history__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-xs);
  flex-wrap: wrap;
}
.finance-allocation-history__grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-xs);
  margin: var(--space-2xs) 0 0;
}
.finance-allocation-history__grid > div { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }
.finance-allocation-history__grid dt { color: var(--color-text-muted); font-size: var(--font-size-xs); }
.finance-allocation-history__grid dd { margin: 0; overflow-wrap: anywhere; }

.finance-schedule-editor-tools { align-items: flex-end; gap: var(--space-sm); }
.field--inline { margin-bottom: 0; }
.finance-schedule-editor-table input { width: 100%; min-width: 120px; }

/* ---------------------------------------------------------------------
   CAMPUS-REAL 1.0B.2M.9 — G.10F reportes financieros / corte de cobranza
   --------------------------------------------------------------------- */
.finance-report-table { min-width: 1180px; }
.finance-report-filter { align-items: flex-end; gap: var(--space-xs); }
.finance-report-filter .field { margin-bottom: 0; min-width: 150px; }
.finance-report-perspectives {
  display: flex;
  gap: var(--space-2xs);
  flex-wrap: wrap;
  padding-bottom: var(--space-2xs);
}
.finance-report-presets {
  display: flex;
  gap: var(--space-2xs);
  flex-wrap: wrap;
}
/* G.10J.1 — LA CIFRA QUE EL COLEGIO VENÍA SUMANDO A MANO.
   Mismo lenguaje visual que el bloque destacado del PDF: fondo
   suave, etiqueta pequeña en versalitas y el importe en grande. */
.finance-pending-total {
  display: flex;
  flex-direction: column;
  gap: var(--space-1, 4px);
  padding: var(--space-4, 16px);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md, 8px);
  background: var(--color-surface-muted);
}
.finance-pending-total__label {
  font-size: var(--font-size-xs, 12px);
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.finance-pending-total__value {
  font-size: var(--font-size-2xl, 28px);
  line-height: 1.1;
  color: var(--color-primary-deep);
}

.finance-report-summary {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--space-xs);
}
.finance-report-summary > span {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  padding: var(--space-xs);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
  min-width: 0;
}
.finance-report-summary small { color: var(--color-text-muted); font-size: var(--font-size-xs); }
.finance-report-summary strong { font-size: var(--font-size-md); overflow-wrap: anywhere; }
.finance-report-summary > span:first-child {
  border-color: var(--color-primary-deep);
  background: var(--color-info-bg);
}
.finance-report-summary > span:first-child strong { color: var(--color-primary-deep); }

@media (max-width: 1100px) {
  .finance-stat-row--five { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  /* Seis en dos filas de tres: se parte por la mitad, sin huérfanas. */
  .finance-stat-row--six { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .finance-stat-row--seven { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  /* Ocho en dos filas de cuatro: se parte por la mitad, sin huérfanas. */
  .finance-stat-row--eight { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .finance-schedule-summary { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .finance-report-summary { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (max-width: 899px) {
  .finance-stat-row--five { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .finance-stat-row--six { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .finance-stat-row--seven { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .finance-stat-row--eight { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .finance-report-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .finance-report-filter .field { min-width: min(100%, 180px); }
  .finance-transactions-filter .field { min-width: min(100%, 180px); }
  .finance-schedule-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .finance-allocation-history__grid { grid-template-columns: minmax(0, 1fr); }
}

@media (max-width: 640px) {
  .finance-stat-row--five { grid-template-columns: minmax(0, 1fr); }
  .finance-stat-row--six { grid-template-columns: minmax(0, 1fr); }
  .finance-stat-row--seven { grid-template-columns: minmax(0, 1fr); }
  /* G.10I.1.1.1 — la rejilla de ocho se quedo sin su regla de movil:
     a 640px heredaba las dos columnas del bloque de 899px y dejaba
     cuatro filas de tarjetas demasiado estrechas. Una sola columna,
     igual que sus tres hermanas. */
  .finance-stat-row--eight { grid-template-columns: minmax(0, 1fr); }
  .finance-payment-table--ledger,
  .finance-transactions-table,
  .finance-ledger-table,
  .finance-schedule-table,
  .finance-unallocated-table,
  .finance-allocation-table,
  .finance-schedule-editor-table,
  .finance-report-table { min-width: 0; }
  .finance-payment-balance-grid,
  .finance-modal-grid,
  .finance-schedule-summary,
  .finance-allocation-totals,
  .finance-report-summary { grid-template-columns: minmax(0, 1fr); }
  .finance-report-filter { align-items: stretch; }
  .finance-report-filter .field { width: 100%; min-width: 0; }
  .finance-report-presets .btn,
  .finance-report-perspectives .btn { flex: 1 1 auto; justify-content: center; }
  .finance-schedule-editor-tools { align-items: stretch; flex-direction: column; }
  .finance-schedule-editor-tools .btn { width: 100%; justify-content: center; }
  .finance-allocation-input { text-align: left; }
  .finance-actions-inline { justify-content: flex-end; }
  .finance-transactions-filter { align-items: stretch; }
  .finance-transactions-filter .field,
  .finance-transactions-search { width: 100%; min-width: 0; }
  .finance-row--voided { border-color: var(--color-danger-border-strong) !important; background: var(--color-danger-bg); }
  .finance-row--voided td { background: transparent; }
  .finance-row--legacy { background: var(--color-surface-alt); }
  .finance-row--legacy td { background: transparent; }
  .finance-row--profile-review { background: var(--color-warning-bg); }
  .finance-row--profile-review td { background: transparent; }
  .finance-legacy-detail__grid,
  .finance-scholarship-grid,
  .finance-ledger-states { grid-template-columns: minmax(0, 1fr); }
}

/* =====================================================================
   CAMPUS-REAL 1.0B.2N.0 — H.1 alta manual de alumno.
   Reutiliza el lenguaje visual existente (field, tag, alert, btn):
   no introduce una segunda arquitectura de estilos.
   ===================================================================== */
.manual-student-section {
  padding: var(--space-sm) 0;
  border-top: 1px solid var(--color-border);
}
.manual-student-section:first-of-type { border-top: 0; padding-top: 0; }
.manual-student-section h4 {
  margin: 0 0 var(--space-xs);
  font-size: var(--font-size-sm);
  color: var(--color-primary-deep);
}
.manual-student-section > p { margin: var(--space-2xs) 0 0; }
.manual-student-grid { gap: var(--space-sm); }

.manual-student-candidates {
  list-style: none;
  margin: var(--space-xs) 0 0;
  padding: 0;
  display: grid;
  gap: var(--space-2xs);
}
.manual-student-candidate {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-xs);
  padding: var(--space-xs);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
}
.manual-student-candidate__pick {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2xs);
  cursor: pointer;
  min-width: 0;
}

.manual-student-confirm {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2xs);
  padding: var(--space-2xs) 0;
  cursor: pointer;
}

.manual-student-summary {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-xs);
  margin: 0;
}
.manual-student-summary > div {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  min-width: 0;
}
.manual-student-summary dt {
  color: var(--color-text-muted);
  font-size: var(--font-size-xs);
}
.manual-student-summary dd {
  margin: 0;
  font-weight: var(--font-weight-semibold);
  overflow-wrap: anywhere;
}

@media (max-width: 899px) {
  .manual-student-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
  .manual-student-summary { grid-template-columns: minmax(0, 1fr); }
  .manual-student-grid { grid-template-columns: minmax(0, 1fr); }
  .manual-student-candidate { align-items: flex-start; flex-direction: column; }
}

/* =====================================================================
   G.10H.1.1 — LA ADVERTENCIA DE ANTICIPO, EN VERTICAL.

   POR QUÉ SE VEÍA MAL
   -------------------
   `.alert` es un contenedor FLEX EN FILA:

       .alert { display: flex; gap: …; align-items: flex-start; }

   Eso es inofensivo para las demás alertas de Campus, que llevan un solo
   bloque de texto y por tanto un solo elemento flexible. La advertencia
   de anticipo lleva cinco —titular, explicación, subtítulo, destino y
   checkbox—, así que cada uno se convertía en una COLUMNA estrecha y el
   texto acababa casi vertical.

   Se corrige con un modificador PROPIO. `.alert` no se toca: cambiarla
   afectaría a todas las alertas de la aplicación.
   ===================================================================== */

.finance-advance-guard {
  flex-direction: column;
  align-items: stretch;
  gap: var(--space-2xs);
  /* Sin esto, un nombre de periodo largo puede desbordar en móvil. */
  min-width: 0;
}

/* Cada bloque ocupa el ancho disponible y envuelve con naturalidad. */
.finance-advance-guard > * {
  min-width: 0;
  margin: 0;
  overflow-wrap: anywhere;
}

.finance-advance-guard__title {
  font-size: var(--font-size-base);
  font-weight: var(--font-weight-semibold);
}

.finance-advance-guard__lead {
  line-height: 1.5;
}

.finance-advance-guard__label {
  margin-top: var(--space-2xs);
  font-size: var(--font-size-xs);
  text-transform: uppercase;
  letter-spacing: 0.03em;
  opacity: 0.85;
}

.finance-advance-guard__target {
  font-size: var(--font-size-md);
  font-weight: var(--font-weight-semibold);
  line-height: 1.4;
}

/* El reconocimiento: una sola fila clicable de ancho completo.
   `.checkbox-row` ya da la disposición horizontal correcta; aquí sólo se
   añaden el área táctil y la separación del bloque anterior. */
.finance-advance-guard__ack {
  margin-top: var(--space-xs);
  padding: var(--space-2xs) 0;
  cursor: pointer;
  align-items: center;
}

.finance-advance-guard__ack input[type="checkbox"] {
  /* 20px reales y sin encogerse cuando el texto envuelve. */
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  min-height: 20px;
  margin: 0;
  cursor: pointer;
}

.finance-advance-guard__ack span {
  /* El texto envuelve a la derecha del checkbox, nunca en columnas. */
  flex: 1 1 auto;
  min-width: 0;
  line-height: 1.45;
}

/* En pantallas estrechas el checkbox se alinea con la primera línea del
   texto, que a esa anchura ocupa ya varias. */
@media (max-width: 480px) {
  .finance-advance-guard__ack { align-items: flex-start; }
  .finance-advance-guard__ack input[type="checkbox"] { margin-top: 0.15rem; }
}

/* =====================================================================
   G.10H.2 — DATOS FISCALES.

   Dos tarjetas: la del portal familiar (móvil primero) y la de la vista
   administrativa. Ambas apilan en vertical y ninguna toca `.alert` ni
   ningún selector global — la lección de G.10H.1.1.
   ===================================================================== */

.family-fiscal { display: flex; flex-direction: column; gap: var(--space-sm); }
.family-fiscal > * { min-width: 0; }

.family-fiscal__title { margin: 0; font-size: var(--font-size-lg); }
.family-fiscal__lead { margin: 0; color: var(--color-text-secondary); font-size: var(--font-size-sm); line-height: 1.5; }

.family-fiscal__choice {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: var(--space-xs) var(--space-sm);
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
}
.family-fiscal__choice legend {
  font-weight: var(--font-weight-semibold);
  font-size: var(--font-size-sm);
  padding: 0 var(--space-2xs);
}
/* Cada opción es una fila clicable con área táctil cómoda. */
.family-fiscal__option { align-items: center; padding: var(--space-2xs) 0; cursor: pointer; }
.family-fiscal__option input[type="radio"] { flex: 0 0 auto; width: 20px; height: 20px; margin: 0; cursor: pointer; }
.family-fiscal__option span { flex: 1 1 auto; min-width: 0; }

.family-fiscal__panel { display: flex; flex-direction: column; gap: var(--space-sm); }
.family-fiscal__panel .field { margin-bottom: 0; }

.family-fiscal__confirm { align-items: flex-start; padding: var(--space-2xs) 0; cursor: pointer; }
.family-fiscal__confirm input[type="checkbox"] { flex: 0 0 auto; width: 20px; height: 20px; min-height: 20px; margin-top: 0.15rem; cursor: pointer; }
.family-fiscal__confirm span { flex: 1 1 auto; min-width: 0; line-height: 1.45; }

.family-fiscal__status:not(:empty) { color: var(--color-text-secondary); }

/* ---- Vista administrativa ---- */
.student-doc-fiscal-card { margin-bottom: var(--space-sm); }
.student-doc-fiscal-grid {
  margin: 0;
  display: grid;
  gap: var(--space-xs);
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
.student-doc-fiscal-grid > div { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }
.student-doc-fiscal-grid dt { color: var(--color-text-muted); font-size: var(--font-size-xs); }
.student-doc-fiscal-grid dd { margin: 0; overflow-wrap: anywhere; }

.student-doc-fiscal-choice {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: var(--space-xs) var(--space-sm);
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-sm);
}
.student-doc-fiscal-choice legend { font-weight: var(--font-weight-semibold); font-size: var(--font-size-sm); padding: 0 var(--space-2xs); }

/* =====================================================================
   G.10H.6B.1.2 — Modal «Dar de baja definitivamente».

   Este modal NO carecía de diseño: estaba escrito contra un vocabulario
   que no existe en este árbol (.form-field, .checkbox, .table,
   .table--compact, .table-scroll, .text-right, .text-danger — cero
   reglas cada uno), así que sus controles caían al estilo nativo del
   navegador. La mayor parte del arreglo vive en el marcado, que ahora
   usa .field, .checkbox-row, .data-table y .btn--* como el resto del
   Campus.

   Aquí queda sólo lo que el sistema no tenía todavía: el ancho de un
   diálogo con formulario + dos tablas, la tarjeta de contexto del
   alumno, la fila de decisión y los encabezados de la vista de impacto.
   Ni un color nuevo: todo sale de tokens.css.

   TODO va bajo .withdrawal-flow o .modal--wide. Ningún selector de este
   bloque alcanza inputs, selects o textareas de otros módulos.
   ===================================================================== */

/* Único modificador de .modal del proyecto. Opcional: sin él, los otros
   52 usos de openModal() rinden exactamente `class="modal"`. */
.modal--wide { width: min(780px, 100%); }

/* .stack ya separa los bloques; .field traía además su propio margen
   inferior y los sumaba. Mismo ajuste que .family-fiscal__panel .field. */
.withdrawal-flow .field { margin-bottom: 0; }

/* ---- Contexto del alumno ---- */
.withdrawal-flow__student {
  background: var(--color-surface-alt);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: var(--space-xs) var(--space-sm);
}
.withdrawal-flow__student-name {
  margin: 0;
  font-size: var(--font-size-md);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text);
  line-height: var(--line-height-tight);
  overflow-wrap: anywhere;
}
.withdrawal-flow__student-meta {
  margin: 0.2rem 0 0;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
}

/* ---- Fila de decisión «No debe ningún periodo» ----
   Mismo patrón que .family-fiscal__confirm: toda la fila es el <label>,
   así que el área clicable es la tarjeta entera. */
.withdrawal-flow__choice {
  align-items: flex-start;
  gap: var(--space-2xs);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface-alt);
  padding: var(--space-xs) var(--space-sm);
  min-height: 44px;
  cursor: pointer;
  font-size: var(--font-size-base);
  transition: border-color var(--transition-base);
}
.withdrawal-flow__choice:hover { border-color: var(--color-border-strong); }
.withdrawal-flow__choice:focus-within { border-color: var(--color-primary); }
.withdrawal-flow__choice input[type="checkbox"] {
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  min-height: 20px;
  margin-top: 0.15rem;
  cursor: pointer;
  accent-color: var(--color-primary);
}
.withdrawal-flow__choice span { flex: 1 1 auto; min-width: 0; line-height: 1.45; }

/* ---- Controles ----
   El anillo de foco se AÑADE al outline del navegador; no lo sustituye.
   Quitar el outline sin equivalente sería una regresión de teclado. */
.withdrawal-flow .field input:focus-visible,
.withdrawal-flow .field select:focus-visible,
.withdrawal-flow .field textarea:focus-visible {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 3px var(--color-primary-soft);
}
.withdrawal-flow .field input:hover:not(:disabled),
.withdrawal-flow .field select:hover:not(:disabled),
.withdrawal-flow .field textarea:hover:not(:disabled) {
  border-color: var(--color-border-strong);
}

/* El detalle es un campo de redacción, no una línea. */
.withdrawal-flow .field textarea { min-height: 112px; resize: vertical; }

/* El calendario nativo, alineado y con el cursor correcto. */
.withdrawal-flow .field input[type="date"] { cursor: pointer; }
.withdrawal-flow .field input[type="date"]::-webkit-calendar-picker-indicator {
  cursor: pointer;
  opacity: 0.65;
}
.withdrawal-flow .field input[type="date"]:hover::-webkit-calendar-picker-indicator { opacity: 1; }

/* Cuando «No debe ningún periodo» está marcado, el selector debe LEERSE
   inactivo. Sólo refleja el estado que ya maneja el flujo: aquí no hay
   una segunda lógica, ni este bloque decide nada. */
.withdrawal-flow .field select:disabled,
.withdrawal-flow .field input:disabled,
.withdrawal-flow .field textarea:disabled {
  background: var(--color-surface-muted);
  color: var(--color-text-muted);
  cursor: not-allowed;
  opacity: 1; /* el gris ya comunica; bajar alfa sólo lo haría ilegible */
}
.withdrawal-flow .field:has(select:disabled) label { color: var(--color-text-muted); }

/* ---- Vista de impacto ----
   Segunda pantalla del mismo flujo: mismo contenedor, misma jerarquía,
   mismas tablas. */
.withdrawal-flow__impact {
  display: flex;
  flex-direction: column;
  gap: var(--space-xs);
  border-top: 1px solid var(--color-border);
  padding-top: var(--space-sm);
}
.withdrawal-flow__section-title {
  margin: 0;
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text);
}
.withdrawal-flow__value { white-space: nowrap; }
.withdrawal-flow__note--warn { color: var(--color-warning); }

/* ---- Responsive ---- */
@media (max-width: 767px) {
  /* .data-table trae min-width: 560px para el modo tabla. En modo
     tarjeta ese mínimo sobra y forzaría scroll dentro del diálogo. Se
     neutraliza SÓLO aquí. */
  .withdrawal-flow .data-table { min-width: 0; }
  .withdrawal-flow__value { white-space: normal; }
}

@media (max-width: 560px) {
  .modal--wide .modal__body { padding: var(--space-sm); }
  .modal--wide .modal__header,
  .modal--wide .modal__footer { padding: var(--space-sm); }
  /* column-reverse conserva el orden del DOM —Cancelar, Ver impacto— y
     deja arriba la acción principal, que es la de mayor jerarquía. */
  .modal--wide .modal__footer { flex-direction: column-reverse; }
  .modal--wide .modal__footer .btn { width: 100%; }
}

/* ---------------------------------------------------------------------
   HOTFIX G10F — selector de nivel académico del corte de cobranza.

   Casillas y no un <select multiple>: el select múltiple obliga a
   Ctrl/Cmd para añadir un nivel, no se puede usar con el pulgar y en
   móvil abre una lista que oculta el resto del filtro. Aquí cada opción
   es un objetivo táctil con su etiqueta, tabulable, y el estado se lee
   sin abrir nada.

   Acotado a este componente: no toca Finanzas ni otras pestañas.
--------------------------------------------------------------------- */
.level-scope {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: var(--space-sm) var(--space-md) var(--space-md);
  margin: 0;
}
.level-scope__legend {
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-muted);
  padding: 0 var(--space-2xs);
}
.level-scope__hint { margin: 0 0 var(--space-xs); }
.level-scope__options {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2xs) var(--space-sm);
}
.level-scope__option {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2xs);
  /* Objetivo táctil: la etiqueta entera, no sólo el cuadrito. */
  min-height: 44px;
  padding: 0 var(--space-2xs);
  cursor: pointer;
  user-select: none;
}
.level-scope__option input { width: 18px; height: 18px; cursor: pointer; }
.level-scope__option:focus-within {
  outline: 2px solid var(--focus-ring);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}
.level-scope__all { margin-top: var(--space-xs); }
.finance-report-scope { padding-top: 0; padding-bottom: 0; }

@media (max-width: 720px) {
  /* Una opción por línea: en pantallas estrechas dos columnas dejan
     etiquetas partidas y objetivos táctiles pegados. */
  .level-scope__options { flex-direction: column; gap: 0; }
  .level-scope__option { width: 100%; }
  .level-scope__all { width: 100%; }
}

/* ONC-2 · Lista de datos (dt/dd en pares). Se usaba sin estilos y el navegador
   aplicaba la sangría por defecto de <dd>. */
.summary-list { margin: 0; display: grid; gap: var(--space-2xs); }
.summary-list > div { display: grid; grid-template-columns: minmax(8rem, 40%) 1fr; gap: var(--space-xs); padding-block: 0.35rem; border-bottom: 1px solid var(--color-border); }
.summary-list > div:last-child { border-bottom: 0; }
.summary-list dt { font-size: var(--font-size-sm); color: var(--color-text-secondary); }
.summary-list dd { margin: 0; font-weight: var(--font-weight-medium); color: var(--color-text); }
