/* ─────────────────────────────────────────────────────────────────────────────
   Documentación de Prestadores — estilos.
   Mismo lenguaje visual que el backoffice: acento dorado, pestañas.
   Sin framework ni compilación: un archivo, y se abre.

   ── LOS DOS TEMAS ────────────────────────────────────────────────────
   El oscuro está en `:root` y el claro en `:root[data-tema="claro"]`. La marca la
   pone un script chiquito en el <head>, ANTES de que se dibuje nada: si se hiciera
   al final, la pantalla aparecería oscura y saltaría a clara de golpe.

   Ningún color se escribe fuera de estos dos bloques. Un color suelto en una
   regla anda en un tema y en el otro deja texto ilegible sobre un fondo del
   color equivocado, y eso no se ve hasta que alguien cambia el tema.

   El claro NO es el oscuro invertido: el dorado #d4af5f sobre blanco casi no se
   lee, así que ahí el dorado de TEXTO se oscurece. Por eso hay dos dorados: el
   que se lee (`--oro-texto`) y el que se usa como relleno del botón (`--oro`).
   ───────────────────────────────────────────────────────────────────────────── */

:root {
  --fondo:        #0f1218;
  --panel:        #1a1f2b;
  --panel-alto:   #212836;
  --borde:        #2b3342;
  --borde-suave:  #232a37;
  --texto:        #e7ebf2;
  --texto-suave:  #9aa5b8;
  --texto-tenue:  #6b7688;

  --oro:          #d4af5f;   /* relleno del botón */
  --oro-alto:     #e8c87d;
  --oro-texto:    #d4af5f;   /* dorado que tiene que leerse sobre el fondo */
  --oro-tenue:    #d4af5f22;
  --oro-contra:   #241d08;   /* el texto ENCIMA del botón dorado */

  --rojo:   #e7706c;  --rojo-bg:   #e5645f1f;  --rojo-aviso:  #f3a5a2;
  --ambar:  #f0c261;  --ambar-bg:  #e0a04a1f;
  --verde:  #62b87f;  --verde-bg:  #62b87f1f;  --verde-aviso: #a5dcb8;
  --gris:   #8e98a6;  --gris-bg:   #7c879820;
  --azul:   #8fc4ff;  --azul-bg:   #6b9fd41f;  --azul-aviso:  #a9cbe9;

  --rojo-borde:  #e5645f44;  --rojo-borde-fuerte:  #e5645f55;
  --ambar-borde: #e0a04a44;
  --verde-borde: #62b87f44;  --verde-borde-fuerte: #62b87f55;
  --gris-borde:  #7c879944;  --gris-bg-suave:      #7c879915;  --gris-borde-suave: #7c879930;
  --azul-borde:  #6b9fd444;  --azul-borde-fuerte:  #6b9fd455;

  --hover:      #1e2532;     /* fila de tabla al pasar el mouse */
  --btn-hover:  #263041;
  --velo:       #05070bbb;   /* el fondo detrás de un modal */
  --sombra:     #0009;
  --sombra-baja: #0008;

  --r: 10px;
}

/* El claro. Pensado sobre blanco, no calculado por inversión: los acentos se
   oscurecen hasta que se leen, y los fondos toman un gris apenas azulado para no
   encandilar en una pantalla que se mira todo el día. */
:root[data-tema="claro"] {
  --fondo:        #eef1f6;
  --panel:        #ffffff;
  --panel-alto:   #f4f7fa;
  --borde:        #d2dae5;
  --borde-suave:  #e5eaf2;
  --texto:        #15202c;
  --texto-suave:  #4f5d70;
  --texto-tenue:  #7d8898;

  --oro:          #c8a24a;
  --oro-alto:     #e0be6b;
  --oro-texto:    #866612;
  --oro-tenue:    #86661218;
  --oro-contra:   #241d08;

  --rojo:   #c0392b;  --rojo-bg:   #c0392b14;  --rojo-aviso:  #8f2b20;
  --ambar:  #916611;  --ambar-bg:  #9a6c1214;
  --verde:  #2c7a4d;  --verde-bg:  #2c7a4d14;  --verde-aviso: #1f5a38;
  --gris:   #616c7c;  --gris-bg:   #616c7c14;
  --azul:   #15528f;  --azul-bg:   #2b6cb014;  --azul-aviso:  #1f4f80;

  --rojo-borde:  #c0392b3d;  --rojo-borde-fuerte:  #c0392b55;
  --ambar-borde: #9a6c123d;
  --verde-borde: #2c7a4d3d;  --verde-borde-fuerte: #2c7a4d55;
  --gris-borde:  #616c7c3d;  --gris-bg-suave:      #616c7c10;  --gris-borde-suave: #616c7c2e;
  --azul-borde:  #2b6cb03d;  --azul-borde-fuerte:  #2b6cb055;

  --hover:      #e9eef5;
  --btn-hover:  #e2e8f1;
  --velo:       #33405599;
  --sombra:     #1e293a24;
  --sombra-baja: #1e293a20;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--fondo);
  color: var(--texto);
  font: 14px/1.5 'Segoe UI', system-ui, -apple-system, sans-serif;
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3 { margin: 0; font-weight: 700; letter-spacing: .3px; }
a { color: var(--oro-texto); }

/* ── Encabezado ───────────────────────────────────────────────────────── */
header {
  background: var(--panel);
  border-bottom: 1px solid var(--borde);
  padding: 18px 28px 0;
  position: sticky; top: 0; z-index: 20;
}
.titulo { display: flex; align-items: baseline; gap: 14px; margin-bottom: 16px; }
.titulo h1 { font-size: 17px; text-transform: uppercase; }
.titulo span { color: var(--texto-tenue); font-size: 12px; }

nav { display: flex; gap: 4px; }
nav button {
  background: none; border: none; border-bottom: 2px solid transparent;
  color: var(--texto-suave); font: 600 12px/1 'Segoe UI', sans-serif;
  letter-spacing: 1.1px; text-transform: uppercase;
  padding: 14px 20px; cursor: pointer; transition: color .15s, border-color .15s;
}
nav button:hover { color: var(--texto); }
nav button.activa { color: var(--oro-texto); border-bottom-color: var(--oro-texto); }
nav button .pastilla {
  display: inline-block; margin-left: 8px; padding: 1px 7px; border-radius: 20px;
  background: var(--rojo-bg); color: var(--rojo); font-size: 11px; letter-spacing: 0;
}

main { padding: 26px 28px 60px; max-width: 1500px; }

/* ── Barra de acciones ────────────────────────────────────────────────── */
.barra {
  display: flex; gap: 12px; align-items: center; flex-wrap: wrap; margin-bottom: 20px;
}
.barra .crecer { flex: 1; }

input, select, textarea {
  background: var(--panel-alto); border: 1px solid var(--borde); border-radius: 8px;
  color: var(--texto); padding: 9px 12px; font: inherit; width: 100%;
}
input:focus, select:focus, textarea:focus {
  outline: none; border-color: var(--oro-texto); box-shadow: 0 0 0 3px var(--oro-tenue);
}
input::placeholder { color: var(--texto-tenue); }

/* Un dato que el formulario muestra pero no deja tocar —la institución de un
   usuario, que la decide el lugar desde donde se abrió—. Tiene la forma de un
   campo para que la fila no se descuadre, y el fondo apagado para que se lea
   como lo que es: un dato, no algo para completar. */
.dato-fijo {
  background: var(--panel); border: 1px dashed var(--borde); border-radius: 8px;
  color: var(--texto); padding: 9px 12px; font-weight: 600;
}
label { display: block; color: var(--texto-suave); font-size: 12px; margin-bottom: 6px; }
/* ── UN CAMPO ESCONDIDO TIENE QUE ESTAR ESCONDIDO ─────────────────────
   La línea de arriba rompe el atributo `hidden` de HTML.

   El navegador trae `[hidden] { display: none }` en SU hoja, y las hojas del
   autor le ganan siempre a las del navegador, sin importar la especificidad. Así
   que `label { display: block }` deja visible cualquier `<label hidden>`, y
   poner `.hidden = true` desde el código no hace absolutamente nada.

   Se vio en la ventana de envío: al elegir «minuta» seguía pidiendo el año, que
   es de los documentos, y al elegir un documento seguía pidiendo la fecha de la
   reunión. Sin error en la consola y sin nada raro en el JavaScript: el código
   escondía bien y el estilo lo volvía a mostrar.

   Va acotado a `label` a propósito, que es lo que la línea de arriba rompe. */
label[hidden] { display: none; }
label .req { color: var(--oro-texto); }

/* Controles en línea. La regla del checkbox hace falta porque los `input` de
   arriba son `width: 100%` y una casilla así sale estirada de lado a lado. */
.linea { display: flex; align-items: center; gap: 9px; }
label.linea {
  cursor: pointer; color: var(--texto); font-size: 13px; font-weight: 600; margin-bottom: 0;
}
.linea input[type="checkbox"] {
  width: 16px; height: 16px; flex: none; accent-color: var(--oro-texto); cursor: pointer;
}
/* El campo que deja de aplicar no se esconde: se atenúa. Esconderlo haría creer
   que la configuración se perdió. */
.apagado { opacity: .4; pointer-events: none; }

.btn {
  background: var(--panel-alto); border: 1px solid var(--borde); border-radius: 8px;
  color: var(--texto); font: 600 12px/1 'Segoe UI', sans-serif; letter-spacing: .6px;
  padding: 11px 16px; cursor: pointer; white-space: nowrap; transition: .15s;
}
.btn:hover { border-color: var(--texto-tenue); background: var(--btn-hover); }
.btn.oro {
  background: linear-gradient(180deg, var(--oro-alto), var(--oro));
  border-color: var(--oro); color: var(--oro-contra); text-transform: uppercase;
}
.btn.oro:hover { filter: brightness(1.08); }
.btn.fina { padding: 7px 11px; font-size: 11px; }
.btn.peligro:hover { border-color: var(--rojo); color: var(--rojo); }
.btn:disabled { opacity: .45; cursor: not-allowed; }

/* ── Tarjetas de resumen ──────────────────────────────────────────────── */
.tarjetas { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; margin-bottom: 22px; }
.tarjeta {
  background: var(--panel); border: 1px solid var(--borde); border-radius: var(--r);
  padding: 16px 18px; border-left: 3px solid var(--borde);
}
.tarjeta .n { font-size: 27px; font-weight: 700; line-height: 1.1; }
.tarjeta .r { color: var(--texto-suave); font-size: 11px; text-transform: uppercase; letter-spacing: .9px; margin-top: 4px; }
.tarjeta.VENCIDO    { border-left-color: var(--rojo); }  .tarjeta.VENCIDO .n    { color: var(--rojo); }
.tarjeta.POR_VENCER { border-left-color: var(--ambar); } .tarjeta.POR_VENCER .n { color: var(--ambar); }
.tarjeta.FALTANTE   { border-left-color: var(--gris); }  .tarjeta.FALTANTE .n   { color: var(--texto-suave); }
.tarjeta.SIN_FECHA  { border-left-color: var(--azul); }  .tarjeta.SIN_FECHA .n  { color: var(--azul); }
.tarjeta.VIGENTE    { border-left-color: var(--verde); } .tarjeta.VIGENTE .n    { color: var(--verde); }

/* ── Tablas ───────────────────────────────────────────────────────────── */
.caja { background: var(--panel); border: 1px solid var(--borde); border-radius: var(--r); overflow: hidden; }
.caja > .cabecera {
  padding: 15px 18px; border-bottom: 1px solid var(--borde);
  display: flex; align-items: center; gap: 12px;
}
.caja > .cabecera h3 { font-size: 13px; text-transform: uppercase; letter-spacing: 1px; color: var(--texto-suave); }
.desliza { overflow-x: auto; }

table { width: 100%; border-collapse: collapse; }
th {
  text-align: left; padding: 11px 16px; font-size: 11px; letter-spacing: 1px;
  text-transform: uppercase; color: var(--texto-tenue); font-weight: 600;
  border-bottom: 1px solid var(--borde); white-space: nowrap;
}
td { padding: 13px 16px; border-bottom: 1px solid var(--borde-suave); vertical-align: middle; }
tbody tr:last-child td { border-bottom: none; }
tbody tr.clic { cursor: pointer; }
tbody tr.clic:hover { background: var(--hover); }
/* Los importes NO se parten en dos líneas. «+$ 761.782» cortado después del `$`
   deja de leerse como un número y hay que reconstruirlo con la vista. */
td.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }

/* ── Vencimientos: agenda por plazo ───────────────────────────────────── */
/* El encabezado de cada franja. El color lo pone el plazo, no el estado: dentro
   de «Vencidos» todo está vencido, así que repetir el chip en cada fila sería
   decir lo mismo cinco veces. */
tbody tr.franja > td {
  background: var(--fondo);
  border-bottom: 1px solid var(--borde);
  padding: 18px 16px 8px;
}
tbody tr.franja:first-child > td { padding-top: 6px; }
tbody tr.franja .rotulo {
  font-size: 11px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase;
}
tbody tr.franja .cuantos { color: var(--texto-tenue); font-size: 12px; margin-left: 10px; }
tbody tr.franja.r-vencido  .rotulo { color: var(--rojo); }
tbody tr.franja.r-semana   .rotulo { color: var(--ambar); }
tbody tr.franja.r-mes      .rotulo { color: var(--ambar); }
tbody tr.franja.r-adelante .rotulo { color: var(--azul); }
tbody tr.franja.r-faltante .rotulo { color: var(--gris); }

/* La fila abierta y su detalle se leen como un bloque: sin la marca de color a
   la izquierda, con tres prestadores desplegados no se sabe dónde termina uno. */
tbody tr.resumen.abierta > td { background: var(--hover); }
tbody tr.resumen.abierta > td:first-child { box-shadow: inset 3px 0 0 var(--oro-texto); }
tbody tr.detalle > td {
  background: var(--panel-alto); padding-top: 9px; padding-bottom: 9px; font-size: 13px;
}
tbody tr.detalle > td:first-child { box-shadow: inset 3px 0 0 var(--oro-texto); }
/* Los chips del resumen se apilan si no entran, en vez de estirar la columna. */
tbody tr.resumen .chip { margin: 2px 4px 2px 0; }
.tenue { color: var(--texto-tenue); }
.suave { color: var(--texto-suave); }
.mono { font-family: 'Cascadia Mono', Consolas, monospace; font-size: 12.5px; }

/* ── Estados ──────────────────────────────────────────────────────────── */
.chip {
  display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px;
  border-radius: 20px; font-size: 11px; font-weight: 600; letter-spacing: .4px;
  white-space: nowrap; border: 1px solid transparent;
}
.chip::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.chip.VENCIDO    { color: var(--rojo);  background: var(--rojo-bg);  border-color: var(--rojo-borde); }
.chip.POR_VENCER { color: var(--ambar); background: var(--ambar-bg); border-color: var(--ambar-borde); }
.chip.FALTANTE   { color: var(--gris);  background: var(--gris-bg);  border-color: var(--gris-borde); }
.chip.SIN_FECHA  { color: var(--azul);  background: var(--azul-bg);  border-color: var(--azul-borde); }
.chip.VIGENTE    { color: var(--verde); background: var(--verde-bg); border-color: var(--verde-borde); }
.chip.NO_APLICA  { color: var(--texto-tenue); background: var(--gris-bg-suave); border-color: var(--gris-borde-suave); }

.barra-progreso { height: 5px; background: var(--borde); border-radius: 4px; overflow: hidden; width: 90px; }
.barra-progreso i { display: block; height: 100%; background: var(--verde); }

/* ── Modal ────────────────────────────────────────────────────────────── */
/*
   El modal se ajusta a la ventana en lugar de crecer y empujar la página.
   `align-items: center` con `max-height` en el modal y el scroll METIDO ADENTRO
   del cuerpo: el título y los botones quedan siempre a la vista, así que nunca
   hay que scrollear para encontrar «Guardar». Antes el velo scrolleaba entero y
   en una pantalla baja el botón quedaba abajo de todo, fuera de cuadro.
*/
.velo {
  position: fixed; inset: 0; background: var(--velo); backdrop-filter: blur(3px);
  display: flex; align-items: center; justify-content: center; z-index: 40;
  padding: 20px; overflow: hidden;
}
.velo[hidden] { display: none; }
.modal {
  background: var(--panel); border: 1px solid var(--borde); border-radius: 14px;
  width: 100%; max-width: 1180px; box-shadow: 0 24px 70px var(--sombra);
  /* Columna con el cuerpo elástico: es lo que deja el scroll adentro. */
  display: flex; flex-direction: column; max-height: calc(100vh - 40px);
}
/* La ficha del prestador usa casi toda la pantalla: adentro está la tabla del
   simulador, que tiene nueve columnas y dos de ellas son precios con centavos.
   A 1180 px los nombres se partían en dos líneas y los importes también. */
#velo-legajo .modal { max-width: min(1720px, 97vw); }
/* «Angosto» es el de los formularios. Ancho suficiente para tres columnas: con
   dos, un alta de prestador no entraba en la pantalla y había que scrollear. */
.modal.angosto { max-width: 900px; }
.modal > .cabecera {
  padding: 18px 26px; border-bottom: 1px solid var(--borde);
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  flex: none;
}
.modal > .cabecera h2 { font-size: 15px; text-transform: uppercase; letter-spacing: .8px; }
.cerrar {
  background: none; border: none; color: var(--texto-tenue); font-size: 24px;
  line-height: 1; cursor: pointer; padding: 0 4px;
}
.cerrar:hover { color: var(--texto); }
/* `min-height: 0` es lo que permite que un hijo de flex se achique y scrollee.
   Sin eso el cuerpo crece con su contenido y se lleva el pie fuera de la ventana. */
.modal .cuerpo { padding: 22px 26px; overflow-y: auto; flex: 1; min-height: 0; }
.modal .pie {
  padding: 16px 26px; border-top: 1px solid var(--borde);
  display: flex; justify-content: flex-end; gap: 10px; flex: none;
}
.modal nav { padding: 0 26px; border-bottom: 1px solid var(--borde); flex: none; }
/* Con siete solapas, en una pantalla angosta hay que poder llegar a la última. */
#menu-legajo { overflow-x: auto; }
#menu-legajo button { white-space: nowrap; padding: 14px 15px; }

/* Submenú de la configuración del padrón. Va más discreto que el menú principal:
   es un segundo nivel, y si se ve igual de fuerte compiten. */
#menu-config {
  display: flex; gap: 4px; margin-bottom: 20px;
  border-bottom: 1px solid var(--borde);
}
#menu-config button {
  background: none; border: none; border-bottom: 2px solid transparent;
  color: var(--texto-suave); font: 600 12px/1 'Segoe UI', sans-serif;
  letter-spacing: .8px; padding: 11px 16px; cursor: pointer;
}
#menu-config button:hover { color: var(--texto); }
#menu-config button.activa { color: var(--oro-texto); border-bottom-color: var(--oro-texto); }

/* Pie de acciones de una solapa. `empuja` separa lo destructivo de lo habitual:
   «Dar de baja» pegado a «Editar datos» se toca por error. */
.acciones { margin-top: 22px; display: flex; gap: 10px; align-items: center; }
.acciones .empuja { flex: 1; }

/* ── Marca: de quién es el sistema y en qué módulo estás ──────────────── */
.titulo .modulo {
  font: 600 10px/1 'Segoe UI', sans-serif; letter-spacing: 1.6px; text-transform: uppercase;
  color: var(--oro-texto); border-left: 1px solid var(--borde); padding-left: 12px;
}

/* Cada prestador que entra en la mesa de esa obra social, en su renglón: en una
   línea separada por comas, con quince, no se distingue dónde termina uno. */
.para-quien { font-size: 12.5px; padding: 1px 0; cursor: pointer; }
.para-quien:hover { color: var(--oro-texto); text-decoration: underline; }

/* ── Asignar obras sociales y prepagas a un prestador ─────────────────── */
/* En columnas: con veinte financiadores cargados, una lista vertical obliga a
   scrollear el formulario entero para tildar dos. */
#lista-financiadores-prestador {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 4px 14px;
}
.opcion-fin {
  padding: 6px 8px; border-radius: 7px; font-weight: 400; font-size: 13px;
  cursor: pointer; transition: background .12s;
}
.opcion-fin:hover { background: var(--hover); }
.opcion-fin span:first-of-type { flex: 1; }
.opcion-fin input:checked ~ span:first-of-type { font-weight: 600; color: var(--oro-texto); }

/* ── Ingreso ──────────────────────────────────────────────────────────── */
/* El velo del ingreso no se cierra con Escape ni tocando el fondo: no hay nada
   detrás hasta que haya sesión. */
/* El ingreso y el cambio de contraseña comparten esta clase: son las dos
   pantallas que se ven ANTES de entrar, sin nada detrás.

   Van ancladas arriba y no centradas. Centrada, en un monitor alto la tarjeta
   queda flotando en medio de medio metro de negro —a 1440 px de alto le quedan
   538 arriba— y la pantalla se lee como si se hubiera cargado a medias. El tope
   en píxeles es para que en una notebook no quede pegada al borde de arriba, y
   el scroll para que el botón siga alcanzable en una ventana muy baja. */
.velo-ingreso {
  background: var(--fondo); backdrop-filter: none;
  align-items: flex-start;
  padding-top: min(15vh, 200px);
  overflow-y: auto;
}
/* El ingreso tiene dos campos y un botón: 420 px lo dejaban con los casilleros
   más anchos que cualquier dato que se escriba adentro, y una tarjeta con mucho
   aire alrededor de poco contenido se lee como una pantalla a medio terminar. */
.modal.ingreso { max-width: 340px; }
.marca-ingreso {
  padding: 30px 26px 22px; border-bottom: 1px solid var(--borde); text-align: center;
}
.marca-ingreso h1 {
  font-size: 17px; text-transform: uppercase; letter-spacing: 1.4px; margin-bottom: 8px;
}
.marca-ingreso .modulo {
  font: 600 10px/1 'Segoe UI', sans-serif; letter-spacing: 1.8px;
  text-transform: uppercase; color: var(--oro-texto); border: none; padding: 0;
}
.modal.ingreso .pie { justify-content: stretch; }
.modal.ingreso .pie .btn { flex: 1; text-align: center; }

.quien {
  color: var(--texto-suave); font-size: 12.5px; font-weight: 600;
  padding-right: 4px; white-space: nowrap;
}

/* La contraseña generada: grande y en monoespaciada, porque se dicta o se copia
   a mano y hay que poder distinguir cada carácter. */
.clave-generada {
  font: 700 22px/1.4 'Cascadia Mono', Consolas, monospace;
  letter-spacing: 2px; text-align: center; color: var(--oro-texto);
  background: var(--panel-alto); border: 1px dashed var(--oro-texto);
  border-radius: var(--r); padding: 18px; user-select: all; word-break: break-all;
}

tbody tr.inactivo > td { opacity: .5; }

/* ── Gráficos del tablero ─────────────────────────────────────────────── */
.graficos { display: grid; grid-template-columns: repeat(auto-fit, minmax(440px, 1fr)); gap: 16px; }
.grafico { padding-bottom: 0; }

/* La barra apilada, en HTML y no en SVG: un SVG estirado a lo ancho deforma
   también el texto de adentro, y los números salían aplastados.
   El `gap` de 2px es el que separa dos colores parecidos; sin él se leen como
   un solo bloque. */
.grafico-barra { display: flex; gap: 2px; width: 100%; }
.grafico-barra .seg {
  display: flex; align-items: center; justify-content: center;
  border-radius: 4px; min-width: 3px; transition: opacity .12s;
  /* Un número que no entra se recorta en vez de desbordarse sobre el segmento
     de al lado: la leyenda lo dice igual, y un dígito montado sobre otro color
     se lee como si fuera de ese otro. */
  overflow: hidden;
}
.grafico-barra .seg:hover, .grafico-barra .seg:focus { opacity: .78; }
.grafico-barra .seg:focus { outline: 2px solid var(--texto); outline-offset: 1px; }
/* El número va encima del color, que siempre es el más claro del par en tema
   oscuro y el más oscuro en claro: por eso toma el color del fondo de página. */
.grafico-barra .seg span {
  font: 700 11px 'Segoe UI', sans-serif; color: var(--fondo);
  font-variant-numeric: tabular-nums; pointer-events: none;
}

.leyenda { display: flex; gap: 16px; flex-wrap: wrap; margin-top: 14px; font-size: 12px; }
.item-leyenda { display: flex; align-items: center; gap: 7px; color: var(--texto-suave); }
.item-leyenda i { width: 10px; height: 10px; border-radius: 3px; flex: none; }
.item-leyenda b { color: var(--texto); font-variant-numeric: tabular-nums; }

/* Una fila por prestador: nombre, barra y total. */
.fila-grafico {
  display: grid; grid-template-columns: 165px 1fr 34px;
  align-items: center; gap: 12px; padding: 5px 0;
}
.fila-grafico.clic { cursor: pointer; border-radius: 6px; }
.fila-grafico.clic:hover { background: var(--hover); }
.nombre-grafico {
  font-size: 12.5px; font-weight: 600; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
.total-grafico {
  font-size: 11.5px; color: var(--texto-tenue); text-align: right;
  font-variant-numeric: tabular-nums;
}

/* El globo del hover. Uno solo para todos los segmentos. */
.globo {
  position: fixed; z-index: 60; transform: translate(-50%, -100%);
  background: var(--panel-alto); border: 1px solid var(--borde); border-radius: 7px;
  padding: 7px 11px; font-size: 12px; color: var(--texto);
  box-shadow: 0 8px 22px var(--sombra); pointer-events: none; white-space: nowrap;
}

@media (max-width: 620px) {
  .fila-grafico { grid-template-columns: 1fr; gap: 4px; }
  .total-grafico { text-align: left; }
}

/* ── Inicio: el buscador de prestador ─────────────────────────────────── */
/* Grande y arriba de todo. Con muchos prestadores, «abrir a fulano» es lo que
   más se hace, y escribir el nombre tiene que ser más corto que ir a la lista. */
.buscador-inicio { max-width: 680px; margin-bottom: 22px; }
.buscador-inicio input { font-size: 16px; padding: 14px 18px; }
.buscador-inicio .tenue { font-size: 12px; margin-top: 8px; padding-left: 2px; }

/* ── Módulo que todavía no existe, dentro de la ficha ─────────────────── */
/* Figura vacío a propósito: así la estructura —todo lo del prestador junto— se
   entiende desde el primer día, sin simular datos que no hay. */
.pendiente-caja {
  border: 1px dashed var(--borde); border-radius: var(--r);
  padding: 26px 28px; max-width: 620px;
}
.pendiente-caja h3 { font-size: 16px; margin: 12px 0 10px; font-weight: 600; }
.pendiente-caja p { margin: 0 0 14px; color: var(--texto-suave); }
.pendiente-caja ul { margin: 0; padding-left: 20px; display: flex; flex-direction: column; gap: 7px; }
.pendiente-caja li { color: var(--texto-suave); font-size: 13.5px; }

/* ── Saltar a otro prestador desde la ficha ───────────────────────────── */
.salto-prestador { position: relative; margin-left: auto; width: 240px; }
.salto-prestador input { padding: 7px 11px; font-size: 12.5px; }
.salto-resultados {
  position: absolute; top: calc(100% + 6px); right: 0; width: 340px; z-index: 5;
  background: var(--panel-alto); border: 1px solid var(--borde); border-radius: var(--r);
  box-shadow: 0 14px 40px var(--sombra); overflow: hidden;
}
.salto-item {
  display: flex; align-items: center; gap: 10px; width: 100%;
  background: none; border: none; border-bottom: 1px solid var(--borde-suave);
  color: var(--texto); text-align: left; padding: 10px 13px; cursor: pointer; font: inherit;
}
.salto-item:last-child { border-bottom: none; }
.salto-item:hover, .salto-item:focus-visible { background: var(--hover); outline: none; }
.salto-item .n { font-weight: 600; font-size: 12.5px; flex: 1; }
.salto-item .c { color: var(--texto-tenue); font-size: 11px; }
.salto-vacio { padding: 14px; color: var(--texto-tenue); font-size: 12.5px; }

/* ── Simulador de incrementos ─────────────────────────────────────────── */
.subir-facturacion { margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--borde); }
.tablero-sim { padding: 18px; }
.controles-sim {
  display: flex; gap: 26px; align-items: flex-end; flex-wrap: wrap;
  padding-bottom: 16px; margin-bottom: 16px; border-bottom: 1px solid var(--borde);
}
.controles-sim .control { display: flex; flex-direction: column; gap: 8px; }

/* La plata que cambia se destaca: es lo que se mira en la tabla. */
td.dif { color: var(--oro-texto); font-weight: 600; }
/* Las del Pareto llevan marca: son las que se negocian de verdad. */
tbody tr.en-pareto > td:first-child { box-shadow: inset 3px 0 0 var(--oro-texto); }
tbody tr.en-pareto > td { background: var(--panel-alto); }

/* El ajuste por práctica va chico y alineado a la derecha: se usa poco, y cuando
   se usa es sobre dos o tres códigos. */
input.pct-practica {
  width: 58px; padding: 4px 6px; font-size: 12px; text-align: right;
  font-variant-numeric: tabular-nums;
}
input.pct-practica:disabled { opacity: .35; }

/* La tabla del simulador es la más ancha del sistema. Se aprieta un poco y se
   le da todo el aire a la columna de la práctica, que es la que se lee. */
#detalle-sim td, #detalle-sim th { padding: 9px 11px; }
#detalle-sim td:nth-child(2) { min-width: 260px; }
#detalle-sim th:nth-child(2) { min-width: 260px; }

/* ── Contratos: acuerdos con sus anexos ────────────────────────────────── */
.acuerdo { margin-bottom: 16px; border-left: 3px solid var(--borde); }
/* El vigente se distingue de un vistazo: en una lista de ocho acuerdos, saber
   cuál rige hoy es la única pregunta que se hace siempre. */
.acuerdo.vigente { border-left-color: var(--verde); }
.acuerdo-cab {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 18px; padding: 18px 20px 14px; flex-wrap: wrap;
}
.acuerdo-titulo { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 15px; }
.anexos { padding: 0 20px 16px; }
.anexo {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  padding: 9px 0; border-top: 1px dashed var(--borde); font-size: 13px;
}
.subir-anexo {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap;
  margin-top: 12px; padding-top: 14px; border-top: 1px solid var(--borde);
}
.subir-anexo input[type="file"] { max-width: 300px; }
.subir-anexo input:not([type="file"]) { max-width: 280px; }

/* Un número que está a favor o en contra. Se usa en la brecha de los tableros:
   perder contra la inflación tiene que verse distinto de ganarle, sin tener que
   leer el signo. */
.bueno { color: var(--verde); }
.malo  { color: var(--rojo); }

/* ── Tableros de control ────────────────────────────────────────────────── */
/* Tres bloques en fila, uno por pregunta. Se apilan solos cuando no entran: en
   una pantalla angosta leer tres columnas de 300px es peor que bajar. */
.tres-bloques {
  display: grid; gap: 14px;
  grid-template-columns: repeat(auto-fit, minmax(330px, 1fr));
}
.bloque-tablero { padding: 16px 18px; }
.titulo-bloque {
  font-size: 13px; font-weight: 700; letter-spacing: .3px;
  padding-bottom: 9px; margin-bottom: 12px; border-bottom: 1px solid var(--borde);
}
.nota-bloque {
  margin-top: 11px; padding: 9px 12px; border-radius: 6px;
  background: var(--panel-alto); color: var(--texto-suave); font-size: 12px; line-height: 1.5;
}

/* El número grande. Es lo que se mira primero y a veces lo único que se mira. */
.kpi {
  border-radius: 8px; padding: 11px 14px; margin-bottom: 12px;
  border: 1px solid var(--borde); background: var(--panel-alto); flex: 1; min-width: 130px;
}
.kpi.oro   { border-left: 3px solid var(--oro-texto); }
.kpi.verde { border-left: 3px solid var(--verde); }
.kpi.rojo  { border-left: 3px solid var(--rojo); }
.kpi-r { font-size: 10.5px; text-transform: uppercase; letter-spacing: .8px; color: var(--texto-tenue); }
.kpi-n { font-size: 24px; font-weight: 700; line-height: 1.25; font-variant-numeric: tabular-nums; }
.kpi-nota { font-size: 11px; color: var(--texto-tenue); line-height: 1.4; margin-top: 2px; }
/* El acumulado del año, debajo del del recorte. Más chico pero legible: es el
   número que se lleva a la reunión cuando arriba hay un mes suelto. */
.kpi-anual { font-size: 11.5px; color: var(--texto-suave); margin-top: 3px; }
.kpi-anual b { color: var(--texto); font-variant-numeric: tabular-nums; }

/* Cada mes es un botón que se prende y se apaga. Elegir de a uno es lo que se
   hace de verdad: «mostrame de febrero a julio», no «del 1/2 al 31/7». */
.chip-filtro {
  border: 1px solid var(--borde); background: var(--panel-alto); color: var(--texto-suave);
  border-radius: 20px; padding: 4px 11px; font: inherit; font-size: 12px; cursor: pointer;
}
.chip-filtro:hover { border-color: var(--oro-texto); }
.chip-filtro.puesto {
  background: var(--oro-tenue); border-color: var(--oro-texto); color: var(--oro-texto); font-weight: 600;
}

/* ── Novedades ──────────────────────────────────────────────────────────── */
/* La pastilla con el número. Va pegada al texto del botón y no como un punto
   suelto: el número importa —«3 novedades» y «40 novedades» no se atienden
   igual— y un punto obliga a abrir para saber cuánto hay. */
.pastilla {
  display: inline-block; min-width: 18px; padding: 1px 6px; margin-left: 5px;
  border-radius: 20px; background: var(--oro-texto); color: #1a1409;
  font-size: 11px; font-weight: 700; text-align: center; line-height: 16px;
}
.novedad {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 11px 4px; border-bottom: 1px solid var(--borde); font-size: 13px;
}
.novedad:last-child { border-bottom: none; }
.novedad .icono-nov { font-size: 17px; line-height: 1.2; flex: none; width: 22px; text-align: center; }
.novedad .crecer { flex: 1; min-width: 0; }
.novedad .cuando { color: var(--texto-tenue); font-size: 12px; white-space: nowrap; }
/* Las ya vistas se apagan en vez de esconderse: sirven para mirar hacia atrás,
   pero no tienen que competir con lo que todavía hay que atender. */
.novedad.vista { opacity: .55; }
/* Lo que hay que atender lleva franja al costado: no se puede despachar con un
   clic como una novedad, así que tiene que distinguirse de las de abajo. */
.novedad.pendiente { border-left: 3px solid var(--ambar); padding-left: 10px; }
.grupo-novedad {
  margin-top: 16px; padding-bottom: 5px; border-bottom: 1px solid var(--borde);
  font-size: 12px; text-transform: uppercase; letter-spacing: .8px;
  color: var(--oro-texto); font-weight: 700;
}
.grupo-novedad:first-child { margin-top: 0; }

/* ── Minutas de reunión ─────────────────────────────────────────────────── */
/* Cada minuta es una tarjeta con la franja al costado. La franja dice de qué
   lado vino sin tener que leer el chip: en una lista de doce reuniones lo
   primero que se busca es «cuáles son las mías». */
.minuta { margin-bottom: 14px; padding: 16px 20px; border-left: 3px solid var(--borde); }
.minuta.mia { border-left-color: var(--oro-texto); }

/* Lo que se acordó, para no tener que bajar el archivo cada vez que alguien
   pregunta. Se respetan los saltos de línea: viene tipeado por una persona. */
.minuta .acordado {
  margin-top: 12px; padding: 12px 14px; border-radius: 8px;
  background: var(--panel-alto); color: var(--texto-suave);
  font-size: 13px; line-height: 1.55; white-space: pre-wrap;
}
.pie-minuta {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 12px; padding-top: 11px; border-top: 1px dashed var(--borde);
  font-size: 12px;
}

/* ── El cuadro de la negociación ───────────────────────────────────────── */
/* Lo que ponen, lo que cuesta y la brecha, uno al lado del otro. Sin esto hay
   que hacer la resta a mano cada vez que se mueve un porcentaje. */
.cuadro-oferta {
  display: flex; align-items: stretch; gap: 18px; flex-wrap: wrap;
  border: 1px solid var(--borde); border-left: 3px solid var(--ambar);
  border-radius: var(--r); padding: 16px 20px; margin-bottom: 16px;
  background: var(--panel-alto);
}
.cuadro-oferta.alcanza { border-left-color: var(--verde); }
.cuadro-oferta.falta   { border-left-color: var(--rojo); }
.cuadro-oferta .col-oferta { display: flex; flex-direction: column; gap: 3px; }
.cuadro-oferta .et {
  font-size: 10px; text-transform: uppercase; letter-spacing: .9px; color: var(--texto-tenue);
}
.cuadro-oferta .n { font-size: 21px; font-weight: 700; font-variant-numeric: tabular-nums; }
.cuadro-oferta .tenue { font-size: 11.5px; }
.cuadro-oferta .signo {
  align-self: center; color: var(--texto-tenue); font-size: 14px; padding: 0 2px;
}
.cuadro-oferta .destacada .n { color: var(--ambar); }
.cuadro-oferta.alcanza .destacada .n { color: var(--verde); }
.cuadro-oferta.falta   .destacada .n { color: var(--rojo); }
.cuadro-oferta .nota {
  margin-left: auto; align-self: center; max-width: 300px;
  font-size: 12px; color: var(--texto-suave); text-align: right;
}
/* El campo de la oferta se separa de los otros controles: es de la otra parte. */
.oferta-control { padding-left: 22px; border-left: 1px solid var(--borde); }

/* ── El árbol servicio → prácticas ─────────────────────────────────────── */
/* Los dos niveles en la misma tabla: el servicio pesa visualmente y sus
   prácticas quedan claramente adentro, para no confundir un total con una parte. */
.arbol-sim tr.grupo > td { background: var(--panel-alto); font-size: 13.5px; }
.arbol-sim tr.grupo { cursor: pointer; }
.arbol-sim tr.grupo:hover > td { background: var(--hover); }
.arbol-sim tr.grupo.abierta > td { box-shadow: inset 0 -1px 0 var(--oro-texto); }
.arbol-sim td.flecha {
  width: 26px; color: var(--oro-texto); text-align: center; padding-right: 0;
}
.arbol-sim tr.hijo > td { font-size: 12.5px; padding-top: 7px; padding-bottom: 7px; }
.arbol-sim td.sangria { padding-left: 30px; }

/* El % heredado se muestra en gris como marca de agua: se ve de dónde viene sin
   que parezca escrito a mano. */
input.pct-grupo {
  width: 62px; padding: 4px 6px; font-size: 12px; text-align: right;
  font-variant-numeric: tabular-nums;
}
input.pct-grupo::placeholder, input.pct-practica::placeholder { color: var(--texto-tenue); }

/* ── Tablero de los avisos ────────────────────────────────────────────── */
.tablero-avisos { padding: 18px; margin-bottom: 18px; }
.controles-aviso {
  display: flex; gap: 24px; align-items: flex-end; flex-wrap: wrap;
  margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--borde);
}
.controles-aviso .control { display: flex; flex-direction: column; gap: 8px; }
/* El interruptor se va al extremo opuesto de los campos: cortar los envíos no
   puede quedar pegado a un campo que se toca todos los días. */
.controles-aviso .interruptor { margin-left: auto; }

.anticipaciones {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--borde); font-size: 12px;
}
.anticipacion {
  background: var(--panel-alto); border: 1px solid var(--borde); border-radius: 20px;
  padding: 4px 10px; color: var(--texto-suave);
}
.anticipacion b { color: var(--oro-texto); font-variant-numeric: tabular-nums; }

/* ── A quién le llega el aviso ────────────────────────────────────────── */
.caja-titulo {
  padding: 16px 18px 12px; border-bottom: 1px solid var(--borde);
  display: flex; flex-direction: column; gap: 4px; margin-bottom: 14px;
}
/* Una dirección por renglón, con quién es al lado: un prestador puede tener tres
   casillas recibiendo avisos y en una sola línea no se distinguen. */
.destino { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.destino + .destino { margin-top: 5px; }
.destino .tenue { font-size: 12px; }

/* ── Editor del texto de los avisos ───────────────────────────────────── */
.editor-aviso { padding: 20px 22px; margin-bottom: 18px; }
.editor-cabecera {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 16px; margin-bottom: 18px; padding-bottom: 14px; border-bottom: 1px solid var(--borde);
}
.editor-aviso textarea {
  font-family: 'Segoe UI', system-ui, sans-serif; line-height: 1.6; resize: vertical;
}
.editor-pie { display: flex; align-items: center; gap: 10px; margin-top: 16px; flex-wrap: wrap; }

/* Los datos que se insertan. Botones y no una lista para copiar a mano: escribir
   `{prestador}` de memoria es donde aparecen los errores de tipeo. */
.huecos { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 12px; font-size: 12px; }
.hueco {
  background: var(--panel-alto); border: 1px solid var(--borde); border-radius: 6px;
  color: var(--oro-texto); font: 12px/1 'Cascadia Mono', Consolas, monospace;
  padding: 5px 8px; cursor: pointer; transition: .12s;
}
.hueco:hover { border-color: var(--oro-texto); background: var(--oro-tenue); }

/* ── Vista previa del mail ────────────────────────────────────────────── */
/* El cuerpo se muestra sobre fondo claro porque así lo va a ver el prestador:
   sobre el fondo oscuro del sistema, el mail se vería de un color que no es. */
.sobre { border: 1px solid var(--borde); border-radius: var(--r); overflow: hidden; }
.sobre-linea {
  display: flex; gap: 12px; align-items: baseline; flex-wrap: wrap;
  padding: 12px 16px; background: var(--panel-alto); border-bottom: 1px solid var(--borde);
}
/* Sólo el PRIMER span es la etiqueta («Para», «Asunto»). Los de adentro —el «por
   qué le llega a esa dirección»— son texto corrido: si tomaran este estilo
   saldrían en mayúsculas y recortados a 60px. */
.sobre-linea > span:first-child {
  color: var(--texto-tenue); font-size: 11px; text-transform: uppercase;
  letter-spacing: .8px; flex: none; width: 60px;
}
.sobre-linea b { word-break: break-word; }

/* La barra de la vista previa: con qué prestador se está mirando el texto. */
.previa-barra {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 14px;
}
.previa-barra select { width: auto; min-width: 240px; }
/* Este bloque NO sigue el tema a propósito: es la maqueta del mail tal como lo
   va a ver el prestador. Si se pusiera oscuro, mostraría un correo que no existe. */
.sobre-cuerpo { background: #fff; color: #222; padding: 18px 20px; }
.sobre-cuerpo a { color: #0b57d0; }

/* ── Sección dentro de un modal ───────────────────────────────────────── */
.seccion { margin-top: 22px; padding-top: 18px; border-top: 1px solid var(--borde); }
.seccion-cabecera {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 16px; margin-bottom: 14px;
}

/* ── Contactos ────────────────────────────────────────────────────────── */
/* Una fila por contacto: persona, sector, correo, teléfono y el botón de quitar.
   Grilla y no flex para que las columnas queden alineadas entre renglones: con
   quince contactos cargados, las columnas desalineadas hacen la lista ilegible. */
.fila-contacto {
  display: grid; grid-template-columns: 1.1fr .95fr 1.35fr .8fr auto auto;
  gap: 8px; align-items: center; margin-bottom: 8px;
}
/* La casilla de avisos, con su rótulo al lado: sola no se entiende para qué es. */
.fila-contacto .avisa {
  display: flex; align-items: center; gap: 5px; margin: 0; cursor: pointer;
  font-size: 11px; color: var(--texto-suave); white-space: nowrap;
}
.fila-contacto .avisa input { width: 15px; height: 15px; flex: none; accent-color: var(--oro-texto); }
.fila-contacto .avisa input:checked + span { color: var(--oro-texto); }
.fila-contacto.encabezado {
  margin-bottom: 6px; color: var(--texto-suave); font-size: 12px;
}
.fila-contacto input { padding: 8px 10px; font-size: 13px; }
.fila-contacto .quitar {
  background: none; border: 1px solid var(--borde); border-radius: 8px;
  color: var(--texto-tenue); cursor: pointer; padding: 8px 11px; line-height: 1; font-size: 13px;
}
.fila-contacto .quitar:hover { color: var(--rojo); border-color: var(--rojo); }
.sin-contactos {
  color: var(--texto-tenue); font-size: 13px; padding: 14px 0 6px;
}
/* En pantalla angosta la fila se apila de a dos, con el botón de quitar al final
   de la fila del teléfono. Cinco columnas ahí no entran sin volverse ilegibles. */
@media (max-width: 760px) {
  .fila-contacto { grid-template-columns: 1fr 1fr; }
  .fila-contacto.encabezado { display: none; }
  .fila-contacto:not(.encabezado) {
    padding-bottom: 10px; border-bottom: 1px dashed var(--borde); margin-bottom: 12px;
  }
}

.rejilla { display: grid; grid-template-columns: repeat(auto-fit, minmax(215px, 1fr)); gap: 14px 16px; }
.rejilla .ancho { grid-column: 1 / -1; }
/* Dos columnas de las tres: para los campos largos que no llegan a necesitar la
   fila entera, como la razón social al lado del CUIT. */
.rejilla .doble { grid-column: span 2; }
@media (max-width: 760px) { .rejilla .doble { grid-column: 1 / -1; } }

/* ── Requisitos del legajo ────────────────────────────────────────────── */
.requisito {
  border: 1px solid var(--borde); border-radius: var(--r); padding: 16px 18px;
  margin-bottom: 12px; background: var(--panel-alto);
  border-left: 3px solid var(--borde);
}
.requisito.VENCIDO    { border-left-color: var(--rojo); }
.requisito.POR_VENCER { border-left-color: var(--ambar); }
.requisito.FALTANTE   { border-left-color: var(--gris); }
.requisito.SIN_FECHA  { border-left-color: var(--azul); }
.requisito.VIGENTE    { border-left-color: var(--verde); }
.requisito .fila1 { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.requisito .nombre { font-weight: 600; flex: 1; min-width: 240px; }
.requisito .nota { color: var(--texto-tenue); font-size: 12px; margin-top: 8px; line-height: 1.5; }
.requisito .archivo {
  margin-top: 12px; padding-top: 12px; border-top: 1px dashed var(--borde);
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: 13px;
}
.grupo-titulo {
  font-size: 11px; text-transform: uppercase; letter-spacing: 1.2px;
  color: var(--oro-texto); margin: 24px 0 12px; padding-bottom: 8px;
  border-bottom: 1px solid var(--borde);
}
.grupo-titulo:first-child { margin-top: 0; }

/* ── Varios ───────────────────────────────────────────────────────────── */
.vacio { padding: 60px 20px; text-align: center; color: var(--texto-tenue); }
.vacio .icono { font-size: 40px; opacity: .35; margin-bottom: 12px; }
.aviso {
  padding: 12px 16px; border-radius: 8px; margin-bottom: 16px; font-size: 13px;
  border: 1px solid transparent;
}
.aviso.error { background: var(--rojo-bg); border-color: var(--rojo-borde-fuerte); color: var(--rojo-aviso); }
.aviso.ok    { background: var(--verde-bg); border-color: var(--verde-borde-fuerte); color: var(--verde-aviso); }
.aviso.info  { background: var(--azul-bg);  border-color: var(--azul-borde-fuerte); color: var(--azul-aviso); }

#brindis {
  position: fixed; right: 22px; bottom: 22px; z-index: 60;
  display: flex; flex-direction: column; gap: 10px; align-items: flex-end;
}
#brindis .t {
  background: var(--panel-alto); border: 1px solid var(--borde); border-left: 3px solid var(--verde);
  border-radius: 8px; padding: 13px 18px; box-shadow: 0 10px 30px var(--sombra-baja);
  animation: entra .2s ease-out; max-width: 420px;
}
#brindis .t.error { border-left-color: var(--rojo); }
@keyframes entra { from { opacity: 0; transform: translateY(8px); } }

.oculto { display: none !important; }
.cargando { padding: 50px; text-align: center; color: var(--texto-tenue); }

/* ── Modo prestador ─────────────────────────────────────────────────────
   Gente del sanatorio: entran a SU documentación y no hay nada más. Esto no es
   la seguridad —esa está en el servidor, que responde 403 a todo lo demás— sino
   no ofrecer puertas que van a rebotar.

   La ficha deja de ser un modal y pasa a ser LA pantalla: sin cruz, sin fondo
   oscurecido y sin buscador de otros prestadores. Un modal que no se puede
   cerrar se siente roto; una pantalla que nunca fue modal, no. */
.modo-prestador #menu,
.modo-prestador #velo-legajo .cerrar,
.modo-prestador .salto,
.modo-prestador #saltar-prestador,
.modo-prestador #salto-resultados,
.modo-prestador #menu-legajo button:not([data-solapa="documentacion"]):not([data-solapa="facturacion"]):not([data-solapa="contratos"]):not([data-solapa="reuniones"]):not([data-solapa="mensajes"]) {
  display: none !important;
}

.modo-prestador #velo-legajo {
  position: static; background: none; padding: 0; display: block;
}
.modo-prestador #velo-legajo .modal {
  max-width: 100%; width: 100%; max-height: none; border: none;
  border-radius: 0; box-shadow: none; background: none;
}
/* La barra SÍ se muestra: la institución tiene dos solapas —su documentación y
   su facturación— y necesita poder cambiar entre ellas. */
.modo-prestador #velo-legajo .cabecera { background: none; border-bottom: 1px solid var(--borde); }

/* Para la gente del sanatorio, la ficha ES la pantalla: el resto del sistema
   —lista de prestadores, configuración, tablero— vive dentro de <main> y no
   corresponde. El servidor igual les responde 403, pero una lista que se queda
   en «Cargando…» para siempre parece un sistema roto, no uno que los protege. */
.modo-prestador main { display: none; }

/* ── Segundo factor ─────────────────────────────────────────────────────── */
/* El código se tipea mirando el teléfono y sin mirar el teclado: grande, con los
   dígitos separados y en fuente de ancho fijo, para poder contarlos de un vistazo. */
.codigo-2fa {
  font: 600 26px/1.2 Consolas, 'Courier New', monospace;
  letter-spacing: 8px; text-align: center; padding: 14px 12px;
}
.codigo-2fa::placeholder { letter-spacing: 8px; color: var(--texto-tenue); }

/* El QR sobre blanco SIEMPRE, en los dos temas: los lectores esperan módulos
   oscuros sobre fondo claro, y en tema oscuro un QR invertido no se lee. */
.qr {
  background: #fff; padding: 14px; border-radius: var(--r);
  width: 210px; height: 210px; flex: none;
}
.qr svg { width: 100%; height: 100%; display: block; }

.paso-2fa { display: flex; gap: 20px; align-items: flex-start; flex-wrap: wrap; }
.paso-2fa .texto { flex: 1; min-width: 260px; }

/* El secreto para tipear a mano, cuando la cámara no colabora. */
.secreto-2fa {
  font: 600 15px/1.7 Consolas, 'Courier New', monospace; letter-spacing: 2px;
  background: var(--panel-alto); border: 1px dashed var(--oro-texto);
  border-radius: var(--r); padding: 12px 14px; color: var(--oro-texto);
  word-break: break-all; user-select: all;
}

/* Los códigos de recuperación: se leen para copiarlos a un papel. */
.recuperacion {
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px 14px;
  font: 600 15px/1.6 Consolas, 'Courier New', monospace; letter-spacing: 1px;
  background: var(--panel-alto); border: 1px solid var(--borde);
  border-radius: var(--r); padding: 14px 16px; color: var(--oro-texto);
  user-select: all;
}

/* ── Campo con sugerencias ───────────────────────────────────────────────────
   Reemplaza al <datalist> del navegador.

   El nativo no se puede pintar: es un control del sistema operativo, así que
   aparece blanco sobre el tema oscuro, con otra tipografía y otro tamaño.
   Funciona, pero se ve como una ventana de otro programa metida en el medio.

   Éste es el mismo campo de siempre —se puede tipear cualquier cosa, la lista
   sólo sugiere— con el desplegable dibujado por nosotros. */
.sugerido { position: relative; }

/* La flecha. Es un botón de verdad y no un adorno: abre la lista al tocarla,
   que es lo que la gente intenta hacer cuando ve una flecha. */
.sugerido .flecha {
  position: absolute; right: 1px; top: 1px; bottom: 1px; width: 34px;
  display: flex; align-items: center; justify-content: center;
  background: none; border: none; border-radius: 0 8px 8px 0;
  color: var(--texto-tenue); cursor: pointer; font-size: 10px; padding: 0;
}
.sugerido .flecha:hover { color: var(--texto); background: var(--hover); }
.sugerido input { padding-right: 38px; }

/* Cuelga del <body> y se mide contra la ventana: dentro de un modal con scroll,
   un desplegable posicionado en el campo queda recortado por ese borde. */
.opciones-sugeridas {
  position: fixed; z-index: 70;
  background: var(--panel-alto); border: 1px solid var(--borde); border-radius: var(--r);
  box-shadow: 0 14px 40px var(--sombra);
  overflow-y: auto; padding: 5px;   /* el alto lo pone `ubicar()`, según el espacio que haya */
}
.opciones-sugeridas button {
  display: block; width: 100%; text-align: left;
  background: none; border: none; border-radius: 7px;
  color: var(--texto); padding: 9px 11px; cursor: pointer; font: inherit; font-size: 13.5px;
}
/* `.marcada` es la que se mueve con las flechas del teclado. Se pinta igual que
   el hover para que no haya dos «seleccionados» distintos a la vez. */
.opciones-sugeridas button:hover,
.opciones-sugeridas button.marcada { background: var(--hover); }
.opciones-sugeridas button.marcada { outline: none; }
.opciones-sugeridas .vacio-sugerido {
  padding: 10px 11px; color: var(--texto-tenue); font-size: 12.5px;
}
/* Lo que coincide con lo tipeado, resaltado: muestra POR QUÉ está en la lista. */
.opciones-sugeridas mark {
  background: var(--oro-tenue); color: var(--oro-texto); border-radius: 3px; padding: 0 1px;
}

/* ── Los campos que se guardan en mayúscula ──────────────────────────────────
   Se ven en mayúscula MIENTRAS se escriben. Sin esto, uno tipea «clinica alcorta»,
   guarda, y el sistema muestra otra cosa: parece que el dato se cambió solo.

   `text-transform` es sólo visual —el valor real lo normaliza el servidor, ver
   src/texto.js— pero es lo que hace que lo que se ve y lo que se guarda coincidan.

   El correo y las observaciones NO están acá, a propósito: el correo puede
   distinguir mayúsculas y las observaciones son texto para leer. */
#form-prestador input[name="razon_social"],
#form-prestador input[name="nombre_fantasia"],
#form-prestador input[name="domicilio"],
#form-prestador input[name="localidad"],
#form-prestador input[name="provincia"],
.fila-contacto input[data-c="nombre"],
.fila-contacto input[data-c="sector"] {
  text-transform: uppercase;
}
/* El texto de ejemplo, no: en mayúscula parecería un dato ya cargado. */
#form-prestador input::placeholder,
.fila-contacto input::placeholder { text-transform: none; }

/* ── Contratos: las tres sub-solapas ───────────────────────────────────────
   Más chicas que las del legajo y con la línea abajo, para que se lean como un
   nivel de adentro y no como otro menú del mismo peso. */
.sub-solapas {
  /* `overflow-y: hidden` no sobra: con `overflow-x: auto` solo, el eje Y pasa a
     `auto` por la especificacion, y el `margin-bottom: -1px` de los botones le
     desborda un pelo — aparecia una barra de scroll vertical de la nada. */
  display: flex; gap: 2px; overflow-x: auto; overflow-y: hidden;
  border-bottom: 1px solid var(--borde); margin-bottom: 14px;
}
.sub-solapas button {
  white-space: nowrap; padding: 9px 14px; border: 0; background: none;
  color: var(--texto-suave); font: inherit; font-size: 13px; cursor: pointer;
  border-bottom: 2px solid transparent; margin-bottom: -1px;
}
.sub-solapas button:hover { color: var(--texto); }
.sub-solapas button.activa {
  color: var(--oro-texto); border-bottom-color: var(--oro-texto); font-weight: 600;
}

/* ── El año, que abre y cierra ──────────────────────────────────────────────
   La raya que sigue al número hace el trabajo de separar sin meter una caja más:
   adentro del grupo ya hay cajas, y anidar una dentro de otra confunde. */
.anio-grupo { margin-bottom: 4px; }
/* Un botón y no un título con un clic encima: así se llega con Tab, se abre con
   Enter, y el lector de pantalla dice si está abierto o cerrado. */
.anio-titulo {
  display: flex; align-items: center; gap: 10px; width: 100%;
  padding: 8px 2px; border: 0; background: none; cursor: pointer;
  font: inherit; font-size: 13px; font-weight: 700;
  color: var(--oro-texto); letter-spacing: .4px; text-align: left;
}
.anio-titulo:focus-visible {
  outline: none; border-radius: 6px; box-shadow: 0 0 0 3px var(--oro-tenue);
}
.anio-titulo .raya { flex: 1; height: 1px; background: var(--borde); }
.anio-titulo .flecha {
  display: inline-block; width: 10px; font-size: 11px;
  transition: transform .12s ease;
}
.anio-grupo.abierto .anio-titulo .flecha { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) { .anio-titulo .flecha { transition: none; } }

/* Cerrado NO se desmonta, se esconde: abrir y cerrar tiene que ser instantáneo
   y sin pedirle nada al servidor. */
.anio-cuerpo { display: none; padding-bottom: 10px; }
.anio-grupo.abierto .anio-cuerpo { display: block; }
.filtro-anio { flex-wrap: wrap; align-items: center; gap: 6px; }

/* De qué tipo es cada ficha. Sin esto, un acuerdo negociado y un papel que la
   Cámara reparte a todos se ven igual, y no son lo mismo: uno se edita acá y el
   otro cambia para los cuarenta prestadores que lo tienen. */
.etiqueta-ficha {
  display: inline-block; padding: 1px 7px; border-radius: 4px;
  background: var(--panel-alto); border: 1px solid var(--borde);
  color: var(--texto-tenue); font-size: 10.5px; font-weight: 700;
  letter-spacing: .5px; text-transform: uppercase; vertical-align: middle;
}
.etiqueta-ficha.camara {
  background: var(--oro-tenue); border-color: var(--oro-texto); color: var(--oro-texto);
}
.caja.publicado { border-left: 3px solid var(--oro-texto); }

/* ── Publicar a varios: la lista de destinatarios ──────────────────────────
   Con altura fija y scroll propio: con ochenta prestadores, sin esto el botón
   «Publicar» queda abajo de todo y hay que scrollear la ventana entera para
   llegar. */
.destinatarios { margin-top: 18px; border-top: 1px solid var(--borde); padding-top: 14px; }
.marca-todos {
  padding: 7px 10px; margin-bottom: 6px; text-align: left;
  border-radius: 6px; background: var(--panel-alto);
}
.lista-destinatarios {
  max-height: 240px; overflow-y: auto;
  border: 1px solid var(--borde); border-radius: 6px;
}
.destinatario {
  padding: 8px 10px; text-align: left;
  border-bottom: 1px solid var(--borde); border-radius: 0;
}
/* En este sistema `.crecer` sólo crece adentro de `.barra` y de `.novedad`. Sin
   esta línea la localidad queda pegada al nombre en vez de irse al margen, y con
   nombres de distinto largo la columna deja de leerse como columna. */
.destinatario .crecer { flex: 1; min-width: 0; }
.destinatario:last-child { border-bottom: 0; }
.destinatario:hover { background: var(--panel-alto); }


/* ── Lo ya publicado, adentro de la ventana de publicar ────────────────────
   Va arriba del formulario y con su propio scroll: con treinta documentos, sin
   el tope, el formulario de publicar —que es lo que más se usa— quedaría abajo
   de todo y habría que scrollear la ventana entera para llegar. */
.publicados-ya {
  margin-bottom: 20px; padding-bottom: 18px; border-bottom: 1px solid var(--borde);
}
.lista-publicados {
  max-height: 280px; overflow-y: auto;
  border: 1px solid var(--borde); border-radius: 6px;
}
/* El encabezado de cada solapa adentro de la lista. Pegajoso: con doce
   documentos, al scrollear se pierde de vista en cuál de los tres grupos se
   está mirando, y las filas de una solapa y de otra se ven iguales. */
.grupo-publicado-tit {
  position: sticky; top: 0; z-index: 1;
  display: flex; align-items: center; gap: 9px;
  padding: 7px 11px; background: var(--panel-alto);
  border-bottom: 1px solid var(--borde);
  font-size: 11px; font-weight: 700; letter-spacing: .7px;
  text-transform: uppercase; color: var(--oro-texto);
}
.grupo-publicado-tit .raya { flex: 1; height: 1px; background: var(--borde); }
.grupo-publicado:last-child .publicado-fila:last-child { border-bottom: 0; }
.publicado-fila {
  display: flex; align-items: center; gap: 10px; padding: 9px 11px;
  font-size: 13px; border-bottom: 1px solid var(--borde);
}
.publicado-fila:last-child { border-bottom: 0; }
.publicado-fila:hover { background: var(--panel-alto); }
.publicado-fila .crecer { flex: 1; min-width: 0; }

/* ── Comunicaciones: la bandeja y el hilo ──────────────────────────────────
   La bandeja es una lista de filas clicables, no una tabla: cada línea es un
   lugar al que se entra, y una tabla con una sola columna útil sería un marco
   alrededor de nada. */
.lista-conversaciones { padding: 0; }
.conversacion {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 13px 16px; cursor: pointer;
  border-bottom: 1px solid var(--borde);
}
.conversacion:last-child { border-bottom: 0; }
.conversacion:hover { background: var(--panel-alto); }
.conversacion .crecer { flex: 1; min-width: 0; }
.conversacion-tit { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
/* Lo que falta leer se marca con la barra de la izquierda y con el peso del
   texto, no sólo con la pastilla: un número chico al costado se pierde en una
   lista de treinta. */
.conversacion.sin-leer { border-left: 3px solid var(--oro-texto); }
.conversacion.sin-leer .conversacion-ultimo { color: var(--texto); font-weight: 600; }
.conversacion-ultimo {
  font-size: 12.5px; margin-top: 4px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* El hilo. Lo propio a la derecha y en oro tenue, lo del otro a la izquierda:
   es la convención de cualquier chat y se lee sin tener que buscar el nombre. */
.hilo { display: flex; flex-direction: column; gap: 12px; }
.burbuja {
  max-width: 78%; padding: 10px 13px; border-radius: 12px;
  border: 1px solid var(--borde); background: var(--panel-alto);
}
.burbuja.mia {
  align-self: flex-end; background: var(--oro-tenue); border-color: var(--oro-texto);
}
.burbuja.suya { align-self: flex-start; }
.burbuja-quien { font-size: 11px; font-weight: 700; letter-spacing: .3px; margin-bottom: 5px; }
/* `pre-wrap`: el texto lo escribió una persona y los renglones que puso son
   parte de lo que quiso decir. Sin esto, una lista de tres puntos llega como un
   párrafo corrido. */
.burbuja-texto { font-size: 13.5px; line-height: 1.5; white-space: pre-wrap; word-break: break-word; }
.burbuja-archivo { margin-top: 8px; font-size: 12.5px; }

/* El cuadro de escribir va en el pie del modal: en una conversación larga, un
   botón de enviar que se va con el scroll obliga a bajar hasta el final para
   contestar. */
.pie.escribir { flex-direction: column; align-items: stretch; gap: 8px; }
.linea-escribir { display: flex; gap: 10px; align-items: flex-end; }
.linea-escribir textarea { flex: 1; resize: vertical; min-height: 44px; }
.acciones-escribir { display: flex; gap: 8px; align-items: center; }
.acciones-escribir .btn.fina { font-size: 15px; line-height: 1; padding: 10px 12px; }
