/* ==========================================================================
   Casa Verdezza — Administración
   Depende de /shared/greenhouse.css.

   Esta hoja NO redefine ningún componente del sistema. Aquí vive solo la
   composición de estas pantallas y su vocabulario propio: qué es un "cargo",
   qué es un "vínculo", qué significa que un permiso esté en un nivel u otro.

   Cuánta marca lleva: la del CRM. Logotipo, versalitas en oro, tipografía de
   marca y nada de decoración. Se usa para leer y comparar, no para emocionar;
   y en la pantalla donde se decide quién abre una historia clínica, cualquier
   adorno es una distracción.
   ========================================================================== */

:root {
  /* Densa como el CRM: aquí se comparan filas, no se lee un texto largo. */
  --t-small: 1rem;
}

.admin-main {
  max-width: 1180px;
  margin-inline: auto;
  padding: var(--s-8) var(--s-5) var(--s-20);
}

/* La barra de puertas es fija en el pie del teléfono (lo hereda del componente
   compartido), así que el contenido reserva su alto. Mismo cálculo que Care. */
@media (max-width: 859px) {
  .admin-main { padding-bottom: calc(96px + env(safe-area-inset-bottom)); }
}

/* ==========================================================================
   Navegación: DOS niveles

   Antes era uno solo con once pestañas, y eso tenía tres problemas que no se
   arreglan con CSS: en un teléfono no caben (se deslizaban en horizontal, así
   que la mitad no existía hasta que alguien adivinaba que había que arrastrar),
   en pantalla ancha la fila llegaba al borde del viewport, y —lo peor— poner
   "Permisos" y "Resultado" en la misma fila dice que son la misma clase de
   cosa. No lo son: una decide quién abre una historia clínica y la otra es el
   informe del mes.

   Las cuatro PUERTAS ya estaban escritas en CLAUDE.md y en el propio app.js;
   lo único que faltaba era que la pantalla las dibujara.
   ========================================================================== */

/* Nivel 1: las puertas. Usa el componente compartido tal cual —nace en Care
   con cinco y está pensado para pocas—: barra inferior fija en el teléfono,
   pegajosa bajo la cabecera en pantalla ancha. Cuatro es su medida exacta, así
   que aquí no hace falta ni una línea de ajuste. */

/* Lo unico que la barra de puertas necesita de esta pantalla: alinearse con
   ella. El componente compartido se estrecha a 780px centrados —nace en Care,
   que es una columna de turno— y aqui la pagina tiene 1180px alineados a la
   izquierda: centrada, la barra flotaba desplazada del titulo que la encabeza.
   Es composicion de esta superficie, no un cambio del componente. */
/* LAS CUATRO PUERTAS: un solo <nav>, dos presentaciones.
   ------------------------------------------------------------------------
   Vive dentro de `.topbar` (ver el comentario del HTML). Ya no usa el
   componente `.tabs`, que nace en Care y esta pensado para una fila fija
   abajo; aqui hacen falta dos formas muy distintas segun el ancho, y forzar
   ambas sobre `.tabs` habria convertido ese componente en un cajon.

   TELEFONO: barra FLOTANTE. No se pega al borde — en los telefonos con gesto
   de inicio, una barra pegada queda bajo la franja del sistema y el ultimo
   boton se vuelve dificil de acertar. `env(safe-area-inset-bottom)` la levanta.
   Opaca, como toda barra pegajosa de este sistema: un desenfoque que a veces
   no se aplica no es un efecto, es un fallo intermitente.                 */

.admin-puertas {
  position: fixed;
  z-index: 40;
  left: var(--s-3); right: var(--s-3);
  bottom: calc(var(--s-3) + env(safe-area-inset-bottom, 0px));
  display: flex; align-items: stretch;
  padding: 6px;
  background: var(--pane);
  border: 1px solid var(--rule);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-float);
}
.admin-puertas .tab {
  flex: 1 1 0; min-width: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3px;
  min-height: var(--tap);
  padding: 6px 2px;
  border: 0; border-radius: var(--r-md);
  background: transparent; color: var(--ink-faint);
  /* 16px, el piso del sistema. Estaba en --t-micro (13px) sin versalitas, que
     es justo lo que la regla de CLAUDE.md no admite: una etiqueta de
     navegación es contenido, no una micro-etiqueta que etiqueta un dato. */
  font-family: inherit; font-size: var(--t-small); font-weight: 600;
  cursor: pointer;
  /* Las tres cosas, o «Administracion» no se parte: dejar que la pestana se
     encoja, ponerle techo a la etiqueta y permitir partir la palabra. Lo que
     no cede sigue siendo el tamano de la letra. Misma leccion que Care. */
  text-align: center;
  overflow-wrap: anywhere;
  transition: background var(--dur-fast) var(--ease-soft), color var(--dur-fast) var(--ease-soft);
}
.admin-puertas .tab .icon { width: 22px; height: 22px; flex: 0 0 auto; }
.admin-puertas .tab > span { max-width: 100%; }
/* «Administración» no cabe en un cuarto de teléfono a 16px y se partía por la
   mitad de la palabra. En estrecho se ve «Admin»; el botón conserva
   aria-label="Administración", así que el lector de pantalla dice lo mismo. */
.admin-puertas .puerta-larga { display: none; }
.admin-puertas .tab[aria-pressed="true"] {
  background: var(--sage-soft);
  color: var(--sage-deep);
}
/* El contenido no puede terminar debajo de la barra flotante. Derivado de su
   altura real (`GH.publicarAltoDeBarra`) y no de `--tap`: la barra crece cuando
   «Administracion» parte en dos lineas, y entonces un calculo sobre el objetivo
   tactil se queda corto. */
.admin-main { padding-bottom: calc(var(--barra-alto, 110px) + var(--s-5) + env(safe-area-inset-bottom, 0px)); }

/* ESCRITORIO: en linea dentro de la barra superior. La activa va en pildora de
   verde CLARO y no de marca: el verde fuerte ya lo lleva el logotipo a diez
   pixeles, y dos manchas oscuras juntas compiten. Lo que manda aqui es cual
   esta abierta. */
@media (min-width: 900px) {
  .admin-puertas {
    position: static;
    left: auto; right: auto; bottom: auto;
    flex: 1;
    justify-content: center;
    gap: 2px;
    padding: 0;
    background: transparent;
    border: 0;
    border-radius: 0;
    box-shadow: none;
  }
  .admin-puertas .tab {
    flex: 0 0 auto;
    flex-direction: row;
    gap: 8px;
    padding: 0 var(--s-4);
    border-radius: var(--r-pill);
    font-size: var(--t-body);
    overflow-wrap: normal;
    white-space: nowrap;
  }
  .admin-puertas .tab .icon { width: 18px; height: 18px; }
  .admin-puertas .puerta-larga { display: inline; }
  .admin-puertas .puerta-corta { display: none; }
  .admin-main { padding-bottom: 0; }
}

/* Nivel 2: las secciones de la puerta abierta. Píldoras y no pestañas, porque
   ya hay una barra de pestañas encima: repetir el mismo componente en dos
   niveles hace que ninguno de los dos se lea como el de arriba. */
.admin-secciones {
  display: flex; flex-wrap: wrap;
  gap: var(--s-2);
  margin-bottom: var(--s-8);
}
.seccion {
  display: inline-flex; align-items: center; gap: var(--s-2);
  min-height: var(--tap);
  padding: 0 var(--s-4);
  border: 1px solid var(--rule);
  border-radius: var(--r-pill);
  background: var(--pane);
  font-family: inherit; font-size: var(--t-small); font-weight: 700;
  color: var(--ink-soft);
  cursor: pointer; touch-action: manipulation;
  transition: background var(--dur-fast) var(--ease-soft), color var(--dur-fast) var(--ease-soft),
              border-color var(--dur-fast) var(--ease-soft);
}
.seccion .icon { width: 18px; height: 18px; }
.seccion:hover { border-color: var(--sage); color: var(--sage-deep); }
/* Rellena, no subrayada: la sección activa tiene que distinguirse de la PUERTA
   activa de la barra de arriba, que se marca con un filete. Dos marcas iguales
   en dos niveles obligan a leer para saber en cuál estás. */
/* Sección de otra puerta: no se dibuja. Con una clase y no con `hidden`, que en
   una sección significa otra cosa — que esta cuenta no puede entrar ahí. */
.seccion.fuera-de-puerta { display: none; }

.seccion[aria-selected="true"] {
  background: var(--sage); border-color: var(--sage); color: #fff;
}

/* En un teléfono las cinco de Administración no caben en una línea. Se
   envuelven (no se deslizan): una segunda fila de píldoras se lee entera, y un
   deslizamiento horizontal esconde lo que hay a la derecha sin decirlo. Es lo
   contrario de lo que hacía la barra de once, y por eso mismo. */
@media (max-width: 560px) {
  .admin-secciones { gap: var(--s-1); }
  .seccion { padding: 0 var(--s-3); }
}

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

/* ==========================================================================
   Cabecera de panel
   ========================================================================== */

.panel-head {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: var(--s-4);
  margin-bottom: var(--s-6);
}
.panel-resumen { color: var(--ink-soft); font-weight: 700; }

/* ==========================================================================
   Personas y residentes
   Una tarjeta por persona y no una tabla: cada fila lleva cargos de longitud
   variable y tres acciones, y eso en una tabla obliga a un scroll horizontal
   permanente.
   ========================================================================== */

.persona {
  padding: var(--s-5);
  border: 1px solid var(--rule);
  border-radius: var(--r-lg);
  background: var(--pane);
}
.persona + .persona { margin-top: var(--s-3); }

.persona-cabecera {
  display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between;
  gap: var(--s-3);
}
.persona-cabecera h3 {
  font-family: var(--font-body); font-weight: 700;
  font-size: var(--t-base);
  font-variation-settings: normal;
}
.persona-estado { display: flex; flex-wrap: wrap; gap: var(--s-2); }

.persona-ultimo { margin-top: var(--s-3); font-size: var(--t-small); }

.persona-acciones {
  display: flex; flex-wrap: wrap; gap: var(--s-2);
  margin-top: var(--s-4);
  padding-top: var(--s-4);
  border-top: 1px solid var(--rule);
}

/* --- Cargos ---------------------------------------------------------- */

.cargos { display: flex; flex-wrap: wrap; gap: var(--s-2); margin-top: var(--s-3); }

.cargo {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 6px 4px 12px;
  border-radius: var(--r-pill);
  background: var(--sage-wash);
  color: var(--sage-deep);
  font-size: var(--t-small); font-weight: 700;
}

/* La X de quitar un cargo mide 32px y no 44: va DENTRO de una píldora y
   agrandarla partiría la píldora en dos líneas. El objetivo de 44px se
   mantiene en el botón que abre la confirmación, que es donde de verdad se
   decide — esta solo abre una hoja que se puede cancelar. */
.cargo-quitar {
  display: inline-flex; align-items: center; justify-content: center;
  width: 32px; height: 32px;
  border: 0; border-radius: 50%;
  background: transparent;
  color: var(--sage-deep);
  cursor: pointer;
}
.cargo-quitar:hover { background: color-mix(in srgb, var(--sage) 18%, transparent); }
.cargo-quitar .icon { width: 15px; height: 15px; }

/* ==========================================================================
   Permisos
   Una tabla POR MÓDULO. La alternativa —una tabla gigante de roles × todo—
   obliga a recorrerla entera para responder "quién entra a medicamentos",
   que es la pregunta que se hace de verdad.
   ========================================================================== */

.permisos-modulo { margin-top: var(--s-8); }
.permisos-modulo h3 {
  font-family: var(--font-body); font-weight: 700;
  font-size: var(--t-micro);
  letter-spacing: 0.09em; text-transform: uppercase;
  color: var(--sage);
  font-variation-settings: normal;
  margin-bottom: var(--s-3);
  padding-bottom: var(--s-2);
  border-bottom: 1px solid var(--rule);
}

/* La tabla se desliza dentro de su caja en vez de romper la página. Es de las
   pocas pantallas del ecosistema donde una tabla ancha está justificada: son
   cinco cargos que hay que poder COMPARAR de un vistazo, y apilarlos en
   tarjetas destruiría justo eso. */
.tabla-scroll {
  overflow-x: auto;
  scrollbar-width: thin;
  -webkit-overflow-scrolling: touch;
}

.permisos-tabla {
  width: 100%;
  min-width: 640px;
  border-collapse: collapse;
}
.permisos-tabla th, .permisos-tabla td {
  padding: var(--s-2);
  text-align: left;
  vertical-align: middle;
}
.permisos-tabla thead th {
  font-size: var(--t-micro);
  letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ink-faint);
  border-bottom: 1px solid var(--rule);
  white-space: nowrap;
}
.permisos-tabla tbody th {
  font-weight: 700;
  color: var(--ink-soft);
  white-space: nowrap;
  padding-right: var(--s-4);
}
.permisos-tabla tbody tr + tr th,
.permisos-tabla tbody tr + tr td { border-top: 1px solid var(--rule); }

/* El nivel se distingue por COLOR y por TEXTO, nunca solo por color: quien no
   distingue el verde del gris tiene que poder leer "Solo lee". */
.permiso {
  display: block;
  width: 100%;
  min-height: var(--tap);
  padding: var(--s-2) var(--s-3);
  border: 1px solid var(--rule-strong);
  border-radius: var(--r-sm);
  background: var(--pane);
  color: var(--ink-soft);
  font: inherit; font-size: var(--t-small); font-weight: 700;
  text-align: left;
  white-space: nowrap;
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease-soft), background var(--dur-fast) var(--ease-soft);
}
.permiso:hover { border-color: var(--sage); }
.permiso:active { transform: scale(0.98); }

/* Sin acceso es lo NEUTRO, no lo alarmante: que un cuidador no entre a
   facturación es lo normal, no un problema que resolver. */
.permiso.nivel-nada { background: var(--paper-sunk); color: var(--ink-faint); }
.permiso.nivel-lee { background: var(--teal-wash); color: var(--teal); border-color: var(--teal-wash); }
.permiso.nivel-escribe { background: var(--sage); color: var(--paper); border-color: var(--sage); }

/* ==========================================================================
   Vínculos con la familia
   ========================================================================== */

.vinculos { display: grid; gap: var(--s-3); margin-bottom: var(--s-5); }

.vinculo {
  padding: var(--s-4);
  border: 1px solid var(--rule);
  border-radius: var(--r-md);
  background: var(--paper);
}
.vinculo-cabecera {
  display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between;
  gap: var(--s-2);
}
.vinculo-tags { display: flex; flex-wrap: wrap; gap: var(--s-2); margin: var(--s-3) 0; }
.vinculo .btn { margin-top: var(--s-2); }

.vinculo-nuevo {
  margin-top: var(--s-5);
  padding-top: var(--s-5);
  border-top: 1px solid var(--rule);
}

/* La ayuda de cada casilla va DEBAJO del nombre de la categoría, no al lado:
   "Sensible" no le dice nada a nadie sin "historia clínica, diagnósticos". */
.check-ayuda {
  display: block;
  margin-top: 2px;
  color: var(--ink-faint);
  font-size: var(--t-small); font-weight: 400;
}
.check-row { align-items: flex-start; padding-block: var(--s-3); }
.check-row input[type="checkbox"] { margin-top: 2px; }

/* ==========================================================================
   Habitaciones
   ========================================================================== */

.habitaciones { display: grid; gap: var(--s-3); }
@media (min-width: 700px) {
  .habitaciones { grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); }
}

.habitacion {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--s-2) var(--s-3);
  padding: var(--s-4) var(--s-5);
  border: 1px solid var(--rule);
  border-radius: var(--r-md);
  background: var(--pane);
}
.habitacion h3 {
  font-family: var(--font-display); font-weight: 600;
  font-size: 1.4rem; line-height: 1.1;
  font-variation-settings: "SOFT" 40, "WONK" 1;
}
.habitacion .btn { grid-column: 1 / -1; justify-self: start; }

/* ==========================================================================
   Comunicados
   ========================================================================== */

.comunicado {
  padding: var(--s-5);
  border: 1px solid var(--rule);
  border-left: 3px solid var(--sage);
  border-radius: var(--r-md);
  background: var(--pane);
}
.comunicado + .comunicado { margin-top: var(--s-3); }

.comunicado-cabecera {
  display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;
  gap: var(--s-3);
  margin-bottom: var(--s-2);
}
.comunicado-cabecera h3 {
  font-family: var(--font-body); font-weight: 700;
  font-size: var(--t-base);
  font-variation-settings: normal;
}
/* `pre-wrap`: un comunicado con tres párrafos se lee como tres párrafos. */
.comunicado-cuerpo { white-space: pre-wrap; color: var(--ink-soft); margin-bottom: var(--s-3); }

/* ==========================================================================
   Hojas
   ========================================================================== */

.hoja-nota {
  margin: var(--s-3) 0 var(--s-5);
  padding: var(--s-3) var(--s-4);
  border-radius: var(--r-sm);
  background: var(--paper-sunk);
  color: var(--ink-soft);
}

/* Lo que se puede deshacer va en verde; lo que no, en rojo de tierra. Quitarle
   el cargo a alguien o desactivar una cuenta le cierra la sesión en ese
   momento: no es un guardar más. */
.btn-peligro {
  background: var(--alert);
  color: var(--paper);
  border: 1px solid var(--alert);
}
.btn-peligro:hover { background: color-mix(in srgb, var(--alert) 85%, #000); }


/* ==========================================================================
   DINERO — Planes y Resultado
   Solo composición y vocabulario de dominio. Las tarjetas, las etiquetas, la
   tabla de datos, los avisos y los botones son los de `/shared`: aquí se
   decide DÓNDE va cada cosa y qué significa "margen" o "sin tarifa".

   Nada de oro decorativo. Administración se usa para leer y comparar cifras
   varias veces al mes, y el oro de la marca señala; en una tabla de números
   no hay nada que señalar que el número no diga mejor.
   ========================================================================== */

/* ----------------------------------------------------------------- Planes */

.plan-grid {
  display: grid;
  gap: var(--s-5);
  /* `min(100%, …)`: a 320px la columna de 320 no cabía con los márgenes y la
     tarjeta se salía 20px. */
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr));
  align-items: start;
}

.plan-card {
  background: var(--pane);
  border: 1px solid var(--rule);
  border-radius: var(--r-lg);
  padding: var(--s-6);
}
/* Un plan retirado se sigue viendo —hay gente pagándolo— pero no compite con
   los que se ofrecen hoy. */
.plan-card.es-inactivo { opacity: 0.72; }

.plan-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--s-4);
  flex-wrap: wrap;
}
.plan-head h3 { font-size: 1.35rem; margin: 0; }

.plan-precio {
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  margin: 0;
}

.plan-desc { color: var(--ink-soft); margin: var(--s-3) 0 0; }
.plan-uso { color: var(--ink-faint); font-size: var(--t-small); margin: var(--s-3) 0 0; }

/* Qué incluye. La cobertura va PRIMERO en cada línea, antes del concepto: lo
   que se barre de un vistazo es quién paga qué, no la lista de conceptos. */
.plan-incluye {
  list-style: none;
  margin: var(--s-5) 0 0;
  padding: var(--s-4) 0 0;
  border-top: 1px solid var(--rule);
  display: grid;
  gap: var(--s-3);
}
.plan-incluye li {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--s-2) var(--s-3);
  font-size: var(--t-small);
}
.plan-incluye .tag { flex: none; }
.plan-nota { flex-basis: 100%; color: var(--ink-faint); font-size: var(--t-small); margin: 0; }

.plan-sin-detalle {
  display: block;
  color: var(--clay);
  background: var(--clay-wash);
  border-radius: var(--r-sm);
  padding: var(--s-3) var(--s-4);
  font-size: var(--t-small);
}

.plan-acciones { display: flex; gap: var(--s-3); flex-wrap: wrap; margin-top: var(--s-5); }

/* Las coberturas de la hoja: concepto, cobertura, límite y el botón de quitar
   en una fila que se apila sola cuando no cabe. */
.cobertura-fila {
  display: grid;
  grid-template-columns: 1fr 1fr var(--tap);
  gap: var(--s-3);
  align-items: end;
  padding-bottom: var(--s-3);
}
.cobertura-fila .field { margin: 0; }
.cobertura-fila .cobertura-limite { grid-column: 1 / -1; }

@media (max-width: 560px) {
  .cobertura-fila { grid-template-columns: 1fr var(--tap); }
  .cobertura-fila .field:nth-of-type(2) { grid-column: 1 / -1; }
}

.historia-precios { list-style: none; margin: var(--s-4) 0 0; padding: 0; display: grid; gap: var(--s-3); }
.historia-precios li { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-4); align-items: baseline; }

.tarifa-lista { list-style: none; margin: var(--s-4) 0 var(--s-6); padding: 0; display: grid; gap: var(--s-4); }
.tarifa-lista li { display: grid; gap: 2px; }

.dato-actual {
  background: var(--paper-sunk);
  border-radius: var(--r-sm);
  padding: var(--s-3) var(--s-4);
  margin: var(--s-4) 0;
}

.sheet-subtitulo {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: var(--t-micro);
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--sage);
  margin: var(--s-6) 0 var(--s-2);
  padding-bottom: var(--s-2);
  border-bottom: 1px solid var(--rule);
}


/* -------------------------------------------------------------- Resultado */

.periodo-campo { margin: 0; max-width: 200px; }

/* La escalera. Es la pieza central de la pantalla: se lee de arriba abajo y
   cada resta se ve como resta. Un cuadro de resumen con cuatro cifras sueltas
   no enseña que el margen todavía no es la ganancia; esto sí. */
.escalera {
  background: var(--pane);
  border: 1px solid var(--rule);
  border-radius: var(--r-lg);
  padding: var(--s-5) var(--s-6);
  margin-bottom: var(--s-6);
}

.escalera-fila {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-4);
  padding: var(--s-3) 0;
  /* La cifra no se parte (`nowrap`), así que en un teléfono es la LÍNEA la que
     se envuelve: el concepto arriba y el dinero debajo. Sin esto, "−$ 3.000.000
     −123,7%" empujaba la página y aparecía scroll horizontal en todo /admin. */
  flex-wrap: wrap;
}
.escalera-fila span { flex: 1 1 60%; min-width: 0; }
.escalera-fila b { margin-left: auto; }
.escalera-fila span { color: var(--ink-soft); }
.escalera-fila small { display: block; color: var(--ink-faint); font-size: var(--t-small); }
/* La CIFRA no se parte —un número cortado a la mitad no se lee— pero la línea
   sí: a 320px "−$ 7.548.700 −123,7%" medía 2px más que la pantalla y le ponía
   scroll horizontal a todo /admin. El porcentaje baja solo. */
.escalera-fila b {
  font-variant-numeric: tabular-nums;
  white-space: normal;
  font-size: 1.1rem;
  text-align: right;
}
.escalera-fila b .cifra { white-space: nowrap; }
.escalera-fila b .text-faint { white-space: nowrap; }
.escalera-fila.es-resta b { color: var(--ink-soft); }

.escalera-fila.es-subtotal {
  border-top: 1px solid var(--rule);
  margin-top: var(--s-2);
}
.escalera-fila.es-subtotal b { font-size: 1.35rem; }

/* El total lleva un filete de 2px arriba —la doble raya del cierre contable—
   y es la única cifra grande de la pantalla. */
.escalera-fila.es-total {
  border-top: 2px solid var(--sage);
  margin-top: var(--s-3);
  padding-top: var(--s-4);
}
.escalera-fila.es-total span { color: var(--ink); font-weight: 700; }
.escalera-fila.es-total b {
  font-family: var(--font-display);
  font-size: 1.75rem;
  font-weight: 600;
  color: var(--sage-deep);
}

/* Un resultado negativo se dice en terracota y con el signo, nunca solo con
   el color: quien no distingue el rojo del verde tiene que leer el menos. */
.escalera-fila.es-total.es-negativo { border-top-color: var(--alert); }
.escalera-fila.es-total.es-negativo b { color: var(--alert); }

/* "No se puede calcular" no es un cero ni un guion suelto: es una frase, y
   debajo va el por qué y qué hacer. */
.escalera-fila.es-total.es-sin-dato { border-top-color: var(--rule-strong); }
.escalera-fila.es-total.es-sin-dato b {
  font-family: var(--font-body);
  font-size: 1.05rem;
  color: var(--ink-faint);
}
.escalera-nota { color: var(--ink-soft); font-size: var(--t-small); margin: var(--s-3) 0 0; }

.equilibrio {
  background: var(--teal-wash);
  border-radius: var(--r-lg);
  padding: var(--s-5) var(--s-6);
  margin-bottom: var(--s-6);
}
.equilibrio .label-micro { color: var(--teal); }
.equilibrio-cifra { font-size: 1.15rem; margin: 0 0 var(--s-2); }
.equilibrio-cifra b {
  font-family: var(--font-display);
  font-size: 1.85rem;
  font-weight: 600;
  margin-right: 6px;
}
.equilibrio-detalle { color: var(--ink-soft); font-size: var(--t-small); margin: 0; }
.equilibrio.es-sin-dato { background: var(--paper-sunk); }
.equilibrio.es-sin-dato .label-micro { color: var(--ink-faint); }
.equilibrio.es-sin-dato p:last-child { color: var(--ink-soft); margin: 0; }

.bloque { margin-bottom: var(--s-8); }
.bloque-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-4);
  flex-wrap: wrap;
  margin-bottom: var(--s-4);
}
.bloque-head h2 { font-size: 1.3rem; margin: 0; }
.bloque-acciones { display: flex; gap: var(--s-3); flex-wrap: wrap; }
.bloque-nota { color: var(--ink-soft); font-size: var(--t-small); margin: var(--s-4) 0 0; }

.fijos-total {
  text-align: right;
  font-variant-numeric: tabular-nums;
  margin: var(--s-3) 0 0;
  padding-top: var(--s-3);
  border-top: 2px solid var(--rule);
}

/* La tabla de dinero se desliza en vez de romper la página en los anchos
   intermedios; por debajo de 768px la pieza compartida ya la convierte en
   tarjetas, así que ahí no hay nada que deslizar. */
.tabla-dinero { overflow-x: auto; scrollbar-width: thin; }
.tabla-dinero .data-table { min-width: 720px; }

@media (max-width: 768px) {
  .tabla-dinero .data-table { min-width: 0; }
}

.fila-sub { display: block; color: var(--ink-faint); font-size: var(--t-small); font-weight: 400; }
.marcas { display: inline-flex; gap: var(--s-2); flex-wrap: wrap; margin-top: var(--s-2); }

/* Sin tarifa es la fila que hay que arreglar: su ingreso cuenta como cero y
   hunde el resultado del hogar. Se marca con un filete, no con un fondo
   llamativo — son datos, no una alarma. */
.data-table tbody tr.es-pendiente td.cell-title { box-shadow: inset 3px 0 0 var(--alert); padding-left: var(--s-4); }
.data-table .num.es-negativo { color: var(--alert); font-weight: 700; }

.regla {
  border-top: 1px solid var(--rule);
  padding-top: var(--s-4);
  margin-top: var(--s-4);
}
.regla-nombre { font-weight: 700; display: flex; align-items: center; gap: var(--s-3); margin: 0 0 var(--s-3); }

.comprobante-cuadra { color: var(--sage-deep); font-size: var(--t-small); margin: var(--s-3) 0 0; }

/* ==========================================================================
   CREDENCIALES DEL TALENTO HUMANO
   Van dentro de la tarjeta de la persona y en voz baja: son un dato de
   respaldo, no lo primero que se busca al abrir la lista. Lo que sí levanta
   la voz es lo que FALTA.
   ========================================================================== */

.credenciales {
  margin-top: var(--s-3);
  padding-top: var(--s-3);
  border-top: 1px solid var(--rule);
}
.credencial-linea {
  color: var(--ink-soft);
  font-size: var(--t-small);
  margin: 0;
  display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2);
}
.credencial-falta {
  display: flex; align-items: flex-start; gap: var(--s-2);
  color: var(--clay);
  font-size: var(--t-small);
  margin: var(--s-2) 0 0;
}
.credencial-falta .icon { flex: none; width: 18px; height: 18px; }

/* ==========================================================================
   RATIO DE PERSONAL (Resolución 110 de 1995)
   Va arriba del listado porque es una lectura del conjunto, no de una persona.
   Deliberadamente SIN estado verde: el sistema no puede confirmar el
   cumplimiento —conoce cargos, no turnos— y un tilde verde aquí es justo el
   dato que alguien enseñaría en una visita sin poder sostenerlo.
   ========================================================================== */

.ratio {
  background: var(--pane);
  border: 1px solid var(--rule);
  border-radius: var(--r-lg);
  padding: var(--s-5);
  margin-bottom: var(--s-5);
}

.ratio-cifras {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
  gap: var(--s-3);
  margin-bottom: var(--s-4);
}
.ratio-cifras > div {
  background: var(--paper-sunk);
  border-radius: var(--r-sm);
  padding: var(--s-3) var(--s-4);
}
.ratio-cifras span { display: block; font-size: var(--t-small); color: var(--ink-soft); }
.ratio-cifras b {
  font-family: var(--font-display);
  font-size: 1.6rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}
/* El mínimo exigido se distingue de lo que hay: uno es la norma, otro el hecho. */
.ratio-cifras .es-regla { box-shadow: inset 0 -3px 0 var(--teal); }

.ratio-aviso {
  display: flex; align-items: flex-start; gap: var(--s-2);
  color: var(--clay);
  font-size: var(--t-small);
  margin: var(--s-3) 0 0;
}
.ratio-aviso .icon { flex: none; width: 18px; height: 18px; }

.ratio-pie {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-4); flex-wrap: wrap;
  margin-top: var(--s-4);
  padding-top: var(--s-4);
  border-top: 1px solid var(--rule);
}
.ratio-categoria { margin: 0; color: var(--ink-soft); }
.ratio-nota { color: var(--ink-faint); font-size: var(--t-small); margin: var(--s-3) 0 0; }


/* ==========================================================================
   CARTERA
   Composición y vocabulario de dominio: qué es un "tramo", qué es "vencido".
   El componente de tabla, las etiquetas y la lista de pendientes son del
   sistema y se usan tal cual.
   ========================================================================== */

/* Los cinco tramos de antigüedad, en fila. Van ANTES del total a propósito:
   el total es el número del informe y los tramos son el que dice a quién hay
   que llamar esta semana. */
.tramos {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: var(--s-3);
  margin-bottom: var(--s-5);
}

.tramo {
  padding: var(--s-4);
  border-radius: var(--r-md);
  background: var(--paper-sunk);
  border-left: 3px solid var(--rule-strong);
}
/* El color sube con la mora. A 90 días la deuda cambia de naturaleza: deja de
   ser un cobro y pasa a ser una conversación sobre la permanencia. */
.tramo-corriente { border-left-color: var(--rule-strong); }
.tramo-d1_30     { border-left-color: var(--teal); }
.tramo-d31_60    { border-left-color: var(--clay); }
.tramo-d61_90    { border-left-color: var(--clay); }
.tramo-mas90     { border-left-color: var(--alert); }

.tramo-etiqueta {
  font-size: var(--t-small);
  color: var(--ink-soft);
  margin-bottom: var(--s-1);
}
.tramo-cifra {
  font-weight: 700;
  font-size: var(--t-body-lg);
  /* La cifra no se parte: un valor en dos líneas se lee como dos valores. */
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}

.cartera-totales {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-6);
  padding: var(--s-4) 0;
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
  margin-bottom: var(--s-5);
}
.cartera-totales div { display: grid; gap: 2px; }
.cartera-totales span { font-size: var(--t-small); color: var(--ink-soft); }
.cartera-totales b {
  font-size: var(--t-body-lg);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.cartera-totales .es-vencido b { color: var(--alert); }

.cartera-generar { display: flex; flex-wrap: wrap; gap: var(--s-3); align-items: center; }
.cartera-generar input { max-width: 220px; }

/* El saldo, arriba del estado de cuenta: es lo que una familia mira primero. */
.cuenta-saldo {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-4);
  padding: var(--s-4);
  border-radius: var(--r-md);
  background: var(--paper-sunk);
  margin-bottom: var(--s-4);
}
.cuenta-saldo span { color: var(--ink-soft); }
.cuenta-saldo b {
  font-size: var(--t-h3);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.cuenta-saldo b.es-vencido { color: var(--alert); }

/* Lo anulado y lo reversado NO se esconde: se atenúa. Una fila que desaparece
   deja un saldo que cambió sin que se vea por qué. */
.data-table tr.es-anulado th,
.data-table tr.es-anulado td { opacity: 0.6; }
.data-table tr.es-anulado th { text-decoration: line-through; }


/* ==========================================================================
   FACTURACIÓN
   Vocabulario de dominio: qué es un régimen declarado, qué es un adquiriente.
   La tabla, las etiquetas, la elección y la lista de pendientes son del
   sistema y se usan tal cual.
   ========================================================================== */

/* Las dos vistas de Cartera. Separadas del contenido para que el conmutador no
   se pegue a la primera cifra. */
.cartera-vistas { margin-bottom: var(--s-6); }

/* El régimen declarado. Cuando NO lo está, lo que se pinta es un aviso rojo:
   la ausencia de determinación no puede parecerse a una determinación. */
.regimen-declarado {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--s-4);
  flex-wrap: wrap;
  padding: var(--s-4);
  border-radius: var(--r-md);
  background: var(--paper-sunk);
  margin-bottom: var(--s-6);
}
.regimen-valor {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  flex-wrap: wrap;
  font-weight: 700;
  font-size: var(--t-body-lg);
  margin-top: 2px;
}

/* La identidad del adquiriente en el documento. Va en su propio recuadro
   porque es lo que hace que la factura sea de alguien. */
.doc-adquiriente {
  padding: var(--s-4);
  border-radius: var(--r-md);
  background: var(--paper-sunk);
  margin-bottom: var(--s-4);
}
.doc-adquiriente p { margin-top: 2px; }

.doc-totales {
  display: grid;
  gap: var(--s-2);
  margin-top: var(--s-4);
  padding-top: var(--s-4);
  border-top: 1px solid var(--rule);
}
.doc-totales div { display: flex; justify-content: space-between; gap: var(--s-4); }
.doc-totales span { color: var(--ink-soft); }
.doc-totales b { white-space: nowrap; font-variant-numeric: tabular-nums; }
.doc-totales .es-total {
  padding-top: var(--s-2);
  border-top: 1px solid var(--rule);
}
.doc-totales .es-total b { font-size: var(--t-body-lg); }

/* ==========================================================================
   COMPRAS
   Vocabulario de dominio. Los tramos de antigüedad, las tablas y las etiquetas
   son los mismos de Cartera y se reutilizan tal cual: leer las dos pantallas
   con la misma escala es lo que permite comparar lo que entra con lo que sale
   sin hacer cuentas.
   ========================================================================== */

.compras-vistas { margin-bottom: var(--s-6); }

/* Las TRES cifras de una orden, juntas y del mismo tamaño: pedido, recibido,
   cobrado. Deberían coincidir, y ponerlas una debajo de otra o en tamaños
   distintos haría que una de las tres pareciera la buena. */
.tres-cifras {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: var(--s-3);
  padding: var(--s-4);
  border-radius: var(--r-md);
  background: var(--paper-sunk);
}
.tres-cifras div { display: grid; gap: 2px; }
.tres-cifras span { font-size: var(--t-small); color: var(--ink-soft); }
.tres-cifras b {
  font-size: var(--t-body-lg);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}

/* Una línea del formulario de orden. Se separa con un filete y no con una
   tarjeta: son partes de un mismo pedido, no objetos distintos. */
.linea-orden {
  padding-bottom: var(--s-4);
  margin-bottom: var(--s-4);
  border-bottom: 1px dashed var(--rule);
}
.linea-orden-cifras {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: var(--s-4);
}

/* ==========================================================================
   PERSONAL
   Vocabulario de dominio: qué es una malla, qué es un hueco de cobertura. Las
   tablas, las etiquetas, la escalera y la elección son del sistema.
   ========================================================================== */

.personal-vistas { margin-bottom: var(--s-6); }

/* La malla: un día por bloque y los turnos dentro. En columnas cuando cabe,
   porque una semana se lee de un vistazo o no se lee. */
.malla {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 230px), 1fr));
  gap: var(--s-4);
}

.malla-dia {
  padding: var(--s-4);
  border-radius: var(--r-md);
  background: var(--paper-sunk);
  border-top: 3px solid var(--rule-strong);
}
/* Hoy se distingue: quien abre la malla viene a mirar hoy o mañana. */
.malla-dia.es-hoy { border-top-color: var(--sage); background: var(--sage-wash); }

.malla-fecha {
  display: flex;
  align-items: baseline;
  gap: var(--s-2);
  flex-wrap: wrap;
  font-weight: 700;
  margin-bottom: var(--s-3);
}

.malla-turno {
  padding: var(--s-3);
  border-radius: var(--r-sm);
  background: var(--pane);
  border-left: 3px solid var(--rule);
  margin-bottom: var(--s-3);
}
/* Un turno por debajo del mínimo se marca en el filete, no con un fondo rojo:
   la malla de una semana con cuatro huecos en rojo se vuelve ilegible. */
.malla-turno.es-hueco { border-left-color: var(--alert); }

.malla-turno-nombre {
  display: flex;
  align-items: baseline;
  gap: var(--s-2);
  flex-wrap: wrap;
  font-weight: 700;
  font-size: var(--t-small);
  margin-bottom: var(--s-2);
}

.malla-gente { list-style: none; display: grid; gap: var(--s-2); margin-bottom: var(--s-2); }

.malla-persona {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  flex-wrap: wrap;
  width: 100%;
  min-height: var(--tap);
  padding: var(--s-2) var(--s-3);
  border: 1px solid var(--rule);
  border-radius: var(--r-sm);
  background: var(--pane);
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.malla-persona:hover { border-color: var(--sage); }

.malla-falta {
  color: var(--alert);
  font-size: var(--t-small);
  margin-bottom: var(--s-2);
}

/* ==========================================================================
   INDICADORES
   Vocabulario de dominio: qué es un indicador en meta, fuera de meta, sin meta
   y sin dato. **Cuatro estados, no tres**, y esa es la pantalla entera: "sin
   meta" y "sin dato" no son un verde tímido, son la negativa del sistema a
   opinar sobre algo que nadie declaró o que no tiene con qué medirse.
   ========================================================================== */

.indicadores {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
  gap: var(--s-4);
}

.indicador {
  padding: var(--s-5);
  border-radius: var(--r-md);
  background: var(--pane);
  border: 1px solid var(--rule);
  /* El filete izquierdo lleva el estado: un fondo de color en doce tarjetas a
     la vez convierte el panel en un semáforo roto. */
  border-left: 3px solid var(--rule-strong);
}
.indicador.es-cumple    { border-left-color: var(--sage); }
.indicador.es-fuera     { border-left-color: var(--alert); }
.indicador.es-sin-meta  { border-left-color: var(--rule-strong); }
.indicador.es-sin-dato  { border-left-color: var(--clay); background: var(--paper-sunk); }

.indicador-nombre {
  font-size: var(--t-small);
  color: var(--ink-soft);
  margin-bottom: var(--s-1);
}

.indicador-valor {
  font-size: var(--t-h3);
  font-weight: 700;
  line-height: 1.1;
  /* No se parte: un valor en dos líneas se lee como dos valores. */
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
/* "Sin dato" se escribe, no se deja en blanco ni se pinta como un cero. */
.indicador-vacio { font-size: var(--t-body); font-weight: 400; color: var(--clay); }

.indicador-de { color: var(--ink-soft); margin-top: 2px; }

.indicador-tendencia { margin-top: var(--s-2); font-size: var(--t-small); }
.indicador-tendencia.tono-mejor  { color: var(--sage-deep); }
.indicador-tendencia.tono-peor   { color: var(--alert); }
.indicador-tendencia.tono-igual,
.indicador-tendencia.tono-cambio { color: var(--ink-soft); }

.indicador-meta {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  flex-wrap: wrap;
  margin-top: var(--s-3);
  font-size: var(--t-small);
}

.indicador-ayuda {
  margin-top: var(--s-3);
  font-size: var(--t-small);
  color: var(--ink-faint);
}

.indicador-acciones {
  display: flex;
  gap: var(--s-2);
  flex-wrap: wrap;
  margin-top: var(--s-4);
}

/* ==========================================================================
   REPORTES
   Vocabulario propio: qué NO dice un archivo. La tarjeta dedica más espacio a
   eso que a la descripción, y es deliberado — un CSV que se abre en otra
   oficina tres meses después se lee como si fuera completo.
   ========================================================================== */

.indicadores-vistas,
.residentes-vistas { margin-bottom: var(--s-6); }

.reportes {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
  gap: var(--s-4);
}

.reporte {
  padding: var(--s-5);
  border-radius: var(--r-md);
  background: var(--pane);
  border: 1px solid var(--rule);
}

.reporte-nombre {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  flex-wrap: wrap;
  font-weight: 700;
  margin-bottom: var(--s-2);
}

.reporte-descripcion { color: var(--ink-soft); }

/* Lo que NO dice, sobre fondo hundido: se lee como una advertencia y no como
   una línea más de la descripción. */
.reporte-omite {
  margin-top: var(--s-3);
  padding: var(--s-3);
  border-radius: var(--r-sm);
  background: var(--paper-sunk);
  color: var(--ink-soft);
  font-size: var(--t-small);
}

.reporte-acciones { margin-top: var(--s-4); }

/* El teléfono en la tarjeta de persona: enlace `tel:` porque desde un
   teléfono se marca de un toque, y en gris cuando falta — que falte es
   información, no un hueco que disimular. */
.persona-telefono { margin: var(--s-1) 0 0; display: flex; align-items: center; gap: var(--s-2); }
.persona-telefono .icon { width: 16px; height: 16px; color: var(--ink-faint); }
.persona-telefono.es-vacio { color: var(--ink-faint); }


/* --------------------------------------------------- Indicador destacado
   La primera cifra del panel, en verde de marca. No es decoración: en una
   pantalla de diecisiete números iguales la vista no sabe por dónde empezar,
   y la que importa es siempre la misma — cómo va la ocupación.

   Vive aquí y no en `/shared` porque `.indicador` es vocabulario de esta
   pantalla; lo que sí viene de arriba son los tokens y `.metric-bar`. Si algún
   día otra superficie necesita una tarjeta así, sube el componente entero.

   UNA por pantalla. Si se destacan tres, no hay destacada.                 */

.indicador.is-featured {
  background: var(--sage);
  border-color: var(--sage);
  color: var(--paper);
}
.indicador.is-featured::before { display: none; }
.indicador.is-featured .indicador-nombre,
.indicador.is-featured .indicador-de,
.indicador.is-featured .indicador-ayuda,
.indicador.is-featured .indicador-tendencia { color: var(--sage-line); }
.indicador.is-featured .indicador-valor { color: var(--paper); }
.indicador.is-featured .indicador-vacio { color: var(--sage-line); }

/* Los botones dentro de la tarjeta verde: el `.btn-quiet` normal es tinta
   sobre crema y ahí desaparece. */
.indicador.is-featured .btn-quiet {
  color: var(--paper);
  border-color: rgba(246, 241, 231, 0.45);
}
.indicador.is-featured .btn-quiet:hover {
  background: rgba(246, 241, 231, 0.14);
  border-color: rgba(246, 241, 231, 0.7);
}

/* Glosa del chip «Sin meta», UNA vez bajo la rejilla en vez de repetida en
   cada tarjeta. Antes la frase completa —«Sin meta declarada · no se pinta
   semáforo»— salía diecisiete veces: la pantalla medía 12.448px de alto en un
   teléfono y la explicación dejaba de leerse por repetida. */
.nota-pie {
  margin-top: var(--s-4);
  color: var(--ink-faint);
  font-size: var(--t-small);
}

/* El chip de «Sin meta» DENTRO de la tarjeta verde.
   Sin esta regla heredaba el trazo y la tinta pensados para crema y daba
   1.71:1 sobre el verde de marca — ilegible. Lo encontró la sonda de contraste
   apuntada a esta pantalla; la auditoría de /admin lo dejaba pasar porque
   barría otra. Una guarda que no ejerce el camino roto certifica. */
.indicador.is-featured .chip-pending {
  border-color: rgba(246, 241, 231, 0.55);
  color: var(--sage-line);          /* 5.82:1 sobre --sage */
}
.indicador.is-featured .chip {
  background: rgba(246, 241, 231, 0.18);
  color: var(--paper);              /* 8.89:1 sobre --sage */
}


/* --------------------------------------------- La barra en un telefono
   Con las cuatro puertas fuera de la barra (abajo, flotando), lo que queda
   arriba tiene que caber en 320px: logotipo, hogar y salir. No cabia:
   «Cerrar sesion» partia en dos lineas y empujaba al logotipo contra el
   selector de hogar.

   Se oculta la ETIQUETA, no el boton — el nombre accesible sigue en el
   `aria-label`, asi que para un lector de pantalla no cambia nada. Y se quita
   «Administracion» del logotipo: en una pantalla de 320px, decir en que
   aplicacion estas cuando el titulo de la pagina lo dice justo debajo es
   gastar la mitad de la barra en repetirse.                                */

@media (max-width: 899px) {
  .topbar .brand-app { display: none; }
  #logout-btn .btn-label { display: none; }
  #logout-btn { min-width: var(--tap); padding-inline: var(--s-3); }
  /* El selector de hogar cede antes que el resto si hace falta. */
  .topbar .hogar-select select { max-width: 42vw; }
}

/* El titulo de seccion ENCIMA de los chips, no al lado: a 390px compiten por
   el mismo renglon y los dos quedan estrechos. En pantalla ancha si caben. */
@media (max-width: 719px) {
  .admin-main .section-head { display: block; }
  .admin-main .section-head .chip-row { margin-top: var(--s-3); }
}

/* ───────────────────────── Consentimientos ─────────────────────────
   Composición y vocabulario de dominio de esta pantalla. El lenguaje visual
   —avisos, chips, pendientes, hojas— sale tal cual de `shared/greenhouse.css`. */

/* El texto legal se lee como un documento, no como una interfaz: ancho de
   lectura cómodo, monoespaciado NO —una política en monoespaciado parece un
   volcado de consola— y los saltos de línea del servidor respetados. */
.documento-texto {
  white-space: pre-wrap;
  font-family: inherit;
  font-size: 1rem;
  line-height: 1.6;
  color: var(--ink);
  background: var(--paper-sunk);
  border: 1px solid var(--rule);
  border-radius: var(--r-md);
  padding: var(--s-4);
  max-height: 46vh;
  overflow-y: auto;
  margin: 0;
}

/* ───────────────────────── IMPRESIÓN ─────────────────────────
   El medio normal de firma es el papel, así que esto no es un extra.

   `#impresion` está fuera de la pantalla en uso normal y es lo ÚNICO que se
   imprime: sin la regla que esconde el resto, saldrían la barra superior, las
   pestañas y el panel entero detrás del documento. Se usa el diálogo del
   navegador —que trae «Guardar como PDF»— en vez de una librería, porque estos
   frontends no tienen build step y una dependencia más hay que mantenerla. */
#impresion { display: none; }

@media print {
  /* Nada de la aplicación se imprime; solo el documento. */
  body > *:not(#impresion) { display: none !important; }

  #impresion {
    display: block;
    /* Negro sobre blanco: un documento que se firma y se archiva no lleva el
       crema de la marca — y en una impresora de oficina el crema sale gris. */
    color: #000;
    background: #fff;
    font-family: Georgia, 'Times New Roman', serif;
    font-size: 11pt;
    line-height: 1.5;
    max-width: 100%;
  }
  #impresion h1 { font-size: 15pt; margin: 0 0 1em; }
  #impresion h2 { font-size: 12pt; margin: 1.4em 0 0.5em; }
  #impresion pre { white-space: pre-wrap; font-family: inherit; font-size: 10.5pt; }
  /* Una finalidad no se parte entre dos páginas: su casilla y su explicación
     tienen que leerse juntas o la familia marca a ciegas. */
  #impresion .autorizacion-item { break-inside: avoid; margin-bottom: 1em; }
  @page { margin: 2cm; }
}

/* ==========================================================================
   Pedidos de las familias (vista de Cartera)
   ========================================================================== */

.pedido-fam {
  background: var(--pane); border-radius: var(--r-lg, 26px);
  padding: var(--s-5); margin-bottom: var(--s-4);
  box-shadow: inset 4px 0 0 var(--accent-lit);
}
.pedido-fam-head { display: flex; justify-content: space-between; gap: var(--s-4); align-items: flex-start; }
.pedido-fam-head h3 { margin: 0; }
.pedido-fam-total { font-size: 1.2rem; white-space: nowrap; }
.pedido-fam-lineas { list-style: none; margin: var(--s-4) 0; padding: 0; display: grid; gap: var(--s-3); }
.pedido-fam-lineas li {
  display: grid; grid-template-columns: 1fr auto; gap: var(--s-1) var(--s-4);
  padding-bottom: var(--s-3); border-bottom: 1px solid var(--rule);
}
.pedido-fam-lineas li > span:first-child { min-width: 0; overflow-wrap: anywhere; }
.pedido-fam-cob { grid-column: 1 / -1; color: var(--ink-soft); }
.pedido-fam-cobro { grid-column: 1 / -1; border: 1px dashed var(--rule); border-radius: var(--r-md); padding: var(--s-3) var(--s-4); margin: 0; }
.pedido-fam-cobro legend { font-weight: 700; padding: 0 var(--s-1); }
.pedido-fam-cobro label { display: inline-flex; align-items: center; gap: var(--s-2); min-height: var(--tap); margin-right: var(--s-5); }
.pedido-fam-acciones { display: flex; gap: var(--s-3); flex-wrap: wrap; }
.pedible-check { display: inline-flex; align-items: center; gap: var(--s-2); min-height: var(--tap); }
.pedible-check input { width: 24px; height: 24px; accent-color: var(--sage); }
.precio-input { min-height: var(--tap); width: 9rem; }

/* Cómo se pone el precio de los pedidos (D6). `.choice` es un botón con
   aria-pressed; aquí es un radio dentro de una etiqueta, así que lo elegido se
   marca con :has() y no con el atributo. */
.politica-precio { display: grid; gap: var(--s-3); margin-bottom: var(--s-6); }
.politica-precio-modo { border: 0; padding: 0; margin: 0; display: grid; gap: var(--s-3); min-width: 0; }
.politica-precio-modo legend { font-weight: 700; margin-bottom: var(--s-2); }
.politica-precio .choice input { width: 22px; height: 22px; flex: none; accent-color: var(--sage); }
.politica-precio .choice:has(input:checked) { border-color: var(--sage); background: var(--sage-wash); }
.politica-precio-campos { display: grid; gap: var(--s-3); grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr)); }

/* Una política de la casa, dicha junto a lo que gobierna, con su botón para
   cambiarla: el horario de visitas sobre los residentes, el vencimiento sobre
   la cartera. */
.politica-linea {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-3);
  padding: var(--s-3) var(--s-4); margin: 0 0 var(--s-5);
  background: var(--paper-sunk); border-radius: var(--r-md);
}
.politica-linea p { margin: 0; flex: 1 1 240px; }

/* Pagos en línea por revisar (Cartera → Cobrar). */
.pago-revisar { padding: var(--s-3) 0; border-top: 1px solid var(--rule); }
.pago-revisar p { margin: 0 0 var(--s-1); overflow-wrap: anywhere; }
.pago-revisar-form { display: flex; flex-wrap: wrap; gap: var(--s-2); margin-top: var(--s-2); }
.pago-revisar-form input { flex: 1 1 220px; min-width: 0; }
.pago-revisar-form .field-error { flex-basis: 100%; }

/* ==========================================================================
   PORTADA DEL PANEL (diseño `Casa Verdezza Admin re.html`, oct. 2026)
   La única superficie oscura del panel: un saludo, una frase que sale de los
   datos y el anillo de la ocupación. Reemplaza a la tarjeta destacada — una
   cifra destacada por pantalla, y ahora es esta.

   Sobre el verde solo hay tres tintas: `--paper` para lo que se lee,
   `--accent-on-dark` para la versalita dorada (el único oro legible sobre
   verde) y `--sage-line` para lo secundario. El oro del anillo es
   `--accent-lit`: decorativo, no lleva texto.
   ========================================================================== */

.portada {
  position: relative; overflow: hidden;
  display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
  align-items: center; gap: var(--s-8);
  padding: clamp(var(--s-6), 4vw, 52px);
  margin-bottom: var(--s-8);
  border-radius: 36px;
  background: var(--sage); color: var(--paper);
  box-shadow: 0 30px 60px -40px color-mix(in srgb, var(--sage-deep) 80%, transparent);
  animation: gh-sube var(--dur-slow) var(--ease) both;
}
.portada-marca-agua {
  position: absolute; right: -80px; bottom: -110px;
  width: 400px; height: 400px; opacity: 0.08;
  pointer-events: none;
  animation: gh-flota 9s ease-in-out infinite;
}
.portada-texto { position: relative; display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; }
.portada-fecha { display: flex; align-items: center; gap: var(--s-4); }
.portada-fecha img { flex: none; border-radius: 14px; animation: gh-marca var(--dur-slow) 200ms var(--ease) both; }
.portada-fecha span,
.portada-micro {
  font-size: var(--t-micro); font-weight: 700; letter-spacing: 0.22em; text-transform: uppercase;
  color: var(--accent-on-dark);
}
.portada h2 {
  margin: 0;
  font-family: var(--font-display); font-weight: 600;
  font-size: clamp(2.2rem, 5vw, 4rem); line-height: 1.02; letter-spacing: -0.02em;
  color: var(--paper);
  text-wrap: balance;
}
.portada-saludo { display: block; color: var(--sage-line); font-size: 0.55em; letter-spacing: -0.01em; margin-bottom: 0.15em; }
.portada-frase { margin: 0; max-width: 34em; font-size: 1.15rem; line-height: 1.55; color: var(--paper); opacity: 0.92; text-wrap: pretty; }
.portada-chips { display: flex; flex-wrap: wrap; gap: var(--s-2); }
.portada-chip {
  display: inline-flex; align-items: center; gap: var(--s-2);
  padding: 10px 16px; border-radius: var(--r-pill);
  background: rgba(246, 241, 231, 0.12);
  font-weight: 700; color: var(--paper);
  font-variant-numeric: tabular-nums;
}
.portada-chip.es-quieto { background: transparent; border: 1px dashed rgba(246, 241, 231, 0.4); }

.portada-ocupacion {
  position: relative;
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
  gap: var(--s-6);
}
.anillo { position: relative; width: min(240px, 70vw); aspect-ratio: 1; flex: none; }
.anillo svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.anillo svg:first-child { transform: rotate(-90deg); }
.anillo-fondo { fill: none; stroke: rgba(246, 241, 231, 0.14); stroke-width: 18; }
.anillo-valor {
  fill: none; stroke: var(--accent-lit); stroke-width: 18; stroke-linecap: round;
  transition: stroke-dashoffset 1.4s var(--ease);
}
.anillo-orbita { animation: gh-spin 14s linear infinite; }
.anillo-orbita circle { fill: var(--paper); }
.anillo-centro {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
}
.anillo-cifra {
  font-family: var(--font-display); font-weight: 600;
  font-size: clamp(3rem, 12vw, 4rem); line-height: 1;
  font-variant-numeric: tabular-nums; color: var(--paper);
}
.anillo-cifra small { font-size: 0.48em; }
.anillo-de { color: var(--sage-line); }
.anillo-sin-dato { font-family: var(--font-display); font-size: 1.6rem; color: var(--sage-line); }

.portada-ocupacion-txt { display: flex; flex-direction: column; gap: var(--s-3); color: var(--paper); }
.portada-veredicto {
  align-self: flex-start;
  padding: 6px 14px; border-radius: var(--r-pill);
  font-size: var(--t-micro); font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase;
}
.portada-veredicto.es-ok { background: var(--sage-line); color: var(--sage-deep); }
.portada-veredicto.es-fuera { background: var(--clay-wash); color: var(--clay); }
.portada-ir {
  align-self: flex-start;
  display: inline-flex; align-items: center; gap: var(--s-2);
  min-height: var(--tap); padding: 0 var(--s-5);
  border-radius: var(--r-pill);
  border: 1.5px solid rgba(246, 241, 231, 0.45);
  background: transparent; color: var(--paper);
  font: inherit; font-weight: 700; cursor: pointer;
  transition: gap var(--dur) var(--ease), background var(--dur-fast) var(--ease-soft), color var(--dur-fast) var(--ease-soft);
}
.portada-ir:hover, .portada-ir:focus-visible { gap: var(--s-4); background: var(--paper); color: var(--sage-deep); }

@media (prefers-reduced-motion: reduce) {
  .portada, .portada-marca-agua, .portada-fecha img, .anillo-orbita { animation: none; }
  .anillo-valor { transition: none; }
}

/* --------------------------------------------- Tarjetas de indicador vivas
   La cifra en Fraunces y grande, como en el diseño: es lo que se viene a
   leer. La barra (solo en proporciones) lleva la línea de la meta. */
.indicador { border-radius: 26px; padding: var(--s-6); display: flex; flex-direction: column; }
.indicador .indicador-valor {
  font-family: var(--font-display); font-weight: 600;
  font-size: clamp(2.4rem, 4vw, 3.4rem); line-height: 1;
  letter-spacing: -0.01em;
  margin-top: var(--s-2);
}
.indicador .indicador-vacio { font-family: var(--font-display); font-size: 1.6rem; }
.indicador-acciones { margin-top: auto; padding-top: var(--s-4); }
.indicador-barra-meta { margin-top: var(--s-2); color: var(--ink-soft); font-size: var(--t-small); }

/* El título de cada grupo: grande, con su filete hasta el borde. */
.grupo-head { display: flex; align-items: baseline; gap: var(--s-4); margin: var(--s-10) 0 var(--s-5); }
.grupo-head h2 {
  margin: 0; font-family: var(--font-display); font-weight: 600;
  font-size: clamp(1.6rem, 3vw, 2.1rem); letter-spacing: -0.015em; color: var(--sage-deep);
}
.grupo-head::after { content: ""; flex: 1; height: 1px; background: var(--rule); order: 1; }
.grupo-head span { order: 2; color: var(--ink-soft); }

/* La puerta abierta: el fondo lo pone el indicador que viaja (motion.js), no
   la pestaña. En escritorio, píldora; en la barra flotante del teléfono, la
   misma esquina que la pestaña. */
.admin-puertas.gh-con-indicador .tab[aria-pressed="true"] { background: transparent; }
.admin-puertas .gh-indicador { background: var(--sage-soft); }
@media (min-width: 900px) {
  .admin-puertas .gh-indicador { border-radius: var(--r-pill); }
}
@media (min-width: 900px) {
  /* Posicionada para que el indicador se mida contra ella (en el teléfono ya
     lo está: es `fixed`). */
  .admin-puertas { position: relative; }
}

/* Préstamos de la bodega por decidir: cada uno con sus dos salidas. */
.prestamo-fila { padding: var(--s-3) 0; border-top: 1px solid var(--rule); }
.prestamo-fila:first-child { border-top: 0; }
.prestamo-fila p { margin: 0; }
.prestamo-acciones { display: flex; flex-wrap: wrap; gap: var(--s-2); margin-top: var(--s-2); }
