/* Panel operativo — paleta y componentes definidos en PROMPT_DISENO_PWA_PANEL_OPERATIVO.md */
:root {
  --verde-principal: #0C3527;
  --verde-secundario: #1F6B4E;
  --verde-suave: #DFF3EA;
  --menta-pastel: #EAF8F1;
  --crema-clara: #FFF8EA;
  --celeste-suave: #EAF3FF;
  --lavanda-suave: #F1ECFF;
  --rosa-suave: #FFEDEF;
  --amarillo-suave: #FFF4CC;
  --gris-texto: #26312D;
  --gris-secundario: #6B7772;
  --fondo-general: #F6F8F5;
  --blanco-panel: #FFFFFF;
  --color-error: #D64545;
  --color-exito: #2E9D62;
  --color-advertencia: #D99A18;
  --color-info: #2978B5;
  --color-naranja: #C2570C;
  --naranja-suave: #FFE7D2;
  --naranja-borde: rgba(194, 87, 12, .3);
  --escala-fuente: 1;
  --densidad: 1;

  /* --- Pares semánticos color + fondo suave + borde (Fase 1 rediseño) ---
     Reusan los mismos hex de arriba, solo les suman una variante de fondo
     pastel y un borde tenue para badges/chips/callouts. */
  --exito-suave: var(--verde-suave);
  --exito-borde: rgba(46, 157, 98, .28);
  --advertencia-suave: var(--amarillo-suave);
  --advertencia-borde: rgba(217, 154, 24, .3);
  --peligro: var(--color-error);
  --peligro-suave: var(--rosa-suave);
  --peligro-borde: rgba(214, 69, 69, .28);
  --info-suave: var(--celeste-suave);
  --info-borde: rgba(41, 120, 181, .28);

  --radio-tarjeta: 1.5rem;
  --radio-pastilla: 9999px;
  --sombra-tarjeta: 0 1px 2px rgba(12, 53, 39, .04), 0 8px 24px -18px rgba(12, 53, 39, .22);
}

/* --- Preferencias visuales (pantalla "Preferencias", apps/operativo/views.preferencias) ---
   Todo vive en atributos data-* sobre <html>, leídos de localStorage en base.html antes
   del primer render. No hay persistencia en el servidor a propósito: es una preferencia
   de dispositivo/navegador, tal como lo pide PROMPT_DISENO_PWA_PANEL_OPERATIVO.md. */
html[data-tipografia="chico"] { --escala-fuente: 0.9; }
html[data-tipografia="grande"] { --escala-fuente: 1.15; }
html[data-tipografia="muy-grande"] { --escala-fuente: 1.3; }

html[data-densidad="compacta"] { --densidad: 0.65; }

html[data-tema="menta"] { --verde-principal: #1F6B4E; --verde-secundario: #2E9D62; }
html[data-tema="azul"] { --verde-principal: #0B3D66; --verde-secundario: #2978B5; }
html[data-tema="lavanda"] { --verde-principal: #4B3B87; --verde-secundario: #7C5FD1; }
html[data-tema="arena"] { --verde-principal: #6B4F2A; --verde-secundario: #A97C42; }

html[data-modo="alto-contraste"] { --gris-texto: #000000; --gris-secundario: #333333; }
html[data-modo="alto-contraste"] .card-custom,
html[data-modo="alto-contraste"] .btn-modulo,
html[data-modo="alto-contraste"] .auth-card,
html[data-modo="alto-contraste"] .card-familia {
  border-width: 2px;
  border-color: #000;
}

body {
  font-family: Inter, ui-sans-serif, system-ui, sans-serif;
  background: var(--fondo-general);
  color: var(--gris-texto);
  font-size: calc(1rem * var(--escala-fuente));
}

/* --- Sin flechitas de subir/bajar en campos numéricos (importes, cantidades):
   se prestan a cambiar el valor por accidente con un clic o con el scroll del
   mouse. El campo sigue siendo type="number" (teclado numérico en celular,
   valida que sea un número), solo se le saca el widget nativo. --- */
input[type="number"] { -moz-appearance: textfield; }
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

a { text-decoration: none; color: inherit; }

/* --- Tipografía de títulos (Fase 1 rediseño): Plus Jakarta Sans para
   encabezados, Inter para texto. Todo multiplica por --escala-fuente para
   respetar la preferencia de tamaño de fuente del usuario. --- */
h1, h2, h3, h4,
.card-custom h2, .card-custom h3,
.pagina-titulo, .seccion-titulo, .stat-numero {
  font-family: "Plus Jakarta Sans", Inter, ui-sans-serif, system-ui, sans-serif;
  letter-spacing: -0.015em;
}

.pagina-titulo {
  font-size: calc(1.5rem * var(--escala-fuente));
  font-weight: 800;
  color: var(--verde-principal);
  margin-bottom: .25rem;
}
.seccion-titulo {
  font-size: calc(1.125rem * var(--escala-fuente));
  font-weight: 700;
  color: var(--verde-principal);
  margin-bottom: .5rem;
}
.stat-numero {
  font-size: calc(1.875rem * var(--escala-fuente));
  font-weight: 800;
  line-height: 1.1;
}
.etiqueta-micro {
  font-size: calc(.75rem * var(--escala-fuente));
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--gris-secundario);
}

/* --- Shell de la app: topbar + contenido + nav inferior --- */
.app-shell { padding-bottom: 5.5rem; min-height: 100vh; }

.app-topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  padding: .9rem 1.1rem;
  background: var(--verde-principal);
  color: white;
  position: sticky;
  top: 0;
  z-index: 20;
}
.app-topbar__marca { display: flex; align-items: center; gap: .6rem; min-width: 0; }
.app-topbar__marca strong { display: block; font-size: .95rem; }
.app-topbar__marca small { display: block; color: #cfe7dc; font-size: .75rem; }
.app-topbar__logo {
  width: 2.6rem; height: 2.6rem; border-radius: .65rem;
  background: #fff; padding: .3rem; object-fit: contain;
  flex-shrink: 0; box-shadow: 0 1px 3px rgba(0,0,0,.15);
}
.app-topbar__acciones { display: flex; align-items: center; gap: .5rem; flex-shrink: 0; }
/* Botón-ícono circular del header (hoy solo notificaciones). SVG en vez de
   emoji: el emoji de campana se renderiza distinto según el teléfono (en
   algunos Android/Samsung aparece con un fondo propio tipo "sticker"), un
   trazo con currentColor se ve igual en todos lados. */
.app-topbar__boton-icono {
  position: relative; display: flex; align-items: center; justify-content: center;
  width: 2.3rem; height: 2.3rem; border-radius: 50%; flex-shrink: 0;
  background: rgba(255,255,255,.14); border: 0; color: white;
  cursor: pointer; line-height: 1;
}
.app-topbar__boton-icono:hover { background: rgba(255,255,255,.22); }
.app-topbar__icono-svg { display: block; }
.app-topbar__punto {
  position: absolute; top: .3rem; right: .35rem;
  width: .55rem; height: .55rem; border-radius: 50%;
  background: var(--peligro); border: 2px solid var(--verde-principal);
}

.app-layout { display: block; }
.app-contenido { max-width: 720px; margin: 0 auto; padding: 1.5rem 1rem 2rem; min-width: 0; }
.app-mensajes { margin-bottom: .75rem; }

/* --- Navegación: mismo link (_nav_link.html) en dos contenedores distintos.
   .bottom-nav lo muestra en fila fija abajo (mobile/tablet); .side-nav lo
   muestra en columna fija a la izquierda (desktop, ver media query). --- */
.nav-link {
  display: flex; align-items: center; color: var(--gris-secundario); border-radius: .7rem;
}
.nav-link.active { color: var(--verde-principal); font-weight: 600; background: var(--menta-pastel); }

.bottom-nav {
  position: fixed; left: 0; right: 0; bottom: 0;
  display: flex; justify-content: space-around;
  background: var(--blanco-panel);
  border-top: 1px solid #e3e9e4;
  padding: .4rem 0 calc(.4rem + env(safe-area-inset-bottom));
  z-index: 30;
}
.bottom-nav .nav-link { flex-direction: column; gap: .1rem; font-size: .7rem; padding: .3rem .6rem; }
.bottom-nav .nav-link__icono { font-size: 1.2rem; line-height: 1; }

.side-nav { display: none; }

@media (min-width: 992px) {
  .bottom-nav { display: none; }
  .app-shell { padding-bottom: 0; }

  .app-layout {
    display: flex; align-items: flex-start; gap: 2rem;
    max-width: 1100px; margin: 0 auto; padding: 0 1.5rem;
  }
  .app-contenido { max-width: none; margin: 0; padding: 2.25rem 0 2.5rem; flex: 1; }

  .side-nav {
    display: flex; flex-direction: column; gap: .3rem;
    position: sticky; top: 5rem; align-self: flex-start;
    width: 14rem; flex-shrink: 0; padding-top: 1.75rem;
  }
  .side-nav .nav-link { gap: .8rem; padding: .75rem 1rem; font-size: .95rem; font-weight: 600; }
  .side-nav .nav-link__icono { font-size: 1.3rem; }
}

/* --- Pantallas de autenticación / selección de perfil --- */
.auth-shell {
  min-height: 100vh; display: flex; align-items: center; justify-content: center;
  background: linear-gradient(160deg, var(--verde-principal), var(--verde-secundario));
  padding: 1.5rem;
}
.auth-card {
  background: var(--blanco-panel); border-radius: 1.25rem; padding: 2rem 1.75rem;
  width: 100%; max-width: 400px; box-shadow: 0 20px 45px rgba(12,53,39,.25);
  text-align: center;
}
.auth-card--ancha { max-width: 460px; }
.auth-card__logo { display: block; width: 5rem; height: 5rem; object-fit: contain; margin: 0 auto 1rem; }
.auth-card__marca { font-weight: 700; color: var(--verde-principal); font-size: 1.4rem; margin-bottom: .25rem; }
.auth-card__frase { color: var(--gris-secundario); margin-bottom: 1.75rem; }
.btn-google {
  display: flex; align-items: center; justify-content: center; gap: .6rem;
  width: 100%; padding: .75rem 1rem; border-radius: .75rem;
  background: white; border: 1px solid #d6dcd8; color: var(--gris-texto);
  font-weight: 600; font-size: .95rem;
}
.btn-google:hover { background: var(--menta-pastel); }
.auth-divider {
  display: flex; align-items: center; gap: .75rem;
  color: var(--gris-secundario); font-size: .8rem; margin: 1.25rem 0;
}
.auth-divider::before, .auth-divider::after { content: ""; flex: 1; height: 1px; background: #e3e9e4; }
.auth-volver {
  display: inline-block; margin-top: 1.5rem; font-size: .85rem;
  color: var(--gris-secundario); text-decoration: underline;
}
.auth-volver:hover { color: var(--verde-principal); }

/* --- Botones grandes de módulo (home) --- */
.modulo-grid { display: grid; gap: .9rem; }
.btn-modulo {
  display: flex; align-items: center; gap: 1rem;
  background: var(--blanco-panel); border-radius: var(--radio-tarjeta);
  padding: calc(1.25rem * var(--densidad)) calc(1.25rem * var(--densidad));
  box-shadow: var(--sombra-tarjeta); border: 1px solid #eef2ef;
  transition: box-shadow .15s ease, transform .15s ease;
}
a.btn-modulo:hover { box-shadow: 0 1px 2px rgba(12,53,39,.04), 0 10px 28px -16px rgba(12,53,39,.3); transform: translateY(-1px); }
.btn-modulo__icono { font-size: 1.8rem; }
.btn-modulo__titulo { font-weight: 700; color: var(--verde-principal); display: block; }
.btn-modulo__detalle { color: var(--gris-secundario); font-size: .85rem; }

/* Variante <button> de .btn-modulo (elegir/cambiar de perfil): reemplaza el
   hack style="text-align:left" que se repetía en perfil.html/seleccionar_perfil.html. */
.btn-modulo--accion {
  width: 100%; text-align: left; border: 1px solid #eef2ef; cursor: pointer;
  font: inherit;
}
.btn-modulo--accion:hover { background: var(--menta-pastel); }

/* --- Tarjetas genéricas --- */
.card-custom {
  background: var(--blanco-panel); border-radius: var(--radio-tarjeta);
  padding: calc(1.25rem * var(--densidad)) calc(1.25rem * var(--densidad));
  box-shadow: var(--sombra-tarjeta); border: 1px solid #eef2ef;
  margin-bottom: calc(1rem * var(--densidad));
}
.card-custom h2, .card-custom h3 { color: var(--verde-principal); }

.buscador-rapido {
  display: flex; gap: .5rem; margin-bottom: 1rem;
}
.buscador-rapido input {
  flex: 1; border-radius: .8rem; border: 1px solid #d6dcd8; padding: .65rem .9rem;
}

/* --- Card de familia (Deudores / explorador de familias): separa el cuerpo
   clicable (va a la ficha) de la fila de acciones rápidas (imprimir/cobrar/
   editar) porque un <a>/<button> no puede anidarse dentro de otro <a>. --- */
.card-familia {
  background: var(--blanco-panel); border-radius: var(--radio-tarjeta);
  box-shadow: var(--sombra-tarjeta); border: 1px solid #eef2ef;
  margin-bottom: calc(1rem * var(--densidad)); overflow: hidden;
}
.card-familia__cuerpo {
  display: block;
  padding: calc(1.25rem * var(--densidad)) calc(1.25rem * var(--densidad)) calc(.9rem * var(--densidad));
}
.card-familia__cabecera { display: flex; justify-content: space-between; align-items: flex-start; gap: .75rem; }
.card-familia__info { min-width: 0; }
.card-familia__stats { display: flex; align-items: center; gap: .6rem; margin-top: .6rem; flex-wrap: wrap; }
.card-familia__saldo {
  font-weight: 800; font-family: "Plus Jakarta Sans", Inter, ui-sans-serif, system-ui, sans-serif;
}
.card-familia__acciones { display: flex; border-top: 1px solid #eef2ef; background: var(--fondo-general); }
.card-familia__accion {
  flex: 1; text-align: center; padding: .55rem .5rem; font-size: 1.05rem;
  border-right: 1px solid #eef2ef; border-top: 0; border-bottom: 0; border-left: 0;
  background: transparent; cursor: pointer; font-family: inherit;
}
.card-familia__accion:last-child { border-right: 0; }
.card-familia__accion:hover { background: var(--menta-pastel); }
.card-familia__accion:disabled { opacity: .45; cursor: not-allowed; }
.card-familia__accion:disabled:hover { background: transparent; }

html[data-modo="alto-contraste"] .card-familia__acciones { border-top-color: #000; }
html[data-modo="alto-contraste"] .card-familia__accion { border-right-color: #000; }

/* --- Alternador lista/grilla, reutilizable en cualquier listado de cards:
   preferencia de dispositivo (igual mecanismo que tipografía/densidad/tema),
   aplicada vía html[data-vista] sobre el contenedor .lista-* que corresponda. --- */
.toggle-vista {
  display: inline-flex; border: 1px solid #d6dcd8; border-radius: var(--radio-pastilla);
  overflow: hidden; flex-shrink: 0;
}
html[data-modo="alto-contraste"] .toggle-vista { border-color: #000; }
.toggle-vista__opcion {
  padding: .45rem .7rem; background: white; border: 0; font-size: 1rem; line-height: 1;
  cursor: pointer; color: var(--gris-secundario);
}
.toggle-vista__opcion + .toggle-vista__opcion { border-left: 1px solid #d6dcd8; }
html[data-modo="alto-contraste"] .toggle-vista__opcion + .toggle-vista__opcion { border-left-color: #000; }
.toggle-vista__opcion.activa { background: var(--menta-pastel); color: var(--verde-principal); }

/* .lista-cards es el contenedor único para cualquier listado de cards del
   panel (familias, deudores, alumnos, matrículas, salones, cierre de ciclo):
   un solo alternador lista/grilla para todas las pantallas, en vez de una
   variante de CSS por listado. */
.lista-cards { display: block; }
html[data-vista="grilla"] .lista-cards {
  display: grid; grid-template-columns: 1fr; gap: .9rem;
}
@media (min-width: 480px) {
  html[data-vista="grilla"] .lista-cards { grid-template-columns: repeat(2, 1fr); }
  /* En grilla cada columna queda angosta: el badge de saldo (ancho fijo,
     no encoge) le robaba espacio al nombre/código/alumnos y los hacía
     envolver palabra por palabra. Acá el badge baja a su propia línea y el
     bloque de info usa el ancho completo de la card. */
  html[data-vista="grilla"] .card-familia__cabecera { flex-direction: column; align-items: flex-start; }
  html[data-vista="grilla"] .card-familia__info { width: 100%; }
}
html[data-vista="grilla"] .lista-cards .card-familia,
html[data-vista="grilla"] .lista-cards .card-custom { margin-bottom: 0; }

/* --- Ficha de familia: acciones cuadradas, billetera, responsables 50/50,
   cards de alumno. --- */
.acciones-ficha { display: flex; flex-wrap: wrap; gap: .6rem; margin-bottom: 1.1rem; }
.btn-cuadrado {
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  border-radius: .9rem; font-weight: 700; font-size: .92rem; line-height: 1.15;
  padding: .8rem 1.1rem; border: 2px solid transparent; cursor: pointer;
  flex: 1 1 auto; min-width: 9rem; text-align: center; font-family: inherit;
}
.acciones-ficha > .dropdown { flex: 1 1 auto; min-width: 9rem; }
.acciones-ficha > .dropdown > .btn-cuadrado { width: 100%; }
.btn-cuadrado--verde { background: var(--verde-principal); color: #fff; }
.btn-cuadrado--verde:hover { background: var(--verde-secundario); color: #fff; }
.btn-cuadrado--naranja { background: var(--naranja-suave); color: var(--color-naranja); border-color: var(--naranja-borde); }
.btn-cuadrado--naranja:hover { background: #FFD8AC; color: var(--color-naranja); }
.btn-cuadrado--azul { background: var(--info-suave); color: var(--color-info); border-color: var(--info-borde); }
.btn-cuadrado--azul:hover { background: var(--info-borde); color: var(--color-info); }
.btn-cuadrado--gris { background: white; color: var(--gris-texto); border-color: #d6dcd8; }
.btn-cuadrado--gris:hover { background: var(--fondo-general); }
html[data-modo="alto-contraste"] .btn-cuadrado--gris { border-color: #000; }

.ficha-cuenta { display: flex; gap: 1.25rem; flex-wrap: wrap; align-items: stretch; }
.ficha-cuenta__datos { flex: 1 1 14rem; min-width: 14rem; }

.billetera {
  flex: 1 1 12rem; min-width: 12rem; max-width: 18rem; border-radius: 1.1rem;
  padding: 1rem 1.1rem; display: flex; flex-direction: column; gap: .3rem;
  border: 1px solid transparent;
}
.billetera__etiqueta { font-size: .78rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; }
.billetera__monto {
  font-size: calc(1.6rem * var(--escala-fuente)); font-weight: 800;
  font-family: "Plus Jakarta Sans", Inter, ui-sans-serif, system-ui, sans-serif;
}
.billetera__detalle { display: flex; flex-direction: column; gap: .15rem; font-size: .82rem; margin-top: .4rem; color: var(--gris-texto); }
.billetera--debe { background: var(--peligro-suave); border-color: var(--peligro-borde); }
.billetera--debe .billetera__etiqueta, .billetera--debe .billetera__monto { color: var(--peligro); }
.billetera--al-dia { background: var(--naranja-suave); border-color: var(--naranja-borde); }
.billetera--al-dia .billetera__etiqueta, .billetera--al-dia .billetera__monto { color: var(--color-naranja); }
.billetera--favor { background: var(--exito-suave); border-color: var(--exito-borde); }
.billetera--favor .billetera__etiqueta, .billetera--favor .billetera__monto { color: var(--verde-secundario); }
@media (max-width: 480px) { .ficha-cuenta { flex-direction: column; } .billetera { max-width: none; } }

.grid-responsables { display: grid; grid-template-columns: 1fr; gap: 1rem; margin-bottom: 1rem; }
@media (min-width: 560px) { .grid-responsables { grid-template-columns: repeat(2, 1fr); } }
.card-responsable { margin-bottom: 0; }
.dato-contacto {
  display: flex; align-items: center; justify-content: space-between; gap: .6rem;
  padding: .4rem 0; border-top: 1px solid #f1f4f1;
}
.dato-contacto:first-of-type { border-top: 0; }
.dato-contacto span { min-width: 0; overflow-wrap: anywhere; font-size: .88rem; color: var(--gris-texto); }
.dato-contacto__accion {
  flex-shrink: 0; width: 2.1rem; height: 2.1rem; display: inline-flex; align-items: center;
  justify-content: center; border-radius: 50%; background: var(--menta-pastel); font-size: 1rem;
}
.dato-contacto__accion:hover { background: var(--verde-suave); }

.card-alumno { margin-bottom: .75rem; }
.card-alumno__cabecera { display: flex; justify-content: space-between; align-items: flex-start; gap: .75rem; }

/* --- Botones tipo píldora --- */
.btn-primario {
  display: inline-flex; align-items: center; justify-content: center; gap: .4rem;
  background: var(--verde-principal); color: #fff; border: 0;
  border-radius: var(--radio-pastilla); font-weight: 600; font-size: .95rem;
  padding: .7rem 1.3rem; text-align: center; cursor: pointer;
}
.btn-primario:hover { background: var(--verde-secundario); color: #fff; }
.btn-primario.w-100, a.btn-primario.w-100 { display: flex; }

.btn-cerrar-sesion {
  display: flex; align-items: center; justify-content: center; gap: .6rem;
  width: 100%; padding: .75rem 1rem; border-radius: .75rem;
  background: white; border: 1px solid #d6dcd8; color: var(--peligro);
  font-weight: 600; font-size: .95rem;
}
.btn-cerrar-sesion:hover { background: var(--peligro-suave); }

/* --- Badges de estado (3 estados de cuenta: al día / con deuda / vencida) ---
   Llevan punto de color + borde: es la señal que la usuaria tiene que poder
   leer de un vistazo, así que quedan reservados a ese uso — para etiquetas
   de contenido (cursos, estado de documentos) usar .chip en vez de esto. */
.badge-estado {
  display: inline-flex; align-items: center; gap: .35rem; flex-shrink: 0;
  padding: .3rem .7rem; border-radius: var(--radio-pastilla); white-space: nowrap;
  font-size: .75rem; font-weight: 600; border: 1px solid transparent;
}
.badge-estado__punto { width: .4rem; height: .4rem; border-radius: 50%; flex-shrink: 0; }
.badge-estado--verde { background: var(--exito-suave); color: var(--verde-secundario); border-color: var(--exito-borde); }
.badge-estado--verde .badge-estado__punto { background: var(--color-exito); }
.badge-estado--amarillo { background: var(--advertencia-suave); color: #8a6d16; border-color: var(--advertencia-borde); }
.badge-estado--amarillo .badge-estado__punto { background: var(--color-advertencia); }
.badge-estado--rojo { background: var(--peligro-suave); color: var(--peligro); border-color: var(--peligro-borde); }
.badge-estado--rojo .badge-estado__punto { background: var(--peligro); }
.badge-estado--gris { background: #eef1ef; color: var(--gris-secundario); }
.badge-estado--azul { background: var(--info-suave); color: var(--color-info); border-color: var(--info-borde); }
.badge-estado--azul .badge-estado__punto { background: var(--color-info); }
.badge-estado--lavanda { background: var(--lavanda-suave); color: #6a4fc9; }

/* --- Chips: etiquetas de contenido sin la carga semántica del badge de
   estado (cursos/divisiones, estado de documentos Borrador/Emitido/Anulado). --- */
.chip {
  display: inline-block; padding: .25rem .6rem; border-radius: var(--radio-pastilla);
  font-size: .75rem; font-weight: 600; background: #eef1ef; color: var(--gris-secundario);
}
.chip--verde { background: var(--exito-suave); color: var(--verde-secundario); }
.chip--gris { background: #eef1ef; color: var(--gris-secundario); }
.chip--azul { background: var(--info-suave); color: var(--color-info); }
.chip--rojo { background: var(--peligro-suave); color: var(--peligro); }
.chip--lavanda { background: var(--lavanda-suave); color: #6a4fc9; }

/* --- Oferta educativa: un div por turno con cuadritos coloreados por nivel
   (total del nivel arriba, salones individuales abajo), clicables para abrir
   el modal de desglose. --- */
/* --- Oferta educativa: resumen institucional (total de alumnos con las bajas
   del ciclo debajo, salones abiertos, % de ocupación general). Reutiliza la
   card de ``.resumen-cuenta__item`` pero en una grilla de 3 columnas propia,
   ya que acá siempre son exactamente 3 datos (a diferencia de los listados
   filtrables, que usan _kpis.html con hasta 4). --- */
.resumen-oferta { display: grid; grid-template-columns: repeat(3, 1fr); gap: .6rem; margin-bottom: 1rem; }
.resumen-oferta__baja { display: block; font-size: .72rem; color: var(--gris-secundario); margin-top: .15rem; }

.oferta-turno__titulo { display: flex; align-items: baseline; justify-content: space-between; gap: .5rem; margin-bottom: .9rem; }
.oferta-turno__total { color: var(--gris-secundario); font-size: .85rem; white-space: nowrap; }

.oferta-niveles { display: grid; grid-template-columns: repeat(auto-fit, minmax(7rem, 1fr)); gap: .75rem; margin-bottom: 1rem; }
.oferta-cursos { display: flex; flex-wrap: wrap; gap: .6rem; }

.oferta-box {
  border: 1px solid transparent; border-radius: 1rem; padding: .85rem .9rem;
  text-align: left; cursor: pointer; font-family: inherit;
  display: flex; flex-direction: column; gap: .15rem;
  transition: transform .1s ease, box-shadow .1s ease;
}
.oferta-box:hover { transform: translateY(-1px); box-shadow: 0 6px 16px -10px rgba(12, 53, 39, .35); }
.oferta-box__numero { font-family: "Plus Jakarta Sans", Inter, ui-sans-serif, system-ui, sans-serif; font-weight: 800; font-size: 1.4rem; line-height: 1; }
.oferta-box__etiqueta { font-size: .78rem; font-weight: 600; }

.oferta-box--curso { flex: 0 0 auto; padding: .55rem .8rem; border-radius: .8rem; }
.oferta-box--curso .oferta-box__numero { font-size: 1.05rem; }
.oferta-box--curso .oferta-box__etiqueta { font-size: .72rem; }

.oferta-box--celeste { background: var(--celeste-suave); border-color: var(--info-borde); }
.oferta-box--celeste .oferta-box__numero, .oferta-box--celeste .oferta-box__etiqueta { color: var(--color-info); }
.oferta-box--verde { background: var(--verde-suave); border-color: var(--exito-borde); }
.oferta-box--verde .oferta-box__numero, .oferta-box--verde .oferta-box__etiqueta { color: var(--verde-secundario); }
.oferta-box--lavanda { background: var(--lavanda-suave); border-color: rgba(106, 79, 201, .28); }
.oferta-box--lavanda .oferta-box__numero, .oferta-box--lavanda .oferta-box__etiqueta { color: #6a4fc9; }
.oferta-box--naranja { background: var(--naranja-suave); border-color: var(--naranja-borde); }
.oferta-box--naranja .oferta-box__numero, .oferta-box--naranja .oferta-box__etiqueta { color: var(--color-naranja); }
.oferta-box--amarillo { background: var(--amarillo-suave); border-color: var(--advertencia-borde); }
.oferta-box--amarillo .oferta-box__numero, .oferta-box--amarillo .oferta-box__etiqueta { color: #8a6d16; }

.detalle-oferta__resumen { display: grid; grid-template-columns: repeat(auto-fit, minmax(5.5rem, 1fr)); gap: .6rem; margin-bottom: 1rem; }
.detalle-oferta__stat { background: var(--fondo-general); border-radius: .8rem; padding: .65rem .5rem; text-align: center; }
.detalle-oferta__stat strong { display: block; font-family: "Plus Jakarta Sans", Inter, ui-sans-serif, system-ui, sans-serif; font-size: 1.25rem; font-weight: 800; color: var(--verde-principal); }
.detalle-oferta__stat span { font-size: .68rem; color: var(--gris-secundario); text-transform: uppercase; letter-spacing: .03em; }
.detalle-oferta__lista { list-style: none; padding: 0; margin: 0; max-height: 14rem; overflow-y: auto; }
.detalle-oferta__lista li { display: flex; justify-content: space-between; gap: .5rem; padding: .5rem 0; border-top: 1px solid #eef2ef; font-size: .9rem; }
.detalle-oferta__lista li:first-child { border-top: 0; }

/* --- Previsualización de emisión (pestaña nueva, emision_previsualizar.html):
   croquis por nivel (color) → turno (resumen a la izquierda, salones
   acordeonados a la derecha) → salón → alumno. Reutiliza los colores de
   "Oferta educativa" (--nivel-suave/--nivel-color/--nivel-borde por
   modificador) para que un mismo nivel se vea igual en las dos pantallas. --- */
.previsualizacion-shell { background: var(--fondo-general); }
.previsualizacion-shell__inner { max-width: 72rem; margin: 0 auto; padding: 1.5rem 1.25rem 3rem; }

.previsualizacion-header {
  display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-end;
  gap: 1rem; margin-bottom: 1.5rem;
}
.previsualizacion-header__eyebrow { color: var(--gris-secundario); font-size: .85rem; margin-bottom: .1rem; }
.previsualizacion-header__titulo { font-size: 1.6rem; font-weight: 800; color: var(--verde-principal); margin-bottom: .2rem; }
.previsualizacion-header__subtitulo { color: var(--gris-secundario); font-size: .9rem; display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.previsualizacion-header__totales { display: flex; gap: 1.5rem; }
.previsualizacion-stat { text-align: right; }
.previsualizacion-stat strong {
  display: block; font-family: "Plus Jakarta Sans", Inter, ui-sans-serif, system-ui, sans-serif;
  font-size: 1.5rem; font-weight: 800; color: var(--verde-principal); line-height: 1.1;
}
.previsualizacion-stat span { font-size: .72rem; color: var(--gris-secundario); text-transform: uppercase; letter-spacing: .03em; }

.previsualizacion-nivel {
  border-radius: var(--radio-tarjeta); border: 1px solid var(--nivel-borde, #eef2ef);
  background: var(--nivel-suave, var(--blanco-panel)); padding: 1.25rem; margin-bottom: 1.25rem;
}
.previsualizacion-nivel--celeste { --nivel-suave: var(--celeste-suave); --nivel-color: var(--color-info); --nivel-borde: var(--info-borde); }
.previsualizacion-nivel--verde { --nivel-suave: var(--verde-suave); --nivel-color: var(--verde-secundario); --nivel-borde: var(--exito-borde); }
.previsualizacion-nivel--lavanda { --nivel-suave: var(--lavanda-suave); --nivel-color: #6a4fc9; --nivel-borde: rgba(106, 79, 201, .28); }
.previsualizacion-nivel--naranja { --nivel-suave: var(--naranja-suave); --nivel-color: var(--color-naranja); --nivel-borde: var(--naranja-borde); }
.previsualizacion-nivel--amarillo { --nivel-suave: var(--amarillo-suave); --nivel-color: #8a6d16; --nivel-borde: var(--advertencia-borde); }

.previsualizacion-nivel__titulo { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline; gap: .5rem; margin-bottom: 1rem; }
.previsualizacion-nivel__titulo h2 { color: var(--nivel-color, var(--verde-principal)); font-size: 1.2rem; margin: 0; }
.previsualizacion-nivel__total { color: var(--gris-secundario); font-size: .85rem; white-space: nowrap; }

.previsualizacion-nivel__cuerpo { display: grid; grid-template-columns: 1fr; gap: 1.25rem; }
@media (min-width: 768px) {
  .previsualizacion-nivel__cuerpo { grid-template-columns: 2fr 3fr; }
}

.previsualizacion-nivel__resumen { display: flex; flex-direction: column; gap: .9rem; }
.previsualizacion-turno-resumen {
  background: rgba(255, 255, 255, .6); border: 1px solid var(--nivel-borde, #eef2ef);
  border-radius: 1rem; padding: .9rem 1rem;
}
.previsualizacion-turno-resumen h3 { font-size: .95rem; color: var(--nivel-color, var(--verde-principal)); margin-bottom: .5rem; }
.previsualizacion-turno-resumen dl { display: grid; grid-template-columns: 1fr auto; gap: .25rem .5rem; margin: 0; }
.previsualizacion-turno-resumen dl div { display: contents; }
.previsualizacion-turno-resumen dt { color: var(--gris-secundario); font-size: .82rem; font-weight: 500; }
.previsualizacion-turno-resumen dd { margin: 0; font-weight: 700; text-align: right; }

.previsualizacion-nivel__salones { display: flex; flex-direction: column; gap: 1rem; }
.previsualizacion-salones-turno__etiqueta { font-size: .78rem; font-weight: 700; color: var(--nivel-color, var(--gris-secundario)); text-transform: uppercase; letter-spacing: .03em; margin-bottom: .5rem; }

/* Grid (no flex-wrap) a propósito: el salón expandido pasa a grid-column:
   1/-1 y empuja el resto de las cajas debajo, en vez de angostar su panel
   contra los vecinos como pasaría en una fila flex. */
.previsualizacion-salones { display: grid; grid-template-columns: repeat(auto-fill, minmax(8.5rem, 1fr)); gap: .6rem; align-items: start; }
.acordeon-salon:has(.acordeon-salon__panel:not([hidden])) { grid-column: 1 / -1; }

.acordeon-salon__boton { position: relative; width: 100%; }
.acordeon-salon__boton--activo { box-shadow: 0 0 0 2px var(--nivel-color, var(--verde-principal)) inset; }
.acordeon-salon__panel {
  margin-top: .6rem; padding: .85rem; border-radius: 1rem;
  background: var(--blanco-panel); border: 1px solid #eef2ef; box-shadow: var(--sombra-tarjeta);
}
.acordeon-salon__resumen { font-size: .8rem; color: var(--gris-secundario); margin-bottom: .5rem; }
.acordeon-salon__lista { list-style: none; padding: 0; margin: 0; max-height: 16rem; overflow-y: auto; }
.acordeon-salon__alumno {
  display: flex; justify-content: space-between; gap: .5rem; width: 100%;
  padding: .5rem .25rem; border: 0; border-top: 1px solid #eef2ef; background: transparent;
  text-align: left; cursor: pointer; font-family: inherit; font-size: .88rem; border-radius: .5rem;
}
.acordeon-salon__lista li:first-child .acordeon-salon__alumno { border-top: 0; }
.acordeon-salon__alumno:hover { background: var(--menta-pastel); }

/* --- Estado vacío: emoji + título + pista concreta de qué hacer --- */
.estado-vacio { text-align: center; padding: calc(2rem * var(--densidad)) 1rem; color: var(--gris-secundario); }
.estado-vacio__emoji { font-size: 2rem; display: block; margin-bottom: .5rem; }
.estado-vacio__titulo { font-weight: 700; color: var(--gris-texto); display: block; margin-bottom: .25rem; }
.estado-vacio__pista { font-size: .88rem; }

/* --- Selector tipo píldora (reemplaza los <select> de Preferencias) --- */
.selector-pastillas { display: flex; flex-wrap: wrap; gap: .5rem; }
.selector-pastillas__opcion {
  padding: .55rem 1rem; border-radius: var(--radio-pastilla); border: 1px solid #d6dcd8;
  background: white; color: var(--gris-texto); font-size: .88rem; font-weight: 600; cursor: pointer;
  display: inline-flex; align-items: center; gap: .5rem;
}
.selector-pastillas__opcion.activa { background: var(--verde-principal); border-color: var(--verde-principal); color: #fff; }
.selector-pastillas__punto { width: .8rem; height: .8rem; border-radius: 50%; flex-shrink: 0; border: 1px solid rgba(0,0,0,.1); }

/* --- Comprobante de pago: preview de imagen subida/pegada --- */
.comprobante-preview img { max-width: 100%; max-height: 220px; border-radius: .75rem; }

/* --- Aviso tranquilizador (Fase 5: "no se borra, se anula") --- */
.aviso-tranquilizador {
  display: flex; gap: .6rem; align-items: flex-start;
  background: var(--info-suave); border: 1px solid var(--info-borde);
  border-radius: 1rem; padding: .9rem 1rem; font-size: .88rem; color: var(--gris-texto);
  margin-bottom: 1rem;
}
.aviso-tranquilizador__icono { font-size: 1.1rem; line-height: 1; }

/* --- Cuenta corriente: cuotas mensuales agrupadas (var Cargo por alumno+período) --- */
.cuota-mensual { border: 1px solid #eef2ef; border-radius: .9rem; overflow: hidden; }
.cuota-mensual__cabecera {
  display: flex; justify-content: space-between; align-items: center; gap: .75rem;
  width: 100%; padding: .75rem .9rem; background: var(--blanco-panel);
  border: 0; text-align: left; cursor: pointer; color: var(--gris-texto);
}
.cuota-mensual__cabecera[aria-expanded="true"] { background: var(--menta-pastel); }
.cuota-mensual__detalle { padding: .75rem .9rem; background: var(--fondo-general); font-size: .9rem; }

/* --- Formularios de cobro --- */
.resumen-cobro { background: var(--menta-pastel); border-radius: 1rem; padding: 1rem 1.1rem; margin-bottom: 1rem; }

/* --- Resumen de cuenta corriente (saldo/deuda vencida/corriente/saldo a favor) --- */
.resumen-cuenta { display: grid; grid-template-columns: repeat(2, 1fr); gap: .6rem; margin-bottom: 1rem; }
@media (min-width: 560px) { .resumen-cuenta { grid-template-columns: repeat(4, 1fr); } }
.resumen-cuenta__item {
  background: var(--blanco-panel); border-radius: 1.1rem; padding: calc(.9rem * var(--densidad)) calc(1rem * var(--densidad));
  border: 1px solid #eef2ef; box-shadow: var(--sombra-tarjeta);
}
.resumen-cuenta__item small { display: block; margin-bottom: .15rem; }
.resumen-cuenta__item strong {
  display: block; font-size: calc(1.2rem * var(--escala-fuente)); font-weight: 800;
  font-family: "Plus Jakarta Sans", Inter, ui-sans-serif, system-ui, sans-serif;
}
.resumen-cuenta__item--vencida strong { color: var(--peligro); }
.resumen-cuenta__item--favor strong { color: var(--verde-secundario); }

.acciones-cuenta { display: flex; flex-wrap: wrap; gap: .5rem; margin-bottom: 1rem; }

/* --- Asistente de cobro con estilo "modal": cada paso es una página
   completa (no hay un modal real por fetch(), ver decisión registrada en el
   plan), pero se ve como una tarjeta angosta y centrada en vez de ocupar
   todo el ancho del panel. --- */
.wizard-modal { max-width: 30rem; margin: 0 auto; }

/* --- Indicador de pasos del asistente de cobro --- */
.wizard-pasos { display: flex; flex-wrap: wrap; gap: .4rem 1rem; margin-bottom: 1.25rem; }
.wizard-pasos__paso { font-size: .8rem; font-weight: 600; color: var(--gris-secundario); }
.wizard-pasos__paso.completado { color: var(--verde-secundario); }
.wizard-pasos__paso.activo { color: var(--verde-principal); text-decoration: underline; text-underline-offset: .2rem; }

/* --- Modalidad de imputación (radios grandes) --- */
.modalidad-imputacion { display: grid; gap: .6rem; }
.modalidad-imputacion label {
  display: flex; gap: .6rem; align-items: flex-start; border: 1px solid #d6dcd8;
  border-radius: .8rem; padding: .7rem .9rem; cursor: pointer;
}
.modalidad-imputacion input:checked + span { font-weight: 700; color: var(--verde-principal); }

/* --- Filas dinámicas de "Medios de pago" (paso 2 del asistente de cobro) --- */
.fila-medio {
  display: grid; grid-template-columns: 1fr 1fr; gap: .5rem .75rem;
  border: 1px solid #eef2ef; border-radius: .9rem; padding: .75rem .9rem; margin-bottom: .6rem;
}
.fila-medio > div:last-child { grid-column: 1 / -1; }

/* --- Selección manual de cuotas --- */
.cuota-manual {
  border: 1px solid #eef2ef; border-radius: .9rem; padding: .75rem .9rem; margin-bottom: .6rem;
  display: flex; gap: .7rem; align-items: center; flex-wrap: wrap;
}
.cuota-manual input[type="number"] { max-width: 9rem; }

/* --- Tablas de listados (pagos, previsualización) --- */
.tabla-operativa { width: 100%; border-collapse: collapse; font-size: .88rem; }
.tabla-operativa th, .tabla-operativa td { padding: .5rem .6rem; border-bottom: 1px solid #eef2ef; text-align: left; }
.tabla-operativa th { color: var(--gris-secundario); font-weight: 600; font-size: .78rem; text-transform: uppercase; }
.tabla-operativa tbody tr:hover { background: var(--fondo-general); }
.tabla-scroll { overflow-x: auto; }

/* --- Vistas imprimibles (estado de cuenta, constancia de pago) --- */
.print-toolbar {
  position: sticky; top: 0; z-index: 10; display: flex; gap: .6rem; justify-content: flex-end;
  padding: .8rem 1rem; background: var(--fondo-general); border-bottom: 1px solid #e3e9e4;
}
.documento-imprimible {
  max-width: 900px; margin: 0 auto; padding: 1.5rem 1.75rem; background: white; color: #111;
}
.documento-imprimible h1, .documento-imprimible h2 {
  font-family: Inter, ui-sans-serif, system-ui, sans-serif; letter-spacing: normal;
}
.documento-imprimible h1 { font-size: 1.3rem; margin-bottom: .1rem; }
.documento-imprimible h2 { font-size: 1.05rem; margin-top: 1.4rem; border-bottom: 2px solid #111; padding-bottom: .2rem; }
.documento-encabezado { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 1rem; margin-bottom: 1rem; border-bottom: 1px solid #ccc; padding-bottom: 1rem; }
.leyenda-interna {
  margin-top: 2rem; padding-top: 1rem; border-top: 2px dashed #999; text-align: center;
  font-weight: 700; letter-spacing: .03em; font-size: .85rem;
}
.documento-imprimible table { width: 100%; border-collapse: collapse; margin-bottom: 1rem; font-size: .85rem; }
.documento-imprimible th, .documento-imprimible td { border: 1px solid #ccc; padding: .4rem .5rem; text-align: left; }
.documento-imprimible th { background: #f2f2f2; }

/* --- Importadores: tabla de antes/después dentro de una card de resultado --- */
.tabla-scroll { overflow-x: auto; }
.tabla-cambios { width: 100%; border-collapse: collapse; font-size: .85rem; white-space: nowrap; }
.tabla-cambios th, .tabla-cambios td { padding: .35rem .5rem; border-bottom: 1px solid #eef2ef; text-align: left; }
.tabla-cambios th { color: var(--gris-secundario); font-weight: 600; }
.tabla-cambios td { white-space: normal; }
.tabla-cambios--anidada { width: auto; }
.tabla-cambios--anidada td { border-bottom: none; padding: .2rem .5rem .2rem 0; }

@media print {
  .no-imprimir { display: none !important; }
  body { background: white; padding-bottom: 0; }
  .documento-imprimible { max-width: none; padding: 0; }
  a { color: inherit; }
  @page { margin: 1.5cm; }
}

/* --- Mi perfil: avatar (foto / emoji / iniciales) + acciones para cambiarlo.
   Las iniciales usan un color pastel determinístico (Usuario.color_avatar,
   apps/usuarios/models.py) sobre la misma paleta de badges/chips, así que un
   mismo usuario siempre cae en el mismo color. --- */
.perfil-cabecera { display: flex; flex-direction: column; align-items: center; text-align: center; gap: .75rem; }
.avatar-perfil {
  width: 5.5rem; height: 5.5rem; border-radius: 50%; overflow: hidden;
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
  font-weight: 800; font-size: 1.8rem;
  font-family: "Plus Jakarta Sans", Inter, ui-sans-serif, system-ui, sans-serif;
  box-shadow: 0 1px 2px rgba(12, 53, 39, .08);
}
.avatar-perfil img { width: 100%; height: 100%; object-fit: cover; }
.avatar-perfil--verde { background: var(--verde-suave); color: var(--verde-secundario); }
.avatar-perfil--celeste { background: var(--celeste-suave); color: var(--color-info); }
.avatar-perfil--lavanda { background: var(--lavanda-suave); color: #6a4fc9; }
.avatar-perfil--rosa { background: var(--rosa-suave); color: var(--peligro); }
.avatar-perfil--amarillo { background: var(--amarillo-suave); color: #8a6d16; }
.avatar-perfil--naranja { background: var(--naranja-suave); color: var(--color-naranja); }
/* Variante chica: preview dentro del modal "Cambiar avatar" (#modal-avatar). */
.avatar-perfil--chico { width: 4.5rem; height: 4.5rem; font-size: 1.4rem; }

.perfil-cabecera__nombre p { margin-bottom: 0; }
.perfil-cabecera .btn-cuadrado { flex: 0 0 auto; min-width: 0; padding: .55rem 1.1rem; font-size: .85rem; }
.perfil-cabecera__quitar {
  background: none; border: 0; padding: 0; color: var(--gris-secundario); font-size: .82rem;
  text-decoration: underline; text-underline-offset: .2rem; cursor: pointer; font-family: inherit;
}
.perfil-cabecera__quitar:hover { color: var(--peligro); }

/* --- Modal "Mi cuenta" (_modal_usuario.html): mismo shell de modal que
   #modal-avatar en perfil.html, con un formulario de datos siempre visible
   y el de contraseña colapsado hasta que se pide cambiarla. --- */
.menu-usuario__cabecera { display: flex; align-items: center; gap: .9rem; }
.menu-usuario__cabecera > div { min-width: 0; overflow-wrap: anywhere; }
.menu-usuario__link {
  display: block; text-align: center; padding: .6rem 1rem; border-radius: .8rem;
  background: var(--fondo-general); color: var(--gris-texto); font-weight: 600;
  font-size: .9rem; text-decoration: none;
}
.menu-usuario__link:hover { background: var(--menta-pastel); color: var(--verde-principal); }

/* --- Modal "Notificaciones" (_modal_notificaciones.html): lista poblada por
   static/js/notificaciones.js. Un color de borde por nivel (mismo criterio
   que .badge-estado) para distinguir "informativo" de "alerta" de un
   vistazo, sin depender solo del texto. --- */
.notificaciones-marcar-todas {
  background: none; border: 0; padding: 0; color: var(--verde-principal); font-size: .8rem;
  font-weight: 600; cursor: pointer; font-family: inherit;
}
.notificaciones-marcar-todas:hover { text-decoration: underline; }
.notificacion-item {
  display: block; width: 100%; text-align: left; border: 0; border-left: 4px solid var(--gris-secundario);
  background: var(--fondo-general); border-radius: .7rem; padding: .7rem .9rem; font-family: inherit;
  cursor: pointer;
}
.notificacion-item + .notificacion-item { margin-top: .6rem; }
.notificacion-item:hover { background: var(--menta-pastel); }
.notificacion-item--info { border-left-color: var(--color-info); }
.notificacion-item--exito { border-left-color: var(--color-exito); }
.notificacion-item--alerta { border-left-color: var(--color-advertencia); }
.notificacion-item--urgente { border-left-color: var(--peligro); }
.notificacion-item__titulo { display: block; font-weight: 700; color: var(--gris-texto); font-size: .9rem; }
.notificacion-item__mensaje { display: block; color: var(--gris-secundario); font-size: .82rem; margin-top: .15rem; }
.notificacion-item__tiempo { display: block; color: var(--gris-secundario); font-size: .72rem; margin-top: .35rem; }

/* Grilla de emojis dentro de #modal-avatar: separada del resto del panel
   (que solo se ve en la card de "Mi perfil") para no ocupar espacio en la
   pantalla principal. */
.avatar-emojis__grid { display: flex; flex-wrap: wrap; justify-content: center; gap: .4rem; max-width: 22rem; margin: 0 auto; }
.avatar-emojis__opcion {
  width: 2.6rem; height: 2.6rem; border-radius: 50%; border: 1px solid #d6dcd8; padding: 0;
  background: white; font-size: 1.3rem; display: flex; align-items: center; justify-content: center;
  cursor: pointer;
}
.avatar-emojis__opcion:hover { background: var(--menta-pastel); }
.avatar-emojis__opcion.activa { border-color: var(--verde-principal); box-shadow: 0 0 0 2px var(--verde-principal) inset; }

/* --- Mi perfil: filas de "Mis datos" (etiqueta en negrita + valor), cada una
   separada de la siguiente por una línea (mismo tono que .bottom-nav). --- */
.datos-perfil__fila {
  display: flex; justify-content: space-between; align-items: baseline; gap: .75rem;
  padding: .7rem 0; border-top: 1px solid #e3e9e4;
}
.datos-perfil__fila:first-child { border-top: 0; padding-top: 0; }
.datos-perfil__etiqueta { font-weight: 700; color: var(--gris-texto); font-size: .9rem; flex-shrink: 0; }
.datos-perfil__valor { color: var(--gris-secundario); text-align: right; overflow-wrap: anywhere; }
html[data-modo="alto-contraste"] .datos-perfil__fila { border-top-color: #000; }
