/*
 * Autor: Darwin Quinones
 * Ultima edicion: 2026-09-08
 *
 * naicenter.css — el aspecto de NAICenter.
 *
 * ⭐ La base es la del dashboard que ya usa NAICenter y que Darwin llamo elegante, tomada tal
 * cual y no aproximada a ojo: fondo con dos halos sobre un degradado, tarjetas de
 * `rgba(15,27,48,.72)` con borde de un 8% de blanco, sombra larga y esquinas de 16, y las
 * pildoras de 12px a la derecha de cada cabecera.
 *
 * ⛔ Lo que NO se hereda es el negro plano con bordes duros que tenia yo antes: se veia de hace
 * quince años. El relieve no es decoracion — es lo que separa una tarjeta del fondo y hace que
 * la pantalla se lea de un vistazo en vez de parecer una lista de texto.
 *
 * El violeta de la marca (#6A54BE, el mismo del Roku y el Apple TV) se queda para lo que es
 * NUESTRO: el foco, lo activo y los acentos. El indigo del degradado es ambiente.
 *
 * 📱 Movil primero: una columna, menu escondido, tablas que se vuelven fichas y nada pulsable
 * por debajo de 44px. Lo ancho son los `@media (min-width: …)` del final.
 */

:root {
  /* ⭐ La pagina es OSCURA y hay que decirselo al navegador. Sin esto, los controles que pinta el
     sistema —el iconito del calendario de <input type=date>, el propio calendario al abrirlo, las
     barras de desplazamiento— salen en su version clara: el calendario quedaba NEGRO sobre fondo
     negro y no se veia (Darwin). Es una linea y arregla todos a la vez, no solo el que se noto. */
  color-scheme: dark;
  /* Y las casillas y radios, en el violeta de la marca: con el tema oscuro el navegador las
     pintaba en su azul de fabrica, que no es de nadie. */
  accent-color: #6A54BE;

  /* ── El fondo y la tinta, del dashboard elegante ── */
  --bg:        #0b1220;
  --texto:     #e8eefc;
  --texto-2:   #9fb0d0;
  --texto-3:   #6d7fa3;
  --borde:     rgba(255, 255, 255, .08);
  --borde-2:   rgba(255, 255, 255, .14);

  /* Superficies: la tarjeta y lo que va dentro de ella */
  --panel:     rgba(15, 27, 48, .72);
  --panel-2:   rgba(12, 23, 42, .85);
  --panel-3:   rgba(255, 255, 255, .04);
  /* ⛔ El fondo de los dialogos, OPACO. `.nai-dlg` usaba `--fondo-2`, que NO ESTA DEFINIDA en
     ninguna parte: el <dialog> se quedaba sin fondo y se transparentaba — se leia el contenido de
     debajo a traves del texto. Pasaba en TODOS los dialogos del panel, no solo en uno. */
  --dlg-fondo: #101c31;

  /* ── El violeta de la marca ── */
  --violeta:       #6A54BE;
  --violeta-claro: #8B79D6;
  --violeta-humo:  rgba(99, 102, 241, .18);
  --violeta-borde: rgba(99, 102, 241, .35);

  --dorado: #E2B96B;
  --verde:  #4ADE80;
  --rojo:   #F87171;
  --ambar:  #FBBF24;

  --sombra:    0 10px 30px rgba(0, 0, 0, .35);
  --radio:     16px;
  --radio-s:   12px;
  --radio-xs:  10px;

  --menu-ancho: 260px;   /* desplegado */
  --menu-tira:   60px;   /* encogido a iconos: lo que se ve siempre */
  --barra-alto: 60px;

  --e1: 6px;  --e2: 10px;  --e3: 14px;  --e4: 20px;  --e5: 32px;

  /* ⛔ La barra y el menu llevaban su color ESCRITO A MANO —`rgba(10,18,33,…)`—, asi que en el
     tema claro se quedaban negros con la letra oscura encima: «NAI» y «Sign out» no se leian.
     Cada tema trae ahora el suyo. */
  /* ⛔ TODO LO QUE SE ESCRIBE llevaba `rgba(8,14,26,.8)` a mano: los campos, los buscadores, los
     filtros, las notas, las tarjetas de equipo y de orden. En el tema claro quedaban con el fondo
     casi NEGRO y la letra oscura encima — ilegibles. Es lo que Darwin llamo «los popups que salen
     oscuros con las letras negras». Aparecia SEIS veces; ahora es una variable. */
  --campo:      rgba(8, 14, 26, .8);     /* input, select, textarea, buscadores */
  --hueco:      rgba(8, 14, 26, .5);     /* cajas hundidas: notas, equipos, ordenes, bitacora */

  --cromo:      rgba(10, 18, 33, .72);   /* la barra de arriba */
  --cromo-menu: rgba(10, 18, 33, .92);   /* la tira lateral */
  /* Lo que se pone encima al pasar por encima: en un tema claro un velo blanco no se ve. */
  --realce:     rgba(255, 255, 255, .05);
  --realce-2:   rgba(255, 255, 255, .07);

  /* ⭐ El fondo, en una variable: es lo que permite que un tema lo cambie entero. Escrito a mano
     dentro de `body`, los temas cambiaban los colores de todo MENOS el fondo — que es justo lo
     primero que se ve. */
  --fondo-halo:
    radial-gradient(1200px 700px at 20% 10%, rgba(59, 130, 246, .25), transparent 55%),
    radial-gradient(900px 600px at 90% 10%, rgba(99, 102, 241, .22), transparent 55%),
    linear-gradient(180deg, #070b14, var(--bg));
}

* { box-sizing: border-box; }

body {
  margin: 0;
  min-height: 100vh;
  font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--texto);
  /* Los dos halos y el degradado: es lo que quita la sensacion de fondo muerto. Cada tema trae
     el suyo en `--fondo-halo`. */
  background: var(--fondo-halo);
  background-attachment: fixed;   /* el halo no se va al hacer scroll */
  -webkit-font-smoothing: antialiased;
}

a { color: inherit; text-decoration: none; }
img { max-width: 100%; display: block; }

/* ══════════════════════════════════════════════════════════════ estructura ══ */

.barra {
  position: sticky; top: 0; z-index: 40;
  height: var(--barra-alto);
  display: flex; align-items: center; gap: var(--e3);
  padding: 0 var(--e4);
  background: var(--cromo);
  backdrop-filter: blur(10px);            /* el cristal esmerilado del original */
  border-bottom: 1px solid var(--borde);
}
.barra .marca { font-weight: 700; font-size: 16px; letter-spacing: .3px; }
.barra .marca span { color: var(--violeta-claro); }
.barra .empuja { margin-left: auto; }
.barra .quien { color: var(--texto-2); font-size: 12.5px; }

.hamburguesa {
  display: inline-flex; align-items: center; justify-content: center;
  width: 40px; height: 40px; margin-left: -6px;
  background: var(--panel-3); border: 1px solid transparent; color: var(--texto);
  cursor: pointer; border-radius: var(--radio-s);
}
.hamburguesa:hover { border-color: var(--borde); }

.menu {
  position: fixed; top: var(--barra-alto); bottom: 0; left: 0; z-index: 50;
  width: var(--menu-ancho);
  padding: var(--e3);
  background: var(--cromo-menu);
  backdrop-filter: blur(10px);
  border-right: 1px solid var(--borde);
  overflow-y: auto;
  display: flex; flex-direction: column; gap: var(--e1);
  transform: translateX(-100%);
  transition: transform .18s ease;
}
.menu.abierto { transform: none; }

.cortina {
  position: fixed; inset: var(--barra-alto) 0 0 0; z-index: 45;
  background: rgba(0, 0, 0, .55);
  opacity: 0; pointer-events: none; transition: opacity .18s ease;
}
.cortina.visible { opacity: 1; pointer-events: auto; }

/* Las entradas del menu: pastillas, no una lista de enlaces pegados al borde. */
.menu a {
  display: flex; align-items: center; gap: var(--e2);
  min-height: 44px; padding: 0 var(--e3);
  border-radius: var(--radio-s);
  border: 1px solid transparent;
  background: rgba(255, 255, 255, .02);
  color: var(--texto-2); font-size: 13.5px;
  transition: .15s ease;
}
.menu a:hover { color: var(--texto); background: var(--realce); border-color: var(--borde); }
.menu-ico  { width: 20px; height: 20px; flex: 0 0 20px; }
.menu-txt  { white-space: nowrap; }
.menu-xojo { margin-left: auto; font-size: 11px; color: var(--texto-3); }
.menu a.aqui  { color: var(--texto); background: var(--violeta-humo); border-color: var(--violeta-borde); }
/* Una seccion que todavia NO existe en ninguna parte: se ve, pero no se puede pulsar. Va mas
   apagada que las de Xojo a proposito — aquellas llevan a algun sitio, estas no. */
.menu-por-crear {
  display: flex; align-items: center; gap: var(--e2);
  min-height: 44px; padding: 0 var(--e3);
  border-radius: var(--radio-s); border: 1px dashed rgba(255,255,255,.08);
  color: var(--texto-3); font-size: 13.5px; opacity: .5; cursor: default;
}
/* ⭐ cPanel es un submenu que se pliega: son nueve entradas de administracion y el dia a dia
   esta arriba. Se abre solo cuando estas dentro de una de ellas. */
.menu-grupo > summary {
  display: flex; align-items: center; gap: var(--e2);
  min-height: 44px; padding: 0 var(--e3);
  border-radius: var(--radio-s); border: 1px solid transparent;
  background: rgba(255, 255, 255, .02);
  color: var(--texto-2); font-size: 13.5px;
  cursor: pointer; list-style: none; transition: .15s ease;
}
/* El triangulito del navegador fuera: se pone uno propio que gira. */
.menu-grupo > summary::-webkit-details-marker { display: none; }
.menu-grupo > summary::marker { content: ''; }
.menu-grupo > summary:hover {
  color: var(--texto); background: rgba(255, 255, 255, .05); border-color: rgba(255, 255, 255, .06);
}
.menu-flecha {
  margin-left: auto; color: var(--texto-3); font-size: 15px; line-height: 1;
  transition: transform .15s ease;
}
.menu-grupo[open] > summary { color: var(--texto); }
.menu-grupo[open] .menu-flecha { transform: rotate(90deg); }

/* Los hijos, con una guia a la izquierda para que se lean como lo que son. */
.menu-hijos {
  display: flex; flex-direction: column; gap: var(--e1);
  margin: var(--e1) 0 var(--e2) 14px; padding-left: 10px;
  border-left: 1px solid var(--borde);
}

.menu .grupo  {
  margin: var(--e3) 0 var(--e1); padding: 0 var(--e2);
  font-size: 11px; text-transform: uppercase; letter-spacing: .1em; color: var(--texto-3);
}

.hoja { padding: var(--e4) var(--e3) var(--e5); max-width: 1280px; }

/* ⭐ Una pantalla de DOS PANELES aprovecha TODO el ancho (Darwin, 2026-08-18: «que la columna de
   la derecha aproveche el espacio restante de la página, se está cortando antes y queda mucho
   espacio»). El tope de 1280 px es bueno para un texto largo —una línea de 200 caracteres no se
   lee— pero aquí la izquierda son 360 px fijos, así que se lo comía todo de la DERECHA: en una
   pantalla de 2000 px la ficha se cortaba y quedaban 650 px vacíos.
   ⚠️ Sólo donde hay `.dos-panes`. Las demás pantallas siguen con su tope. */
.hoja:has(.dos-panes) { max-width: none; }

/* ══════════════════════════════════════════════════════════════════ piezas ══ */

.tarjeta {
  background: var(--panel);
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  overflow: hidden;
}
/* La cabecera de tarjeta: titulo a la izquierda, pildora a la derecha. */
.tarjeta-cab {
  display: flex; align-items: center; justify-content: space-between; gap: var(--e2);
  padding: var(--e3) var(--e4);
  border-bottom: 1px solid var(--borde);
}
.tarjeta-cab h2, .tarjeta-cab h3 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: .2px; }
.tarjeta-cuerpo { padding: var(--e4); }

.pildora {
  padding: 6px 11px; border: 1px solid var(--borde); border-radius: 999px;
  background: var(--panel-3); color: var(--texto-2); font-size: 12px; line-height: 1;
  white-space: nowrap;
}
.pildora-ok   { color: #bff5d0; background: rgba(34,197,94,.12);  border-color: rgba(34,197,94,.45); }
.pildora-mal  { color: #ffd3db; background: rgba(255,92,122,.12); border-color: rgba(255,92,122,.45); }
.pildora-ojo  { color: #fde68a; background: rgba(234,179,8,.12);  border-color: rgba(234,179,8,.45); }

.titulo    { margin: 0 0 var(--e1); font-size: 22px; font-weight: 700; letter-spacing: .2px; }
.subtitulo { margin: 0 0 var(--e4); color: var(--texto-2); font-size: 13.5px; }
.seccion   { margin: var(--e5) 0 var(--e3); font-size: 15px; font-weight: 600; }

.fila { display: flex; align-items: center; gap: var(--e2); flex-wrap: wrap; }

/* Botones */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--e1);
  min-height: 42px; padding: 0 var(--e4);
  border: 1px solid var(--borde); border-radius: var(--radio-s);
  background: var(--panel-3); color: var(--texto-2);
  font-size: 14px; font-family: inherit; cursor: pointer;
  transition: .15s ease;
}
.btn:hover { color: var(--texto); background: var(--realce-2); border-color: var(--borde-2); }
.btn-primario {
  background: var(--violeta); border-color: var(--violeta); color: #fff; font-weight: 600;
  box-shadow: 0 6px 18px rgba(106, 84, 190, .35);
}
.btn-primario:hover { background: var(--violeta-claro); border-color: var(--violeta-claro); color: #fff; }
.btn-peligro { border-color: rgba(248,113,113,.4); color: var(--rojo); }
.btn:disabled { opacity: .5; cursor: not-allowed; }

/* Formularios */
.campo { display: block; margin-bottom: var(--e4); }
.campo > span { display: block; margin-bottom: var(--e1); font-size: 12.5px; color: var(--texto-2); }
.campo input, .campo select, .campo textarea {
  width: 100%; min-height: 44px; padding: 0 var(--e3);
  background: var(--campo); color: var(--texto);
  border: 1px solid var(--borde); border-radius: var(--radio-s);
  font-size: 16px;                      /* 📱 por debajo de 16 el iPhone hace zoom al enfocar */
  font-family: inherit;
  transition: .15s ease;
}
.campo textarea { padding: var(--e2) var(--e3); min-height: 96px; line-height: 1.5; }
.campo input:focus, .campo select:focus, .campo textarea:focus {
  outline: none; border-color: var(--violeta); box-shadow: 0 0 0 3px var(--violeta-humo);
}
.campo input::placeholder { color: var(--texto-3); }

/* ⛔ UNA CASILLA NO ES UN CAMPO DE TEXTO. La regla de arriba le daba `width:100%`, relleno y borde,
   asi que salia un cuadro gris enorme con la etiqueta aplastada al otro lado. No es un fallo de
   una pantalla: le habria pasado a CUALQUIER casilla metida en un `.campo`, por eso se arregla en
   la regla. */
.campo input[type="checkbox"],
.campo input[type="radio"] {
  /* Tamaño a mano: por defecto el navegador la pinta al tamaño del texto del formulario y aqui
     salia grandota al lado de una linea de 13px. */
  width: 15px;
  height: 15px;
  min-width: 0;
  padding: 0;
  margin: 0;
  flex: 0 0 auto;
  accent-color: var(--verde);
  cursor: pointer;
}

/* Avisos */
.aviso { padding: var(--e3) var(--e4); border-radius: var(--radio-s); margin-bottom: var(--e4); font-size: 13.5px; }
.aviso-malo  { background: rgba(248,113,113,.12); border: 1px solid rgba(248,113,113,.35); color: #FFD9D9; }
.aviso-bueno { background: rgba(74,222,128,.10);  border: 1px solid rgba(74,222,128,.30);  color: #D6FFE4; }
.aviso-nota  { background: var(--panel-3);        border: 1px solid var(--borde);          color: var(--texto-2); }

.chip { display: inline-block; padding: 3px 10px; border-radius: 999px; font-size: 11.5px; font-weight: 600; }
.chip-si { background: rgba(74,222,128,.14);  color: var(--verde); }
.chip-no { background: rgba(148,163,184,.14); color: var(--texto-3); }

.vacio  { padding: var(--e5) var(--e3); text-align: center; color: var(--texto-3); }
.conteo { color: var(--texto-3); font-size: 12.5px; margin-bottom: var(--e2); }

.cargando { display: none; color: var(--texto-3); }
.htmx-request .cargando, .htmx-request.cargando { display: inline-block; }

/* ═══════════════════════════════════════════════════════ cifras del panel ══ */

.kpis { display: grid; grid-template-columns: 1fr; gap: var(--e2); }
.kpi {
  background: var(--panel-2);
  border: 1px solid var(--borde);
  border-radius: 14px;
  padding: var(--e3) var(--e4);
  min-height: 84px;
  display: flex; flex-direction: column; justify-content: center;
}
.kpi-rotulo { font-size: 12px; color: var(--texto-2); margin-bottom: 6px; }
/* ⛔ Un importe NO se parte. «$1,067,682.» en una linea y «76» en la siguiente no es un numero,
   es un error de maquetacion — y era lo que pasaba con `word-break`. En vez de romperlo, se
   encoge: `clamp` baja el tamaño en pantallas estrechas y la clase `largo` lo baja otro poco
   cuando la cifra tiene muchos digitos. Y `tabular-nums` alinea las columnas de numeros. */
.kpi-valor {
  font-size: clamp(18px, 1.5vw + 10px, 23px);
  font-weight: 700; line-height: 1.15; letter-spacing: -.4px;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.kpi-valor.largo { font-size: clamp(15px, 1.1vw + 8px, 19px); }
.kpi-pie    { font-size: 11.5px; color: var(--texto-3); margin-top: 4px; }

.graficas { display: grid; grid-template-columns: 1fr; gap: var(--e3); }

/* ═══════════════════════════════════════════════════════ listas y tablas ══ */
/*
 * 📱 Una tabla de ocho columnas no se lee en un movil. En pantalla chica cada FILA se vuelve una
 * ficha y el nombre de la columna se pinta delante del dato con `data-col`. Mismo HTML.
 */
.tabla { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.tabla thead { display: none; }
.tabla tbody tr {
  display: block; margin-bottom: var(--e2); padding: var(--e3);
  background: var(--panel-2); border: 1px solid var(--borde); border-radius: var(--radio-xs);
}
.tabla tbody td { display: flex; justify-content: space-between; gap: var(--e3); padding: 5px 0; border: 0; }
.tabla tbody td::before { content: attr(data-col); color: var(--texto-3); font-size: 12.5px; flex: none; }

/* ═════════════════════════════════════════════ dos panes (Usuarios y demas) ══ */

.dos-panes { display: block; }
.pane-lista, .pane-ficha { min-width: 0; }
.dos-panes.viendo-ficha .pane-lista { display: none; }
.dos-panes:not(.viendo-ficha) .pane-ficha { display: none; }

.pane-cabeza { display: flex; align-items: center; gap: var(--e2); margin-bottom: var(--e3); }
.pane-cabeza .btn { margin-left: auto; }

.pane-filtros { display: flex; flex-wrap: wrap; gap: var(--e2); align-items: center; margin-bottom: var(--e3); }
.buscador, .filtro {
  min-height: 42px; padding: 0 var(--e3); font-size: 15px; font-family: inherit;
  background: var(--campo); color: var(--texto);
  border: 1px solid var(--borde); border-radius: var(--radio-s);
}
.buscador { flex: 1 1 150px; min-width: 0; }
.filtro   { flex: 1 1 140px; min-width: 0; }
/* El de resellers, en su propia linea: «WIFI SERVICES CARIBBEAN INC» no cabe al lado de nada. */
.filtro-ancho { flex: 1 1 100%; overflow: hidden; text-overflow: ellipsis; }
.buscador:focus, .filtro:focus { outline: none; border-color: var(--violeta); box-shadow: 0 0 0 3px var(--violeta-humo); }

.fila-usuario {
  padding: var(--e3) var(--e4); margin-bottom: var(--e1);
  background: var(--panel); border: 1px solid var(--borde); border-radius: var(--radio-s);
  cursor: pointer; transition: .15s ease;
}
.fila-usuario:hover, .fila-usuario:focus-visible {
  border-color: var(--violeta-borde); background: rgba(99,102,241,.10); outline: none;
}
/* Inactivo: el NOMBRE en rojo (Darwin). La fila se atenua, pero menos que antes — al 50 % el
   rojo se apagaba tanto que dejaba de leerse como aviso, que es justo para lo que esta. */
.fila-usuario.off { opacity: .72; }
.fila-usuario.off .fila-nombre { color: var(--rojo); }
.fila-principal { display: flex; align-items: center; gap: var(--e2); }
.fila-nombre { font-weight: 600; }
.fila-detalle { color: var(--texto-3); font-size: 12.5px; margin-top: 1px; }

/* La ficha en acordeones */
.ficha-cabeza { display: flex; align-items: center; gap: var(--e2); margin-bottom: var(--e3); }
.solo-movil { display: inline-flex; }

.acordeon {
  background: var(--panel); border: 1px solid var(--borde);
  border-radius: var(--radio-s); margin-bottom: var(--e2); overflow: hidden;
  box-shadow: var(--sombra);
}
.acordeon > summary {
  padding: var(--e3) var(--e4); cursor: pointer; font-weight: 600; font-size: 13.5px;
  list-style: none; min-height: 46px; display: flex; align-items: center;
  transition: background .15s ease;
}
.acordeon > summary:hover { background: rgba(255,255,255,.03); }
.acordeon > summary::-webkit-details-marker { display: none; }
.acordeon > summary::after { content: '⌄'; margin-left: auto; color: var(--texto-3); }
.acordeon[open] > summary::after { content: '⌃'; }
.acordeon[open] > summary { border-bottom: 1px solid var(--borde); }
.acordeon-cuerpo { padding: var(--e3) var(--e4) var(--e4); }

.dato { display: flex; justify-content: space-between; gap: var(--e4); padding: 8px 0; font-size: 13.5px; }
.dato + .dato { border-top: 1px solid var(--borde); }
.dato span { color: var(--texto-2); }
.dato strong { text-align: right; word-break: break-word; font-weight: 600; }

.permiso-area {
  margin: var(--e3) 0 var(--e1); font-size: 11px; text-transform: uppercase;
  letter-spacing: .1em; color: var(--texto-3);
}
.permisos { display: grid; grid-template-columns: 1fr; gap: 1px; }
.permiso { display: flex; align-items: center; gap: var(--e2); padding: 5px 0; color: var(--texto-3); font-size: 13px; }
.permiso.si { color: var(--texto); }
.permiso .marca { width: 18px; text-align: center; }
.permiso.si .marca { color: var(--verde); }

/* ══════════════════════════════════════════════════════════════ la entrada ══ */

.entrada {
  min-height: 100vh; min-height: 100dvh;
  display: grid; place-items: center; padding: var(--e4);
}
.entrada .caja { width: 100%; max-width: 400px; }
.entrada .marca { text-align: center; font-size: 28px; font-weight: 700; letter-spacing: .3px; }
.entrada .marca span { color: var(--violeta-claro); }
.entrada .lema { text-align: center; color: var(--texto-3); font-size: 13.5px; margin: 6px 0 var(--e5); }
.entrada .tarjeta { padding: var(--e5) var(--e4) var(--e4); }

/* ══════════════════════════════════════════════════════════ pantalla ancha ══ */

@media (min-width: 900px) {
  .hamburguesa, .cortina, .solo-movil { display: none; }

  /* ⭐ El menu se queda SIEMPRE visible, pero encogido a sus iconos (Darwin). Se despliega al
     acercar el raton al borde izquierdo o al tocarlo, y lo hace ENCIMA del contenido: si empujara,
     la pantalla entera daria un salto cada vez que alguien pasa el raton por ahi.
     Con 260 px de menu la ficha del cliente se salia por la derecha; con 60 se ganan 200. */
  /* ⭐ El menu vive como una TIRA DE ICONOS de 60 px y se despliega al acercar el raton o al
     tocarlo, por encima del contenido — nunca empujandolo, o la pantalla daria un salto cada vez
     que alguien pasa por ahi. Con 260 px fijos la ficha del cliente se salia por la derecha.

     ⚠️ El ancho lo pone `naiRail()` en el propio elemento y no una regla `:hover`. Se intento con
     `width` y con `max-width` y las dos se quedaban clavadas en 60: la regla estaba, el selector
     casaba y no hay ningun `!important` en ninguna hoja — hasta un `style="width:260px"` en linea
     perdia. Desde JS, con prioridad, si obedece. Queda escrito para que nadie lo "simplifique"
     otra vez a un :hover que no funciona. */
  .menu {
    transform: none;
    width: var(--menu-tira);
    overflow-x: hidden;
    transition: width .16s ease;
    padding: var(--e3) 0;              /* sin lados: el icono se centra en los 60 px */
  }

  /* Encogido: solo el icono, centrado. El rotulo sigue en el HTML —para el lector de pantalla y
     para el `title`— pero no se ve. */
  .menu a { padding: 0; justify-content: center; gap: 0; }
  .menu .menu-txt, .menu .menu-xojo { display: none; }
  /* Del submenu solo se ve su icono, centrado como los demas. Los hijos pierden la guia y la
     sangria: en 60 px no caben, y sangrarlos dejaria los iconos descuadrados. */
  .menu-grupo > summary { padding: 0; justify-content: center; gap: 0; }
  .menu-grupo .menu-flecha { display: none; }
  .menu-hijos { margin: var(--e1) 0; padding-left: 0; border-left: 0; }
  .menu .grupo { height: 10px; padding: 0; overflow: hidden; }
  .menu .grupo .menu-txt { display: none; }

  /* Desplegado: el icono vuelve a la izquierda y aparecen los rotulos. */
  .menu.desplegado a { padding: 0 var(--e3); justify-content: flex-start; gap: var(--e2); }
  .menu.desplegado .menu-grupo > summary {
    padding: 0 var(--e3); justify-content: flex-start; gap: var(--e2);
  }
  .menu.desplegado .menu-grupo .menu-flecha { display: inline; }
  .menu.desplegado .menu-hijos {
    margin: var(--e1) 0 var(--e2) 14px; padding-left: 10px; border-left: 1px solid var(--borde);
  }
  .menu.desplegado .menu-txt { display: inline; }
  .menu.desplegado .menu-xojo { display: inline; }
  .menu.desplegado .grupo { height: auto; padding: 0 var(--e2); }
  .menu.desplegado .grupo .menu-txt { display: inline; }

  /* ⭐ CENTRADA, sea cual sea el ancho (Darwin, 2026-08-20). Antes el margen izquierdo era FIJO
     y no habia derecho, asi que la hoja se quedaba arrimada a la izquierda: en 1920 px sobraban
     600 px muertos a la derecha.
     `max()` y no `margin: auto`: la tira de iconos es `position: fixed`, y un auto puro meteria
     el contenido POR DEBAJO de los iconos en pantallas estrechas. Asi nunca baja de la tira:
        1920 → max(60, 320) = 320 px, centrada    ·    1280 → max(60, 0) = 60 px, como antes */
  .hoja {
    margin-left: max(var(--menu-tira), calc(50% - 640px));
    margin-right: auto;
    padding: var(--e4) var(--e5) var(--e5);
  }

  /* ⚠️ Las de DOS PANELES no tienen tope de ancho, asi que `calc(50% - 640px)` les daria un
     margen enorme sin sentido: se quedan pegadas a la tira, aprovechando todo el ancho. */
  .hoja:has(.dos-panes) { margin-left: var(--menu-tira); margin-right: 0; }

  .kpis     { grid-template-columns: repeat(4, 1fr); gap: var(--e3); }
  .graficas { grid-template-columns: 1fr 1fr; }
  .permisos { grid-template-columns: 1fr 1fr; gap: 1px var(--e4); }

  .tabla thead { display: table-header-group; }
  .tabla thead th {
    text-align: left; padding: var(--e2) var(--e3);
    font-size: 11px; text-transform: uppercase; letter-spacing: .08em;
    color: var(--texto-3); border-bottom: 1px solid var(--borde); white-space: nowrap; font-weight: 600;
  }
  .tabla tbody tr {
    display: table-row; margin: 0; padding: 0;
    background: none; border: 0; border-bottom: 1px solid var(--borde); border-radius: 0;
  }
  .tabla tbody tr:last-child { border-bottom: 0; }
  .tabla tbody tr:hover { background: rgba(255,255,255,.03); }
  .tabla tbody td { display: table-cell; padding: var(--e2) var(--e3); vertical-align: middle; }
  .tabla tbody td::before { content: none; }

  /* ⭐ La lista de la izquierda CRECE Y ENCOGE con la ventana (Darwin, 2026-08-18: «debe
     adaptarse dinamicamente al espacio en pantalla… no se ajusta cuando cierro un poco el
     navegador»).
     ⛔ Antes eran 360 px CLAVADOS a cualquier ancho: en una pantalla de 2.000 px sobraba sitio y
     la lista seguia estrecha —los nombres largos partidos en tres lineas—, y al estrechar el
     navegador se comia el espacio de la ficha en vez de ceder ella.
     `clamp` le pone suelo y techo: nunca menos de 300 px (por debajo no cabe una fila de cliente)
     ni mas de 460 (a partir de ahi solo es hueco). */
  .dos-panes {
    display: grid;
    grid-template-columns: clamp(300px, 24%, 460px) 1fr;
    gap: var(--e4); align-items: start;
  }
  .dos-panes.viendo-ficha .pane-lista,
  .dos-panes:not(.viendo-ficha) .pane-ficha { display: block; }
  .pane-lista { position: sticky; top: calc(var(--barra-alto) + var(--e4)); max-height: 80vh; overflow-y: auto; }
}

@media (min-width: 1400px) {
  .kpis { grid-template-columns: repeat(6, 1fr); }
}

/* ── Bitácora de un usuario ─────────────────────────────────────────────────────────────
   Se pinta como fichas y no como tabla: cada apunte tiene un texto largo y un «qué cambió»
   plegable, y eso en una tabla no cabe — menos aún en un móvil. */
/* Los filtros se pintan UNA vez y se quedan quietos — lo que se refresca es la lista de abajo.
   Si se reemplazaran ellos, el recuadro de fecha que estás escribiendo se destruiría a media
   escritura y perderías el foco. */
.log-filtros {
  display: grid; gap: var(--e2);
  margin-bottom: var(--e3); padding-bottom: var(--e3);
  border-bottom: 1px solid var(--borde);
}
.log-filtros .campo { margin: 0; }
.campo-corto { flex: 1 1 130px; min-width: 0; }

.log-rangos { display: flex; flex-wrap: wrap; gap: var(--e1); }
.log-fechas { display: flex; gap: var(--e2); }
.log-fechas .campo { flex: 1 1 0; }
.log-otros  { display: flex; flex-wrap: wrap; gap: var(--e2); }
.log-otros .campo:last-child { flex: 1 1 100%; }   /* la búsqueda, en su propia línea */

/* Los atajos de rango: pequeños, y el puesto se ve encendido. */
.btn-chico   { min-height: 34px; padding: 0 var(--e3); font-size: 13px; }
.btn-elegido { background: var(--violeta-humo); border-color: var(--violeta-borde); color: var(--texto); }

.log-zona { color: var(--texto-3); font-weight: 400; }

.log-linea {
  padding: var(--e3); margin-bottom: var(--e2);
  background: var(--hueco);
  border: 1px solid var(--borde); border-radius: var(--radio-s);
}
.log-cab { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2); }
.log-cuando { font-variant-numeric: tabular-nums; font-size: 13px; color: var(--texto-2); }
.chip-modulo { background: var(--violeta-humo); border-color: var(--violeta-borde); }
.log-que   { margin-top: 4px; }
.log-quien { margin-top: 2px; font-size: 13px; color: var(--texto-3); }
.log-ip    { margin-top: 4px; font-size: 12px; color: var(--texto-3); font-variant-numeric: tabular-nums; }

.log-detalle { margin-top: var(--e2); }
.log-detalle summary { cursor: pointer; font-size: 13px; color: var(--texto-2); }
.log-cambios { margin-top: var(--e2); display: grid; gap: 4px; }
.log-cambios > div { display: flex; gap: var(--e2); align-items: baseline; }
.log-cambios span { flex: 0 0 52px; font-size: 12px; color: var(--texto-3); }
/* El JSON puede ser largo: se deja desbordar en su propia caja, nunca ensanchando la página. */
.log-cambios code {
  flex: 1; min-width: 0; overflow-x: auto; white-space: pre;
  font-size: 12px; padding: 4px 6px;
  background: var(--hueco); border-radius: 6px;
}

.log-paso { display: flex; align-items: center; gap: var(--e3); margin-top: var(--e3); }
.log-pagina { color: var(--texto-3); font-size: 13px; font-variant-numeric: tabular-nums; }

/* ── La ficha del cliente ───────────────────────────────────────────────────────────────
   Lo que se pregunta primero va SIEMPRE arriba y no depende de la sección abierta: quién es,
   su número de cuenta, si tiene servicio y hasta cuándo. */
.customer-head {
  padding-bottom: var(--e3); margin-bottom: var(--e3);
  border-bottom: 1px solid var(--borde);
}
.customer-title { display: flex; align-items: flex-start; gap: var(--e2); }
.customer-sub   { color: var(--texto-2); font-size: 13px; margin-top: 2px; }
.customer-chips { display: flex; flex-wrap: wrap; gap: var(--e1); margin-top: var(--e2); }

/* La tira de secciones: se desliza en móvil y cabe entera en pantalla ancha.
   ⚠️ `scrollbar-width:none` esconde la barra pero NO el desplazamiento — se sigue arrastrando. */
/* ⭐ DOS FILAS, como las pestañas de un fichero (Darwin): arriba las seis del día a día, abajo
   el resto. En una sola tira las últimas quedaban cortadas y había que deslizar para descubrir
   que Telefonía y Mensajes existían — en la pantalla donde más horas se pasan, eso no vale. */
.customer-nav {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--e1);
  padding-bottom: var(--e2); margin-bottom: var(--e3);
  border-bottom: 1px solid var(--borde);
}
/* ⭐ El separador es una RAYITA, no un salto de linea: las pestañas se acomodan solas al ancho
   que haya (Darwin, 2026-08-18).
   ⛔ Antes era `flex: 0 0 100%`, o sea un salto forzado: partia la tira en dos filas SIEMPRE,
   incluso en una pantalla donde las once caben de sobra en una — y dejaba media fila vacia. La
   rayita conserva lo que aportaba —separar el dia a dia de lo que se abre de vez en cuando— sin
   imponer donde parte. */
.nav-sep {
  flex: 0 0 auto; align-self: stretch; width: 1px; min-height: 20px;
  background: var(--borde); margin: 0 var(--e2);
}
.nav-chip {
  flex: 0 0 auto;
  min-height: 34px; padding: 0 var(--e3);
  border: 1px solid transparent; border-radius: 999px;
  background: rgba(255, 255, 255, .03); color: var(--texto-2);
  font-size: 13px; font-family: inherit; cursor: pointer; white-space: nowrap;
  transition: .15s ease;
}
.nav-chip:hover  { color: var(--texto); background: rgba(255, 255, 255, .07); }

/* ⭐ El acceso rapido, empujado al otro extremo de la barra (Darwin, 2026-08-20).
   ⚠️ `margin-left:auto` en el GRUPO y no en cada boton: en cada uno, el primero se come todo el
   hueco y los separa a lo ancho en vez de dejarlos juntos.
   📱 Si las pestañas llenan la fila, el grupo baja entero a la siguiente y sigue a la derecha —
   `.customer-nav` es `flex-wrap: wrap`. */
.nav-acciones {
  margin-left: auto; flex: 0 0 auto;
  display: inline-flex; align-items: center; gap: var(--e1);
}

.nav-chip-on     { color: var(--texto); background: var(--violeta-humo); border-color: var(--violeta-borde); }

/* Dos campos por línea en pantalla ancha, uno en móvil: un nombre y una inicial al lado se leen
   como lo que son, y en un teléfono apilados no se pierde nada. */
.campos-2 { display: flex; flex-wrap: wrap; gap: var(--e2); }
.campos-2 .campo { flex: 1 1 200px; min-width: 0; margin: 0; }
.campos-2 .campo-corto { flex: 0 1 120px; }
.dato {
  display: flex; justify-content: space-between; gap: var(--e2);
  padding: var(--e2) 0; border-top: 1px solid var(--borde);
  font-size: 13.5px;
}
.dato span { color: var(--texto-3); }

/* El código de activación: en verde porque es LO que se le dicta al cliente, y con espaciado
   de tabla para que un 0 y una O no se confundan al leerlo en voz alta. */
.codigo-activacion {
  color: var(--verde);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 15px; letter-spacing: .06em;
  user-select: all;              /* un clic lo selecciona entero */
}

/* La ficha que está abierta se queda marcada en la lista. Con 500 filas y el panel de la derecha
   lleno, sin esto no se sabe a quién se está mirando. */
.fila-usuario.fila-elegida {
  border-color: var(--violeta);
  background: var(--violeta-humo);
  box-shadow: inset 3px 0 0 var(--violeta);
}

/* ── Los equipos del cliente ────────────────────────────────────────────────────────────
   Fichas, no tabla: de un equipo importan cinco cosas y hay clientes con más de cien. */
.device {
  padding: var(--e3); margin-bottom: var(--e2);
  background: var(--hueco);
  border: 1px solid var(--borde); border-radius: var(--radio-s);
}
.device-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2); }
/* El punto de «encendido»: es lo primero que se busca cuando alguien llama diciendo que no le
   funciona la TV. Gris off, verde encendido. */
.device-dot {
  width: 9px; height: 9px; border-radius: 50%;
  background: var(--texto-3); flex: 0 0 auto;
}
.device-dot.on { background: var(--verde); box-shadow: 0 0 8px rgba(74, 222, 128, .6); }
.device-kind {
  font-size: 11px; text-transform: uppercase; letter-spacing: .08em; color: var(--texto-3);
}
.device-id { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 14px; }
.device-playing { margin-top: var(--e1); color: var(--verde); font-size: 13px; }
/* ⭐ Por dónde le llega el directo a un equipo que está viendo algo: el servidor y el país de su
   IP. Van pegados a lo que reproduce porque es ahí donde el dato sirve — una queja de cortes se
   atiende distinto según de dónde se surta. Discretos: son contexto, no el titular. */
.device-via, .device-country {
  display: inline-block; margin-left: var(--e2);
  padding: 1px 7px; border-radius: 10px;
  font-size: 11px; font-weight: 600; letter-spacing: .3px;
  vertical-align: middle;
}
.device-via  { background: rgba(80,70,151,.16); color: var(--violeta, #6558C4); }
.device-country { background: var(--fondo-3, rgba(0,0,0,.05)); color: var(--texto-3); }
.device-datos {
  display: flex; flex-wrap: wrap; gap: var(--e1) var(--e3);
  margin-top: var(--e1); font-size: 12.5px; color: var(--texto-3);
}
.device form { margin-top: var(--e2); }

/* ⭐ El desplegable de «a qué servidor va este equipo». En una línea y discreto: se mira poco y
   se cambia menos, pero cuando hace falta tiene que estar a la vista y no escondido en un menú. */
/* Casilla con su explicación al lado, para las banderas de Streaming Servers: una bandera que
   dice sólo «serves_api» no se entiende; con la frase detrás, sí. */
.field-check {
  display: flex; align-items: flex-start; gap: var(--e2);
  margin-bottom: var(--e2); font-size: 13px; line-height: 1.45; cursor: pointer;
}
.field-check input[type=checkbox] { margin-top: 3px; flex: 0 0 auto; }
.field-check > span { color: var(--texto-2); }

.device-server { margin-top: var(--e2); }
.device-server .field-inline {
  display: flex; align-items: center; gap: var(--e2);
  margin: 0;
}
.device-server .field-inline > span {
  font-size: 12.5px; color: var(--texto-3); white-space: nowrap;
}
.device-server select { max-width: 320px; }
.device-server .ho-pista { display: block; margin-top: var(--e1); font-size: 11.5px; }

/* La zona de la que no se vuelve: separada del resto para que no se pulse de paso. */
.zona-peligro {
  margin-top: var(--e5); padding: var(--e3);
  border: 1px solid rgba(248, 113, 113, .25); border-radius: var(--radio-s);
  background: rgba(248, 113, 113, .04);
}

/* ── MRC ────────────────────────────────────────────────────────────────────────────────
   El total del mes es el número que se busca al entrar: va grande y arriba. */
.mrc-resumen {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: var(--e3); margin-bottom: var(--e3);
}
.mrc-rotulo { font-size: 12px; text-transform: uppercase; letter-spacing: .08em; color: var(--texto-3); }
.mrc-lado { color: var(--texto-2); font-size: 13px; }

/* Una tabla ancha se desplaza DENTRO de su caja; la página nunca se mueve de lado.
   ⚠️ Y se desvanece por el borde derecho para que se NOTE que sigue: sin eso la última columna
   —que suele ser el total— parece cortada y nadie descubre que se puede arrastrar. */
.tabla-envoltura {
  overflow-x: auto; scrollbar-width: thin;
  -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 24px), transparent);
          mask-image: linear-gradient(90deg, #000 calc(100% - 24px), transparent);
}
.tabla { width: 100%; border-collapse: collapse; font-size: 13px; }
.tabla th {
  text-align: left; padding: var(--e2); white-space: nowrap;
  font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--texto-3);
  border-bottom: 1px solid var(--borde);
}
.tabla td { padding: var(--e2); border-bottom: 1px solid var(--borde); white-space: nowrap; }

/* ⭐ La columna de TEXTO puede partir en varias lineas; las de numeros no.
   ⛔ `.tabla td { white-space: nowrap }` vale para las cifras —una fecha o un importe partido en
   dos se lee fatal— pero con una descripcion larga empuja la tabla mas alla de su caja: la de
   lineas de una orden medía 1.063 px en 978, asi que la envoltura la desplazaba y **se comia el
   principio de cada fila**. Eso es lo que se veia cortado (Darwin, 2026-08-18).
   ⚠️ Se marca la columna, no se quita el nowrap general: en una tabla de dinero, envolver por
   defecto es peor. */
.tabla td.col-ancha, .tabla th.col-ancha { white-space: normal; min-width: 0; }
.tabla tbody tr:hover { background: rgba(255, 255, 255, .03); }

/* Las acciones de un equipo: plegadas, porque lo que se hace casi siempre es mirar. */
.acciones-equipo { margin-top: var(--e2); }
.acciones-equipo > summary {
  cursor: pointer; font-size: 12.5px; color: var(--texto-2);
  padding: var(--e1) 0; list-style: none;
}
.acciones-equipo > summary::-webkit-details-marker { display: none; }
.acciones-equipo > summary::before { content: '⋯ '; color: var(--texto-3); }
.acciones-equipo[open] > summary::before { content: '× '; }
.acciones-cuerpo { padding: var(--e2) 0 0; display: grid; gap: var(--e3); }
.accion { padding-top: var(--e2); border-top: 1px solid var(--borde); }
.accion:first-child { border-top: 0; padding-top: 0; }
.accion-rotulo {
  font-size: 11px; text-transform: uppercase; letter-spacing: .08em;
  color: var(--texto-3); margin-bottom: var(--e2);
}
.accion form { margin: 0; }

.meta-datos { margin-top: var(--e2); display: grid; gap: 2px; }
.meta-fila {
  display: flex; justify-content: space-between; gap: var(--e2);
  font-size: 12.5px; padding: 3px 0; border-bottom: 1px solid var(--borde);
}
.meta-fila span { color: var(--texto-3); }
.meta-fila strong { font-weight: 500; text-align: right; word-break: break-word; }

/* Un dato sensible se tapa con la FUENTE, no con type=password: el navegador se ofrece a guardar
   las contraseñas y un número de tarjeta no lo es. El valor sigue ahí para poder guardarlo. */
.tapado {
  -webkit-text-security: disc;
  text-security: disc;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; letter-spacing: .12em;
}

/* ── Órdenes ────────────────────────────────────────────────────────────────────────────
   La cabecera se pulsa para abrir; el detalle sale debajo, sin salir de la lista. */
.orden {
  margin-bottom: var(--e2);
  background: var(--hueco);
  border: 1px solid var(--borde); border-radius: var(--radio-s);
  overflow: hidden;
}
.orden-abierta { border-color: var(--violeta-borde); }
.orden-cab {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2);
  padding: var(--e3); cursor: pointer;
}
.orden-cab:hover { background: rgba(255, 255, 255, .03); }
.orden-num    { font-variant-numeric: tabular-nums; }
.orden-fecha  { color: var(--texto-3); font-size: 13px; }
.orden-total  { margin-left: auto; font-variant-numeric: tabular-nums; }
.orden-balance{ color: var(--rojo); font-size: 13px; font-variant-numeric: tabular-nums; }
.orden-cuerpo { padding: 0 var(--e3) var(--e3); border-top: 1px solid var(--borde); }

/* ── Notas ──────────────────────────────────────────────────────────────────────────────
   Las escritas por una persona y las que apunta el sistema van juntas, distinguidas por el
   punto: separarlas obligaría a mirar en dos sitios para entender una historia. */
.nota {
  padding: var(--e2) var(--e3); margin-bottom: var(--e1);
  border-left: 2px solid var(--violeta-borde);
  background: var(--hueco); border-radius: 0 var(--radio-s) var(--radio-s) 0;
}
.nota-sistema { border-left-color: var(--borde-2); opacity: .8; }
.nota-cab { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2); }
.nota-quien { font-size: 12px; color: var(--texto-3); }
textarea {
  min-height: 60px; padding: var(--e2) var(--e3); font-size: 15px; font-family: inherit;
  background: var(--campo); color: var(--texto);
  border: 1px solid var(--borde); border-radius: var(--radio-s); resize: vertical;
}
textarea:focus { outline: none; border-color: var(--violeta); box-shadow: 0 0 0 3px var(--violeta-humo); }

/* ── Editar una orden ───────────────────────────────────────────────────────────────────
   Ocho diálogos de la original, plegados dentro de la propia orden. */
.orden-acciones { margin-top: var(--e3); display: grid; gap: var(--e2); }
.linea-edit {
  padding: var(--e2); margin-bottom: var(--e2);
  background: rgba(255, 255, 255, .02);
  border: 1px solid var(--borde); border-radius: var(--radio-s);
}
.linea-titulo { font-size: 12px; color: var(--texto-3); margin-bottom: var(--e1); }

.catalogo { display: grid; gap: var(--e1); margin-top: var(--e2); }
.catalogo-fila {
  display: flex; align-items: center; gap: var(--e2);
  padding: var(--e2); border: 1px solid var(--borde); border-radius: var(--radio-s);
  background: rgba(255, 255, 255, .02);
}
.catalogo-fila:hover { border-color: var(--violeta-borde); }
.catalogo-precio { margin-left: auto; font-variant-numeric: tabular-nums; white-space: nowrap; }

/* ⛔ Un campo de FECHA nunca puede ser `campo-corto` a secas: en 120 px no cabe ni su propio
   control -el navegador pinta «08/18/2026» mas el icono del calendario, unos 160- y lo que sobra
   se corta por la derecha. Se le pone suelo aqui, para todas las fechas del panel a la vez, en vez
   de ir arreglandolas de una en una segun aparecen (ya paso en Inventario y en Gastos). */
.campo:has(input[type="date"]) { min-width: 175px; }
/* El nombre arriba y de que va debajo: en una linea, «BASIC TV PACKAGE · BASIC» se come media
   fila a lo ancho y empuja el precio contra el borde. */
.cat-nombre { min-width: 0; flex: 1 1 auto; }
.cat-nombre strong { display: block; line-height: 1.25; }
.pago-campos { margin-top: var(--e2); }

/* ── El diálogo del catálogo ────────────────────────────────────────────────────────────
   <dialog> de verdad: el navegador pone el fondo, atrapa el foco y lo cierra con Escape. */
.dlg {
  width: min(680px, 94vw); max-height: 86vh;
  padding: var(--e4); border: 1px solid var(--borde-2); border-radius: var(--radio);
  background: var(--dlg-fondo); color: var(--texto);
  box-shadow: 0 24px 60px rgba(0, 0, 0, .6);
  display: flex; flex-direction: column; gap: var(--e2);
}
.dlg::backdrop { background: rgba(0, 0, 0, .6); backdrop-filter: blur(2px); }
.dlg-titulo { margin: 0; font-size: 16px; font-weight: 600; }
.dlg-cerrar { position: absolute; top: var(--e2); right: var(--e2); }
.dlg-cerrar button {
  width: 32px; height: 32px; border-radius: 50%;
  background: var(--panel-3); border: 1px solid var(--borde); color: var(--texto-2);
  font-size: 18px; line-height: 1; cursor: pointer;
}
/* La lista se desplaza sola; el pie con los botones se queda siempre visible.
   ⚠️ El carrito lleva `flex: 0 0 auto`: sin eso la lista se comia todo el alto y lo elegido salia
   aplastado a cero — se veia el rotulo «Se van a añadir» y debajo nada. */
.dlg-lista   { flex: 1 1 auto; overflow-y: auto; min-height: 140px; }
.dlg-carrito {
  flex: 0 0 auto;
  border-top: 1px solid var(--borde); padding-top: var(--e2);
  max-height: 26vh; overflow-y: auto;
}
.dlg-pie { display: flex; justify-content: flex-end; gap: var(--e2); }

.catalogo { display: grid; gap: 4px; }
.catalogo-fila {
  display: flex; align-items: center; gap: var(--e2); width: 100%;
  padding: var(--e2); text-align: left; cursor: pointer;
  border: 1px solid var(--borde); border-radius: var(--radio-s);
  background: rgba(255, 255, 255, .02); color: var(--texto); font-family: inherit; font-size: 14px;
}
.catalogo-fila:hover { border-color: var(--violeta); background: var(--violeta-humo); }
.catalogo-precio { margin-left: auto; font-variant-numeric: tabular-nums; white-space: nowrap; }
.catalogo-mas { color: var(--violeta-claro); font-size: 18px; line-height: 1; }

.cart-fila { display: flex; align-items: center; gap: var(--e2); padding: 3px 0; font-size: 13px; }
.cart-nombre { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cart-qty { max-width: 70px; min-height: 32px; }
.cart-sub { font-variant-numeric: tabular-nums; white-space: nowrap; }
.cart-total { margin-top: var(--e2); text-align: right; color: var(--texto-2); font-size: 13px; }

/* Pestañas del catálogo: salen de las categorías que ese usuario puede ver, no de una lista fija. */
.cat-tabs {
  display: flex; flex-wrap: wrap; gap: var(--e1);
  padding-bottom: var(--e2); margin-bottom: var(--e2);
  border-bottom: 1px solid var(--borde);
}
.cat-tabs .nav-chip small { color: var(--texto-3); }

.dlg-cab { display: flex; align-items: center; justify-content: space-between; gap: var(--e2); }
.dlg-x {
  width: 32px; height: 32px; border-radius: 50%; cursor: pointer;
  background: var(--panel-3); border: 1px solid var(--borde); color: var(--texto-2);
  font-size: 18px; line-height: 1;
}
.dlg-x:hover { color: var(--texto); border-color: var(--borde-2); }

/* El borrador: nada de esto existe todavía en la base. */
.borrador { display: grid; gap: var(--e3); }
/* Ajustes de la ficha que se guardan por su cuenta (cobro automatico, dia de facturacion).
   El control va DEBAJO de su rotulo, no al otro extremo de la fila: con `.dato` quedaban a un
   palmo y no se sabia cual mandaba sobre cual. */
.ajustes-fila {
  display: flex;
  flex-wrap: wrap;
  gap: var(--e4);
  margin-top: var(--e4);
}
.ajuste-caja { flex: 1 1 260px; min-width: 240px; }
.ajuste { display: flex; flex-direction: column; gap: var(--e1); padding: 8px 0; }
.ajuste-rotulo { color: var(--texto-2); font-size: 13.5px; }
.ajuste .fila { display: flex; align-items: center; gap: var(--e2); }
.ajuste select.filtro { max-width: 160px; }

.draft-num { max-width: 90px; min-height: 32px; text-align: right; }

/* El precio, con su simbolo. Va pegado al campo y no dentro para que el input siga siendo
   numerico; `pointer-events:none` deja que al pulsar sobre el «$» el foco entre igual al campo. */
.draft-dinero { position: relative; display: inline-block; }
.draft-dinero-sim {
  position: absolute;
  left: 9px; top: 50%;
  transform: translateY(-50%);
  color: var(--texto-2);
  font-size: 13px;
  pointer-events: none;
}
.draft-num-dinero { padding-left: 20px; }
.draft-total {
  display: flex; align-items: baseline; justify-content: flex-end; gap: var(--e4);
  margin-top: var(--e2); color: var(--texto-2); font-size: 13px;
}

/* ⚠️ Dentro del diálogo, los controles NO se estiran. `.buscador` lleva `flex: 1 1 150px` para la
   barra de filtros, y en una columna flex eso lo convertía en una caja de 133 px de alto. */
.dlg .buscador, .dlg .cat-tabs, .dlg-cab, .dlg-pie { flex: 0 0 auto; }

/* ── El catálogo: la cantidad se pone en la propia fila ─────────────────────────────────
   Lo elegido se marca, para que se vea de un vistazo qué va a entrar en la orden. */
.catalogo-fila.elegida { border-color: var(--violeta); background: var(--violeta-humo); }
.cat-qty { max-width: 76px; min-height: 34px; text-align: right; flex: 0 0 auto; }
.dlg-cuenta { margin-right: auto; color: var(--texto-2); font-size: 13px; font-variant-numeric: tabular-nums; }

/* ⚠️ El diálogo se centra en la VENTANA, no en la página: con `position: fixed` no importa dónde
   esté el documento ni cuánto se haya bajado. `showModal()` ya lo hace, pero si algún día no
   estuviera disponible, esto evita que aparezca al final de la página. */
dialog.dlg[open] {
  position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);
  margin: 0; z-index: 100;
}

/* El catálogo va dentro de la pantalla, no en una ventana: se ve lo que se está montando
   mientras se elige. La lista se desplaza dentro de su propia caja. */
.cat-panel { max-height: 46vh; overflow-y: auto; margin-top: var(--e2); }

/* Al subir a una sección, que no se meta debajo de la barra de arriba. */
[id^="customer-section-"] { scroll-margin-top: 84px; }

/* La segunda línea de la cabecera de una orden: quién la hizo y por dónde entró. */
.orden-quien { display:block; color:var(--texto-3); font-size:11px; letter-spacing:.02em; }

/* ── El diálogo propio de confirmar y avisar ─────────────────────────────────────────────
   ⛔ Sustituye a window.confirm/alert: aquellos bloquean la pestaña entera y no se traducen. */
.nai-dlg {
  border: 1px solid var(--borde); border-radius: 14px; padding: 0;
  background: var(--dlg-fondo); color: var(--texto);
  max-width: min(440px, calc(100vw - 32px)); width: 100%;
  box-shadow: 0 24px 60px rgba(0,0,0,.45);
}
.nai-dlg::backdrop { background: rgba(0,0,0,.55); backdrop-filter: blur(2px); }
.nai-dlg-txt { margin: 0; padding: var(--e4) var(--e4) var(--e3); font-size: 15px; line-height: 1.5; }
.nai-dlg-pie {
  display: flex; gap: var(--e2); justify-content: flex-end;
  padding: 0 var(--e4) var(--e4);
}

/* Un pago se toca para ver todo lo que hay guardado de él. */
.pago-fila { cursor: pointer; }
.pago-fila:hover { background: var(--fondo-3); }
.pago-datos { display: grid; grid-template-columns: auto 1fr; gap: 4px var(--e3); margin: 0; font-size: 13px; }
.pago-datos dt { color: var(--texto-3); }
.pago-datos dd { margin: 0; color: var(--texto-1); overflow-wrap: anywhere; }

/* Un documento vencido se ve de lejos: es lo único que pide acción en esa pantalla. */
.device-alerta { border-color: color-mix(in srgb, var(--rojo) 45%, var(--borde)); }

/* ── Aviso de suplantación ────────────────────────────────────────────────────────────────
   Va arriba del todo, ocupa el ancho y no se puede confundir con nada de la aplicación:
   olvidar que estás viendo como otro es tomar decisiones sobre una pantalla que no es la tuya. */
.suplantando {
  position: sticky; top: 0; z-index: 60;
  display: flex; align-items: center; gap: var(--e3); flex-wrap: wrap;
  padding: 8px var(--e4);
  background: #7a4a00; color: #ffe9c7;
  font-size: 13px;
  border-bottom: 1px solid #a86a10;
}
.suplantando strong { color: #fff; }
.suplantando .btn { background: #ffe9c7; color: #4a2c00; border-color: #ffd79a; }

/* ── La conversación con el cliente ──────────────────────────────────────────────────────
   Lo suyo a la izquierda y lo nuestro a la derecha: es como se lee un chat sin pensar. */
.charla { display:flex; flex-direction:column; gap:10px; margin-top:var(--e3); }
.charla-linea { max-width:min(78%, 560px); }
.charla-mia { margin-left:auto; text-align:right; }
.charla-globo {
  display:inline-block; text-align:left;
  padding:8px 12px; border-radius:14px;
  background:var(--fondo-3); border:1px solid var(--borde);
  font-size:14px; line-height:1.45; overflow-wrap:anywhere;
}
.charla-mia .charla-globo { background:color-mix(in srgb, var(--violeta) 22%, var(--fondo-3)); }
.charla-fallo { border-color:var(--rojo); }
.charla-pie { margin-top:3px; font-size:11px; color:var(--texto-3); }

/* Quién está dentro: su nombre y, si es de un reseller, su empresa debajo. */
.quien-soy { display:flex; flex-direction:column; line-height:1.2; text-align:right; }
.quien-nombre  { color:var(--texto-3); font-size:13px; }
.quien-empresa { color:var(--texto-3); font-size:11px; opacity:.75; letter-spacing:.02em; }

/* ⚠️ Un `input type=date` necesita su ancho: en `campo-corto` el año salía cortado
   («08/01/20») porque el control del navegador no encoge, se recorta. */
.campo input[type="date"] { min-width: 160px; }

/* Una llamada con notas se toca para leerlas. */
.ivr-fila { cursor: pointer; }
.ivr-fila:hover { background: var(--fondo-3); }
.ivr-notas td { padding-top: 0; }

/* ⚠️ `hidden` en una fila de tabla lo pisa el `display: table-row` del CSS de la tabla, que es
   más específico. Sin esto, las notas de cada llamada salían siempre abiertas. */
.tabla tr[hidden] { display: none; }

/* ── Pantalla de alto de ventana: la cabecera se queda, el contenido se desplaza ──────────
   ⭐ Darwin quería la cabecera de la lista de proveedores y la de la ficha quietas al bajar.

   ⛔ Tres intentos fallaron antes de llegar aquí, y todos por lo mismo: **mientras la PÁGINA
   scrollee, un panel con scroll propio pelea con ella.** `position: sticky` dejaba las filas
   pasando por debajo; partir el panel dejaba su fondo fuera de la ventana; e interceptar la rueda
   acabó moviendo lo que no debía.

   ⭐ La solución es quitar la pelea: en esta pantalla la página NO scrollea. `<main>` mide justo
   la ventana, el resumen de arriba se queda fijo por ser un hijo que no crece, y lo que sobra se
   lo reparten los dos paneles — cada uno con su cabecera quieta y su lista desplazándose dentro.
   Sin una línea de JavaScript.

   ⚠️ Sólo en pantalla ancha. En móvil manda la página, como en el resto del panel. */
@media (min-width: 900px) {
  .hoja-alta {
    height: calc(100vh - var(--barra-alto));
    /* ⛔ Y EN EL IPAD, `dvh`. En iOS `100vh` NO es lo que se ve: es la ventana como si las barras
       del navegador estuvieran escondidas, o sea MAS ALTA que el hueco real. Con la pagina
       ademas bloqueada (el `overflow: hidden` de aqui abajo), la ultima tira de la pantalla
       quedaba debajo de la barra del navegador y no habia forma de llegar a ella: en el iPad
       «no baja». Reportado por Darwin el 2026-09-08 con Chrome.
       ⚠️ Y le pasa a los iPad porque este `@media` empieza en 900 px: en horizontal casi todos
       pasan de ahi (1080–1366), asi que entran por la puerta pensada para un escritorio.
       `100dvh` es el alto que se ve DE VERDAD. Va en una segunda linea, no sustituyendo a la
       primera: quien no entienda `dvh` se queda con `vh` y todo sigue como estaba.
       ⭐ Es el mismo par que ya usaba `.entrada` desde el principio. */
    height: calc(100dvh - var(--barra-alto));
    display: flex; flex-direction: column;
    overflow: hidden;
    padding-bottom: var(--e3);
  }

  /* ⛔ Y LA PAGINA NO SE DESPLAZA. Una `hoja-alta` mide EXACTAMENTE la ventana: cabecera (60) mas
     `100vh - 60`. Si algo anade UN solo pixel —una barra de desplazamiento horizontal, que
     `100vh` no descuenta; un margen; una fila que se pasa— la pagina ya se puede desplazar. Y
     como la cabecera es `sticky`, no se va: lo que se esconde DETRAS de ella es la barra de
     arriba de la pantalla. En NAIMail salian cortados el buzon y el boton de «Escribir».

     ⚠️ Medido: con 1 px de sobra la barra sube 1 px. No hace falta un fallo grande, basta
     cualquier pixel.

     Cerrar el desplazamiento de la PAGINA no quita nada, porque en estas pantallas nunca se
     desplazo: cada panel se desplaza por dentro y `.hoja-alta` ya era `overflow: hidden`. */
  html:has(main.hoja-alta),
  body:has(main.hoja-alta) { overflow: hidden; }

  /* El resumen de arriba no crece ni encoge; los paneles se quedan con el resto.
     ⚠️ `min-height: 0` es lo que permite que un hijo flex se haga MÁS PEQUEÑO que su contenido.
     Sin eso no aparece ningún scroll y la lista se sale por abajo. */
  .hoja-alta > * { flex: 0 0 auto; }
  .hoja-alta > .dos-panes { flex: 1 1 auto; min-height: 0; }

  /* Cada panel: alto completo de su columna, y partido en cabecera + contenido.

     ⚠️ Se escribe con `.dos-panes` en medio para EMPATAR en especificidad con
     `.dos-panes.viendo-ficha .pane-lista { display: block }`, que si no gana y deshace el reparto
     en cuanto se abre una ficha — la lista de la izquierda dejaba de tener scroll y se salia por
     abajo. Al empatar, gana la que va despues, que es esta. */
  .hoja-alta .dos-panes .pane-lista,
  .hoja-alta .dos-panes .pane-ficha {
    position: static;                 /* ya no hace falta `sticky`: no hay scroll de pagina */
    max-height: none;
    height: 100%;
    display: flex; flex-direction: column;
    overflow: hidden;
  }

  /* La ficha del proveedor llega dentro del panel y tiene que estirarse igual. */
  .hoja-alta .pane-alto {
    height: 100%;
    display: flex; flex-direction: column;
    overflow: hidden;
  }

  .hoja-alta .pane-fijo {
    flex: 0 0 auto;
    padding-bottom: var(--e2);
    margin-bottom: var(--e2);
    border-bottom: 1px solid var(--borde);
  }

  /* Lo que va DESPUÉS de la cabecera es lo que se desplaza.
     ⚠️ Sin `padding-top`: en un contenedor con scroll el relleno de arriba NO recorta — el
     contenido sube por dentro del hueco y asoma media fila bajo la cabecera. El aire va en el
     `margin-bottom` de la cabecera, que sí queda fuera de lo que se mueve. */
  .hoja-alta .pane-fijo ~ * {
    flex: 1 1 auto; min-height: 0;
    overflow-y: auto;
  }

  /* ⭐ Y se puede ANIDAR: una caja que ya se desplaza pero que a su vez tiene su propia cabecera
     fija deja de desplazarse ella y se parte otra vez. Asi la seccion de Ordenes tiene su balance
     y sus filtros quietos DENTRO de la ficha, que a su vez esta dentro de la pantalla — tres
     niveles con la misma regla.

     ⚠️ `:has()` hereda la especificidad de lo que lleva dentro, asi que esta gana a la de arriba
     y le quita el `overflow-y: auto`. Es a proposito: quien se desplaza ahora es su cuerpo. */
  .hoja-alta .pane-fijo ~ *:has(> .pane-fijo) {
    display: flex; flex-direction: column;
    overflow: hidden;
  }
  .hoja-alta .pane-fijo ~ .pane-cuerpo,
  .hoja-alta .pane-cuerpo {
    flex: 1 1 auto; min-height: 0;
    overflow-y: auto;
  }
}

/* ── Un bloque que se pliega ──────────────────────────────────────────────────────────────
   ⭐ Darwin: el resumen de Gastos se pliega para dejar sitio a las listas. En `hoja-alta` esos
   píxeles salen directamente del alto de los paneles, así que se notan mucho. */
.plegable-tirador {
  /* ⚠️ Ancho automatico, no 100%: a lo ancho de la pantalla la flecha se iba al otro extremo,
     a un palmo del rotulo, y no se leia como un solo boton. */
  display: inline-flex; align-items: center; gap: 6px;
  margin: 0 0 var(--e2);
  padding: 3px var(--e2);
  background: none; border: 0; border-radius: var(--radio-xs);
  color: var(--texto-3); font: inherit; font-size: 12px; letter-spacing: .04em;
  text-transform: uppercase; cursor: pointer;
}
.plegable-tirador:hover { background: var(--fondo-3); color: var(--texto-1); }
/* La flecha apunta a lo que va a pasar al pulsar, no a como está. */
.plegable-flecha { transition: transform .15s ease; }
.plegable.plegado .plegable-flecha { transform: rotate(-90deg); }
.plegable.plegado > .plegable-cuerpo { display: none; }

/* Título del formulario de contacto: dice si se está añadiendo o editando a alguien. */
.exp-form-titulo {
  margin-bottom: var(--e2);
  color: var(--texto-3); font-size: 12px;
  text-transform: uppercase; letter-spacing: .04em;
}

/* ═══ Conciliación bancaria (2026-08-18) ═══════════════════════════════════════════════
   ⭐ Rejilla y no bloques apilados: con 60 movimientos en pantalla, las columnas alineadas
   dejan comparar de un vistazo; apilado hay que releer cada bloque para saber qué es cada cosa.
   Las seis columnas son: casilla · fecha · importe · concepto · propuesta · acción. */
.bk-tabla { display: flex; flex-direction: column; }

.bk-cab,
.bk-fila {
  display: grid;
  grid-template-columns: 26px 96px 118px minmax(220px, 1fr) minmax(230px, 300px) 96px;
  gap: var(--e2);
  align-items: start;
  padding: 8px 4px;
  border-bottom: 1px solid var(--borde);
}
/* ⛔ SIN `position: sticky`. Iba pegada con `top: 34px` —la altura de la barra de aceptar,
   contada a mano— y bastaba que esa barra creciera una línea para que la cabecera se comiera la
   primera fila. Ahora vive dentro del `pane-fijo` del panel, que ya sabe quedarse quieto. */
.bk-cab {
  font-size: 12px; color: var(--texto-3);
  border-bottom: 1px solid var(--borde);
}
.bk-fila:hover { background: rgba(255,255,255,.02); }

/* ⚠️ Lo ya resuelto se atenúa pero NO se esconde: hace falta poder revisar lo hecho y deshacerlo,
   y una lista donde lo conciliado desaparece impide comprobar el trabajo de ayer. */
.bk-hecha { opacity: .6; }

.bk-fecha   { font-size: 13px; color: var(--texto-2); white-space: nowrap; padding-top: 2px; }
.bk-importe { text-align: right; font-weight: 600; font-variant-numeric: tabular-nums;
              white-space: nowrap; padding-top: 2px; }

.bk-concepto { min-width: 0; }
/* El concepto del banco puede ser larguísimo y con números de traza: se corta en dos líneas en vez
   de estirar la fila. El texto entero sigue estando en el título. */
.bk-texto {
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; font-size: 13px; line-height: 1.35; word-break: break-word;
}
.bk-fam { font-size: 10.5px; opacity: .75; }

.bk-prop select { width: 100%; }
.bk-prop .ho-pista { display: block; margin-top: 2px; line-height: 1.3; }
.bk-acc { text-align: right; }

@media (max-width: 1100px) {
  /* En pantalla estrecha la propuesta pasa debajo, que es lo único que se puede sacrificar. */
  .bk-cab { display: none; }
  .bk-fila { grid-template-columns: 26px 90px 110px 1fr; }
  .bk-prop, .bk-acc { grid-column: 2 / -1; text-align: left; }
}

/* ── Buscador dentro del desplegable ─────────────────────────────────────────────────────
   Cualquier `<select data-buscar>` abre ESTE panel en vez del desplegable del navegador, con una
   caja de busqueda arriba. Nace de los 207 proveedores y 53 resellers de la conciliacion: en un
   desplegable nativo no hay forma de buscar —solo salta al primero que empieza por la letra que
   pulsas, y una sola vez—, asi que encontrar «JETBLUE» era rodar la lista entera a mano.

   ⭐ El panel es UNO solo y vive en el <body>: no se pinta uno por fila. Con 60 movimientos en
   pantalla, uno por fila serian 60 paneles dormidos en el DOM. */
.nai-busc {
  position: fixed; z-index: 200; display: flex; flex-direction: column;
  min-width: 280px; max-width: 480px; max-height: 380px;
  background: var(--dlg-fondo); border: 1px solid var(--borde-2);
  border-radius: var(--radio-s); box-shadow: var(--sombra); overflow: hidden;
}
.nai-busc-cab { padding: var(--e2); border-bottom: 1px solid var(--borde); }
.nai-busc-in {
  width: 100%; min-height: 38px; padding: 0 var(--e3);
  background: var(--campo); color: var(--texto);
  border: 1px solid var(--borde-2); border-radius: var(--radio-xs);
  font-size: 15px; font-family: inherit; outline: none;
}
.nai-busc-in:focus { border-color: var(--violeta); box-shadow: 0 0 0 3px var(--violeta-humo); }
.nai-busc-in::placeholder { color: var(--texto-3); }

/* ⛔ `min-height: 0` NO SOBRA. Un hijo de flex nace con `min-height: auto`, y eso significa que
   **no encoge por debajo de su contenido**: con 207 proveedores la lista medía lo que midieran
   los 207, el panel la recortaba con su `overflow: hidden` y el `overflow-y: auto` de aquí no
   llegaba a activarse nunca — se veían las primeras y no había forma de bajar.
   Es el fallo clásico de flex y no da ningún aviso: la regla del scroll está puesta y parece que
   debería funcionar.
   ⚠️ `flex: 1 1 auto` para que ocupe lo que sobra del panel bajo la caja de búsqueda.
   `overscroll-behavior: contain` para que al llegar al final no se ponga a rodar la página de
   detrás, que en un panel flotante desorienta. */
.nai-busc-lista {
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto; overscroll-behavior: contain;
  padding: 4px;
}
.nai-busc-gr {
  padding: var(--e2) var(--e2) 4px; font-size: 11px; font-weight: 600;
  color: var(--texto-3); text-transform: uppercase; letter-spacing: .04em;
}
.nai-busc-op {
  padding: 9px var(--e2); border-radius: var(--radio-xs); cursor: pointer;
  font-size: 14px; color: var(--texto); line-height: 1.3;
}
/* ⭐ Una sola marca para el raton y para las flechas: la que se resalta es SIEMPRE la que entra
   con Enter. Con `:hover` aparte, mover el raton sin querer dejaba dos resaltadas y no se sabia
   cual iba a caer. */
.nai-busc-op.act { background: var(--violeta-humo); box-shadow: inset 0 0 0 1px var(--violeta-borde); }
.nai-busc-op mark { background: none; color: var(--violeta-claro); font-weight: 600; }
.nai-busc-op .nai-busc-eleg { float: right; color: var(--verde); font-size: 12px; }
.nai-busc-nada { padding: var(--e4) var(--e2); text-align: center; color: var(--texto-3); font-size: 13px; }

/* ══════════════════════════════════════════════════════════════════ temas ══
   ⭐ Darwin (2026-08-18): «que el usuario pueda escoger un tema para todo NAICenter, según el
   agrado de sus ojos». Cinco: el de siempre y cuatro más.

   ⛔ TODO EL PANEL SE PINTA CON ESTAS VARIABLES. Por eso un tema son 20 líneas y no una hoja
   nueva: no hay ni una pantalla que necesite tocarse. Lo que NO se puede es escribir un color
   suelto en una pantalla — ese se quedaría igual en los cinco temas y cantaría.

   El tema se elige en el perfil y viaja en `<body data-tema="…">`, que pone `marco.php`. */

/* ── 2 · Grafito ── gris neutro y ámbar. Para quien el azul le cansa la vista. ─────────── */
body[data-tema="grafito"] {
  --campo: rgba(16,18,21,.85);  --hueco: rgba(16,18,21,.55);
  --cromo: rgba(22,24,28,.82);  --cromo-menu: rgba(20,22,26,.94);
  --realce: rgba(255,255,255,.055);  --realce-2: rgba(255,255,255,.08);
  color-scheme: dark;
  accent-color: #D9944A;
  --bg: #14161a;  --texto: #ececee;  --texto-2: #a8abb2;  --texto-3: #74787f;
  --borde: rgba(255,255,255,.09);   --borde-2: rgba(255,255,255,.16);
  --panel: rgba(31,34,40,.78);      --panel-2: rgba(24,27,32,.9);
  --panel-3: rgba(255,255,255,.045); --dlg-fondo: #1c1f25;
  --violeta: #D9944A;  --violeta-claro: #E8B27A;
  --violeta-humo: rgba(217,148,74,.16);  --violeta-borde: rgba(217,148,74,.34);
  --dorado: #E2B96B;  --verde: #5FCF8A;  --rojo: #EF7A7A;  --ambar: #F0B429;
  /* Sin halos de color: en gris, un halo azul se ve sucio. Un degradado y nada más. */
  --fondo-halo: linear-gradient(180deg, #0e1013, var(--bg));
}

/* ── 3 · Bosque ── verde profundo. Descansa mucho en jornadas largas. ──────────────────── */
body[data-tema="bosque"] {
  --campo: rgba(6,18,15,.8);  --hueco: rgba(6,18,15,.5);
  --cromo: rgba(9,26,22,.8);  --cromo-menu: rgba(8,22,19,.94);
  --realce: rgba(255,255,255,.05);  --realce-2: rgba(255,255,255,.075);
  color-scheme: dark;
  accent-color: #3FB98C;
  --bg: #0b1714;  --texto: #e6f2ec;  --texto-2: #9dbcb0;  --texto-3: #6b8a7e;
  --borde: rgba(255,255,255,.08);   --borde-2: rgba(255,255,255,.15);
  --panel: rgba(16,38,32,.75);      --panel-2: rgba(12,30,26,.88);
  --panel-3: rgba(255,255,255,.04); --dlg-fondo: #12261f;
  --violeta: #3FB98C;  --violeta-claro: #6DD3AC;
  --violeta-humo: rgba(63,185,140,.16);  --violeta-borde: rgba(63,185,140,.34);
  --dorado: #D9C06B;  --verde: #4ADE80;  --rojo: #F08585;  --ambar: #EBB13C;
  --fondo-halo:
    radial-gradient(1100px 650px at 15% 8%, rgba(45,140,105,.22), transparent 55%),
    radial-gradient(800px 550px at 88% 12%, rgba(80,180,140,.16), transparent 55%),
    linear-gradient(180deg, #060f0d, var(--bg));
}

/* ── 4 · Borgoña ── vino y coral. El más cálido de los oscuros. ────────────────────────── */
body[data-tema="borgona"] {
  --campo: rgba(18,8,12,.82);  --hueco: rgba(18,8,12,.5);
  --cromo: rgba(30,14,20,.82);  --cromo-menu: rgba(26,12,17,.94);
  --realce: rgba(255,255,255,.055);  --realce-2: rgba(255,255,255,.08);
  color-scheme: dark;
  accent-color: #D96A7A;
  --bg: #180d12;  --texto: #f4e9ec;  --texto-2: #c4a3ac;  --texto-3: #97757f;
  --borde: rgba(255,255,255,.09);   --borde-2: rgba(255,255,255,.16);
  --panel: rgba(45,20,29,.76);      --panel-2: rgba(36,15,23,.88);
  --panel-3: rgba(255,255,255,.045); --dlg-fondo: #2a141c;
  --violeta: #D96A7A;  --violeta-claro: #EE93A0;
  --violeta-humo: rgba(217,106,122,.17);  --violeta-borde: rgba(217,106,122,.36);
  --dorado: #E4BE7C;  --verde: #6BD08F;  --rojo: #FF8A8A;  --ambar: #F2B33E;
  --fondo-halo:
    radial-gradient(1100px 650px at 18% 8%, rgba(150,45,75,.24), transparent 55%),
    radial-gradient(850px 560px at 88% 12%, rgba(190,80,90,.16), transparent 55%),
    linear-gradient(180deg, #0f070a, var(--bg));
}

/* ── 5 · Claro ── el único con fondo blanco. ───────────────────────────────────────────────
   ⛔ `color-scheme: light` es OBLIGATORIO aquí, no un detalle: sin él, el calendario de los
   `<input type=date>`, los desplegables y las barras de scroll los sigue pintando el navegador
   en su versión oscura y quedan negros sobre blanco. Es el mismo problema que ya costó el
   calendario invisible, al revés.
   ⚠️ Y las sombras aquí son grises muy suaves: la sombra negra del tema oscuro, sobre blanco,
   ensucia y hace que todo parezca despegado. */
body[data-tema="claro"] {
  --campo: #ffffff;  --hueco: rgba(20,30,60,.045);
  --cromo: rgba(255,255,255,.82);  --cromo-menu: rgba(252,253,255,.95);
  --realce: rgba(20,30,60,.05);  --realce-2: rgba(20,30,60,.075);
  color-scheme: light;
  accent-color: #5B47B0;
  --bg: #eef1f7;  --texto: #16203a;  --texto-2: #4a5878;  --texto-3: #78859f;
  --borde: rgba(20,30,60,.12);      --borde-2: rgba(20,30,60,.2);
  --panel: rgba(255,255,255,.86);   --panel-2: rgba(248,250,253,.95);
  --panel-3: rgba(20,30,60,.04);    --dlg-fondo: #ffffff;
  --violeta: #5B47B0;  --violeta-claro: #7A66CF;
  --violeta-humo: rgba(91,71,176,.1);  --violeta-borde: rgba(91,71,176,.28);
  --dorado: #B8892B;  --verde: #1F9D55;  --rojo: #C7453F;  --ambar: #B7791F;
  --sombra: 0 8px 24px rgba(30,45,80,.1);
  --fondo-halo:
    radial-gradient(1100px 650px at 18% 6%, rgba(120,140,255,.16), transparent 55%),
    radial-gradient(850px 560px at 90% 10%, rgba(150,120,230,.13), transparent 55%),
    linear-gradient(180deg, #f7f9fd, var(--bg));
}

/* ══════════════════════════════════════════════════════════ mi perfil ══
   El diálogo que se abre al pulsar el nombre. */

/* Un <button> que tiene que verse como el <span> de antes: sin fondo, sin borde y con la letra
   del sitio. Sin esto sale un botón gris del navegador en medio de la barra. */
.quien-soy {
  background: none; border: 0; padding: 0; margin: 0;
  font: inherit; color: inherit; text-align: right; cursor: pointer;
  border-radius: var(--radio-xs);
}
.quien-soy:hover .quien-nombre { color: var(--violeta-claro); }
.quien-soy:focus-visible { outline: 2px solid var(--violeta-borde); outline-offset: 3px; }

.nai-dlg-ancho { max-width: 620px; width: calc(100vw - 32px); }

.perfil-cab {
  display: flex; align-items: center; justify-content: space-between;
  padding: var(--e3) var(--e4); border-bottom: 1px solid var(--borde);
}
.perfil-cab h2 { margin: 0; font-size: 16px; }
/* ⚠️ Alto acotado y scroll DENTRO: el formulario es largo y en una pantalla de portátil el botón
   de guardar se quedaba fuera, sin forma de llegar a él. */
.perfil-cuerpo { padding: var(--e4); max-height: min(65vh, 560px); overflow-y: auto; }
.perfil-pie {
  display: flex; gap: var(--e2); justify-content: flex-end;
  padding: var(--e3) var(--e4); border-top: 1px solid var(--borde);
}
.perfil-tit {
  margin: var(--e4) 0 var(--e2); font-size: 12px; font-weight: 600;
  text-transform: uppercase; letter-spacing: .6px; color: var(--texto-3);
}
.perfil-cuerpo .perfil-tit:first-child { margin-top: 0; }

/* ⚠️ `.ho-pista` viene de la hoja del HOSPITAL y aqui NUNCA se cargo: las pistas del perfil
   —«con esto entras», «8 o mas»— llevaban saliendo con el tamaño y el color del texto normal,
   o sea sin parecer pistas. Se le da su estilo aqui, que es donde se usan. */
.perfil-cuerpo .ho-pista {
  color: var(--texto-3);
  font-size: 12px;
  font-weight: 400;
}

/* La explicacion debajo de una casilla: parrafo, no coletilla. */
.perfil-nota {
  margin: 6px 0 0 26px;          /* alineada con el texto de la casilla, no con el cuadrito */
  color: var(--texto-3);
  font-size: 12px;
  line-height: 1.45;
  max-width: 46em;               /* que no se estire hasta ser ilegible */
}
/* Cuando la nota avisa de algo que hay que saber ANTES de marcar. */
.perfil-nota-aviso {
  color: var(--texto-2);
  border-left: 2px solid var(--ambar, #d08700);
  padding-left: 8px;
}

/* ── Los cinco temas ──────────────────────────────────────────────────────────────────── */
.temas { display: grid; grid-template-columns: repeat(auto-fit, minmax(104px, 1fr)); gap: var(--e2); }
.tema {
  display: block; cursor: pointer; text-align: center;
  border: 1.5px solid var(--borde); border-radius: var(--radio-s);
  padding: var(--e2); background: var(--panel-3);
}
.tema:hover { border-color: var(--borde-2); }
.tema-elegido { border-color: var(--violeta); background: var(--violeta-humo); }
/* La casilla no se ve: lo que se pulsa es la muestra entera. */
.tema input { position: absolute; opacity: 0; pointer-events: none; }
/* La muestra: el fondo del tema con sus dos colores encima. Es lo que deja compararlos de un
   vistazo sin tener que probarlos uno a uno. */
.tema-muestra {
  display: flex; align-items: center; justify-content: center; gap: 5px;
  height: 40px; border-radius: var(--radio-xs); margin-bottom: 6px;
  border: 1px solid var(--borde);
}
.tema-muestra span { width: 13px; height: 13px; border-radius: 50%; display: block; }
.tema-nombre { font-size: 12.5px; }

/* ── Circuitos de internet ────────────────────────────────────────────────────────────────
   Un circuito dado de baja se queda en la lista —el historico es lo que permite reclamarle a
   un proveedor meses despues— pero off, para no confundirlo con los que funcionan.
   Mismo tratamiento que `.fila-usuario.off`. */
.device.off { opacity: .72; }
/* Margen negativo: se ve, no se esconde. */
.kpi-valor.malo { color: var(--rojo); }

/* ── El grupo «Técnico» de la ficha del cliente ───────────────────────────────────────────
   Cuatro secciones de operador bajo una sola pestaña. `<details>` para que abra y cierre sin
   JavaScript, igual que el cPanel del menu lateral. */
.nav-grupo { position: relative; flex: 0 0 auto; }
.nav-grupo > summary { list-style: none; display: inline-flex; align-items: center; gap: 6px; }
.nav-grupo > summary::-webkit-details-marker { display: none; }
.nav-grupo > summary::marker { content: ''; }
/* La flechita dice que hay algo debajo, y gira al abrirse. */
.nav-grupo > summary::after { content: '⌄'; color: var(--texto-3); font-size: 12px; }
.nav-grupo[open] > summary::after { content: '⌃'; }

/* Va FLOTANDO sobre la ficha, no empujandola: si empujara, abrir el menu movería de sitio lo
   que se está leyendo. */
.nav-grupo-menu {
  position: absolute; z-index: 40; top: calc(100% + 6px); left: 0; min-width: 190px;
  display: flex; flex-direction: column; gap: 2px; padding: var(--e1);
  background: var(--panel); border: 1px solid var(--borde); border-radius: 12px;
  box-shadow: 0 12px 32px rgba(0, 0, 0, .38);
}
/* En un teléfono se ancla a la derecha para no salirse por el borde. */
@media (max-width: 560px) { .nav-grupo-menu { left: auto; right: 0; } }

.nav-sub {
  text-align: left; min-height: 32px; padding: 0 var(--e2);
  border: 1px solid transparent; border-radius: 8px;
  background: transparent; color: var(--texto-2);
  font-size: 13px; font-family: inherit; cursor: pointer; white-space: nowrap;
  transition: .15s ease;
}
.nav-sub:hover  { background: rgba(255, 255, 255, .05); color: var(--texto); }
.nav-sub-on     { color: var(--texto); background: var(--violeta-humo); border-color: var(--violeta-borde); }

/* ════════════════════════════════════════════════════════════════════════════════════════
   NAIMail — el correo dentro de NAICenter
   Autor: Darwin Quinones · 2026-08-21

   Tres columnas: carpetas · lista · el correo abierto. En móvil se apilan.
   ════════════════════════════════════════════════════════════════════════════════════════ */

/* ── La barra de arriba: buzón, buscar, escribir ──────────────────────────────────────── */
.nm-barra {
  display: flex; align-items: center; gap: var(--e3);
  margin-bottom: var(--e3); flex-wrap: wrap;
}
.nm-buzon, .nm-buzon-fijo {
  font-size: 13px; color: var(--texto-2);
  background: var(--panel-3); border: 1px solid var(--borde);
  border-radius: 9px; padding: 7px 10px;
}
.nm-buzon-fijo { color: var(--texto-3); }

.nm-buscar {
  display: flex; align-items: center; gap: 4px;
  flex: 1 1 260px; min-width: 0;
  background: var(--panel-3); border: 1px solid var(--borde);
  border-radius: 9px; padding: 2px 4px 2px 10px;
}
.nm-buscar input {
  flex: 1 1 auto; min-width: 0;
  background: none; border: 0; outline: none;
  color: var(--texto); font-size: 13.5px; padding: 7px 0;
}
.nm-buscar-btn {
  flex: 0 0 auto;
  width: 28px; height: 28px; border-radius: 7px;
  border: 0; background: none; color: var(--texto-3); cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
.nm-buscar-btn:hover { background: var(--panel-2); color: var(--texto); }
/* La estrella de Darwin, en dorado: se distingue de la lupa sin tener que leer nada. */
.nm-buscar-btn.nm-ia { color: var(--dorado); }
.nm-buscar-btn.nm-ia:hover { background: color-mix(in srgb, var(--dorado) 18%, transparent); }

.nm-nuevo { flex: 0 0 auto; }

/* ── El reparto en tres columnas ──────────────────────────────────────────────────────────
   ⚠️ Se reusa `.dos-panes` para heredar el apilado en móvil y el reparto de alto de
   `.hoja-alta`, y se le cambia sólo la rejilla. Escribir un reparto nuevo desde cero habría
   significado repetir —y desincronizar— las reglas de móvil que ya funcionan. */
@media (min-width: 900px) {
  .dos-panes.nm-panes {
    grid-template-columns: clamp(170px, 15%, 240px) 1fr;
  }
  /* La columna del medio se parte en lista arriba y lectura abajo… */
  .nm-centro {
    display: grid;
    grid-template-rows: minmax(0, 1fr) minmax(0, 1.25fr);
    gap: var(--e3);
    min-height: 0; height: 100%;
  }
}
/* …y en pantalla ancha, lista a la izquierda y lectura a la derecha, que es como se lee de
   verdad: se recorre la lista con la vista sin perder el correo abierto. */
@media (min-width: 1300px) {
  .dos-panes.nm-panes {
    grid-template-columns: clamp(170px, 13%, 240px) 1fr;
  }
  .nm-centro {
    grid-template-rows: none;
    grid-template-columns: clamp(300px, 30%, 430px) 1fr;
  }
}

.nm-carpetas, .nm-lista, .nm-lectura {
  min-height: 0;
  display: flex; flex-direction: column;
  overflow: hidden;
}
.nm-lista, .nm-lectura { overflow-y: auto; }

/* ── Las carpetas ─────────────────────────────────────────────────────────────────────── */
.nm-carpetas-cab {
  display: flex; align-items: center; justify-content: space-between;
  padding: var(--e3) var(--e3) var(--e2);
  font-size: 11.5px; font-weight: 600; letter-spacing: .06em;
  text-transform: uppercase; color: var(--texto-3);
  flex: 0 0 auto;
}
.nm-mini {
  border: 1px solid var(--borde); background: var(--panel-3);
  color: var(--texto-2); border-radius: 6px; cursor: pointer;
  font-size: 13px; line-height: 1; padding: 3px 7px;
}
.nm-mini:hover { color: var(--texto); border-color: var(--texto-3); }
.nm-carpetas-aviso { margin: 0 var(--e3) var(--e2); font-size: 12px; }

.nm-arbol { flex: 1 1 auto; overflow-y: auto; padding-bottom: var(--e3); }

.nm-carpeta {
  display: flex; align-items: center; gap: 7px;
  padding: 6px 8px 6px 10px;
  color: var(--texto-2); font-size: 13px;
  text-decoration: none;
  border-left: 2px solid transparent;
}
.nm-carpeta:hover { background: var(--panel-2); color: var(--texto); }
.nm-carpeta.on {
  background: var(--panel-2); color: var(--texto);
  border-left-color: var(--verde); font-weight: 600;
}
.nm-carpeta-icono { flex: 0 0 auto; opacity: .7; }
.nm-carpeta.on .nm-carpeta-icono { opacity: 1; color: var(--verde); }
.nm-carpeta-nombre {
  flex: 1 1 auto; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nm-carpeta-n {
  flex: 0 0 auto;
  font-size: 10.5px; font-weight: 700;
  color: var(--texto-3);
  font-variant-numeric: tabular-nums;
}
.nm-carpeta.on .nm-carpeta-n { color: var(--verde); }

/* Renombrar y borrar: sólo al pasar por encima, que si no el árbol es un muro de iconos.
   ⚠️ `visibility` y no `display`: así la fila no cambia de ancho al aparecer, que hace que el
   nombre dé un salto justo cuando vas a pulsarlo. */
.nm-carpeta-acciones { flex: 0 0 auto; display: flex; gap: 2px; visibility: hidden; }
.nm-carpeta:hover .nm-carpeta-acciones,
.nm-carpeta:focus-within .nm-carpeta-acciones { visibility: visible; }
.nm-carpeta-accion {
  border: 0; background: none; color: var(--texto-3); cursor: pointer;
  padding: 2px; border-radius: 5px; display: flex;
}
.nm-carpeta-accion:hover { color: var(--texto); background: var(--panel-3); }
.nm-carpeta-accion.nm-borrar:hover { color: var(--rojo); }

.nm-carpeta-editar, .nm-carpeta-nueva input {
  width: 100%; box-sizing: border-box;
  background: var(--panel-3); border: 1px solid var(--verde);
  border-radius: 6px; color: var(--texto);
  font-size: 13px; padding: 4px 7px; outline: none;
}
.nm-carpeta-nueva { padding: 4px 8px 4px 10px; }

/* ── La lista de correos ──────────────────────────────────────────────────────────────── */
.nm-lista-cab {
  display: flex; align-items: center; justify-content: space-between; gap: var(--e2);
  padding: var(--e3); border-bottom: 1px solid var(--borde);
  font-size: 12.5px; color: var(--texto-2);
  flex: 0 0 auto; position: sticky; top: 0; background: var(--panel); z-index: 2;
}
.nm-ia-dijo { display: flex; align-items: center; gap: 6px; color: var(--dorado); }
.nm-lista-aviso { margin: var(--e3); }

.nm-filas { display: flex; flex-direction: column; }

.nm-fila {
  padding: 10px var(--e3);
  border-bottom: 1px solid var(--borde);
  cursor: pointer;
  border-left: 3px solid transparent;
}
.nm-fila:hover { background: var(--panel-2); }
.nm-fila.elegida { background: var(--panel-2); border-left-color: var(--verde); }

/* Sin leer: el remitente y el asunto en negrita, y un punto. Es como se distingue de un vistazo
   sin tener que leer nada. */
.nm-fila.sin-leer .nm-de,
.nm-fila.sin-leer .nm-asunto { font-weight: 700; color: var(--texto); }
.nm-fila.sin-leer { border-left-color: color-mix(in srgb, var(--verde) 45%, transparent); }

.nm-fila-alto { display: flex; align-items: baseline; gap: var(--e2); }
.nm-de {
  flex: 1 1 auto; min-width: 0;
  font-size: 13px; color: var(--texto-2);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nm-cuando {
  flex: 0 0 auto;
  font-size: 11.5px; color: var(--texto-3);
  font-variant-numeric: tabular-nums;
}
.nm-asunto {
  font-size: 13px; color: var(--texto-2); margin-top: 2px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nm-extracto {
  font-size: 12px; color: var(--texto-3); margin-top: 2px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* ⚠️ `wrap` y `overflow: hidden`: aunque las chapas ya van agrupadas por tipo, una direccion que
   este en muchas fichas puede seguir sacando cuatro o cinco. Sin esto se salen del panel. */
.nm-fila-pie {
  display: flex; align-items: center; gap: 5px; margin-top: 5px;
  flex-wrap: wrap; overflow: hidden; max-height: 40px;
}
.nm-clip { color: var(--texto-3); display: flex; }

/* ── Quién escribe ────────────────────────────────────────────────────────────────────────
   ⭐ Lo que un Outlook no puede dar: el que escribe está en la casa. */
.nm-chapa {
  font-size: 10px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  padding: 2px 6px; border-radius: 5px;
  border: 1px solid transparent;
  white-space: nowrap;
}
.nm-chapa-client   { color: var(--verde);  background: color-mix(in srgb, var(--verde)  16%, transparent); }
.nm-chapa-vendor   { color: var(--ambar);  background: color-mix(in srgb, var(--ambar)  16%, transparent); }
.nm-chapa-reseller { color: var(--dorado); background: color-mix(in srgb, var(--dorado) 16%, transparent); }
.nm-chapa-staff    { color: var(--texto-3); background: var(--panel-3); }
.nm-chapa-otro     { color: var(--texto-3); background: var(--panel-3); }

.nm-quien-tiras { display: flex; flex-direction: column; gap: 6px; margin-top: var(--e2); }
.nm-quien-tira {
  display: flex; align-items: center; gap: var(--e2); flex-wrap: wrap;
  padding: 7px 9px; border-radius: 9px;
  background: var(--panel-3); border: 1px solid var(--borde);
}
.nm-quien-nombre { font-size: 13px; font-weight: 600; color: var(--texto); }
.nm-quien-detalle { font-size: 12px; color: var(--texto-3); flex: 1 1 auto; }

/* ── El correo abierto ────────────────────────────────────────────────────────────────── */
.nm-leido { display: flex; flex-direction: column; min-height: 0; height: 100%; }
.nm-leido-cab { border-bottom: 1px solid var(--borde); flex: 0 0 auto; }

/* La parte que se ve SIEMPRE: quién escribe y de qué va. */
.nm-leido-resumen {
  display: flex; align-items: flex-start; gap: var(--e2);
  padding: var(--e3);
  cursor: pointer;
  list-style: none;           /* fuera el triangulito del navegador: hay una flecha propia */
}
.nm-leido-resumen::-webkit-details-marker { display: none; }
.nm-leido-resumen:hover { background: var(--panel-2); }
.nm-leido-resumen-txt { flex: 1 1 auto; min-width: 0; }
.nm-chevron {
  flex: 0 0 auto; margin-top: 3px; color: var(--texto-3);
  transition: transform .15s ease;
}
[open] > .nm-leido-resumen .nm-chevron { transform: rotate(180deg); }
/* ⚠️ Quien haya pedido menos movimiento, no lo tiene. */
@media (prefers-reduced-motion: reduce) { .nm-chevron { transition: none; } }

/* Lo de dentro, con el mismo margen que el resumen para que no baile al abrirse. */
.nm-leido-cab > *:not(.nm-leido-resumen) { padding-left: var(--e3); padding-right: var(--e3); }
.nm-leido-cab > .nm-leido-botones { padding-bottom: var(--e3); }

.nm-leido-asunto { font-size: 16px; font-weight: 650; margin: 0 0 var(--e2); line-height: 1.35; }
/* ⚠️ Cerrada, el asunto en UNA línea: un asunto larguísimo haría que la cabecera «plegada» ocupara
   tres renglones, que es justo lo que se quería evitar. Abierta se ve entero. */
.nm-leido-cab:not([open]) .nm-leido-asunto {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nm-leido-quien { display: flex; align-items: baseline; gap: var(--e2); }
.nm-leido-de { flex: 1 1 auto; min-width: 0; font-size: 13px; }
.nm-leido-email { color: var(--texto-3); margin-left: 6px; font-size: 12px; }
.nm-leido-para {
  display: flex; flex-wrap: wrap; gap: var(--e3);
  margin-top: var(--e2); font-size: 12px; color: var(--texto-3);
}
.nm-leido-botones { display: flex; flex-wrap: wrap; gap: var(--e2); margin-top: var(--e3); }

.nm-adjuntos {
  display: flex; flex-wrap: wrap; gap: var(--e2);
  padding: var(--e2) var(--e3); border-bottom: 1px solid var(--borde);
  flex: 0 0 auto;
}
.nm-adjunto {
  display: flex; align-items: center; gap: 6px;
  padding: 5px 9px; border-radius: 8px;
  background: var(--panel-3); border: 1px solid var(--borde);
  color: var(--texto-2); font-size: 12px; text-decoration: none;
}
.nm-adjunto:hover { color: var(--texto); border-color: var(--texto-3); }
.nm-adjunto-peso { color: var(--texto-3); font-variant-numeric: tabular-nums; }

/* 🚨 El cuerpo va en un `iframe` con `sandbox`: es HTML de un desconocido.
   ⚠️ Sin `allow-same-origin` NO se puede medir su alto —no se llega al contenido—, así que se le
   da todo el hueco que queda y su propio desplazamiento. Es el precio de no dejar que un correo
   corra código en el panel, y es barato. */
.nm-cuerpo {
  flex: 1 1 auto; min-height: 320px;
  width: 100%; border: 0; background: #fff;
}

/* ── Cuando no hay nada que enseñar ───────────────────────────────────────────────────── */
.nm-vacio {
  flex: 1 1 auto;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--e2); padding: var(--e5);
  color: var(--texto-3);
}
.nm-vacio-texto { font-size: 13px; color: var(--texto-3); margin: 0; text-align: center; max-width: 34em; }
.nm-cargando { padding: var(--e4); font-size: 13px; color: var(--texto-3); }

/* ── Movimiento del banco que todavía puede cambiar ───────────────────────────────────────
   ⭐ Se ve ANTES de tocar nada. Conciliarlo es lo que lo vuelve intocable: la limpieza que borra
   «lo que el banco ya no trae» respeta lo conciliado, así que un cambio posterior del banco se
   queda dentro para siempre. El motivo va en el `title`, que en la fila no cabe.
   ⚠️ Ámbar y no rojo: no es un error, es una advertencia. Un rojo aquí competiría con los avisos
   de verdad y acabaría ignorándose. */
.bk-chip-prov {
  background: rgba(250, 204, 21, .14);
  color: #facc15;
  cursor: help;
}
.bk-fila.bk-provisional { border-left-color: rgba(250, 204, 21, .55); }

/* ── Seguir trayendo correo al llegar abajo ───────────────────────────────────────────────
   ⭐ Darwin (2026-08-22): «cuando uno hace scroll y llega abajo no sigue trayendo más emails».
   ⚠️ Tiene que OCUPAR ALTO aunque no se vea nada: es lo que `IntersectionObserver` vigila, y un
      elemento de cero píxeles no se cruza con nada — la cadena no arrancaría nunca.
   ⚠️ Y la rueda sólo mientras hay petición: htmx pone `htmx-request` él solo. Una rueda girando
      siempre al final de la lista parece que algo está colgado. */
.nm-mas {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  min-height: 46px; padding: var(--e3);
  font-size: 12.5px; color: var(--texto-3);
}
.nm-mas-rueda {
  width: 13px; height: 13px; flex: 0 0 auto;
  border: 2px solid var(--borde);
  border-top-color: var(--verde);
  border-radius: 50%;
  animation: nai-girar .7s linear infinite;
  visibility: hidden;
}
.nm-mas.htmx-request .nm-mas-rueda { visibility: visible; }

/* Pasado el tope de tandas seguidas lo pide la persona: ahí sí es un botón y se ve como tal. */
.nm-mas-boton {
  cursor: pointer;
  color: var(--verde); font-weight: 600;
  border-top: 1px solid var(--borde);
}
.nm-mas-boton:hover { background: var(--panel-2); }
.nm-mas-boton .nm-mas-rueda { display: none; }
.nm-mas-boton.htmx-request .nm-mas-rueda { display: block; visibility: visible; }

@media (prefers-reduced-motion: reduce) {
  .nm-mas-rueda { animation: none; }
}

/* ── Abrir o guardar un adjunto ───────────────────────────────────────────────────────────
   ⭐ Las dos a la vista: son dos, caben, y se elige en un clic en vez de en dos. */
.nm-adjunto-acciones { display: flex; align-items: center; gap: 5px; margin-left: 4px; }
.nm-adjunto-accion {
  color: var(--verde); font-size: 11.5px; font-weight: 600;
  text-decoration: none; white-space: nowrap;
}
.nm-adjunto-accion:hover { text-decoration: underline; }
.nm-adjunto-sep { color: var(--texto-3); font-size: 11px; }
.nm-adjunto-nombre { max-width: 22ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ── Escribir un correo ───────────────────────────────────────────────────────────────────
   ⚠️ Ocupa el panel de la derecha, donde se lee. Un correo a medio escribir y el que estás
   leyendo no caben a la vez, y una ventana flotante taparía justo lo que quieres mirar mientras
   contestas. */
.nm-escribir { display: flex; flex-direction: column; min-height: 0; height: 100%; }

.nm-escribir-cab {
  display: flex; align-items: center; justify-content: space-between;
  padding: var(--e3); border-bottom: 1px solid var(--borde);
  font-size: 13px; flex: 0 0 auto;
}
.nm-escribir-cuerpo {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  padding: var(--e3); display: flex; flex-direction: column; gap: var(--e2);
}

.nm-campo { display: flex; align-items: center; gap: var(--e2); }
.nm-campo > span {
  flex: 0 0 62px;
  font-size: 12px; color: var(--texto-3); text-align: right;
}
.nm-campo input, .nm-campo select {
  flex: 1 1 auto; min-width: 0;
  background: var(--panel-3); border: 1px solid var(--borde);
  border-radius: 8px; color: var(--texto);
  font-size: 13.5px; padding: 8px 10px; outline: none;
}
.nm-campo input:focus, .nm-campo select:focus { border-color: var(--verde); }

/* ── El botón de Darwin ───────────────────────────────────────────────────────────────── */
.nm-ia-barra {
  display: flex; align-items: center; gap: 5px; flex-wrap: wrap;
  padding: var(--e2) 0; margin-top: var(--e1);
  border-top: 1px solid var(--borde); border-bottom: 1px solid var(--borde);
}
.nm-ia-rotulo {
  display: flex; align-items: center; gap: 4px;
  color: var(--dorado); font-size: 11.5px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .04em;
  margin-right: var(--e2);
}
.nm-ia-btn {
  border: 1px solid var(--borde); background: var(--panel-3);
  color: var(--texto-2); border-radius: 7px; cursor: pointer;
  font-size: 12px; padding: 4px 9px;
}
.nm-ia-btn:hover:not(:disabled) { color: var(--texto); border-color: var(--dorado); }
/* ⚠️ Apagados mientras Darwin trabaja: pulsar tres veces son tres peticiones que se pisan, y la
   última en llegar gana — que no tiene por qué ser la última que se pidió. */
.nm-ia-btn:disabled { opacity: .45; cursor: default; }
.nm-ia-estado { font-size: 11.5px; color: var(--texto-3); margin-left: auto; }

/* ── Donde se escribe ─────────────────────────────────────────────────────────────────── */
.nm-editor {
  flex: 1 1 auto; min-height: 180px;
  background: var(--panel-3); border: 1px solid var(--borde);
  border-radius: 10px; color: var(--texto);
  font-size: 14px; line-height: 1.6; padding: var(--e3);
  outline: none; overflow-y: auto;
}
.nm-editor:focus { border-color: var(--verde); }
/* El texto de ayuda cuando está vacío: `contenteditable` no tiene `placeholder`. */
.nm-editor:empty::before {
  content: attr(data-vacio);
  color: var(--texto-3);
}
.nm-editor blockquote {
  margin: 8px 0 0; padding-left: 12px;
  border-left: 2px solid var(--borde); color: var(--texto-3);
}

/* La firma, plegada: no estorba al escribir y no se borra sin querer. */
.nm-firma { font-size: 12px; }
.nm-firma > summary { color: var(--texto-3); cursor: pointer; padding: 4px 0; }
.nm-firma-cuerpo {
  background: #fff; color: #333; border-radius: 8px;
  padding: var(--e2) var(--e3); margin-top: var(--e1);
  overflow-x: auto;
}

.nm-escribir-pie {
  display: flex; align-items: center; justify-content: flex-end; gap: var(--e2);
  padding: var(--e3); border-top: 1px solid var(--borde); flex: 0 0 auto;
}
.nm-escribir-aviso { flex: 1 1 auto; font-size: 12px; color: var(--texto-3); }

/* ── El menú de «mover a» ─────────────────────────────────────────────────────────────── */
.nm-menu {
  position: absolute; z-index: 40;
  margin-top: 4px; padding: 4px;
  max-height: 320px; overflow-y: auto;
  background: var(--panel-2); border: 1px solid var(--borde);
  border-radius: 10px; box-shadow: 0 14px 40px rgba(0,0,0,.45);
  min-width: 180px;
}
.nm-menu-item {
  display: block; width: 100%; text-align: left;
  border: 0; background: none; color: var(--texto-2);
  font-size: 13px; padding: 6px 9px; border-radius: 6px; cursor: pointer;
}
.nm-menu-item:hover { background: var(--panel-3); color: var(--texto); }
/* El botón que lo abre necesita ser el ancla del menú. */
.nm-leido-botones { position: relative; }

/* ── La rueda de espera, de todo el panel ──────────────────────────────────────────────────────────────────
   Flota sobre la pantalla, arriba y en medio: donde se mira. Abajo en una esquina no se ve, y
   dentro de un panel desaparece justo cuando ese panel se está reemplazando. */
.nai-espera {
  position: fixed;
  top: calc(var(--barra-alto) + 12px);
  left: 50%; transform: translateX(-50%);
  z-index: 60;
  display: flex; align-items: center; gap: 9px;
  padding: 8px 15px;
  border-radius: 999px;
  background: var(--panel-2); border: 1px solid var(--borde);
  box-shadow: 0 10px 30px rgba(0,0,0,.4);
  font-size: 12.5px; color: var(--texto-2);
}
.nai-espera[hidden] { display: none; }

.nai-espera-rueda {
  width: 14px; height: 14px; flex: 0 0 auto;
  border: 2px solid var(--borde);
  border-top-color: var(--verde);
  border-radius: 50%;
  animation: nai-girar .7s linear infinite;
}
@keyframes nai-girar { to { transform: rotate(360deg); } }

/* ── El aviso que se va solo ──────────────────────────────────────────────────────────────
   ⚠️ Debajo de la rueda, no en su sitio: si una acción larga acaba con un aviso, los dos pueden
   coincidir un instante y no pueden pisarse.
   ⚠️ Y `pointer-events: none`: flota sobre la pantalla y nadie tiene que esquivarlo para pulsar
   lo que hay debajo. */
.nai-toast {
  position: fixed;
  top: calc(var(--barra-alto) + 12px);
  left: 50%;
  z-index: 61;
  max-width: min(520px, calc(100vw - 32px));
  padding: 9px 16px;
  border-radius: 999px;
  background: var(--panel-2);
  border: 1px solid var(--verde);
  color: var(--texto);
  font-size: 13px; font-weight: 600;
  box-shadow: 0 10px 30px rgba(0,0,0,.45);
  pointer-events: none;
  opacity: 0;
  transform: translateX(-50%) translateY(-8px);
  transition: opacity .2s ease, transform .2s ease;
}
.nai-toast.on { opacity: 1; transform: translateX(-50%) translateY(0); }
.nai-toast.malo { border-color: var(--rojo); }

@media (prefers-reduced-motion: reduce) {
  .nai-toast { transition: none; transform: translateX(-50%); }
  .nai-toast.on { transform: translateX(-50%); }
}

/* ⚠️ A quien haya pedido menos movimiento no se le da vueltas: se le enseña que hay algo en
   marcha con el color, que es lo que importa. */
@media (prefers-reduced-motion: reduce) {
  .nai-espera-rueda { animation: none; border-top-color: var(--verde); opacity: .8; }
}

/* ── Sugerencias de direcciones ───────────────────────────────────────────────────────── */
.nm-campo-sugiere { position: relative; }
.nm-sugerencias {
  position: absolute; z-index: 50;
  top: 100%; left: 62px; right: 0;
  margin-top: 3px; padding: 4px;
  max-height: 260px; overflow-y: auto;
  background: var(--panel-2); border: 1px solid var(--borde);
  border-radius: 10px; box-shadow: 0 14px 40px rgba(0,0,0,.45);
}
.nm-sugerencias[hidden] { display: none; }
.nm-sugerencia {
  display: flex; align-items: baseline; gap: 8px;
  width: 100%; text-align: left;
  border: 0; background: none; cursor: pointer;
  padding: 6px 9px; border-radius: 7px;
  font-size: 13px; color: var(--texto-2);
}
.nm-sugerencia:hover, .nm-sugerencia.marcada { background: var(--panel-3); color: var(--texto); }
.nm-sug-nombre { font-weight: 600; white-space: nowrap; }
.nm-sug-email  { flex: 1 1 auto; min-width: 0; color: var(--texto-3); font-size: 12px;
                 overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nm-sug-que    { flex: 0 0 auto; font-size: 10.5px; color: var(--texto-3);
                 text-transform: uppercase; letter-spacing: .04em; }

/* ── El correo traducido ──────────────────────────────────────────────────────────────── */
.nm-traducido { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: var(--e3); }
.nm-traducido-aviso {
  margin: 0 0 var(--e3); padding-bottom: var(--e2);
  border-bottom: 1px solid var(--borde);
  font-size: 11.5px; color: var(--dorado);
}
/* `pre-wrap` porque llega como texto con sus saltos: sin esto sale un párrafo corrido. */
.nm-traducido-texto {
  white-space: pre-wrap; word-wrap: break-word;
  font-size: 14px; line-height: 1.6; color: var(--texto);
}

/* ── Correo o calendario ─────────────────────────────────────────────────────────────── */
.nm-vistas {
  display: flex; flex: 0 0 auto;
  background: var(--panel-3); border: 1px solid var(--borde);
  border-radius: 9px; padding: 2px;
}
.nm-vista {
  border: 0; background: none; cursor: pointer;
  color: var(--texto-3); font-size: 12.5px; font-weight: 600;
  padding: 6px 13px; border-radius: 7px;
}
.nm-vista.on { background: var(--panel); color: var(--texto); }

/* ── El calendario ───────────────────────────────────────────────────────────────────── */
.nm-cal-pane { min-height: 0; overflow: hidden; display: flex; }

/* 🚨 SIN ESTO EL CALENDARIO NO SCROLLEA. `.hoja-alta > *` reparte el alto con `flex: 0 0 auto` y
   solo le da el hueco que sobra a `.dos-panes`. El panel del calendario es hijo directo de
   `.hoja-alta` pero NO es `.dos-panes`, asi que se quedaba sin alto — y un contenedor sin alto no
   tiene nada por lo que desplazarse: las citas de fin de mes simplemente no se alcanzaban.
   ⚠️ `min-height: 0` es lo que permite a un hijo flex hacerse MAS PEQUEÑO que su contenido; sin
   el, no aparece ningun scroll y se sale por abajo. */
@media (min-width: 900px) {
  .hoja-alta > .nm-cal-pane { flex: 1 1 auto; min-height: 0; }
}

/* 🚨 UN `display` DE UNA CLASE GANA AL ATRIBUTO `hidden`, SIEMPRE.
   `hidden` es un estilo del navegador con especificidad casi nula: cualquier regla propia que
   ponga `display` lo pisa. Paso aqui: al abrir el calendario, `#nmPanes` quedaba con `hidden`
   puesto y `.dos-panes { display: grid }` seguia mandando — el correo se veia POR DEBAJO del
   calendario, los dos encima del otro. En el codigo todo estaba bien; solo se ve mirando.
   Se arregla para las dos, que la trampa es la misma. */
.nm-cal-pane[hidden],
.dos-panes[hidden] { display: none; }

.nm-cal { display: block; width: 100%; min-height: 0; overflow-y: auto; }

@media (min-width: 900px) {
  /* El mes se queda quieto y la lista se desplaza: mirar una cita de fin de mes sin perder de
     vista el calendario es justo para lo que sirve tenerlos juntos. */
  .nm-cal {
    display: grid;
    grid-template-columns: minmax(240px, 300px) minmax(0, 1fr);
    gap: var(--e4);
    overflow: hidden; height: 100%;
  }
  /* 🚨 `min-width: 0` EN LAS DOS COLUMNAS. En una rejilla los hijos nacen con `min-width: auto`,
     o sea que NO se dejan encoger por debajo de su contenido: las siete columnas del mes se salian
     de su hueco y se pintaban ENCIMA de la lista de citas — sabados y domingos aparecian debajo de
     los eventos. En el codigo la rejilla era correcta; solo se ve mirando la pantalla. */
  .nm-cal-mes   { position: sticky; top: 0; align-self: start; min-width: 0; }
  .nm-cal-lista { min-height: 0; min-width: 0; overflow-y: auto; }
}

.nm-cal-mes { padding: var(--e3); }
.nm-cal-cab {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: var(--e3); font-size: 14px;
}

.nm-cal-rejilla {
  display: grid;
  /* 🚨 `minmax(0, 1fr)`, NO `1fr` a secas. Un `1fr` tampoco baja del ancho MINIMO de su contenido,
     y con `aspect-ratio: 1` mas el numero y los puntos, cada casilla exigia mas de lo que cabia:
     las siete columnas se salian del hueco del mes y sabado y domingo se pintaban ENCIMA de la
     lista de citas. El `min-width: 0` del contenedor no basta — hay que decirselo tambien a las
     columnas de dentro. */
  grid-template-columns: repeat(7, minmax(0, 1fr)); /* ⚠️ ver arriba */
  gap: 3px;
}
.nm-cal-dia-nombre {
  text-align: center; font-size: 10.5px; font-weight: 700;
  color: var(--texto-3); text-transform: uppercase;
  padding-bottom: 5px;
}
.nm-cal-dia {
  position: relative;
  min-width: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3px;
  aspect-ratio: 1;
  border-radius: 8px;
  color: var(--texto-2); font-size: 12.5px;
  text-decoration: none;
  font-variant-numeric: tabular-nums;
}
.nm-cal-dia.vacio { pointer-events: none; }
.nm-cal-dia:hover:not(.vacio) { background: var(--panel-3); color: var(--texto); }
.nm-cal-dia.con-citas { color: var(--texto); font-weight: 600; }
.nm-cal-dia.hoy {
  background: color-mix(in srgb, var(--verde) 18%, transparent);
  color: var(--verde); font-weight: 700;
}
.nm-cal-puntos { display: flex; gap: 2px; }
.nm-cal-puntos i { width: 3px; height: 3px; border-radius: 50%; background: var(--verde); }
.nm-cal-dia.hoy .nm-cal-puntos i { background: var(--verde); }

.nm-cal-pie {
  margin-top: var(--e3); padding-top: var(--e2);
  border-top: 1px solid var(--borde);
  font-size: 11.5px; color: var(--texto-3);
}

/* ── Las citas ───────────────────────────────────────────────────────────────────────── */
.nm-cal-grupo { padding: 0 var(--e3) var(--e3); }
.nm-cal-grupo.resaltado { background: var(--panel-2); border-radius: 10px; }

.nm-cal-fecha {
  display: flex; align-items: baseline; gap: 7px;
  margin: var(--e3) 0 var(--e2);
  font-size: 19px; font-weight: 700; color: var(--texto);
  font-variant-numeric: tabular-nums;
}
.nm-cal-fecha > span { font-size: 12px; font-weight: 500; color: var(--texto-3); }
.nm-cal-fecha.hoy { color: var(--verde); }
.nm-cal-fecha.hoy > span { color: var(--verde); }

.nm-cita {
  display: flex; gap: var(--e3);
  padding: 10px var(--e3);
  border-left: 2px solid var(--verde);
  background: var(--panel-3);
  border-radius: 0 9px 9px 0;
  margin-bottom: 6px;
}
/* ⚠️ Tachada, no escondida: si alguien la tenía en la cabeza tiene que ver que ya no va. */
.nm-cita.cancelada { border-left-color: var(--rojo); opacity: .65; }
.nm-cita.cancelada .nm-cita-asunto { text-decoration: line-through; }

.nm-cita-hora {
  flex: 0 0 74px;
  font-size: 12px; font-weight: 600; color: var(--texto-2);
  font-variant-numeric: tabular-nums;
}
.nm-cita-cuerpo { flex: 1 1 auto; min-width: 0; }
.nm-cita-asunto { font-size: 13.5px; font-weight: 600; color: var(--texto); }
.nm-cita-datos { display: flex; flex-wrap: wrap; gap: var(--e3); margin-top: 4px; }
.nm-cita-dato { font-size: 11.5px; color: var(--texto-3); }
.nm-cita-entrar { margin-top: 7px; }
.nm-cita-extracto {
  margin: 5px 0 0; font-size: 12px; color: var(--texto-3); line-height: 1.45;
}

/* ── Invitaciones sin contestar ───────────────────────────────────────────────────────────
   ⛔ Van ARRIBA y en ámbar: una invitación sin contestar no es información, es algo que hay que
   HACER. Mezclada con las citas ya aceptadas se pierde. */
.dash-invitaciones {
  display: flex; flex-direction: column; gap: 6px;
  margin-bottom: var(--e3); padding-bottom: var(--e3);
  border-bottom: 1px solid var(--borde);
}
.dash-invitacion {
  display: flex; align-items: center; gap: var(--e3); flex-wrap: wrap;
  padding: 10px var(--e3);
  border-left: 2px solid var(--ambar);
  background: color-mix(in srgb, var(--ambar) 9%, var(--panel-3));
  border-radius: 0 9px 9px 0;
}
.dash-invitacion-que { flex: 1 1 260px; min-width: 0; }
.dash-invitacion-botones { display: flex; gap: 6px; flex: 0 0 auto; }
.dash-rechazar:hover { color: var(--rojo); border-color: var(--rojo); }

/* Contestada: se queda en su sitio pero apagada, en vez de desaparecer de golpe — así se ve QUÉ
   se acaba de contestar. */
.dash-invitacion.contestada {
  border-left-color: var(--borde);
  background: var(--panel-3);
  opacity: .6;
}
.dash-invitacion-hecho { font-size: 12px; color: var(--texto-3); }

/* ── Las citas en el dashboard ────────────────────────────────────────────────────────── */
.dash-citas { display: flex; flex-direction: column; gap: 6px; }

.dash-cita {
  display: flex; align-items: center; gap: var(--e3);
  padding: 9px var(--e3);
  background: var(--panel-3);
  border-left: 2px solid var(--borde);
  border-radius: 0 9px 9px 0;
}
/* Lo que empieza dentro de una hora se ve distinto: es lo único de aquí sobre lo que hay que
   hacer algo ahora mismo. */
.dash-cita.pronto {
  border-left-color: var(--ambar);
  background: color-mix(in srgb, var(--ambar) 8%, var(--panel-3));
}

.dash-cita-cuando {
  flex: 0 0 92px;
  display: flex; flex-direction: column; gap: 1px;
  font-variant-numeric: tabular-nums;
}
.dash-cita-cuando strong { font-size: 13px; color: var(--texto); }
.dash-cita-cuando span   { font-size: 11px; color: var(--texto-3); }
.dash-cita.pronto .dash-cita-cuando span { color: var(--ambar); font-weight: 600; }

.dash-cita-que { flex: 1 1 auto; min-width: 0; }
.dash-cita-asunto {
  font-size: 13px; color: var(--texto);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dash-cita-lugar {
  font-size: 11.5px; color: var(--texto-3); margin-top: 2px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dash-citas-mas {
  align-self: flex-start; margin-top: 2px;
  font-size: 12px; color: var(--verde); text-decoration: none;
}
.dash-citas-mas:hover { text-decoration: underline; }

/* ── Acciones sobre una cita ──────────────────────────────────────────────────────────── */
.nm-cita-botones { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 8px; }
.nm-cita-no:hover { color: var(--rojo); border-color: var(--rojo); }
.nm-cita-estado {
  display: inline-flex; align-items: center;
  font-size: 11.5px; color: var(--texto-3);
  padding: 0 6px;
}
/* ⭐ El enlace de la reunión, pulsable: Teams, Zoom, NaiClass o lo que sea. */
.nm-cita-url { color: var(--verde); text-decoration: none; }
.nm-cita-url:hover { text-decoration: underline; }

.nm-cal-pie {
  display: flex; align-items: center; justify-content: space-between; gap: var(--e2);
}

/* ── El formulario de cita nueva ──────────────────────────────────────────────────────── */
.nm-cita-form { display: flex; flex-direction: column; min-height: 0; width: 100%; }
.nm-campos-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--e2); }
@media (max-width: 620px) { .nm-campos-2 { grid-template-columns: 1fr; } }

.nm-campo textarea {
  flex: 1 1 auto; min-width: 0;
  background: var(--panel-3); border: 1px solid var(--borde);
  border-radius: 8px; color: var(--texto);
  font-size: 13.5px; padding: 8px 10px; outline: none;
  font-family: inherit; line-height: 1.5;
}
.nm-campo textarea:focus { border-color: var(--verde); }
.nm-campo-alto { align-items: flex-start; }
.nm-campo-alto > span { padding-top: 8px; }

/* ── Refrescar el correo a mano ───────────────────────────────────────────────────────── */
.nm-refrescar { flex: 0 0 auto; border: 1px solid var(--borde); background: var(--panel-3); }
.nm-refrescar:hover:not(:disabled) { color: var(--texto); border-color: var(--texto-3); }
.nm-refrescar:disabled { opacity: .6; cursor: default; }
/* La vuelta mientras trae: sin ella, pulsar y que no pase nada visible se lee como que no funciona. */
.nm-refrescar.girando svg { animation: nai-girar .8s linear infinite; }
@media (prefers-reduced-motion: reduce) { .nm-refrescar.girando svg { animation: none; opacity: .5; } }

/* El selector de «de quién», al lado del buzón. */
.nm-dequien { flex: 0 0 auto; }

/* ── Adjuntar al escribir ─────────────────────────────────────────────────────────────── */
.nm-adjuntar { display: flex; align-items: center; gap: var(--e2); flex-wrap: wrap; }
.nm-adjuntar label { cursor: pointer; }
.nm-adjuntar-lista {
  font-size: 11.5px; color: var(--texto-3);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  flex: 1 1 200px; min-width: 0;
}
/* ⚠️ Cuando se pasa del tope se dice AQUI, al elegir los ficheros: descubrirlo al pulsar enviar
   —despues de escribir el correo entero— es la peor forma de enterarse. */
.nm-adjuntar-lista.pasado { color: var(--rojo); }

/* ── NAIEnvios: la barra de subida ────────────────────────────────────────────────────────
   ⭐ Subir 2 GB son minutos. Sin una barra, la pantalla parece colgada y la gente cierra la
   pestaña a media subida — que es exactamente lo que Darwin queria evitar. */
.nm-subida { display: flex; flex-direction: column; gap: 5px; }
.nm-subida[hidden] { display: none; }
.nm-subida-barra {
  height: 5px; border-radius: 3px; overflow: hidden;
  background: var(--panel-3); border: 1px solid var(--borde);
}
.nm-subida-barra i {
  display: block; height: 100%; width: 0;
  background: var(--verde);
  transition: width .2s ease;
}
@media (prefers-reduced-motion: reduce) { .nm-subida-barra i { transition: none; } }
.nm-subida-texto {
  font-size: 11.5px; color: var(--texto-3);
  font-variant-numeric: tabular-nums;
}

/* Cuando los ficheros pasan de 25 MB no es un error: es que van por enlace. */
.nm-adjuntar-lista.porEnlace { color: var(--dorado); }


/* ══ NAIDrive — el OneDrive dentro de NAICenter ═══════════════════════════════════════════
   ⭐ Darwin (2026-08-22): «simular como si fuera una carpeta de verdad». Se parece a un explorador
   a propósito: rejilla de columnas, carpetas arriba, doble clic para entrar. */

.nd-barra {
  display: flex; align-items: center; gap: var(--e3); flex-wrap: wrap;
  margin-bottom: var(--e3);
}
.nd-titulo { display: flex; align-items: baseline; gap: var(--e2); }
.nd-cuota  { margin-left: auto; font-variant-numeric: tabular-nums; }

/* ⚠️ `position: relative` para que la tapa de «suelta aquí» se pegue a ESTA caja y no a la
   ventana: anclada al viewport taparía la barra de arriba. */
.nd-zona { position: relative; display: flex; flex-direction: column; min-height: 0; flex: 1 1 auto; }

.nd-migas { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: var(--e2); }
.nd-miga {
  background: none; border: 0; padding: 2px 6px; border-radius: var(--radio-xs);
  color: var(--verde); font: inherit; font-size: 12.5px; cursor: pointer;
}
.nd-miga:hover { background: var(--panel-2); }
.nd-miga-sep { color: var(--texto-3); font-size: 12px; }
.nd-miga-act { color: var(--texto-2); font-size: 12.5px; }

/* La rejilla: icono · nombre · tamaño · fecha · quién · acciones.
   ⚠️ `minmax(0,1fr)` en el nombre — sin el 0, un nombre largo empuja las demás columnas fuera. */
.nd-cab, .nd-fila {
  display: grid;
  grid-template-columns: 26px minmax(0,1fr) 90px 130px 130px auto;
  align-items: center; gap: var(--e2);
}
.nd-cab {
  padding: 0 var(--e3) 6px;
  font-size: 8.4pt; text-transform: uppercase; letter-spacing: .5px; color: var(--texto-3);
  border-bottom: 1px solid var(--borde);
}
.nd-lista { flex: 1 1 auto; min-height: 0; overflow-y: auto; }

.nd-fila {
  padding: 7px var(--e3);
  border-bottom: 1px solid var(--borde);
  cursor: default;
  border-left: 3px solid transparent;
}
.nd-fila:hover { background: var(--panel-2); }
.nd-fila.es-carpeta { cursor: pointer; }
/* Mientras se arrastra, la fila se queda a medio ver: dice qué se está moviendo. */
.nd-fila.llevando { opacity: .4; }
/* Y la carpeta bajo el puntero se marca: sin esto no se sabe dónde va a caer. */
.nd-fila.encima { background: var(--panel-3); border-left-color: var(--verde); }

.nd-icono { display: flex; align-items: center; justify-content: center; color: var(--texto-3); }
.nd-carpeta { color: var(--verde); }
.nd-hoja    { color: #21a366; }   /* Excel */
.nd-texto   { color: #2b7cd3; }   /* Word */
.nd-diapo   { color: #d24726; }   /* PowerPoint */
.nd-pdf     { color: #d0342c; }
.nd-imagen  { color: #a855f7; }
.nd-video   { color: #f59e0b; }
.nd-audio   { color: #06b6d4; }
.nd-caja    { color: #94a3b8; }

.nd-nombre  {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13.5px;
  display: flex; align-items: center; gap: 7px; min-width: 0;
}

/* ── Compartido ───────────────────────────────────────────────────────────────────────────
   ⭐ Darwin (2026-08-22): «normalmente OneDrive le cambia el color al folder y le pone como dos
   muñequitos silueta cuando son folders compartidos». Se hace igual, y además el color dice CUÁNTO
   se ha compartido, que es lo que de verdad importa. */
/* ⛔ EL COLOR DEL ICONO LO MANDA EL TIPO, NO EL ESTAR COMPARTIDO. Al principio pintaba de ámbar
   el icono de lo compartido y, en cuanto los iconos pasaron a distinguir PDF de Excel de Word, ese
   ámbar se los comía todos: dentro de una carpeta compartida TODO salía del mismo color y el tipo
   dejaba de verse. Que está compartido ya lo dicen las dos siluetas y el borde de la fila; el
   icono tiene un trabajo y es decir qué clase de fichero es.
   ⚠️ Sólo la CARPETA se sigue pintando de ámbar: ahí el icono no compite con ningún tipo. */
.nd-icono.nd-carpeta.nd-comp { color: #f0a020; }

.nd-comp-marca {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px; padding: 0;
  background: none; border: 1px solid transparent; border-radius: var(--radio-xs);
  color: #f0a020; cursor: pointer;
}
.nd-comp-marca:hover { background: var(--panel-3); border-color: var(--borde-2); }

/* ⛔ Y EL ALCANCE, EN EL COLOR. Compartir con dos personas y compartir con CUALQUIERA que tenga el
   enlace se ven igual en OneDrive, y no son lo mismo ni de lejos: lo abierto va en rojo. */
.nd-comp-users        { color: #f0a020; }
.nd-comp-organization { color: #3b9dd8; }
.nd-comp-anonymous    { color: var(--rojo); }

/* La fila entera, con un toque en el borde: se distingue de un vistazo sin leer nada. */
.nd-fila.compartido { border-left-color: color-mix(in srgb, #f0a020 55%, transparent); }
.nd-tam, .nd-cuando, .nd-quien {
  font-size: 12px; color: var(--texto-3); font-variant-numeric: tabular-nums;
}
.nd-quien { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Las acciones sólo al pasar por encima: seis botones en cada fila son ruido puro. */
.nd-acc { display: flex; align-items: center; gap: 4px; opacity: 0; transition: opacity .12s; }
.nd-fila:hover .nd-acc, .nd-fila:focus-within .nd-acc { opacity: 1; }
.nd-mini {
  background: none; border: 1px solid transparent; border-radius: var(--radio-xs);
  padding: 2px 7px; font-size: 11.5px; font-weight: 600;
  color: var(--texto-2); cursor: pointer; text-decoration: none; font-family: inherit;
}
.nd-mini:hover { background: var(--panel-3); border-color: var(--borde-2); }
.nd-mini-malo:hover { color: var(--rojo); }

.nd-vacio { padding: var(--e5); text-align: center; }

/* La tapa de «suelta aquí». Cubre la zona entera: Darwin pidió arrastrar y soltar, y obligar a
   apuntar a un recuadro pequeño es lo contrario de eso. */
.nd-tapa {
  position: absolute; inset: 0; z-index: 5;
  display: flex; align-items: center; justify-content: center;
  border: 2px dashed var(--verde); border-radius: var(--radio-s);
  background: color-mix(in srgb, var(--verde) 10%, var(--panel));
  color: var(--verde); font-size: 15px; font-weight: 600;
  pointer-events: none;   /* o el propio `drop` no llega a la zona de debajo */
}
/* ⛔ `[hidden]` PIERDE CONTRA EL `display: flex` DE ARRIBA. Es el fallo de siempre: el
   atributo `hidden` sólo vale `display: none` por defecto del navegador, y cualquier regla
   propia que ponga un display lo gana. Sin esta línea la tapa se ve SIEMPRE. */
.nd-tapa[hidden] { display: none; }

/* El diálogo de la vista previa: casi toda la pantalla, que un Excel en una ventanita no se lee. */
.nd-dlg { max-width: min(1100px, calc(100vw - 40px)); width: 100%; }
.nd-marco {
  width: 100%; height: min(72vh, 760px); border: 0; display: block;
  background: var(--panel-2);
}

/* ── Compartir: la misma ventana enseña con quién está y deja añadir o quitar ─────────────
   ⭐ Darwin (2026-08-22): «esa misma pantalla puede usarse para ver con quién se está
   compartiendo». Una sola ventana para las tres cosas — mirar, añadir y quitar— porque son la
   misma pregunta hecha de tres formas. */
.nd-comp-dlg { max-width: min(620px, calc(100vw - 40px)); width: 100%; }

.nd-comp-lista { display: flex; flex-direction: column; gap: 2px; margin-bottom: var(--e3); }

.nd-comp-fila {
  display: grid; grid-template-columns: 1fr auto auto;
  align-items: center; gap: var(--e2);
  padding: 6px var(--e2); border-radius: var(--radio-xs);
}
.nd-comp-fila:hover { background: var(--panel-2); }
/* Las de elegir llevan casilla delante, así que una columna más. */
.nd-comp-elegir { grid-template-columns: auto 1fr auto; cursor: pointer; }

.nd-comp-quien { font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nd-comp-rol   { font-size: 11.5px; }

.nd-comp-pie {
  display: flex; align-items: center; justify-content: space-between; gap: var(--e3);
  padding-top: var(--e3); border-top: 1px solid var(--borde);
}


/* ── Elegir varios ────────────────────────────────────────────────────────────────────────
   ⭐ Darwin (2026-08-22): «que se pueda escoger varios a la hora de borrar o mover».
   ⚠️ La casilla ocupa EL SITIO DEL ICONO y sólo aparece al pasar por encima o si ya está marcada.
   Una columna más sólo para esto estrecharía la rejilla para siempre por algo que se usa de vez
   en cuando. */
.nd-marca { position: relative; display: flex; align-items: center; justify-content: center; }

/* ⛔ `opacity: 0` NO QUITA EL ELEMENTO DE EN MEDIO: sigue ahí y sigue recibiendo los clics.
   El icono va DESPUÉS de la casilla en el HTML, así que se pinta encima; al pasar por encima la
   casilla se veía, pero el clic lo seguía comiendo el icono invisible y subía a la fila, que abre
   la carpeta. Darwin: «se pone como para poner un check mark, sin embargo cuando le doy click lo
   que hace es abrir la carpeta».
   Hacen falta las DOS cosas: apagar el ratón en el icono cuando se esconde, y levantar la casilla
   con `z-index`. Con una sola no basta. */
.nd-marca .nd-check {
  position: absolute; z-index: 1; margin: 0;
  opacity: 0; pointer-events: none;
  /* ⚠️ Una casilla nativa mide 13 px: apuntar a eso con el ratón es incómodo y se falla. Se le da
     el alto y ancho de la celda entera para que valga todo el hueco del icono. */
  width: 100%; height: 100%;
  appearance: none; -webkit-appearance: none;
  border: 1.6px solid var(--borde-2); border-radius: 4px;
  background: var(--campo);
  max-width: 20px; max-height: 20px;
}
/* Marcada: se pinta la palomita a mano, porque al quitarle el aspecto nativo ya no la trae. */
.nd-marca .nd-check:checked {
  background: var(--verde); border-color: var(--verde);
}
.nd-marca .nd-check:checked::after {
  content: ''; position: absolute; left: 6px; top: 2px;
  width: 5px; height: 10px;
  border: solid #0b1220; border-width: 0 2.2px 2.2px 0;
  transform: rotate(42deg);
}
.nd-marca .nd-check:focus-visible { outline: 2px solid var(--violeta); outline-offset: 1px; }
.nd-fila:hover .nd-marca .nd-check,
.nd-marca .nd-check:checked { opacity: 1; pointer-events: auto; cursor: pointer; }

.nd-marca .nd-icono { pointer-events: none; }   /* el icono NUNCA se come un clic */
.nd-fila:hover .nd-marca .nd-icono,
.nd-marca .nd-check:checked ~ .nd-icono { opacity: 0; }

/* La fila elegida se ve elegida, no sólo la casilla. */
.nd-fila:has(.nd-check:checked) { background: var(--panel-2); border-left-color: var(--verde); }

.nd-lote {
  display: flex; align-items: center; gap: var(--e2);
  padding: 6px var(--e3); margin-bottom: var(--e2);
  background: var(--panel-2); border: 1px solid var(--borde-2);
  border-radius: var(--radio-s);
  font-size: 13px; font-weight: 600;
}
/* ⛔ `[hidden]` pierde contra el `display: flex` de arriba. El fallo de siempre. */
.nd-lote[hidden] { display: none; }

/* ── La cabecera de cada dia ──────────────────────────────────────────────────────────────
   ⭐ Darwin (2026-08-23): «today, yesterday, fecha».
   ⚠️ Discreta a proposito: es un separador, no un titulo. Si pesa mas que los nombres de los
   ficheros, la lista se lee peor de lo que se leia sin ella. */
.nd-grupo {
  padding: 10px var(--e3) 4px;
  font-size: 11px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .6px;
  color: var(--texto-3);
  border-bottom: 1px solid var(--borde);
  font-variant-numeric: tabular-nums;
}
/* La primera no necesita el hueco de arriba: ya lo pone la cabecera de columnas. */
.nd-lista > .nd-grupo:first-child { padding-top: 2px; }


/* ── El consumo de los servidores de video ───────────────────────────────────────────────
   Se usa igual en la ficha de un servidor y en el dashboard. */
.nsg-total { margin-bottom: var(--e3); }
.nsg-total-val { font-size: 30px; font-weight: 800; letter-spacing: -.02em; color: var(--texto-1);
  line-height: 1.1; font-variant-numeric: tabular-nums; }
.nsg-total-eti { font-size: 12px; color: var(--texto-3); margin-top: 2px; }
/* Alto fijo: Chart.js necesita que el contenedor mida algo o el lienzo crece sin parar. */
.nsg-lienzo { position: relative; height: 240px; }
.nsg-leyenda { margin-top: var(--e3); display: flex; flex-direction: column; gap: 4px; }
.nsg-l { display: flex; align-items: baseline; gap: var(--e2); font-size: 12px;
  padding: 4px 0; border-bottom: 1px solid var(--borde); }
.nsg-l:last-child { border-bottom: 0; }
.nsg-punto { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.nsg-nom { font-weight: 600; color: var(--texto-1); min-width: 78px; }
.nsg-papel { color: var(--texto-3); font-size: 11px; min-width: 46px; }
.nsg-val { margin-left: auto; font-weight: 700; color: var(--texto-1);
  font-variant-numeric: tabular-nums; }
.nsg-pico { color: var(--texto-3); font-size: 11px; min-width: 96px; text-align: right;
  font-variant-numeric: tabular-nums; }
@media (max-width: 700px) { .nsg-papel, .nsg-pico { display: none; } }

.nsg-total-cn { font-size: 12px; color: var(--texto-3); margin-top: 4px; }
.nsg-total-cn b { color: var(--texto-2); font-weight: 700; font-variant-numeric: tabular-nums; }
.nsg-conn { color: var(--texto-3); font-size: 11px; min-width: 74px; text-align: right;
  font-variant-numeric: tabular-nums; }
@media (max-width: 700px) { .nsg-conn { display: none; } }

/* ── Quien esta viendo ────────────────────────────────────────────────────────────────── */
.nsa-cifras { display: flex; gap: var(--e4); flex-wrap: wrap; margin-bottom: var(--e4); }
.nsa-c b { display: block; font-size: 26px; font-weight: 800; letter-spacing: -.02em;
  color: var(--texto-1); line-height: 1.1; font-variant-numeric: tabular-nums; }
.nsa-c i { font-style: normal; font-size: 11.5px; color: var(--texto-3); }
.nsa-rejilla { display: grid; gap: var(--e3); grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
.nsa-caja { border: 1px solid var(--borde); border-radius: 10px; padding: var(--e3); }
.nsa-caja h4 { margin: 0 0 var(--e2); font-size: 12.5px; color: var(--texto-2); font-weight: 600; }
.nsa-ancha { margin-top: var(--e3); }
/* Chart.js necesita que el contenedor mida algo o el lienzo crece sin parar. */
.nsa-lienzo { position: relative; height: 176px; }
.nsa-barras { display: flex; flex-direction: column; gap: 5px; }
.nsa-b { display: flex; align-items: center; gap: var(--e2); font-size: 12px; }
.nsa-b-nom { width: 130px; flex: none; color: var(--texto-1); overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }
.nsa-b-riel { flex: 1; height: 8px; background: var(--borde); border-radius: 4px; overflow: hidden; }
.nsa-b-lleno { display: block; height: 100%; border-radius: 4px; }
.nsa-b-eq { width: 48px; text-align: right; font-weight: 700; color: var(--texto-1);
  font-variant-numeric: tabular-nums; }
.nsa-b-cl { width: 66px; text-align: right; color: var(--texto-3); font-size: 11px;
  font-variant-numeric: tabular-nums; }
.nsa-b-tx { width: 78px; text-align: right; color: var(--texto-3); font-size: 11px;
  font-variant-numeric: tabular-nums; }
.nsa-nota { margin-top: var(--e3); font-size: 11px; color: var(--texto-3); line-height: 1.5; }
@media (max-width: 760px) { .nsa-b-cl, .nsa-b-tx { display: none; } .nsa-b-nom { width: 92px; } }

/* ── Canales del artículo (inventario) ────────────────────────────────────────────────────
   El checklist que se elige dentro de la ficha del artículo, para los ADD-ON (HBO, Starz…) y
   los paquetes de TV. Ver `app/paginas/inventory_channels.php`. */
.inv-can-cab { display: flex; align-items: center; gap: var(--e2); margin-bottom: var(--e2); }
.inv-can-buscar {
  flex: 1; min-height: 38px; padding: 0 var(--e3);
  background: rgba(8, 14, 26, .8); color: var(--texto);
  border: 1px solid var(--borde); border-radius: var(--radio-xs);
  font-size: 15px; font-family: inherit; outline: none;
}
.inv-can-buscar:focus { border-color: var(--violeta); box-shadow: 0 0 0 3px var(--violeta-humo); }
.inv-can-cuenta {
  font-size: 18px; font-weight: 700; color: var(--violeta-claro);
  min-width: 2ch; text-align: right;
}

/* ⚠️ Alto tope con su propio desplazamiento: son ~280 canales y sin esto la ficha se vuelve un
   rollo de tres metros y el botón de Guardar queda fuera de la pantalla. */
.inv-can-lista {
  max-height: 340px; overflow-y: auto;
  border: 1px solid var(--borde); border-radius: var(--radio-s);
  background: rgba(8, 14, 26, .5);
}
.inv-can {
  display: flex; align-items: center; gap: var(--e2);
  padding: 7px var(--e3); cursor: pointer;
  border-bottom: 1px solid var(--borde);
  font-size: 14px;
}
.inv-can:last-child { border-bottom: 0; }
.inv-can:hover { background: var(--panel-3); }
/* El que está dentro se ve de un vistazo: la casilla sola, a media pantalla de distancia y con
   280 filas, no se distingue. */
.inv-can.on { background: var(--violeta-humo); }
.inv-can input { width: 17px; height: 17px; accent-color: var(--violeta); flex: 0 0 auto; }
.inv-can-num { min-width: 3.5ch; color: var(--texto-3); font-variant-numeric: tabular-nums; }
.inv-can-nom { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.inv-can-off {
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .06em;
  color: var(--ambar); border: 1px solid rgba(251,191,36,.35);
  border-radius: 999px; padding: 1px 7px;
}

/* ── Canales premium del cliente (add-ons) ───────────────────────────────────────────────── */
.add-lista { display: flex; flex-direction: column; gap: 1px; background: var(--borde); border-radius: var(--radio-s); overflow: hidden; }
.add-fila {
  display: grid; grid-template-columns: 1fr auto auto; gap: var(--e3);
  align-items: center; padding: var(--e3); background: var(--panel-2);
}
/* Lo que ya terminó se ve, pero apagado: hace falta para responder «¿desde cuándo no lo tengo?» */
.add-fila.apagado { opacity: .55; }
.add-nom b { display: block; font-size: 14.5px; }
.add-nom small { color: var(--texto-3); font-size: 12px; }
.add-fecha { font-size: 13px; color: var(--texto-2); white-space: nowrap; }
.add-fecha small { color: var(--texto-3); }
.add-off { color: var(--texto-3); }
/* Se avisa solo cuando queda poco Y no se renueva: es el único caso en que hay que hacer algo. */
.add-pronto { color: var(--ambar); font-weight: 600; }
.add-sw { display: flex; align-items: center; gap: var(--e2); cursor: pointer; font-size: 12.5px; color: var(--texto-2); white-space: nowrap; }
.add-sw input { width: 17px; height: 17px; accent-color: var(--violeta); }

@media (max-width: 700px) {
  /* En el móvil la fecha baja: es lo único que puede partirse sin perder sentido. */
  .add-fila { grid-template-columns: 1fr auto; }
  .add-fecha { grid-column: 1 / -1; }
}
