
:root{
  --fondo:#F6F8FB; --panel:#FFFFFF; --tinta:#0B1A26; --tinta2:#5A7183; --tinta3:#93A8B6;
  --fondo2:#F1F5F9;   /* superficie hundida: cajas dentro de una tarjeta */
  --marca:#0F6CC4; --marca2:#1E9BE0; --marca-suave:#EAF4FC; --borde:#E6EDF3; --borde2:#EFF3F7;
  --turquesa:#2BD3E2; --tinta-inv:#F6F9FC;
  /* El turquesa de la marca sobre blanco da 1.82:1 — MEDIDO, y reprueba hasta para
     numero grande (el ambar de al lado da 3.22). Sirve para degradados y acentos,
     no para texto. Este es su version legible: 4.8:1 sobre blanco. Es la leccion
     de los tonos del CSAT, calculados sobre blanco y cortos a 13px. */
  --turquesa-t:#0A7E8A;
  --verde:#17966B; --ambar:#C97F04; --rojo:#D14837;
  --verde-f:#E7F6EF; --ambar-f:#FCF2DD; --rojo-f:#FCEBE8;
  --s1:0 1px 2px rgba(11,26,38,.04),0 1px 3px rgba(11,26,38,.06);
  --s2:0 2px 4px rgba(11,26,38,.04),0 8px 24px rgba(11,26,38,.07);
  --s3:0 8px 16px rgba(11,26,38,.06),0 24px 56px rgba(11,26,38,.12);
  --sombra:var(--s2); --sombra-alta:var(--s3);
  --radio:18px; --radio-sm:12px;
  --grad:linear-gradient(135deg,#0F6CC4 0%,#1E9BE0 55%,#2BD3E2 120%);
}
/* ── Modo oscuro ────────────────────────────────────────────────────────────
   Sigue la preferencia del sistema (el camino Apple: el telefono decide de
   noche). Todo el diseño vive en tokens, asi que oscurecer es redefinirlos;
   abajo, un puñado de reglas puntuales para los pasteles que no son token.
   El azul de marca sube un paso de luz: el #0F6CC4 original pierde contraste
   sobre fondo oscuro. Los correos NO cambian: HTML con estilos en linea. */
@media (prefers-color-scheme: dark){
  :root{
    --fondo:#0F1318; --panel:#171D24; --tinta:#ECF1F6; --tinta2:#A7B5C1; --tinta3:#71808D;
    --fondo2:#12181F;
    --marca:#4FA8EC; --marca2:#67B8F2; --marca-suave:#13293C; --borde:#28323D; --borde2:#212A33;
    --tinta-inv:#0B1A26;
    --verde:#33B888; --ambar:#E3A93F; --rojo:#EA7360;
    /* En oscuro el turquesa de la marca SI se lee (10.9:1 sobre el fondo), asi que
       aqui el token legible vuelve a ser el de la marca. */
    --turquesa-t:#2BD3E2;
    --verde-f:#12312A; --ambar-f:#33280F; --rojo-f:#3A1E19;
    --s1:0 1px 2px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.35);
    --s2:0 2px 4px rgba(0,0,0,.3),0 8px 24px rgba(0,0,0,.42);
    --s3:0 8px 16px rgba(0,0,0,.4),0 24px 56px rgba(0,0,0,.55);
  }
}
*{box-sizing:border-box}
::selection{background:rgba(30,155,224,.18)}
body{margin:0;background:var(--fondo);color:var(--tinta);
  font:15px/1.6 -apple-system,BlinkMacSystemFont,'SF Pro Text','SF Pro Display','Helvetica Neue','Segoe UI',system-ui,Roboto,Arial,sans-serif;
  letter-spacing:-.01em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}
a{color:var(--marca);text-decoration:none}
/* El texto DENTRO de un SVG no hereda la fuente de la página: el navegador le
   pone su tipografía por defecto, que suele ser una serif. Por eso los números de
   las gráficas se veían de otra familia que el resto del tablero — no era el
   tamaño, era la letra. Una sola regla lo arregla en las tres gráficas.
   'font-variant-numeric' alinea las cifras: en una escala, un 1 más angosto que
   un 8 hace que las marcas bailen. */
svg text{font-family:inherit;font-variant-numeric:tabular-nums;letter-spacing:-.1px}
/* Escala tipográfica al estilo de las pantallas de estado (2-sep-2026): títulos a
   700 —no 800— con tracking negativo y líneas balanceadas, subtítulo un punto más
   grande y con interlineado de lectura. Los tamaños base no se tocan: las tablas y
   los formularios están medidos con 15px y moverlo los descuadra. */
h1{font-size:30px;font-weight:700;letter-spacing:-.03em;margin:0 0 6px;line-height:1.12;text-wrap:balance}
h2{font-weight:700;letter-spacing:-.025em;text-wrap:balance}
h3{font-size:15px;font-weight:650;letter-spacing:-.015em}
.sub{color:var(--tinta2);margin:0 0 24px;font-size:15.5px;line-height:1.5;max-width:70ch;text-wrap:pretty}

/* ── encabezado */
header{background:rgba(255,255,255,.80);-webkit-backdrop-filter:saturate(180%) blur(16px);backdrop-filter:saturate(180%) blur(16px);
  border-bottom:1px solid var(--borde);padding:0 22px;display:flex;align-items:center;gap:18px;
  height:60px;position:sticky;top:0;z-index:20}
header .logo{display:flex;align-items:center;gap:11px;color:var(--tinta)}
header .logo img{height:30px;width:auto;display:block}
header .logo span{font-weight:700;letter-spacing:-.02em;font-size:14.5px;color:var(--tinta);
  border-left:1px solid var(--borde);padding-left:11px;white-space:nowrap}
/* min-width:0 + overflow-x son lo que impide que la barra desborde cuando el menú
   crece: sin ellos, un elemento nuevo empuja el botón de Salir fuera de la pantalla
   y toda la página pide scroll lateral (pasó al agregar "Activos"). Con esto el
   menú se desliza dentro de su propio carril y el encabezado nunca se rompe. */
/* El degradado que insinúa "hay más a la derecha" vivía SOLO dentro del bloque de
   860px. Entre 861px y el ancho donde empieza a recortar, el menú se desliza sin
   ninguna pista: la barra de scroll está oculta arriba y no hay sombra. Así fue como
   "Tablero" desapareció de la vista sin que nada lo anunciara. Aquí sirve para
   cualquier número de elementos: header nav es flex:1 1 auto, así que cuando todo
   cabe la franja derecha queda vacía y el degradado cae sobre nada. */
header nav{display:flex;gap:1px;flex:1 1 auto;min-width:0;margin-left:6px;
  overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none;padding-right:22px;
  -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 22px),transparent);
  mask-image:linear-gradient(90deg,#000 calc(100% - 22px),transparent)}
header nav::-webkit-scrollbar{display:none}
header nav a{flex:0 0 auto}
header nav a{color:var(--tinta2);padding:7px 13px;border-radius:9px;font-size:13.5px;font-weight:650;
  transition:color .16s,background .16s;position:relative}
header nav a:hover{color:var(--marca)}
header nav a.act{color:var(--marca);background:var(--marca-suave)}
header .quien{font-size:13px;color:var(--tinta2);white-space:nowrap;font-weight:600}
main{max-width:1180px;margin:32px auto;padding:0 24px;animation:surge .4s ease}
/* La bandeja es una TABLA DE DATOS, no una columna de lectura. Los 1180px del
   resto del sitio le quedaron cortos al llegar a ocho columnas: el navegador le
   quita el ancho a la única columna que puede encoger —el asunto— y lo deja en
   una palabra por renglón, que fue justo lo que se vio en producción. Se abre
   solo aquí; el resto del sitio conserva su ancho de lectura. */
main.ancha{max-width:1400px}
@keyframes surge{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* ── superficies */
.tarjeta{background:var(--panel);border:1px solid var(--borde);border-radius:var(--radio);
  padding:24px;margin-bottom:18px;box-shadow:var(--s1)}
table{width:100%;border-collapse:collapse;font-size:14px}
th{text-align:left;color:var(--tinta3);font-weight:700;font-size:10.5px;text-transform:uppercase;
  letter-spacing:.8px;padding:10px 14px;border-bottom:1px solid var(--borde)}
td{padding:14px;border-bottom:1px solid var(--borde2);vertical-align:middle}
tr:last-child td{border-bottom:0}

/* ── filas de ticket clicables con acento por prioridad */
tr.fila{cursor:pointer;transition:background .14s}
tr.fila:hover td{background:#F8FBFD}
tr.fila td:first-child{border-left:3px solid transparent}
tr.fila.p-critica td:first-child{border-left-color:#B3261E;border-left-width:4px}
tr.fila.p-alta td:first-child{border-left-color:var(--rojo)}
tr.fila.p-media td:first-child{border-left-color:var(--ambar)}
tr.fila.p-baja td:first-child{border-left-color:var(--verde)}

.folio{font-family:ui-monospace,SFMono-Regular,'SF Mono',Menlo,monospace;
  font-size:12.5px;font-weight:600;letter-spacing:-.2px}
.chip{display:inline-flex;align-items:center;gap:6px;padding:3px 11px;border-radius:999px;
  font-size:12px;font-weight:700;white-space:nowrap}
.chip .pt{width:7px;height:7px;border-radius:50%}
.c-verde{background:var(--verde-f);color:var(--verde)} .c-verde .pt{background:var(--verde)}
.c-ambar{background:var(--ambar-f);color:var(--ambar)} .c-ambar .pt{background:var(--ambar)}
.c-rojo{background:var(--rojo-f);color:var(--rojo)} .c-rojo .pt{background:var(--rojo)}
.c-rojo.pulso .pt{animation:pulso 1.6s infinite}
@keyframes pulso{0%,100%{box-shadow:0 0 0 0 rgba(209,72,55,.5)}50%{box-shadow:0 0 0 5px rgba(209,72,55,0)}}
.c-gris{background:#EDF2F0;color:var(--tinta2)} .c-gris .pt{background:var(--tinta3)}
/* Campo de fecha. El calendario emergente lo dibuja el navegador y no se puede
   estilizar; lo que sí es nuestro es el campo y su ícono. */
input[type=date]{position:relative;font-variant-numeric:tabular-nums;cursor:pointer}
input[type=date]::-webkit-calendar-picker-indicator{
  width:20px;height:20px;padding:4px;margin-right:-4px;border-radius:7px;cursor:pointer;
  opacity:.55;transition:opacity .12s ease,background .12s ease}
input[type=date]:hover::-webkit-calendar-picker-indicator{opacity:1;background:var(--marca-suave)}
input[type=date]::-webkit-datetime-edit{padding:0}
input[type=date]:focus{border-color:var(--marca)}
/* prioridad como semáforo: verde puede esperar → rojo sólido no puede */
.pr-critica{background:var(--rojo);color:#fff} .pr-critica .pt{background:var(--panel)}
.pr-alta{background:var(--rojo-f);color:var(--rojo)} .pr-alta .pt{background:var(--rojo)}
.pr-media{background:var(--ambar-f);color:var(--ambar)} .pr-media .pt{background:var(--ambar)}
.pr-baja{background:var(--verde-f);color:var(--verde)} .pr-baja .pt{background:var(--verde)}
/* estados con paleta propia distinta (dona y chips coinciden) */
.e-espaprob{background:#FBF0DE;color:#8A5A12} .e-espaprob .pt{background:#B5751A}
.e-nuevo{background:#EAEDFB;color:#3D4FB8} .e-nuevo .pt{background:#5566D6}
.e-asignado{background:#F4E9FB;color:#7B37B5} .e-asignado .pt{background:#9D57D4}
.e-encurso{background:#E0F4F9;color:#0E7A8D} .e-encurso .pt{background:#15A3BC}
.e-espera{background:#FCE8F0;color:#C13C70} .e-espera .pt{background:#E8598B}
.e-resuelto{background:var(--verde-f);color:var(--verde)} .e-resuelto .pt{background:#17966B}
.e-cerrado{background:#F7E9E7;color:#8C453A} .e-cerrado .pt{background:#A6564A}
/* Cerrado por silencio no es lo mismo que rechazado: nadie decidió que no, solo se
   apagó la conversación. Gris, no rojo — no hay nada que reprocharle a nadie. */
.e-sinresp{background:#EDF1F4;color:#5E7285} .e-sinresp .pt{background:#8399A8}
.badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:12px;font-weight:700;
  background:var(--marca-suave);color:var(--marca)}

/* ── formularios */
form.linea{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end}
label{display:block;font-size:12.5px;font-weight:700;color:var(--tinta);margin-bottom:6px;letter-spacing:-.1px}
input,select,textarea{width:100%;padding:11px 14px;border:1.5px solid var(--borde);border-radius:var(--radio-sm);
  font:inherit;background:var(--panel);color:var(--tinta);transition:border-color .16s,box-shadow .16s}
input::placeholder,textarea::placeholder{color:var(--tinta3)}
input:focus,select:focus,textarea:focus{outline:0;border-color:var(--marca2);
  box-shadow:0 0 0 3.5px rgba(30,155,224,.14)}
.campo{margin-bottom:16px}
button,.boton{background:var(--marca);color:#fff;border:0;border-radius:var(--radio-sm);padding:11px 20px;
  font:inherit;font-weight:600;letter-spacing:-.01em;cursor:pointer;display:inline-block;transition:transform .14s,box-shadow .14s,background .14s;
  box-shadow:0 1px 2px rgba(15,108,196,.24),0 4px 12px rgba(15,108,196,.20)}
button:hover,.boton:hover{background:var(--marca2);transform:translateY(-1px);
  box-shadow:0 2px 6px rgba(15,108,196,.26),0 8px 20px rgba(15,108,196,.26);text-decoration:none}
button:active,.boton:active{transform:translateY(0)}
.boton.sec{background:var(--panel);color:var(--marca);border:1.5px solid var(--borde);box-shadow:none}

/* ── línea de tiempo (bitácora) */

/* ── Controles con acabado propio ───────────────────────────────────────────
   Los widgets nativos (flecha de select, casilla, botón de archivo) los dibuja
   el sistema operativo: en Windows se ven de otra época y rompen el resto de la
   interfaz. Aquí se reemplazan por versiones propias, iguales en todos lados. */
select{appearance:none;-webkit-appearance:none;-moz-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%235A7183' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 13px center;padding-right:38px;cursor:pointer}
select::-ms-expand{display:none}

/* Casilla propia: el cuadrito nativo se oculta y se dibuja uno con la marca. */
.chk{position:relative;display:inline-flex;align-items:flex-start;gap:10px;cursor:pointer}
.chk>input[type=checkbox]{position:absolute;width:1px;height:1px;opacity:0;margin:0}
.chk>input[type=checkbox]+.caja{flex:0 0 auto;width:19px;height:19px;margin-top:1px;border-radius:6px;
  border:1.8px solid var(--borde);background:var(--panel);display:grid;place-items:center;
  transition:border-color .15s,background .15s,transform .12s}
.chk>input[type=checkbox]+.caja::after{content:'';width:10px;height:6px;border-left:2.2px solid #fff;
  border-bottom:2.2px solid #fff;transform:rotate(-45deg) scale(.5);opacity:0;transition:opacity .14s,transform .14s;
  margin-top:-2px}
.chk>input[type=checkbox]:checked+.caja{background:var(--marca);border-color:var(--marca)}
.chk>input[type=checkbox]:checked+.caja::after{opacity:1;transform:rotate(-45deg) scale(1)}
.chk>input[type=checkbox]:focus-visible+.caja{box-shadow:0 0 0 3.5px rgba(30,155,224,.18)}
.chk:hover>input[type=checkbox]:not(:checked)+.caja{border-color:var(--marca2)}

/* Zona para soltar archivos. El input nativo se estira invisible por encima:
   así el clic y el arrastrar-y-soltar funcionan aun sin JavaScript, y el
   JavaScript solo agrega el nombre del archivo y el resaltado. */
.rejilla-2{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:0 14px}
/* Opciones sueltas: casillas en línea, sin caja de color. Antes cada una vivía en
   su propio recuadro ámbar y dos recuadros seguidos saturaban el formulario. */
.opciones-sueltas{display:flex;flex-direction:column;gap:10px;margin-top:16px;
  padding-top:14px;border-top:1px solid var(--borde)}
.opciones-sueltas .chk{font-size:14px}
.opciones-sueltas .chk small{display:block;color:var(--tinta3);font-size:12px;margin-top:1px}
.accesos{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:10px;margin:18px 0 4px}
.acceso{display:flex;align-items:center;gap:13px;padding:14px 16px;background:var(--panel);
  border:1px solid var(--borde);border-radius:var(--radio-sm);text-decoration:none;color:inherit;
  transition:border-color .16s,transform .16s,box-shadow .16s}
.acceso:hover{border-color:var(--marca2);transform:translateY(-1px);
  box-shadow:0 2px 6px rgba(15,108,196,.08),0 8px 20px rgba(15,108,196,.08);text-decoration:none}
.acceso-ico{flex:0 0 auto;width:36px;height:36px;border-radius:10px;background:var(--marca-suave);
  color:var(--marca);display:grid;place-items:center}
.acceso>span:nth-child(2){display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}
.acceso b{font-size:14px;font-weight:700}
.acceso small{font-size:12px;color:var(--tinta3);line-height:1.4}
.acceso-fl{flex:0 0 auto;color:var(--tinta3);font-size:16px;transition:transform .16s,color .16s}
.acceso:hover .acceso-fl{color:var(--marca);transform:translateX(3px)}
.soltar{position:relative;display:flex;align-items:center;gap:14px;padding:18px 20px;
  border:1.8px dashed var(--borde);border-radius:var(--radio-sm);background:var(--fondo2);
  cursor:pointer;transition:border-color .18s,background .18s,transform .18s}
.soltar:hover,.soltar.encima{border-color:var(--marca2);background:var(--marca-suave)}
.soltar.encima{transform:scale(1.005)}
.soltar.puesto{border-style:solid;border-color:var(--verde);background:var(--verde-f)}
.soltar>input[type=file]{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}
.soltar-ico{flex:0 0 auto;width:42px;height:42px;border-radius:12px;background:var(--panel);
  border:1px solid var(--borde);display:grid;place-items:center;color:var(--marca);transition:color .18s}
.soltar.puesto .soltar-ico{color:var(--verde);border-color:#C6E9D8}
.soltar.pesado{border-style:solid;border-color:var(--rojo);background:var(--rojo-f)}
.soltar.pesado .soltar-ico{color:var(--rojo);border-color:#F3C9C9}
.soltar.pesado .soltar-txt .nombre{color:var(--rojo)}
/* Va encima del input invisible que cubre la zona; si no, el clic abriría el explorador. */
.soltar-quitar{position:absolute;top:9px;right:9px;z-index:3;width:26px;height:26px;padding:0;
  display:flex;align-items:center;justify-content:center;border:1px solid var(--borde);
  border-radius:50%;background:var(--panel);color:var(--tinta3);cursor:pointer;transition:all .12s ease}
.soltar-quitar:hover{border-color:var(--rojo);color:var(--rojo);background:var(--rojo-f)}
/* Ayuda del importador: una fila de Excel dibujada. Son 14 columnas, así que la
   tabla se desliza sola dentro de su caja en vez de empujar la página a lo ancho. */
.cols-ayuda{margin:2px 0 16px}
.cols-scroll{overflow-x:auto;border:1px solid var(--borde);border-radius:10px;background:var(--fondo2)}
.cols-import{border-collapse:collapse;font-size:12.5px;white-space:nowrap;min-width:100%}
.cols-import th{background:var(--fondo);color:var(--tinta3);font-weight:700;font-size:11px;
  padding:5px 10px;border-right:1px solid var(--borde);border-bottom:1px solid var(--borde);text-align:left}
.cols-import td{padding:7px 10px;border-right:1px solid var(--borde);vertical-align:top}
.cols-import th:last-child,.cols-import td:last-child{border-right:0}
.cols-import td b{font-weight:650;color:var(--tinta)}
.cols-import .cols-pista td{padding-top:0;font-size:11.5px;color:var(--tinta3)}
.cols-import .req{color:var(--marca);font-style:normal;font-weight:800;margin-left:2px}
.cols-nota{font-size:12px;color:var(--tinta3);margin:8px 2px 0}
/* Importar en tres pasos: descargar, llenar, subir. Numerados a mano con un
   contador para que el número viva pegado al paso y no en el HTML. */
.pasos-import{list-style:none;counter-reset:pi;margin:0 0 6px;padding:0;display:flex;flex-direction:column;gap:20px}
.pasos-import>li{counter-increment:pi;position:relative;padding-left:38px}
.pasos-import>li::before{content:counter(pi);position:absolute;left:0;top:-1px;width:26px;height:26px;
  border-radius:50%;background:var(--marca);color:#fff;font-size:13px;font-weight:800;
  display:flex;align-items:center;justify-content:center}
.pasos-import>li>b{display:block;font-size:14.5px;margin-bottom:3px}
.pasos-import>li>span{display:block;font-size:13px;color:var(--tinta2);line-height:1.55;margin-bottom:10px}
.pasos-import .cols-ayuda{margin-top:2px}
.pasos-import .boton{text-decoration:none;display:inline-flex;align-items:center;gap:7px}
.det-pegar{margin-top:20px;border-top:1px solid var(--borde);padding-top:14px}
.det-pegar>summary{cursor:pointer;font-size:13px;color:var(--tinta3);font-weight:600}
.det-pegar>summary:hover{color:var(--marca)}
.import-trabado{background:var(--rojo-f);border:1px solid var(--rojo);border-radius:12px;
  padding:13px 16px;margin-bottom:16px;font-size:13.5px;line-height:1.6;color:var(--tinta)}
.import-trabado b{color:var(--rojo)}
/* Cómo se vigila un equipo: hechos, no controles. Por eso no parecen formulario. */
.ctl-caja{margin-top:12px;display:flex;flex-direction:column;gap:9px}
.ctl-fila{display:flex;gap:9px;align-items:flex-start;flex-wrap:wrap}
.ctl-fila small{color:var(--tinta2);font-size:12.5px;line-height:1.45;flex:1;min-width:180px}
.ctl-pedir{border-top:1px solid var(--borde);padding-top:10px;margin-top:2px}
.ctl-pedir>summary{cursor:pointer;font-size:13px;font-weight:650;color:var(--marca2);
  list-style:none;display:inline-flex;align-items:center;gap:6px}
.ctl-pedir>summary::-webkit-details-marker{display:none}
.ctl-pedir>summary::before{content:'+';font-weight:800}
.ctl-pedir[open]>summary::before{content:'–'}
.ctl-pedir p{font-size:12.5px;color:var(--tinta2);line-height:1.45;margin:8px 0 10px}
.ctl-pedir input{width:100%;margin-bottom:8px}
/* La bitácora vive en la columna angosta y se queda a la vista mientras se lee
   el resto: es la referencia que uno consulta, no algo que se recorra una vez. */
.col-bitacora{position:sticky;top:16px}
.col-bitacora .bit{max-height:70vh;overflow-y:auto;padding-right:4px}
/* La bitácora comparte la línea del historial de resguardo: las dos cuentan lo
   mismo —qué pasó y cuándo— y leerlas con dos formas distintas costaba un salto. */
.bit.timeline li{padding:0 0 20px 26px;border-bottom:0}
.bit.timeline li:last-child{padding-bottom:0}
.bit.timeline b{display:block;font-size:13.5px;line-height:1.45;font-weight:750}
/* El "quién y cuándo" es referencia, no titular: se lee cuando se busca. */
.bit.timeline small{display:block;margin-top:3px;font-size:11.5px;color:var(--tinta3);
  font-weight:600;letter-spacing:.1px}
/* El detalle era un <div> pelón que se encimaba con el renglón siguiente y hacía
   parecer que la bitácora era un solo bloque de texto. */
.bit-det{margin-top:7px;padding:7px 11px;font-size:12.5px;line-height:1.5;color:var(--tinta2);
  background:var(--fondo);border:1px solid var(--borde2);border-radius:9px;
  overflow-wrap:anywhere}
/* El guion del video: es lo único que la persona tiene que seguir, así que se
   lee como una receta y no como una nota al pie. */
.guion{margin:12px 0 0;padding:14px 16px;border:1px solid var(--marca2);border-radius:12px;
  background:var(--marca-suave)}
.guion>b{font-size:14px}
.guion ol{margin:8px 0 0;padding-left:20px;font-size:14px;line-height:1.6}
.guion ol li{margin-bottom:6px}
.guion p{font-size:12.5px;color:var(--tinta2);margin:10px 0 0;line-height:1.5}
@media(max-width:860px){ .col-bitacora{position:static} .col-bitacora .bit{max-height:none} }
/* Un KPI que vale cero es una buena noticia; solo se pinta en rojo si NO es cero. */
.ka-mal b{color:var(--rojo)}
.ka-mal{border-color:var(--rojo)}
.soltar-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
.soltar-txt b{font-size:14.5px;font-weight:700;color:var(--tinta)}
.soltar-txt small{font-size:12px;color:var(--tinta3);line-height:1.45}
.soltar-txt .nombre{font-size:13px;color:var(--verde);font-weight:650;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
@media(max-width:520px){ .soltar{padding:15px 16px;gap:11px} .soltar-ico{width:36px;height:36px} }

/* ── Activos de TI ─────────────────────────────────────────────────────────── */
.c-azul{background:var(--marca-suave);color:var(--marca2)} .c-azul .pt{background:var(--marca2)}
/* Cobertura de vigilancia: cuantos equipos mira Intune, cuantos estan unidos a
   Entra y cuantos faltan. Va en tarjeta aparte de los contadores de estado porque
   contesta otra pregunta. */
.cobertura{border:1px solid var(--borde);border-radius:14px;padding:14px 16px;margin:0 0 14px;
  background:var(--panel)}
.cob-nums{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px}
.cob{min-width:0}
.cob b{display:block;font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;
  letter-spacing:-.02em;color:var(--marca)}
.cob b i{font-style:normal;font-size:14px;font-weight:600;color:var(--tinta2)}
.cob span{display:block;font-size:12.5px;font-weight:600;margin-top:1px}
.cob small{display:block;font-size:11.5px;color:var(--tinta3);line-height:1.35;margin-top:2px}
.cob-falta b{color:var(--ambar)}
.cob-ok b{color:var(--verde)}
.cob-sindato b{color:var(--tinta3)}
.cob-listo b{color:var(--turquesa-t)}
.cob-nota{margin:12px 0 0;padding-top:11px;border-top:1px solid var(--borde);
  font-size:11.5px;line-height:1.45;color:var(--tinta2)}
/* Dentro de una tarjeta del tablero la pieza ya está en su caja: el borde y el fondo
   propios pintaban una caja dentro de otra. En /activos sigue siendo tarjeta ella
   misma, así que el estilo se apaga por contexto y no se borra. */
.tarjeta .cobertura{border:0;background:none;padding:0;margin:0}
/* El escudo de la fila: vertical-align y NO inline-flex. Un contenedor flex al lado
   de texto se sintetiza la linea base del borde inferior y hunde lo que sigue — es el
   bug del negritas con icono del 07-sep-2026. */
.esc{display:inline-block;vertical-align:-4px;margin-left:6px;line-height:0}
/* El trazo se engrosa desde el CSS: el simbolo del sprite trae 1.9 y la clase .ico lo
   baja, y a 16px un escudo de linea fina no se lee como un sello. */
.esc .ico{width:16px;height:16px;stroke-width:2.05}
/* OJO: la variable --azul NO existe en la paleta de la app (vive en el :root propio de
   las pantallas de estado), y usarla dejaba el escudo del color del texto, o sea
   invisible como marca. Es la misma falla del boton de Microsoft del login: un color
   sin token se ve bien en un tema y desaparece en el otro. El azul de la casa es
   --marca, y tiene su valor en claro y en oscuro. */
.esc-ok{color:var(--marca)}
.esc-media{color:var(--ambar)}
/* Registrado en Entra y sin Intune: ni azul —no esta vigilado— ni ambar —no falla
   nada—. Se usa el turquesa de la marca, que ya existe en los dos temas. */
.esc-entra{color:var(--turquesa-t)}
/* En la ficha el escudo vive dentro de .ctl-fila, que es FLEX: ahi vertical-align no
   hace nada y el icono quedaba 5px arriba del centro del chip. Se le da la altura de
   la caja del chip y se centra dentro, en vez de empujarlo con un margen a ojo: asi
   sigue alineado si el chip cambia de tamano. Aqui inline-flex SI es correcto —es un
   elemento flex hermano, no un icono pegado a texto suelto, que es el caso del bug
   del 07-sep-2026. */
.ctl-fila .esc{display:inline-flex;align-items:center;min-height:25px;vertical-align:baseline}
.kpis-activos{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:12px;margin:18px 0}
.ka{display:flex;flex-direction:column;gap:2px;padding:14px 16px;background:var(--panel);
  border:1px solid var(--borde);border-radius:14px;text-decoration:none;color:inherit;
  box-shadow:0 1px 2px rgba(16,24,32,.04);transition:border-color .15s,transform .15s}
.ka:hover{border-color:var(--marca2);transform:translateY(-1px)}
.ka b{font-size:26px;font-weight:700;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.ka span{font-size:12px;color:var(--tinta3);font-weight:600}
/* La tarjeta de equipo perdido se ve distinta: si se viera igual que las demás,
   sería un número más en una fila de números. */
.ka-alerta{border-color:var(--rojo,#c0392b)}
.ka-alerta b{color:var(--rojo,#c0392b)}
.filtros-activos{display:flex;gap:9px;flex-wrap:wrap;align-items:center;margin-bottom:14px}
.filtros-activos input{flex:1 1 240px;min-width:0}
.filtros-activos select{flex:0 1 auto;width:auto}
.tabla-activos tr.fila{cursor:pointer}
.tabla-activos tr.fila:hover{background:var(--marca-suave)}
/* Con nueve columnas y los importes en nowrap, la tabla rebasaba la tarjeta en
   anchos intermedios (una ventana de ~1400px con el navegador a media pantalla):
   "Vale hoy" quedaba pintada FUERA del borde y "Quién lo tiene" se partía palabra
   por palabra. El bloque móvil ya hacía que la tarjeta se deslizara, pero solo bajo
   860px; arriba de eso no había nada que contuviera el desborde. La tabla se
   desliza DENTRO de su tarjeta a cualquier ancho, y el nombre de quien tiene el
   equipo se lee en una o dos líneas en vez de cinco. Bajo 700px las filas se
   apilan en tarjetas y el bloque de abajo vuelve a soltar el overflow. */
.tabla-activos{overflow-x:auto}
.tabla-activos td[data-c=quien]{min-width:140px}
/* Nueve columnas con 14px por lado son 252px solo de relleno. Con 10px la tabla
   cabe en el ancho normal de escritorio sin pedir scroll; bajo eso, se desliza. */
.tabla-activos th,.tabla-activos td{padding-left:10px;padding-right:10px}
/* Los importes se alinean a la derecha y con cifras de ancho fijo: así las columnas
   de pesos y centavos quedan una debajo de otra y un cero de más se ve solo. */
.col-valor{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
/* Captura de valores en bloque. */
/* Los tres modos de la pantalla de valores. */
.modos{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 16px}
.modos a{padding:6px 13px;border-radius:99px;border:1px solid var(--borde);font-size:13px;
  color:var(--tinta2);text-decoration:none;background:var(--panel)}
.modos a:hover{border-color:var(--marca2);color:var(--marca2)}
.modos a.hoy{background:var(--marca-suave);border-color:var(--marca2);color:var(--marca2);font-weight:600}
/* Valuar es mirar anuncios y teclear. La liga por modelo convierte una tarde de
   búsquedas en unos minutos, y de paso deja claro contra qué se estimó. */
.busca{font-size:12.5px;color:var(--marca2);text-decoration:none;white-space:nowrap}
.busca:hover{text-decoration:underline}
.arrendado{font-size:12.5px;color:var(--tinta2);line-height:1.45}
.cuando{font-size:12px;color:var(--tinta2);white-space:nowrap}
.cuando small{display:block;color:var(--tinta3);font-size:11px;max-width:220px;
  white-space:normal;line-height:1.35;margin-top:2px}
/* Un avalúo viejo no se esconde: se marca. Esconderlo perdería el dato y mostrarlo
   como si fuera de hoy sería mentir. */
.cuando .viejo{color:var(--ambar,#8a5a12);font-weight:600}
.cuando .viejo::after{content:" · ya tiene un año"}
.lote{margin-bottom:14px}
.lote > b{display:block;font-size:14.5px}
.lote > p{margin:4px 0 12px;font-size:13px;color:var(--tinta2);max-width:70ch}
.lote-fila{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap}
.lote-fila label{display:flex;flex-direction:column;gap:4px;font-size:12.5px;
  font-weight:600;color:var(--tinta2)}
.lote-fila label small{font-weight:400}
.lote-fila input{width:150px;font-variant-numeric:tabular-nums}
.lote-cuenta{font-size:12.5px;color:var(--tinta2);padding-bottom:9px}
.col-mar{width:34px;text-align:center}
.tabla-activos td.col-valor input{width:120px;text-align:right;
  font-variant-numeric:tabular-nums}
.tabla-activos small.eq{display:block;color:var(--tinta2);font-size:12px;margin-top:2px}
.tabla-activos td.quien{font-size:12.5px;color:var(--tinta2)}
/* El 16% que no cuadra se marca en el renglón, no en un aviso aparte: con veinte
   equipos en pantalla, un aviso arriba no dice CUÁL renglón revisar. */
.tabla-activos tr.no-cuadra td.col-valor input{border-color:var(--ambar,#c98a12);
  background:var(--ambar-f,#fdf6e6)}
.tabla-activos tr.recien td.col-valor input{border-color:var(--marca2)}
/* Un avalúo de más de un año se ve apagado: sigue ahí, pero avisa que ya no manda. */
.mer-viejo{color:var(--tinta3);text-decoration:underline dotted}
@media(max-width:700px){ .lote-fila input{width:120px} }
th.col-valor{text-align:right}
/* Resumen de dinero. Vive fuera de los contadores de estado a propósito: aquellos
   cuentan equipos y este cuenta pesos, y mezclarlos haría dudar de qué suma qué. */
.resumen-valor{display:flex;gap:14px;align-items:baseline;flex-wrap:wrap;
  margin:0 0 12px;padding:10px 14px;border:1px solid var(--borde);border-radius:12px;
  background:var(--panel);font-size:13.5px;color:var(--tinta2)}
.resumen-valor b{color:var(--tinta);font-size:16px;font-variant-numeric:tabular-nums;
  margin-left:5px}
.resumen-valor a{color:var(--ambar,#8a5a12);font-weight:600;text-decoration:none;
  border-bottom:1px dashed currentColor}
.resumen-valor a:hover{border-bottom-style:solid}
.resumen-valor a.activo{border-bottom-style:solid}
.resumen-valor a.quitar{color:var(--tinta2);font-weight:500}
.resumen-valor a.capturar{color:var(--marca2);border-bottom-color:var(--marca2)}
.resumen-valor .todo-listo{color:var(--verde,#0f6b5c);font-weight:600}
/* El tipo se lee como etiqueta, no como texto corrido: esa columna se recorre de
   arriba abajo buscando "laptop" o "monitor", y así saltan a la vista. */
.tipo-act{display:inline-block;padding:2px 8px;border-radius:999px;background:var(--marca-suave);
  border:1px solid var(--marca2);color:var(--marca2);font-size:11.5px;font-weight:600;
  white-space:nowrap}
/* Solo la primera letra, no cada palabra: 'capitalize' escribía "Soporte De
   Monitor" e "Impresora De Credenciales", que en español están mal. */
.tipo-act::first-letter{text-transform:uppercase}
.mono-min{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;color:var(--tinta2)}
.a-cabeza{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:4px}
.folio.grande{font-size:17px}
.rejilla-3{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:0 14px}
.chk-alto{display:flex;gap:10px;align-items:flex-start;padding:12px 14px;margin:6px 0 14px;
  background:var(--ambar-f);border:1px solid #F0DDB4;border-radius:12px;cursor:pointer}
.chk-alto input{width:16px;height:16px;margin-top:2px;flex:0 0 auto}
.chk-alto span{display:flex;flex-direction:column;gap:2px;font-size:13.5px}
.chk-alto small{color:var(--tinta2);font-size:12px}
.det-alta{margin-top:18px}
.det-alta>summary{cursor:pointer;font-weight:700;font-size:14px;color:var(--marca2);
  padding:10px 0;list-style:none;display:flex;align-items:center;gap:7px}
.det-alta>summary::before{content:'+';font-size:17px;line-height:1}
.det-alta[open]>summary::before{content:'−'}
.prev{flex:1 1 100%;min-width:0;margin:10px 0 0}
.prev>summary{cursor:pointer;font-size:12.5px;font-weight:600;color:var(--marca2);
  list-style:none;display:inline-flex;align-items:center;gap:6px;padding:4px 0}
.prev>summary::-webkit-details-marker{display:none}
.prev>summary::before{content:'▸';font-size:11px;transition:transform .15s}
.prev[open]>summary::before{content:'▾'}
.prev-marco{width:100%;margin-top:8px;border:1px solid var(--borde);border-radius:10px;
  overflow:hidden;background:var(--fondo2)}
/* Alto pensado para una hoja carta: con el ancho completo de la tarjeta, esto deja
   ver la hoja de arriba abajo sin que el visor tenga que recortarla. */
.prev-marco iframe{display:block;width:100%;height:min(80vh,760px);border:0;background:#fff}
.prev-nueva{display:inline-block;margin-top:8px;font-size:12px;color:var(--tinta2);text-decoration:none}
.prev-nueva:hover{text-decoration:underline}
@media (max-width:620px){ .prev-marco iframe{height:min(70vh,520px)} }
.foto-equipo{margin:0 0 14px;padding:0}
.foto-equipo img{display:block;width:100%;max-height:260px;object-fit:contain;border-radius:10px;
  background:var(--fondo2);border:1px solid var(--borde)}
.foto-equipo figcaption{font-size:12px;color:var(--tinta3);margin-top:6px}
.foto-falta{font-size:12.5px;color:var(--tinta3);margin:0 0 14px;padding:10px 12px;
  background:var(--fondo2);border:1px dashed var(--borde);border-radius:10px}
.etq-priv{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--tinta3);font-weight:700}
.nota-priv{font-size:12px;color:var(--tinta3);margin:12px 0 0;padding-top:10px;border-top:1px solid var(--borde)}
.dict{flex:1 1 100%;font-size:12.5px;border-radius:9px;padding:8px 11px;margin-top:2px}
.dict b{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.4px;margin-bottom:3px}
.dict ul{margin:0;padding-left:16px}
.dict.ok{background:var(--verde-f);color:var(--verde)}
.dict.mal{background:var(--rojo-f);color:var(--rojo)}
.dict.pend{background:var(--ambar-f);color:var(--ambar)}
.adj-acc{flex:1 1 100%;display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:4px}
.form-forzar{display:flex;gap:6px;flex:1 1 260px}
.form-forzar input{flex:1 1 auto;min-width:0;font-size:12.5px;padding:7px 10px}
.ps-vincular{margin-top:12px;padding:12px 14px;background:var(--ambar-f);border:1px solid #F0DDB4;border-radius:12px}
.ps-vincular label{display:block;font-size:13px;margin-bottom:7px}
.ps-vincular small{display:block;margin-top:6px;font-size:11.5px;color:var(--tinta2)}
.ps-clave{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
  margin-top:8px;padding:10px 13px;background:var(--fondo2);border:1px solid var(--borde2);border-radius:11px}
.ps-clave span{font-size:12.5px;color:var(--tinta2)}
.ps-clave-sso{background:var(--marca-suave,#EAF4FD);border-color:#BEDCF5}
/* La hoja de apagado. Va en ámbar y no en rojo a propósito: no es una alarma, es
   una lista de pendientes que solo importa el día de la salida. */
/* Lo que la mesa encontró al elegir a quien sale. Aparece solo cuando hay algo
   que decir: un recuadro vacío permanente es ruido en un formulario largo. */
.baja-tiene:empty{display:none}
.baja-tiene{margin:0 0 14px;padding:11px 14px;border-radius:11px;font-size:13px;line-height:1.55;
  background:var(--fondo2);border:1px solid var(--borde2);color:var(--tinta2)}
/* Estas dos tarjetas traían colores fijos de tema claro y ninguno de oscuro. La
   peor era .apagar: un degradado de crema casi blanco al panel — que en oscuro
   SÍ cambia—, así que la mitad de arriba quedaba clara con el texto claro encima
   y no se leía nada. Van por tokens, que existen en los dos temas. */
.baja-tiene.hay{background:var(--ambar-f);border-color:var(--ambar);color:var(--ambar)}
.baja-tiene.mal{background:var(--rojo-f);border-color:var(--rojo);color:var(--rojo)}
.apagar{border-color:var(--ambar);background:var(--ambar-f)}
.apagar h3{color:var(--ambar)}
/* Sobre el fondo ámbar, la tinta más tenue se pierde: aquí sube un escalón. */
.apagar .pista,.apagar .res-item small,.apagar .pf-vacio{color:var(--tinta2)}
/* El domicilio de resguardo se guardaba al asignar y solo se veía abriendo la
   ficha del equipo. Quien lo busca lo busca AQUÍ —en la persona— porque la
   pregunta es "¿dónde está el equipo de fulano?", no "¿dónde está tal etiqueta?".
   (Sin ejemplos de etiqueta aquí, ni siquiera el prefijo: esta hoja va INLINE en
   el HTML de cada página, así que una etiqueta escrita en un comentario sale en
   TODAS, y quien lea etiquetas de la página se lleva esa como si fuera un activo
   real. Costó una prueba en rojo averiguarlo.)
   DATO PERSONAL (LFPDPPP): esta pantalla ya es solo de supervisores. */
.res-dom{display:block;color:var(--tinta3);line-height:1.45;margin-top:2px}
.res-dom.falta{color:var(--ambar)}
.ap-sis{font-weight:650;font-size:14px}
.ap-extra{margin-top:12px;padding-top:11px;border-top:1px dashed var(--ambar)}
.ap-extra b{display:block;font-size:13.5px}
.ap-extra small{display:block;margin-top:3px;font-size:12px;color:var(--tinta2);line-height:1.5}
.pasos-asientos{margin:14px 0 0;padding-left:20px;display:flex;flex-direction:column;gap:14px}
.pasos-asientos li b{display:block;font-size:14px}
.pasos-asientos li span{display:block;font-size:13px;color:var(--tinta2);margin:3px 0 8px;line-height:1.5}
.clave-nueva{background:var(--verde-f,#E7F6EF);border:1.5px solid #9FD9BE;border-radius:14px;
  padding:14px 16px;margin-bottom:16px}
.clave-nueva b{color:#0F6B47}
.clave-nueva p{margin:6px 0 10px;font-size:13.5px;color:var(--tinta2)}
.clave-nueva small{display:block;margin-top:9px;font-size:11.5px;color:var(--tinta2)}
.clave-caja{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.clave-caja code{font-size:16px;font-weight:700;letter-spacing:.5px;background:#fff;
  border:1px solid #9FD9BE;border-radius:9px;padding:8px 13px;color:#0F6B47}
.ps-crear{margin-top:12px;border-top:1px dashed #E0C89A;padding-top:10px}
.ps-crear summary{cursor:pointer;font-size:12.5px;font-weight:650;color:#8A5A12}
.ps-crear form{margin-top:10px}
.ps-crear .campo{margin-bottom:10px}
.ps-crear .campo label{font-size:12px}
.ub-corr{margin:6px 0 2px;padding-left:2px}
.ub-corr>summary{cursor:pointer;font-size:12.5px;font-weight:650;color:var(--marca2);list-style:none}
.ub-corr>summary::-webkit-details-marker{display:none}
.ub-corr>summary::before{content:'›';display:inline-block;margin-right:6px;transition:transform .15s}
.ub-corr[open]>summary::before{transform:rotate(90deg)}
.ub-corr form{margin-top:9px}
.ub-corr .campo{margin-bottom:9px}
.ub-corr .campo label{font-size:12px}
.ub-corr .pista{display:block;margin:-2px 0 9px}
.firmas-tit{font-size:11px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--tinta3);margin:16px 0 8px}
.firmas-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:8px}
.firma-fila{display:flex;gap:9px;align-items:center;margin:0}
.firma-fila span{flex:0 0 auto;font-size:13.5px;font-weight:600;min-width:96px}
.firma-fila select{flex:1 1 auto;width:auto;min-width:0}
.firmas-rh{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:8px}
.chip-btn{border:1.5px solid var(--borde);background:var(--panel);color:var(--tinta2);border-radius:99px;
  padding:5px 12px;font-size:12.5px;font-weight:600;cursor:pointer;transition:all .15s}
.chip-btn:hover{border-color:var(--marca2)}
.chip-btn.act{background:var(--marca-suave);border-color:var(--marca2);color:var(--marca2)}
/* Quienes se sumaron a la conversación. La ✕ va DENTRO del chip y es su propio
   formulario: dos formularios no se anidan, así que cada quitar es uno aparte. */
.part-lista{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 8px}
.part-chip{display:inline-flex;align-items:center;gap:2px;max-width:100%;
  border:1.5px solid var(--borde);background:var(--marca-suave);color:var(--marca2);
  border-radius:99px;padding:3px 4px 3px 11px;font-size:12.5px;font-weight:600}
.part-chip form{margin:0;display:inline}
.part-x{background:none;border:0;box-shadow:none;color:var(--tinta3);cursor:pointer;
  width:22px;height:22px;padding:0;border-radius:99px;font-size:16px;line-height:1}
.part-x:hover{background:var(--rojo-f);color:var(--rojo)}
.part-nota{display:block;margin-top:6px;font-size:11.5px;color:var(--tinta3)}
.panel-firmas .ps-cab{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.firmas-lista{list-style:none;margin:0;padding:0;counter-reset:f}
.firmas-lista li{position:relative;padding:9px 0 9px 26px;border-bottom:1px solid var(--borde)}
.firmas-lista li:last-child{border-bottom:none}
.firmas-lista li::before{counter-increment:f;content:counter(f);position:absolute;left:0;top:11px;
  width:18px;height:18px;border-radius:50%;background:var(--borde);color:var(--tinta2);
  font-size:10.5px;font-weight:700;display:flex;align-items:center;justify-content:center}
.firmas-lista li.ahora::before{background:var(--marca2);color:#fff}
.fir-cab{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.fir-quien{font-size:12.5px;color:var(--tinta3);margin-top:1px}
.fir-motivo{font-size:12.5px;color:var(--tinta2);margin-top:3px;font-style:italic}
.fir-accion{margin-top:14px;padding-top:14px;border-top:1px solid var(--borde)}
.fir-pregunta{font-size:13.5px;margin-bottom:10px}
.fir-just{margin-top:4px;padding:8px 11px;background:var(--fondo2);border-radius:9px;font-size:13px;color:var(--tinta2)}
.eq-caja{margin:2px 0 10px;padding:12px 14px;background:var(--fondo2);border:1px solid var(--borde);border-radius:12px}
.eq-caja>.tarjeta{margin:0 0 10px;padding:0;border:none;background:none;box-shadow:none}
.eq-caja.aviso-caja{background:var(--ambar-f);border-color:#F0DDB4}
.eq-caja.aviso-caja p{margin:4px 0 0;font-size:13px;color:var(--tinta2)}
.eq-chk{display:flex;gap:9px;align-items:flex-start;padding:8px 10px;margin-bottom:6px;
  background:var(--panel);border:1px solid var(--borde);border-radius:10px;cursor:pointer;font-size:13.5px}
.eq-chk input{width:16px;height:16px;margin-top:1px;flex:0 0 auto}
.eq-bloqueo{margin:8px 0 0;font-size:13px;color:var(--ambar);font-weight:600}
/* ── Módulo de equipo del ticket ─────────────────────────────────────────────
   Vive BAJO la conversación y no en la columna angosta, a propósito: elegir el
   equipo es una acción con lista —etiqueta, marca, serie— y en 320px una serie
   no se lee. Todo con tokens, así que el modo oscuro sale de la paleta y no
   hace falta un bloque aparte que se olvide de actualizar. */
.mod-eq{margin-top:14px}
.eqp-cab{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.eqp-para{font-size:13.5px;color:var(--tinta2);margin:0 0 12px}
.eqp-para b{color:var(--tinta);font-weight:600}
.eqp-op{display:flex;gap:10px;align-items:flex-start;padding:9px 11px;margin-bottom:6px;
  border:1px solid var(--borde);border-radius:10px;background:var(--panel);cursor:pointer;font-size:13.5px}
.eqp-op:hover{border-color:var(--marca2)}
.eqp-op input{width:16px;height:16px;margin-top:2px;flex:0 0 auto}
.eqp-op code{font-size:12.5px;font-weight:700;color:var(--marca);margin-right:7px}
.eqp-op small{display:block;color:var(--tinta2);font-size:12.5px;margin-top:1px}
.eqp-alto{color:var(--ambar);font-weight:700;font-size:11.5px;letter-spacing:.04em;text-transform:uppercase}
/* La ficha del equipo apartado: el dato que importa se lee sin buscar. */
.eqp-ficha{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;
  padding:12px 14px;border:1px solid var(--borde);border-radius:12px;background:var(--panel)}
.eqp-ficha .eqp-que{font-size:14.5px;font-weight:600;line-height:1.4}
.eqp-ficha .eqp-que code{font-size:13px;color:var(--marca);margin-right:6px}
.eqp-ficha .eqp-que small{display:block;font-weight:500;color:var(--tinta2);font-size:12.5px;margin-top:2px}
.eqp-aviso{margin:10px 0 0;padding:11px 13px;border-radius:11px;font-size:13px;line-height:1.5;
  background:var(--ambar-f);border:1px solid var(--ambar);color:var(--tinta)}
.eqp-aviso.malo{background:var(--rojo-f);border-color:var(--rojo)}
.eqp-aviso b{display:block;margin-bottom:2px}
.eqp-aviso form{margin:9px 0 0}
.eqp-nada{margin:0;font-size:13.5px;color:var(--ambar);font-weight:600}
.eqp-nada small{display:block;font-weight:500;color:var(--tinta2);margin-top:3px}
.eqp-otros{margin-top:8px}
.eqp-otros>summary{font-size:13px;color:var(--marca);cursor:pointer;font-weight:600;padding:4px 0}
.mod-datos .dat-grupo{margin-bottom:12px}
.mod-datos .dat-tit{font-size:11.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--tinta3);margin-bottom:7px}
.mod-datos .eqp-op small{display:block;color:var(--tinta3);font-size:12px;margin-top:1px}
/* Viene de un ticket mal clasificado: se dice antes del formulario, no después,
   porque cambia lo que la persona está a punto de escribir. */
.reclas-de{margin:0 0 18px;padding:14px 16px;border-radius:14px;background:var(--marca-suave);
  border:1px solid var(--marca2);font-size:13.5px;line-height:1.55}
.reclas-de b{display:block;margin-bottom:3px;color:var(--marca)}
.reclas-de span{color:var(--tinta2)}
.reclas-de a{font-weight:700}
.eq-aviso-rh{margin:12px 0 0;padding:11px 13px;border-radius:11px;background:var(--ambar-f);
  border:1px solid #F0DDB4;font-size:13px;line-height:1.5;color:var(--tinta2)}
.eq-aviso-rh b{color:var(--tinta)}
/* En un teléfono la ficha y su botón se apilan: si no, el nombre del equipo se
   parte en cuatro renglones para dejarle sitio a "Soltar". */
@media(max-width:560px){.eqp-ficha{flex-direction:column;align-items:stretch;gap:10px}}
.eq-pend{display:flex;gap:9px;align-items:center;flex-wrap:wrap;padding:8px 0;border-bottom:1px solid var(--borde)}
.eq-pend:last-child{border-bottom:none}
.eq-pend span{flex:1 1 auto;font-size:13.5px}
.eq-form .campo{margin-bottom:10px}
.ver-reto{margin:10px 0;padding:10px 13px;background:var(--marca-suave);border:1px dashed var(--marca2);
  border-radius:10px;font-size:14px;color:var(--marca2)}
.ver-reto b{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:16px;letter-spacing:1px}
.form-verif{margin-top:8px}
/* Se pide en ámbar, no en rojo: al equipo no le falta nada, al registro sí. */
.pide-serie{margin:0 0 12px;padding:12px 14px;background:var(--ambar-f);
  border:1px solid var(--ambar);border-radius:10px}
.pide-serie b{display:block;font-size:14px}
.pide-serie p{margin:6px 0 10px;font-size:13px;line-height:1.5;color:var(--tinta2)}
.pide-serie label{display:block;margin-top:8px;font-size:12.5px;color:var(--tinta2)}
.pide-serie input{margin-top:4px}
.pide-serie input[name=serie_reportada]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  letter-spacing:.5px;text-transform:uppercase}
.leido{color:var(--marca2);font-weight:600;font-size:10.5px;text-transform:uppercase;letter-spacing:.4px}
.lista-adj{list-style:none;margin:0 0 12px;padding:0}
.lista-adj li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 9px;padding:9px 0;border-bottom:1px solid var(--borde)}
.lista-adj li:last-child{border-bottom:none}
.adj-nombre{display:inline-flex;align-items:center;gap:6px;font-size:13.5px;font-weight:600;text-decoration:none;color:var(--marca2)}
.adj-nombre:hover{text-decoration:underline}
.adj-meta{font-size:11.5px;color:var(--tinta3);flex:1 1 100%}
.form-adj{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:4px 0 6px}
.form-adj select{width:auto;flex:0 1 auto}
.form-adj input[type=file]{flex:1 1 180px;min-width:0;font-size:12.5px;padding:7px}
.form-adj button{flex:0 0 auto}
.res-item{display:flex;flex-direction:column;gap:1px;padding:9px 0;border-bottom:1px solid var(--borde)}
.res-item:last-child{border-bottom:none}
.res-item span{font-size:13.5px;font-weight:600}
.res-item small{font-size:11.5px;color:var(--tinta3)}
.bit{list-style:none;margin:0;padding:0;font-size:13px}
.bit li{padding:8px 0;border-bottom:1px solid var(--borde)}
.bit li:last-child{border-bottom:none}
.bit small{display:block;color:var(--tinta3);font-size:11.5px;margin-top:1px}
.bit div{color:var(--tinta2);margin-top:2px}

.timeline{list-style:none;margin:0;padding:0;position:relative}
.timeline::before{content:'';position:absolute;left:5px;top:6px;bottom:6px;width:2px;
  background:linear-gradient(var(--borde),var(--borde2))}
.timeline li{position:relative;padding:0 0 22px 26px}
.timeline li:last-child{padding-bottom:0}
.tl-punto{position:absolute;left:0;top:3px;width:12px;height:12px;border-radius:50%;
  background:var(--panel);border:2.5px solid var(--marca2);box-shadow:0 0 0 3px var(--marca-suave)}
.timeline li:first-child .tl-punto{border-color:var(--turquesa);box-shadow:0 0 0 3px rgba(43,211,226,.18)}
.tl-cuando{font-size:11.5px;color:var(--tinta3);font-weight:600;letter-spacing:.1px;margin-bottom:3px}
.tl-que{font-size:13.5px;color:var(--tinta);line-height:1.5}
.tl-que b{font-weight:750}
.tl-det{font-size:13px;color:var(--tinta2);margin-top:6px;padding:7px 11px;background:var(--fondo);
  border-radius:9px;border:1px solid var(--borde2);line-height:1.5;overflow-wrap:anywhere}

.b-texto .ml{display:block}
.b-texto .ml+.ml{margin-top:3px}
.b-texto .ml i.met{font-style:normal;font-size:12px;opacity:.7;margin-right:6px;
  text-transform:uppercase;letter-spacing:.03em;font-weight:600}
.b-texto .ml b{font-weight:650}
.mi-cuerpo .ml{display:block}
.mi-cuerpo .ml+.ml{margin-top:3px}
.mi-cuerpo .ml i.met{font-style:normal;font-size:11.5px;opacity:.75;margin-right:6px;
  text-transform:uppercase;letter-spacing:.03em;font-weight:600}
/* Formato de los mensajes (src/formato.js). La sangría colgante es lo que hace que
   una lista se lea como lista: sin ella, el segundo renglón vuelve al margen y el
   número deja de significar nada. */
.ml.mli{display:flex;gap:7px;align-items:baseline}
.ml.mli i.mnum{font-style:normal;font-weight:700;opacity:.6;flex:0 0 auto;
  min-width:14px;font-variant-numeric:tabular-nums}
.ml.mli .mtx{flex:1;min-width:0}
.ml.mh{font-weight:750;margin-top:7px}
.ml.mh:first-child{margin-top:0}
.ml.mhr{display:block;height:1px;background:currentColor;opacity:.16;margin:8px 0}
.ml em{font-style:italic}
.ml code{font-family:ui-monospace,SFMono-Regular,'SF Mono',Menlo,monospace;font-size:.88em;
  background:rgba(127,127,127,.14);border-radius:5px;padding:1px 5px}
.ml a{color:inherit;text-decoration:underline;text-underline-offset:2px;
  overflow-wrap:anywhere}
.fila-msg.suyo .ml a{color:var(--marca)}
/* ── chat de burbujas (conversación) */
.chat-card{padding:0;overflow:hidden}
.chat-head{padding:18px 22px 14px;border-bottom:1px solid var(--borde2);display:flex;
  align-items:baseline;gap:10px;flex-wrap:wrap}
.chat-head .chat-sub{font-size:12.5px;color:var(--tinta3);font-weight:600}
.chat{padding:20px 22px;display:flex;flex-direction:column;gap:12px;background:
  linear-gradient(var(--fondo),var(--fondo)) ;min-height:120px;max-height:520px;overflow-y:auto}
.chat-vacio{text-align:center;color:var(--tinta3);font-size:13.5px;padding:26px 0}
.fila-msg{display:flex;max-width:100%}
.fila-msg.mio{justify-content:flex-end}
.fila-msg.suyo{justify-content:flex-start}
.burbuja{max-width:76%;padding:9px 13px;border-radius:18px;position:relative;
  box-shadow:0 1px 1px rgba(11,26,38,.06);animation:surge .3s ease}
.fila-msg.suyo .burbuja{background:var(--panel);border:1px solid var(--borde);border-bottom-left-radius:6px;color:var(--tinta)}
.fila-msg.mio .burbuja{background:var(--grad);color:#fff;border-bottom-right-radius:6px}
/* Quien habla se distingue por COLOR, no solo por el nombre en letra chica. En un
   hilo donde escriben la persona que reporta, su jefa y un agente, TODAS las burbujas
   de la izquierda se ven iguales y el cambio de interlocutor pasa de largo: el aviso
   estaba, pero no avisaba. El tono se reparte por ORDEN DE APARICION dentro del hilo
   y no por el id del usuario — con el id, dos participantes del mismo ticket pueden
   caer en el mismo color justo cuando importa distinguirlos. */
.fila-msg.suyo .burbuja{border-left-width:3px;border-left-color:var(--tono,var(--borde))}
.fila-msg.suyo .b-autor{color:var(--tono,var(--marca))}
.fila-msg.t0{--tono:#1179C4}
.fila-msg.t1{--tono:#0F7A6E}
.fila-msg.t2{--tono:#6D4AB8}
.fila-msg.t3{--tono:#B03A78}
.fila-msg.t4{--tono:#4F7A18}
.fila-msg.t5{--tono:#AF5A16}
/* Aire extra donde cambia quien habla; los mensajes seguidos de la misma persona se
   quedan pegados. El agrupamiento es la mitad de la señal: sin él, el color solo. */
.fila-msg.cambia{margin-top:7px}
.b-autor{display:block;font-size:11.5px;font-weight:750;color:var(--marca);margin-bottom:2px}
.b-quien{color:inherit;text-decoration:none;border-bottom:1px dotted currentColor}
.b-quien:hover{border-bottom-style:solid}
.b-texto{display:block;font-size:14px;line-height:1.5;word-wrap:break-word}
.b-pie{display:flex;align-items:center;gap:4px;justify-content:flex-end;
  font-size:10.5px;margin-top:3px;opacity:.72}
.fila-msg.mio .b-pie{color:rgba(255,255,255,.92)}
.fila-msg.suyo .b-pie{color:var(--tinta3)}
.palomas{display:inline-flex;color:rgba(255,255,255,.55)}
.palomas.leido{color:#B7EEFF}
.msg-interno{align-self:center;max-width:82%;background:#FFFBF0;border:1px solid #F1DDA9;
  border-radius:12px;padding:9px 13px;box-shadow:none}
.msg-interno .mi-head{font-size:11px;font-weight:700;color:#B0851E;margin-bottom:3px;
  display:flex;align-items:center;gap:6px}
.msg-interno .mi-cuerpo{font-size:13.5px;color:#6E5A22;line-height:1.5}
.asis-conf{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:12px 18px;
  border-top:1px solid rgba(30,155,224,.3);
  background:linear-gradient(90deg,rgba(30,155,224,.06),rgba(43,211,226,.05))}
.asis-conf-t{font-size:13px;font-weight:600;color:var(--marca);flex:1;min-width:200px}
.chat-form{padding:14px 18px 18px;border-top:1px solid var(--borde2);background:var(--panel)}
/* Barra de formato del cuadro de escribir. Discreta: es una ayuda, no una botonera
   de procesador de textos, y compite por espacio con el mensaje. */
.fmt-barra{display:flex;align-items:center;gap:4px;margin-bottom:8px;flex-wrap:wrap}
.fmt-b{width:28px;height:26px;padding:0;border:1px solid transparent;border-radius:7px;
  background:none;color:var(--tinta3);font-size:13px;line-height:1;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center}
.fmt-b:hover{background:var(--fondo);color:var(--tinta2)}
.fmt-b.fmt-cod{font-family:ui-monospace,SFMono-Regular,'SF Mono',Menlo,monospace;font-size:11px}
/* Prendido = el cursor está DENTRO de esa marca. Es el indicador de qué formato
   tiene la palabra: sin él, la única forma de saberlo es mandar el mensaje. */
.fmt-b[aria-pressed="true"]{background:var(--marca-suave);border-color:rgba(30,155,224,.28);
  color:var(--marca)}
.fmt-pista{font-size:11px;color:var(--tinta3);margin-left:4px}
@media (max-width:520px){.fmt-pista{display:none}}
.chat-input{display:flex;gap:9px;align-items:flex-end}
/* Evidencia: la captura del caso */
.b-adj{padding:6px 6px 4px;max-width:min(78%,320px)}
.b-adj .b-autor{padding:2px 6px 0}
.b-adj .b-pie{padding:0 6px 2px}
/* contain, nunca cover: esto es EVIDENCIA. Recortar una captura para que llene el
   cuadro puede tapar justo el mensaje de error que la persona subió a enseñar. Se
   ve completa aunque queden bandas a los lados. (Sin comillas invertidas aquí:
   este bloque vive dentro de un template literal y lo cerrarían.) */
.adj-orig{display:inline-block;margin-top:6px;font-size:13px}
.adj-med{display:block;width:100%;max-height:320px;object-fit:contain;border-radius:13px;
  background:var(--fondo)}
video.adj-med{max-height:300px}
.adj-noimg{font-size:12.5px;line-height:1.5;padding:8px 8px 10px;color:var(--tinta2)}
.adj-noimg .ico{width:15px;height:15px;vertical-align:-3px;margin-right:4px}
.pista-captura{display:flex;gap:9px;align-items:flex-start;font-size:13px;line-height:1.5;
  color:var(--tinta2);background:var(--marca-suave);border:1px solid rgba(30,155,224,.22);
  border-radius:11px;padding:11px 13px;margin:0 0 16px}
.pista-captura .ico{width:17px;height:17px;flex:0 0 auto;color:var(--marca);margin-top:1px}
.chat-pista{display:flex;gap:7px;align-items:center;font-size:12px;color:var(--tinta3);
  margin-top:9px;line-height:1.45}
.chat-pista .ico{width:14px;height:14px;flex:0 0 auto}
.ev-form{padding:0 18px;margin:0}
.ev-form input[type=file]{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.ev-espera{font-size:12.5px;color:var(--tinta3);padding:8px 0 0;display:block}
.ev-espera[hidden]{display:none}
.chat-clip{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  width:40px;height:40px;border-radius:50%;cursor:pointer;color:var(--tinta3);
  border:1px solid var(--borde2);background:var(--panel);transition:.15s}
.chat-clip:hover{color:var(--marca);border-color:var(--marca);background:var(--marca-suave)}
.chat-clip .ico{width:19px;height:19px}
/* Nota de voz. El micrófono es un botón hermano del clip; el panel de grabación
   aparece encima del cajón solo mientras se graba o se revisa. */
.chat-mic{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  width:40px;height:40px;border-radius:50%;cursor:pointer;color:var(--tinta3);
  border:1px solid var(--borde2);background:var(--panel);transition:.15s;padding:0}
.chat-mic:hover{color:var(--marca);border-color:var(--marca);background:var(--marca-suave)}
.chat-mic .ico{width:19px;height:19px}
.chat-mic.grabando{color:#fff;background:#D9463F;border-color:#D9463F;animation:latido 1.1s ease-in-out infinite}
@keyframes latido{0%,100%{box-shadow:0 0 0 0 rgba(217,70,63,.45)}50%{box-shadow:0 0 0 7px rgba(217,70,63,0)}}
.voz-panel{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:0 0 10px;
  padding:10px 14px;border-radius:14px;background:var(--marca-suave);border:1px solid rgba(30,155,224,.22)}
.voz-panel[hidden]{display:none}
/* Los .boton y el <audio> traen display propio y le GANAN a [hidden] del navegador:
   en el estado de error seguian a la vista "Detener" y "Enviar". Misma trampa que
   .ev-espera. Dentro del panel, hidden manda. */
.voz-panel [hidden]{display:none!important}
.voz-estado{font-size:13px;font-weight:600;color:var(--tinta);flex:1;min-width:160px}
.voz-estado.rec::before{content:"";display:inline-block;width:9px;height:9px;border-radius:50%;
  background:#D9463F;margin-right:7px;vertical-align:0;animation:parpadeo 1s steps(1) infinite}
@keyframes parpadeo{50%{opacity:.25}}
.voz-panel audio{height:36px;max-width:100%}
.voz-acc{display:flex;gap:8px;flex-wrap:wrap}
.voz-acc .boton{padding:7px 13px;font-size:13px;box-shadow:none}
.voz-nota{flex-basis:100%;font-size:12px;color:var(--tinta3);line-height:1.45}
.b-voz{padding:8px 10px 6px;max-width:min(80%,360px)}
.b-voz audio{display:block;width:100%;height:40px}
.voz-tx{display:block;font-size:13.5px;line-height:1.5;margin-top:7px;padding-top:7px;
  border-top:1px solid rgba(127,127,127,.25)}
.voz-tx.pend{font-style:italic;opacity:.75}
.fila-msg.mio .voz-tx{border-top-color:rgba(255,255,255,.3)}
.chat-input textarea{border-radius:22px;padding:11px 16px;resize:none;line-height:1.4;
  max-height:260px;min-height:44px}
.b-tag{display:inline-block;font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;
  color:var(--tinta3);background:var(--fondo);border:1px solid var(--borde2);border-radius:6px;
  padding:1px 6px;margin-left:5px;vertical-align:1px}
.fila-msg.mio .b-autor{color:rgba(255,255,255,.96)}
.fila-msg.mio .b-tag{color:#fff;background:rgba(255,255,255,.18);border-color:rgba(255,255,255,.30)}

/* ── módulo de correos */
.leyenda-correo{display:flex;gap:22px;flex-wrap:wrap;font-size:13px;color:var(--tinta2);line-height:1.5}
.leyenda-correo>span{flex:1;min-width:220px}
.tabla-correos td{vertical-align:top}
.correo-tags{display:flex;align-items:center;gap:7px;margin-bottom:5px;flex-wrap:wrap}
.folio-mini{font-family:ui-monospace,SFMono-Regular,'SF Mono',Menlo,monospace;font-size:11.5px;font-weight:700;color:var(--marca);
  background:var(--marca-suave);border:1px solid rgba(30,155,224,.22);border-radius:7px;padding:2px 8px}
.correo-prev{color:var(--tinta3);font-size:12.5px;margin-top:3px;line-height:1.45}
/* leyenda de categorías (barras por mes) */
.leyenda-cat{display:flex;flex-wrap:wrap;gap:8px 16px;margin-top:14px;
  padding-top:14px;border-top:1px solid var(--borde2)}
.leyenda-cat .lg-item{display:inline-flex;align-items:center;gap:7px;font-size:12px;
  font-weight:600;color:var(--tinta2)}
.leyenda-cat .lg-punto{width:9px;height:9px;border-radius:3px;flex:0 0 auto}
.chat-enviar{flex:0 0 auto;width:44px;height:44px;border-radius:50%;padding:0;display:flex;
  align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(15,108,196,.28)}
.chat-interno{display:flex;align-items:center;gap:8px;margin:11px 2px 0;cursor:pointer;
  font-size:13px;font-weight:650;color:var(--tinta2)}
.chat-interno input{width:auto;margin:0}
/* El aviso de credencial en el chat. Informa, no frena: mandar una contraseña por
   aquí es legítimo, y lo que faltaba era decir qué se hace con ella. */
.chat-clave{display:block;margin:9px 2px 0;padding:9px 11px;border-radius:10px;
  font-size:12.5px;line-height:1.5;background:var(--ambar-f);border:1px solid #F0DDB4;
  color:var(--tinta2)}
.chat-clave b{color:var(--tinta)}
/* OJO: display:block le GANA al [hidden] del navegador (misma trampa que .voz-panel).
   Sin esta regla el aviso se veía SIEMPRE, con el cuadro vacío — y un aviso de
   "esto lleva una contraseña" sobre nada confunde a quien va a escribir. */
.chat-clave[hidden]{display:none}
.chat-interno small{font-weight:500;color:var(--tinta3)}
/* ── Capa 1 IA: botón pedir y tarjeta de sugerencia */
.ia-pedir-fila{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:12px 18px;
  border-top:1px solid var(--borde2);background:linear-gradient(180deg,#FBFCFE,#fff);margin:0}
.ia-pedir{display:inline-flex;align-items:center;gap:8px;background:#F1EEFE;color:#5A3FD6;
  border:1px solid #DCD4FA;border-radius:11px;padding:9px 15px;font-size:13.5px;font-weight:700;
  cursor:pointer;transition:all .16s}
.ia-pedir:hover{background:#E9E3FD;border-color:#C9BEF6;transform:translateY(-1px)}
.ia-pedir svg *{stroke:#7C5CFB}
.ia-pedir-nota{font-size:12px;color:var(--tinta3);font-weight:500}
.ia-sug{margin:16px 18px 4px;border:1.5px solid #DCD4FA;border-radius:16px;overflow:hidden;
  background:linear-gradient(180deg,#F7F5FF,#fff);box-shadow:0 4px 16px rgba(90,63,214,.08);animation:surge .3s ease}
.ia-sug-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
  padding:11px 15px;background:rgba(124,92,251,.07);border-bottom:1px solid #E7E1FB}
.ia-badge{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:800;color:#5A3FD6}
.ia-badge svg *{stroke:#7C5CFB}
.ia-sug-tag{font-size:11.5px;color:#8A79C8;font-weight:600}
.ia-verif{padding:10px 16px 0;font-size:12.5px;color:var(--tinta2)}
.ia-verif b{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:#8A79C8;margin-bottom:4px}
.ia-verif ul{margin:0;padding-left:18px}
.ia-verif li{margin:2px 0}
.ia-verif code{font-size:11px;background:rgba(124,92,251,.08);border-radius:5px;padding:1px 5px;color:#5A3FD6}
.ia-sug-cuerpo{padding:14px 16px;font-size:14px;line-height:1.55;color:var(--tinta)}
.ia-sug-acc{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:0 15px 15px}
/* ── Del-iA: el panel lateral donde el agente conversa con el asistente.
   Es una ventana aparte y no un bloque más del ticket a propósito: lo que el
   agente pregunta mientras piensa no es parte del caso, y no debe mezclarse
   con la conversación que sí lo es. Se abre encima, no empuja el contenido:
   el agente necesita seguir leyendo el ticket mientras pregunta. */
.delia-fab{position:fixed;right:22px;bottom:22px;z-index:60;display:inline-flex;align-items:center;gap:9px;
  background:linear-gradient(135deg,#6D4BF0,#8B6BFF);color:#fff;border:0;border-radius:999px;
  padding:13px 20px 13px 17px;font:inherit;font-size:14px;font-weight:750;cursor:pointer;
  box-shadow:0 8px 26px rgba(90,63,214,.34);transition:transform .16s,box-shadow .16s}
.delia-fab:hover{transform:translateY(-2px);box-shadow:0 12px 32px rgba(90,63,214,.42)}
.delia-fab svg *{stroke:none}
.delia-fab .pt{width:7px;height:7px;border-radius:50%;background:#5AE6B0;box-shadow:0 0 0 3px rgba(90,230,176,.25)}
.delia{position:fixed;top:0;right:0;bottom:0;width:min(420px,100vw);z-index:70;display:flex;flex-direction:column;
  background:var(--panel);border-left:1px solid var(--borde);box-shadow:-14px 0 44px rgba(15,23,42,.16);
  transform:translateX(102%);transition:transform .22s cubic-bezier(.4,0,.2,1);visibility:hidden}
.delia.abierto{transform:none;visibility:visible}
.delia-head{display:flex;align-items:center;gap:10px;padding:15px 16px;border-bottom:1px solid var(--borde2);
  background:linear-gradient(135deg,rgba(109,75,240,.10),rgba(43,211,226,.08))}
.delia-head h3{margin:0;font-size:16px;letter-spacing:-.3px;display:flex;align-items:center;gap:7px}
.delia-head small{display:block;font-size:11.5px;color:var(--tinta3);font-weight:500;margin-top:1px}
.delia-x{margin-left:auto;background:transparent;border:0;color:var(--tinta3);font-size:22px;line-height:1;
  cursor:pointer;padding:4px 8px;border-radius:9px}
.delia-x:hover{background:var(--fondo2);color:var(--tinta)}
.delia-hilo{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:14px}
.delia-vacio{margin:auto 0;text-align:center;color:var(--tinta3);font-size:13.5px;line-height:1.6}
.delia-vacio b{display:block;color:var(--tinta2);font-size:14.5px;margin-bottom:6px}
.delia-tips{display:flex;flex-wrap:wrap;gap:7px;justify-content:center;margin-top:14px}
.delia-tip{background:var(--fondo2);border:1px solid var(--borde2);border-radius:999px;padding:7px 13px;
  font:inherit;font-size:12.5px;color:var(--tinta2);cursor:pointer;text-align:left}
.delia-tip:hover{border-color:#C9BEF6;background:#F4F1FE;color:#5A3FD6}
.delia-m{max-width:92%;font-size:13.5px;line-height:1.55}
.delia-m.yo{align-self:flex-end;background:#6D4BF0;color:#fff;border-radius:15px 15px 4px 15px;padding:10px 14px}
.delia-m.yo .delia-quien{color:rgba(255,255,255,.72)}
.delia-m.ia{align-self:flex-start;background:var(--fondo2);border:1px solid var(--borde2);
  border-radius:15px 15px 15px 4px;padding:11px 14px;color:var(--tinta)}
.delia-quien{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;
  color:var(--tinta3);margin-bottom:4px}
.delia-m.ia .delia-quien{color:#7C5CFB}
.delia-verif{margin-top:9px;font-size:11.5px;color:var(--tinta3)}
.delia-verif summary{cursor:pointer;font-weight:650;color:#8A79C8}
.delia-verif ul{margin:6px 0 0;padding-left:16px}
.delia-verif code{background:rgba(124,92,251,.10);border-radius:5px;padding:1px 5px;color:#5A3FD6;font-size:11px}
.delia-acc{display:flex;gap:8px;margin-top:9px;flex-wrap:wrap}
.delia-acc button{background:transparent;border:1px solid var(--borde);border-radius:8px;padding:5px 10px;
  font:inherit;font-size:11.5px;font-weight:650;color:var(--tinta2);cursor:pointer}
.delia-acc button:hover{border-color:#C9BEF6;color:#5A3FD6;background:#F7F5FF}
.delia-pie{border-top:1px solid var(--borde2);padding:11px 13px;background:var(--panel)}
.delia-pie textarea{width:100%;border:1px solid var(--borde);border-radius:12px;padding:10px 12px;font:inherit;
  font-size:13.5px;resize:none;background:var(--fondo);color:var(--tinta);min-height:44px;max-height:150px}
.delia-pie textarea:focus{outline:0;border-color:#A992F7;box-shadow:0 0 0 3px rgba(124,92,251,.14)}
.delia-fila{display:flex;align-items:center;gap:10px;margin-top:8px}
.delia-fila small{font-size:11px;color:var(--tinta3);flex:1}
.delia-env{background:#6D4BF0;color:#fff;border:0;border-radius:10px;padding:9px 17px;font:inherit;
  font-size:13px;font-weight:700;cursor:pointer}
.delia-env:disabled{opacity:.55;cursor:default}
.delia-err{background:var(--rojo-f);color:var(--rojo);border:1px solid #F2C9C2;border-radius:11px;
  padding:9px 12px;font-size:12.5px}
.delia-pensando{align-self:flex-start;display:flex;align-items:center;gap:8px;color:var(--tinta3);font-size:12.5px}
.delia-pensando i{width:6px;height:6px;border-radius:50%;background:#7C5CFB;display:inline-block;
  animation:deliaLat 1s infinite ease-in-out}
.delia-pensando i:nth-child(2){animation-delay:.16s}.delia-pensando i:nth-child(3){animation-delay:.32s}
@keyframes deliaLat{0%,80%,100%{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-3px)}}
@media (max-width:640px){.delia{width:100vw}.delia-fab{right:14px;bottom:14px;padding:12px 17px}}
@media print{.delia,.delia-fab{display:none}}
.boton.fantasma{background:transparent;color:var(--tinta3);border:0;box-shadow:none;font-weight:600}
.boton.fantasma:hover{color:var(--rojo);background:var(--rojo-f)}
.boton.sec:hover{border-color:var(--marca2);background:var(--marca-suave)}

.aviso{background:var(--ambar-f);color:var(--ambar);border:1px solid #F0DDB4;border-radius:12px;
  padding:11px 15px;font-size:14px;margin-bottom:16px}
.error{background:var(--rojo-f);color:var(--rojo);border:1px solid #F2C9C2;border-radius:12px;
  padding:11px 15px;font-size:14px;margin-bottom:16px}
.csatb{border-radius:16px;transition:transform .12s ease, box-shadow .12s ease, border-color .12s ease}
.csatb:hover{transform:translateY(-2px);border-color:var(--csat);box-shadow:0 8px 20px rgba(15,23,42,.10)}
.insignia-ia{display:inline-flex;align-items:center;gap:5px;font-weight:800;color:var(--marca);background:linear-gradient(120deg,rgba(30,155,224,.10),rgba(43,211,226,.14));border:1px solid rgba(30,155,224,.25);border-radius:999px;padding:2px 9px;font-size:12px}
/* Directorio de personas. Antes era una tabla con tres selectores crudos apilados por
   fila: se leía como un volcado de base de datos. Ahora el estado se muestra con chips
   y la edición vive detrás de un <details>, que es nativo y no necesita JS. */
.directorio{display:flex;flex-direction:column;gap:10px}
/* Cabecera de la lista: resumen + buscador + filtros. Con 17 personas ya no
   basta scrollear; con 60 sera imprescindible. */
.us-barra{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin:26px 0 14px}
.us-barra h2{margin:0;font-size:20px;letter-spacing:-.025em;flex:0 0 auto}
.us-barra .us-n{font-size:13px;color:var(--tinta3);font-variant-numeric:tabular-nums}
.us-buscar{flex:1;min-width:200px;position:relative}
.us-buscar input{width:100%;padding:9px 13px 9px 34px;border:1px solid var(--borde);border-radius:10px;
  background:var(--panel);font:inherit;font-size:13.5px;color:var(--tinta)}
.us-buscar svg{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--tinta3)}
.us-filtros{display:flex;gap:6px;flex-wrap:wrap}
.us-f{font-size:12px;font-weight:600;border:1px solid var(--borde);background:var(--panel);
  border-radius:999px;padding:6px 13px;cursor:pointer;color:var(--tinta2);box-shadow:none}
.us-f:hover{border-color:var(--marca2)}
.us-f.act{background:var(--marca);border-color:var(--marca);color:#fff}
.us-f.alerta.act{background:var(--ambar);border-color:var(--ambar)}
.us-vacio{padding:26px;text-align:center;color:var(--tinta3);font-size:13.5px}
.us-abrir{display:inline-flex;align-items:center;gap:7px;font-size:11.5px;font-weight:700;
  color:var(--marca);text-decoration:none;flex:0 0 auto}
.persona{background:var(--panel);border:1px solid var(--borde);border-radius:14px;padding:14px 16px;
  box-shadow:var(--s1);transition:border-color .12s ease,box-shadow .12s ease;position:relative;overflow:hidden}
.persona::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--acento,transparent)}
.persona:hover{border-color:var(--marca2);box-shadow:var(--s2)}
.persona .avatar{color:#fff}
.p-cab .p-id b{cursor:default}
.persona.inactiva{opacity:.6;background:#FAFBFC}
/* Dado de baja aquí y con la cuenta viva allá. Se le quita el atenuado de las
   fichas inactivas a propósito: apagar visualmente justo la que hay que atender
   es lo contrario de lo que esta marca viene a hacer. */
.persona.cuenta-abierta{opacity:1;background:var(--ambar-f);border-color:var(--ambar)}
.alerta-cuenta{display:block;margin-top:3px;color:var(--ambar);font-weight:600}
.p-cab{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.p-id{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}
.p-id b{font-size:15px;letter-spacing:-.2px}
.p-id small{font-size:12.5px;color:var(--tinta2);word-break:break-all}
.p-tu{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;
  color:var(--marca);background:var(--marca-suave);padding:1px 6px;border-radius:5px;vertical-align:2px}
.p-attrs{display:flex;flex-wrap:wrap;gap:6px;margin-top:11px}
.attr{font-size:12px;font-weight:600;color:var(--tinta2);background:var(--fondo);
  border:1px solid var(--borde);border-radius:8px;padding:3px 9px}
.attr.rh{color:var(--marca);border-color:#BBDDF5;background:var(--marca-suave)}
.attr.tenue{color:var(--tinta3);font-weight:500}
.attr.falta{color:var(--ambar);border-color:#F0DCB0;background:var(--ambar-f)}
.attr.falta::before{content:'⚠ ';font-weight:800}
.p-edit{margin-top:12px;border-top:1px solid var(--borde);padding-top:10px}
.p-edit summary{cursor:pointer;font-size:12.5px;font-weight:700;color:var(--marca);
  list-style:none;display:inline-flex;align-items:center;gap:5px;padding:3px 0}
.p-edit summary::-webkit-details-marker{display:none}
.p-edit summary::before{content:'▸';transition:transform .15s ease;display:inline-block}
.p-edit[open] summary::before{transform:rotate(90deg)}
.p-edit summary:hover{text-decoration:underline}
.p-edit-cuerpo{padding-top:14px}
.p-campos{display:grid;grid-template-columns:repeat(auto-fit,minmax(185px,1fr));gap:12px 14px}
.p-campos form{margin:0;display:flex;flex-direction:column;gap:3px}
.p-campos label{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--tinta3);font-weight:700;margin:0}
.p-campos select{font-size:13px;padding:7px 9px}
.p-inline{display:flex;gap:6px}
.p-inline select{flex:1}
.p-inline button{white-space:nowrap}
.p-acciones{display:flex;flex-wrap:wrap;gap:7px;margin-top:14px;padding-top:13px;border-top:1px dashed var(--borde)}
.p-acciones .boton{padding:6px 12px;font-size:12.5px;box-shadow:none}
.p-acciones .boton.act{border-color:var(--marca);color:var(--marca);background:var(--marca-suave)}
.p-acciones .boton.peligro:hover{border-color:var(--rojo);color:var(--rojo)}
.p-nota{font-size:12.5px;color:var(--tinta3);margin:12px 0 0}
.csat-com{margin:14px 0 0;padding:12px 16px;background:var(--fondo);border-left:3px solid var(--borde);
  border-radius:0 10px 10px 0;font-size:14px;line-height:1.6;color:var(--tinta2);font-style:italic}
.csat-com::before{content:'\201C'}
.csat-com::after{content:'\201D'}
/* El fondo era un #FFFDF7 fijo: en tema oscuro pintaba la tarjeta de blanco con
   el texto claro encima. Con el token se apaga solo. */
.panel-ap{border-top:3px solid var(--ambar);background:var(--ambar-f)}
.panel-ap p{font-size:13.5px;color:var(--tinta2);line-height:1.55;margin:6px 0 16px}
.ap-tit{font-size:15px;font-weight:800;letter-spacing:-.2px}
.ap-botones{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}
.ap-botones .boton{padding:9px 16px;font-size:13.5px;box-shadow:none}
.ap-no:hover{border-color:var(--rojo);color:var(--rojo)}
/* Una tarjeta que dice "esto está detenido" no puede verse como cualquier otra:
   antes era gris y se leía como información de fondo. Ámbar mientras va en
   camino; rojo cuando ya lleva demasiado parado. El color lo decide el reloj,
   no el tipo de espera: lo urgente es cuánto lleva, no de quién se espera. */
.ap-espera{border-top:3px solid var(--ambar);background:var(--ambar-f)}
.ap-espera .ap-tit{color:var(--ambar)}
.ap-espera.nv-rojo{border-top-color:var(--rojo);background:var(--rojo-f)}
.ap-espera.nv-rojo .ap-tit{color:var(--rojo)}
/* El reloj: en ámbar es un dato, en rojo es el punto de la tarjeta. */
.esp-reloj{font-size:13px;color:var(--tinta2);margin:8px 0 0}
.esp-reloj b{color:var(--ambar)}
.esp-reloj.grave{font-weight:650;color:var(--rojo)}
.esp-reloj.grave b{color:var(--rojo)}
/* El correo que ya está en el chat, a un clic de quedar guardado. Ámbar porque
   es un hueco que alguien tiene que cerrar, no un dato más. */
.cp-suelto{border-top:3px solid var(--ambar);background:var(--ambar-f)}
.cp-suelto .ap-tit{color:var(--ambar)}
.cp-fila{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0 8px}
.cp-suelto small{font-size:11.5px;color:var(--tinta3)}
/* Elegir a qué buzón se le escribe. Las dos opciones con su DIRECCIÓN a la
   vista: una que dijera solo "personal" obliga a ir a buscarla a otra pantalla,
   que es cuando se manda al que no era. */
.dest-sel{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:10px}
.dest-tit{font-size:12px;font-weight:700;color:var(--tinta3);letter-spacing:.3px;
  text-transform:uppercase;width:100%}
.dest-op{display:flex;align-items:center;gap:9px;padding:9px 12px;border-radius:12px;
  border:1px solid var(--borde);background:var(--panel);cursor:pointer;flex:1 1 220px;
  transition:border-color .14s,background .14s}
.dest-op:hover{border-color:var(--marca2)}
.dest-op input{width:16px;height:16px;flex:none;margin:0}
.dest-op span{display:flex;flex-direction:column;gap:1px;min-width:0;font-size:12.5px;
  color:var(--tinta2);overflow:hidden;text-overflow:ellipsis}
.dest-op span b{font-size:13.5px;color:var(--tinta);font-weight:650}
.dest-op:has(input:checked){border-color:var(--marca);background:var(--marca-suave)}
/* Bloqueada: se queda a la vista, apagada y con el porqué debajo. Esconderla
   dejaría al agente preguntándose a dónde se fue la opción. */
.dest-op.bloqueada{opacity:.45;cursor:not-allowed;border-style:dashed}
.dest-op.bloqueada:hover{border-color:var(--borde)}
.dest-falta{font-size:12.5px;color:var(--tinta3);padding:9px 2px}
.dest-guia{font-size:12.5px;line-height:1.55;color:var(--tinta2);background:var(--fondo2);
  border-radius:11px;padding:10px 12px;margin-bottom:10px}
.dest-guia b{color:var(--tinta)}
.dest-freno{font-size:12.5px;line-height:1.5;color:#8A5A08;background:var(--ambar-f);
  border-radius:11px;padding:10px 12px;margin-bottom:10px}
.dest-freno[hidden]{display:none}
.dc-caja{margin:14px 0 4px}
.dc-caja .pista{margin:7px 0 0;font-size:12.5px}
.dc-out{margin-top:12px;display:flex;flex-direction:column;gap:10px;align-items:flex-start}
.dc-out[hidden]{display:none}
.dc-texto{white-space:pre-wrap;font-size:13.5px;line-height:1.6;background:var(--fondo2);
  border:1px solid var(--borde);border-radius:10px;padding:12px 14px;width:100%;box-sizing:border-box}
.dc-espera{font-size:13px;color:var(--tinta2)}
.dc-error{font-size:13px;color:#8A5A08;background:var(--ambar-f);border-radius:9px;padding:9px 12px;width:100%;box-sizing:border-box}
.dc-nota{font-size:12.5px;line-height:1.5;color:var(--tinta2);background:var(--marca-suave);
  border-radius:9px;padding:9px 12px;width:100%;box-sizing:border-box;white-space:pre-wrap}
.dc-ver{font-size:12.5px;color:var(--tinta3)}
.dc-ver ul{margin:6px 0 0;padding-left:18px}
.red-correo{display:flex;flex-direction:column;gap:9px;margin:0}
.red-correo input,.red-correo textarea{width:100%;font:inherit;padding:9px 11px;
  border:1px solid var(--borde);border-radius:9px;background:var(--panel);color:inherit}
.red-correo textarea{resize:vertical;line-height:1.55;font-size:13.5px}
.red-botones{display:flex;gap:8px;align-items:center}
/* La nota de la contraseña: plegada, porque no siempre aplica, pero a la vista
   de quien va a escribir — no en un manual que nadie abre. */
.clave-nota{margin:0 0 12px;border:1px solid var(--ambar);border-radius:10px;
  background:var(--ambar-f);padding:11px 12px}
.clave-nota p{font-size:12.5px;line-height:1.55;color:var(--tinta2);margin:8px 0 0}
/* La previa: el correo tal cual va a llegar, sin marco de la app que lo disfrace. */
.previa-marco{border:1px solid var(--borde);border-radius:14px;overflow:hidden;background:#FAFAFA;
  margin:14px 0}
.previa-marco iframe{display:block;width:100%;height:520px;border:0;background:#FAFAFA}
.previa-datos{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;font-size:13.5px;margin:0 0 4px}
.previa-datos dt{color:var(--tinta3)}
.previa-datos dd{margin:0;font-weight:600}
.ap-espera p{font-size:13.5px;color:var(--tinta2);margin:6px 0 0;line-height:1.55}
.ap-resuelta{border-top:3px solid var(--borde)}
.ap-resuelta.ap-ok{border-top-color:var(--verde)} .ap-resuelta.ap-ok .ap-tit{color:var(--verde)}
.ap-resuelta.ap-no{border-top-color:var(--rojo)} .ap-resuelta.ap-no .ap-tit{color:var(--rojo)}
.ap-resuelta.ap-dev{border-top-color:var(--ambar)} .ap-resuelta.ap-dev .ap-tit{color:var(--ambar)}
.panel-sol{border-top:3px solid var(--marca)}
.ps-cab{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.d-lista{display:flex;flex-direction:column;gap:9px}
.d-fila{display:flex;flex-direction:column;gap:1px}
.d-fila span{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--tinta3);font-weight:700}
.d-fila b{font-size:14px;font-weight:600}
.aviso-llega{background:var(--marca-suave);border:1px solid var(--marca);border-radius:10px;
  padding:14px 16px;margin-bottom:14px}
.aviso-llega b{display:block;color:var(--marca);font-size:14.5px}
.aviso-llega span{display:block;font-size:13px;color:var(--tinta2);margin-top:3px}
.aviso-llega ul{margin:9px 0 0;padding-left:18px}
.aviso-llega li{margin:3px 0;font-size:13.5px}
.aviso-firma{background:var(--ambar-f);border:1px solid var(--ambar);border-radius:10px;
  padding:14px 16px;margin-bottom:18px}
.aviso-firma b{display:block;color:var(--ambar);font-size:14.5px}
.aviso-firma span{display:block;font-size:13px;color:var(--tinta2);margin-top:3px}
.aviso-firma ul{margin:9px 0 0;padding-left:18px}
.aviso-firma li{margin:3px 0;font-size:13.5px}
.fr-doc{background:var(--panel);border:1px solid var(--borde);border-radius:10px;padding:16px 18px}
.fr-tabla{width:100%;border-collapse:collapse;margin-bottom:14px}
.fr-tabla th,.fr-tabla td{text-align:left;padding:7px 9px;border:1px solid var(--borde);font-size:13.5px}
.fr-tabla th{background:var(--marca-suave);width:34%;font-weight:600}
/* En el telefono la tabla se APILA. La regla global de min-width:600px para las
   tablas existe para que las de administracion se deslicen dentro de su tarjeta, y
   aqui hacia lo contrario: metia 600px en una caja de 310 y CORTABA EL TEXTO -"Ana
   Laura Linare", "Cda. Hueyacalco"-. Es la hoja que la persona tiene que leer antes
   de firmar; un documento que no se puede leer completo no se puede firmar. Mismo
   remedio que la matriz del tablero: se suelta el minimo y se apila.
   Importa mas desde el 10-sep-2026, que es cuando quien recibe el equipo empezo a
   tener camino a esta pantalla. */
@media(max-width:560px){
  main .fr-tabla{min-width:0}
  .fr-tabla th,.fr-tabla td{display:block;width:auto;border:0;padding:0}
  .fr-tabla tr{display:block;padding:8px 0;border-bottom:1px solid var(--borde)}
  .fr-tabla tr:last-child{border-bottom:0}
  .fr-tabla th{background:none;font-size:10.5px;text-transform:uppercase;
    letter-spacing:.04em;color:var(--tinta3);font-weight:700;margin-bottom:2px}
  .fr-doc{padding:14px}
}
.fr-foto img{display:block;max-width:100%;max-height:240px;object-fit:contain;
  border:1px solid var(--borde);border-radius:8px}
.fr-foto figcaption{font-size:12px;color:var(--tinta2);margin-top:6px}
.fr-sello{margin:14px 0 0;padding-top:12px;border-top:1px dashed var(--borde);font-size:12.5px}
.fr-sello code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px}
.fr-sello span{display:block;color:var(--tinta2);margin-top:4px}
.fr-roles{display:flex;gap:12px;flex-wrap:wrap}
.fr-rol{flex:1;min-width:190px;border:1px solid var(--borde);border-radius:10px;padding:12px}
.fr-rol.fr-lista{border-color:var(--verde);background:var(--verde-f)}
.fr-rol-t{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--tinta2)}
.fr-hecha b{display:block;margin-top:6px;font-size:13px}
.fr-hecha small{color:var(--tinta2);font-size:11.5px}
.fr-trazo{display:block;max-width:100%;height:56px;object-fit:contain;object-position:left}
.fr-sin-trazo{font-size:11.5px;color:var(--tinta2);font-style:italic;padding:14px 0 4px}
.fr-pend{margin-top:8px;font-size:12.5px;color:var(--ambar)}
.fr-lienzo-caja{position:relative;border:1px solid var(--borde);border-radius:10px;
  background:#fff;overflow:hidden}
.fr-lienzo-caja canvas{display:block;width:100%;height:auto;touch-action:none;cursor:crosshair}
.fr-linea-firma{position:absolute;left:6%;right:6%;bottom:22%;border-bottom:1px dashed #C3CCD6;
  pointer-events:none}
.fr-acciones{display:flex;align-items:center;gap:12px;margin-top:10px;flex-wrap:wrap}
.fr-estado{font-size:12.5px;color:var(--tinta2)}
.fr-estado.con{color:var(--verde);font-weight:600}
.iva-aviso{background:var(--ambar-f);color:var(--ambar);border-radius:8px;padding:9px 11px;
  font-size:12.5px;line-height:1.5;margin:8px 0 12px}
.pista-iva{font-size:12.5px;color:var(--tinta2);margin:-4px 0 14px;line-height:1.5}
input.sugerido{background:var(--ambar-f);border-color:var(--ambar)}
.sello-ok,.sello-mal,.sello-nada{margin-top:10px;padding:9px 11px;border-radius:8px;font-size:12.5px;line-height:1.5}
.sello-ok{background:var(--verde-f);color:var(--verde)}
.sello-mal{background:var(--rojo-f);color:var(--rojo)}
.sello-nada{background:var(--ambar-f);color:var(--ambar)}
.sello-ok code,.sello-mal code,.sello-nada code{display:block;margin-top:4px;font-size:11px;opacity:.85}
.ps-privado{margin-top:16px;padding:12px 14px;background:#FFFBF0;border:1px solid #F1DDA9;border-radius:12px;
  display:flex;flex-direction:column;gap:6px}
.ps-priv-tit{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:#B0851E;font-weight:700}
.ps-contacto{font-size:14.5px;font-weight:650;color:#6E5A22;text-decoration:none;word-break:break-all}
.ps-contacto:hover{text-decoration:underline}
/* El domicilio va en renglón propio y no como un "contacto" más: no se le llama ni
   se le escribe, se lee. Su etiqueta arriba y el valor abajo porque una dirección
   completa no cabe al lado de un rótulo. */
.ps-dom{display:flex;flex-direction:column;gap:2px}
.ps-dom>span{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:#B0851E;font-weight:700}
.ps-dom>b{font-size:14px;font-weight:650;color:#6E5A22;line-height:1.4}
.ps-dom>small{font-size:11.5px;color:#8A7331;line-height:1.45}
/* Falta el dato: rojo, porque sin él no se registra la entrega. No es "hay un
   trámite pendiente" -eso es ámbar-: es que la entrega está detenida. */
.ps-dom-falta>b{color:var(--rojo)}
/* Capturado y sin visto bueno: ámbar. Aquí SÍ es "hay un trámite pendiente" -el dato
   está, falta una firma-, y pintarlo igual que un dato bueno lo haría leer como
   bueno. Los dos rojos no deben verse iguales, y esto no es un rojo. */
.ps-dom-pend>small{color:var(--ambar)}
/* El recuadro pendiente. Ámbar por lo mismo, y con el botón de autorizar en primario:
   es la acción que destraba la entrega, no una más de la pantalla. */
.dom-pend{background:var(--ambar-f);border-color:var(--ambar)}
.dom-pend>b{display:block;color:#8A6100;font-size:14px;margin-bottom:4px}
.dom-sub{margin-top:10px}
.dom-sub>summary{cursor:pointer;font-size:12.5px;font-weight:650;color:var(--tinta2);list-style:none}
.dom-sub>summary::-webkit-details-marker{display:none}
.dom-sub>summary::before{content:'+';margin-right:6px}
.dom-sub[open]>summary::before{content:'−'}
.dom-sub[open]>summary{margin-bottom:8px}
/* El recuadro del domicilio. Rojo cuando falta -sin él no se registra la entrega,
   que no es "hay un trámite pendiente"- y discreto cuando solo sirve para corregir. */
.dom-caja{margin-top:14px;padding:12px 14px;border-radius:12px;border:1px solid var(--borde)}
.dom-falta{background:var(--rojo-f);border-color:var(--rojo)}
.dom-falta>b{display:block;color:var(--rojo);font-size:14px;margin-bottom:4px}
.dom-para{margin:0 0 10px;font-size:13px;color:var(--tinta2);line-height:1.45}
.dom-ok>summary{cursor:pointer;font-size:13px;font-weight:650;color:var(--tinta2);list-style:none}
.dom-ok>summary::-webkit-details-marker{display:none}
.dom-ok>summary::before{content:'+';margin-right:6px;font-size:15px}
.dom-ok[open]>summary::before{content:'−'}
.dom-ok[open]>summary{margin-bottom:10px}
.dom-form .campo{margin-bottom:10px}
/* ── Los módulos de trabajo de una solicitud, bajo la conversación ──────────
   Cada bloque va en su tarjeta. Antes eran uno solo de 2,000 px dentro de la
   columna de 371, y ahí el problema no era el alto: era que en 371 px una lista de
   equipos va de uno en uno y un domicilio completo se parte en cuatro renglones. */
.mod-sol{display:flex;flex-direction:column;gap:16px;margin-top:16px}
.mod-sol>*{margin:0}
/* Cada bloque con su tarjeta, y no por simetria: son cosas distintas -otorgar
   accesos, entregar equipo, capturar un domicilio- y sin marco se leen como una sola
   columna larga, que es de lo que veniamos. Estos bloques nacieron DENTRO de una
   tarjeta, asi que traen sus propios margenes y separadores para vivir ahi: aqui se
   les anulan. */
.mod-sol>.ps-accesos,.mod-sol>.dom-caja,.mod-sol>.corregir-acc,.mod-sol>.ps-vincular{
  background:var(--panel);border:1px solid var(--borde);border-radius:var(--radio);
  padding:20px 22px;box-shadow:var(--s1)}
.mod-sol>.ps-accesos{border-top:1px solid var(--borde);padding-top:20px}
.mod-sol>.corregir-acc{margin-top:0}
/* El domicilio conserva su color cuando dice algo -rojo si falta, ambar si espera
   firma-: ahi el marco neutro seria perder el aviso. */
.mod-sol>.dom-falta{background:var(--rojo-f);border-color:var(--rojo)}
.mod-sol>.dom-pend{background:var(--ambar-f);border-color:var(--ambar)}

/* El módulo de entrega. Numerado porque son pasos con orden: elegir, documentar,
   registrar. Sin los números se lee como tres cosas sueltas. */
.eq-mod{display:flex;flex-direction:column;gap:14px}
.eq-para{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:10px 18px;
  padding:12px 14px;background:var(--fondo2);border-radius:12px}
.eq-para>div{display:flex;flex-direction:column;gap:2px;min-width:0}
.eq-para span{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;
  color:var(--tinta3);font-weight:700}
.eq-para b{font-size:14px;line-height:1.4;font-weight:650}
.eq-falta{color:var(--rojo)}
.eq-reservado{color:var(--tinta2);font-weight:600}
/* El paso: número, título y su chip de estado en la misma línea. */
.eq-paso{display:flex;align-items:center;gap:9px;margin:2px 0 0}
.eq-paso h4{margin:0;font-size:14px;font-weight:750}
.eq-num{flex:0 0 auto;width:21px;height:21px;border-radius:50%;background:var(--marca);
  color:#fff;font-size:12px;font-weight:800;display:grid;place-items:center}
/* La rejilla de equipos: dos por renglon en la columna ancha. Con auto-fit y un
   minimo de 250px cae sola a una columna en movil, sin media query. */
.eq-rejilla{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:9px}
.eq-op{align-items:flex-start;padding:11px 12px;border:1px solid var(--borde);border-radius:11px;
  background:var(--panel);transition:border-color .15s,background .15s}
.eq-op:hover{border-color:var(--marca)}
.eq-op:has(input:checked){border-color:var(--marca);background:rgba(30,155,224,.05)}
.eq-op-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
.eq-op-txt b{font-family:var(--mono,ui-monospace,monospace);font-size:12.5px;letter-spacing:.02em}
.eq-op-txt i{font-style:normal;font-size:13.5px;font-weight:650;line-height:1.3}
.eq-op-txt small{font-size:11.5px;color:var(--tinta3)}
/* Un equipo de alto valor sin la firma de Direccion: se ve, no se elige. */
.eq-op-txt small.eq-falta-dir{color:var(--ambar);font-weight:600;margin-top:2px}
.eq-op:has(input:disabled){cursor:default;background:var(--ambar-f)}
.eq-op:has(input:disabled):hover{border-color:var(--borde)}
.eq-vacio{margin:0;padding:12px 14px;background:var(--ambar-f);border-radius:11px;
  font-size:13.5px;color:var(--tinta2)}
/* Subir la responsiva: un espacio de carga y su boton, no la tarjeta de expediente
   con titulo, lista y previsualizador. Es lo que pidio el dueno -"solo un espacio
   para cargar la responsiva firmada"- y es lo que la convierte en un paso en vez de
   en el portero de la pantalla.
   La zona es la .soltar de todo el proyecto: la misma que la gente ya conoce, y
   con el input nativo ESCONDIDO. Eso ultimo no es un detalle: un input de archivo
   visible no se encoge por debajo de su propio texto -350px medidos- y forzaba ese
   minimo en la columna, dejando la pagina con scroll lateral a 390px. */
.eq-subir{display:flex;flex-direction:column;gap:10px}
.eq-subir .soltar{padding:14px 16px}
/* El renglon de lo ya entregado: el equipo a la izquierda y las dos salidas a la
   derecha. No es flex en el <b> -eso sintetiza una linea base y hunde el texto que
   sigue, la leccion del 07-sep-: el flex es la fila entera. */
.eq-dado{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-start;
  justify-content:space-between;padding:14px 16px;background:var(--fondo2);border-radius:12px}
.eq-dado+.eq-dado{margin-top:10px}
.eq-dado-txt{flex:1 1 240px;min-width:0;display:flex;flex-direction:column;gap:3px}
.eq-dado-txt b{font-size:14.5px;font-weight:700;line-height:1.35}
.eq-dado-txt code{font-size:12.5px;padding:1px 5px;border-radius:6px;background:var(--panel)}
.eq-dado-txt small{font-size:11.5px;color:var(--tinta2);line-height:1.45}
.eq-dado-acc{display:flex;flex-wrap:wrap;gap:8px;flex:0 0 auto}
.eq-dado-acc .boton{padding:7px 12px;font-size:13px;box-shadow:none;text-decoration:none}
/* El estado de las tres firmas. Va pegado a la entrega -en el ticket y en la ficha
   del equipo- porque son los dos lugares donde alguien la tiene enfrente. */
.fr-est{margin-top:12px;padding:14px 16px;border:1px solid var(--borde);border-radius:12px}
.fr-est-tit{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;
  color:var(--tinta3);font-weight:700;margin-bottom:10px}
.fr-est-lista{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px 14px}
.fr-est-r{display:flex;flex-direction:column;gap:1px;min-width:0}
.fr-est-r>span{font-size:11px;text-transform:uppercase;letter-spacing:.04em;
  color:var(--tinta3);font-weight:700}
.fr-est-r>b{font-size:13.5px;font-weight:700;line-height:1.35}
.fr-est-r>small{font-size:11px;color:var(--tinta3)}
.fr-est-r.ok>b{color:var(--verde)}
.fr-est-falta{color:var(--ambar)}
.fr-est-btn{display:inline-block;margin-top:12px;text-decoration:none}
.fr-est-min{margin-top:0}
/* El peso del archivo, al lado del enlace: dice si es una foto o un video de verdad
   antes de abrirlo con datos moviles. */
.hv-peso{display:block;font-size:11px;color:var(--tinta3)}
/* Cuanto falta para cerrar, en UN numero. Habia dos contadores para el mismo ticket
   -"Accesos a otorgar 4 de 5" y "Cierre administrativo 0 de 1"- y ninguno decia el
   total, que es lo que uno quiere saber antes de decidir si puede cerrar. Los dos
   carriles se quedan separados: son cosas distintas, con verbos distintos, y corren
   en paralelo. Lo que se suma es el total. */
.ps-total{background:var(--panel);border:1px solid var(--borde);border-radius:var(--radio);
  padding:16px 20px;box-shadow:var(--s1)}
.ps-total-n{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.ps-total-n>b{font-size:24px;font-weight:750;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.ps-total-n>span{font-size:13px;color:var(--tinta2)}
/* Todo listo se pinta en VERDE y lo dice: un contador completo en el mismo gris que
   uno a medias obliga a leer los numeros para saber si ya se puede cerrar. */
.ps-total.listo{border-color:var(--verde);background:var(--verde-f)}
.ps-total.listo .ps-total-n>b{color:var(--verde)}
.ps-total .ps-barra{margin:0}
/* El video dentro del panel de previsualizacion. El marco del iframe esta pensado
   para una hoja de PDF -alto fijo-; un video se acomoda a su propia proporcion. */
.prev-marco.prev-video{height:auto;background:#000}
.prev-marco.prev-video video{display:block;width:100%;max-height:460px;background:#000}
/* Como entra a la computadora. Va pegado a la entrega porque es lo que hay que
   DECIRLE en ese momento, y se DERIVA de si el equipo esta unido a Entra: en una
   maquina sin unir la contrasena es de una cuenta local y distinta. */
.eq-entra{margin-top:12px;padding:12px 14px;background:var(--marca-suave);
  border-radius:12px}
.eq-entra>span{display:block;font-size:10.5px;text-transform:uppercase;
  letter-spacing:.05em;color:var(--marca2);font-weight:700;margin-bottom:4px}
.eq-entra>p{margin:0;font-size:13px;line-height:1.5}
/* Las fotos de como se recibio el equipo. Cuadricula chica: son constancia, no una
   galeria -se miran para comparar y se abren si hace falta-. */
.fr-fotos{list-style:none;padding:0;margin:0 0 14px;display:grid;
  grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:10px}
.fr-fotos li{margin:0;display:flex;flex-direction:column;gap:3px}
.fr-fotos img{width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:10px;
  border:1px solid var(--borde);display:block}
.fr-fotos small{font-size:11px;color:var(--tinta3)}
.fr-subir{display:flex;flex-direction:column;gap:10px}
/* Cuando firmar, para quien recibe: el documento afirma un hecho fisico. */
.fr-cuando{margin:0 0 12px;padding:11px 13px;background:var(--ambar-f);
  border:1px solid var(--ambar);border-radius:11px;font-size:13px;line-height:1.5}
.eq-cerrar{border-top:1px solid var(--borde);padding-top:14px}
.eq-btn{width:100%}
.eq-mod .eq-bloqueo{margin:0;font-size:13px;color:var(--tinta2)}
/* Lo que pasa DESPUES de registrar: el renglon del checklist lo cierra la firma de
   quien recibe, no este boton. Va debajo y en tinta2 para que no compita con el. */
.eq-nota-firma{margin:9px 0 0;font-size:12px;line-height:1.45;color:var(--tinta2);text-align:center}
.ps-accesos{margin-top:18px;border-top:1px solid var(--borde);padding-top:14px}
.ps-acc-tit{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--tinta3);font-weight:700;margin-bottom:8px}
.ps-nota{font-size:11.5px;color:var(--tinta2);line-height:1.45;margin:-4px 0 9px}
.ps-accesos+.ps-accesos{margin-top:16px}
/* Quien administra un sistema que la Mesa NO da (Nimbo, Estela). Ambar y no rojo:
   no es una alarma, es un tramite que depende de alguien mas — el mismo criterio
   que el domicilio pendiente de visto bueno. */
.ps-ref{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
  margin-top:12px;padding:10px 12px;border:1px solid var(--ambar-b,#F0D9A8);
  background:var(--ambar-f,#FDF6E7);border-radius:10px}
.ps-ref>div{flex:1 1 220px;min-width:0}
.ps-ref b{display:block;font-size:13px;line-height:1.35}
.ps-ref small{display:block;color:var(--tinta2);font-size:12px;margin-top:3px;line-height:1.45}
.ps-barra{height:6px;border-radius:99px;background:var(--borde);overflow:hidden;margin-bottom:12px}
.ps-barra i{display:block;height:100%;background:var(--verde);border-radius:99px;transition:width .3s ease}
.ps-acc{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 0;
  border-bottom:1px solid var(--borde-suave,#EEF2F5);flex-wrap:wrap}
.ps-acc>.ps-acc-txt{flex:1 1 190px}
.ps-acc:last-child{border-bottom:none}
.ps-acc-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
.ps-acc-txt b{font-size:14px}
.ps-acc-txt small{font-size:11.5px;color:var(--tinta3)}
.ps-acc.listo .ps-acc-txt b{color:var(--verde)}
.ps-acc.listo .ps-acc-txt b::before{content:'✓ ';font-weight:800}
.campos-2{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}
.pista{display:block;margin-top:5px;color:var(--tinta3);font-size:12px;line-height:1.4}
.pista-mal{color:var(--rojo);font-weight:600}
input.mal{border-color:var(--rojo)}
/* auto-fit y no 3 fijas: quien no puede dar de baja ve dos opciones, y con
   columnas fijas la tercera dejaba un hueco vacío a la derecha. */
.tipo-sol{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.tipo-sol input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px;margin:0;padding:0}
.tipo-sol label{display:flex;flex-direction:column;gap:3px;padding:13px 15px;cursor:pointer;
  border:1.5px solid var(--borde);border-radius:12px;background:var(--panel);transition:all .12s ease}
.tipo-sol label:hover{border-color:var(--marca2)}
.tipo-sol label{position:relative}
.ico-tipo{width:26px;height:24px;color:var(--tinta3);margin-bottom:5px;transition:color .12s ease}
.tipo-sol label b{font-size:14px}
.tipo-sol label small{color:var(--tinta2);font-size:12px;line-height:1.4}
/* Semaforo por tipo (pedido del dueño): verde entra, rojo sale, ambar cambia.
   El color confirma de un vistazo que se eligio lo correcto — una baja marcada
   como alta duele. Coincide con el semaforo de estados del resto del sistema. */
#tp-alta:checked+label{border-color:var(--verde);background:linear-gradient(120deg,rgba(23,150,107,.07),rgba(23,150,107,.13))}
#tp-alta:checked+label b,#tp-alta:checked+label .ico-tipo{color:var(--verde)}
#tp-baja:checked+label{border-color:var(--rojo);background:linear-gradient(120deg,rgba(209,72,55,.06),rgba(209,72,55,.12))}
#tp-baja:checked+label b,#tp-baja:checked+label .ico-tipo{color:var(--rojo)}
#tp-cambio:checked+label{border-color:var(--ambar);background:linear-gradient(120deg,rgba(217,165,20,.08),rgba(217,165,20,.14))}
#tp-cambio:checked+label b,#tp-cambio:checked+label .ico-tipo{color:#8C6A10}
.accesos-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:9px}
.otro-sistema{margin-top:14px}
.ia-vieja{margin:0;padding:10px 16px;font-size:12.5px;line-height:1.5;color:#8A5A12;
  background:#FBF0DE;border-bottom:1px solid #E0B475}
.ia-vieja b{display:block;margin-bottom:2px}
.asientos-form{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;margin:0}
.asientos-form label{display:flex;flex-direction:column;gap:4px;font-size:12.5px;font-weight:600;color:var(--tinta2)}
.asientos-form input{width:100px}
.prop-caja{border-left:3px solid var(--marca2)}
.prop{display:flex;flex-wrap:wrap;gap:10px;align-items:center;padding:11px 0;border-top:1px solid var(--borde)}
.prop:first-of-type{border-top:0}
.prop-txt{flex:1;min-width:220px}
.prop-txt b{display:block;font-size:14px;line-height:1.5;font-weight:600}
.prop-txt small{display:block;margin-top:3px;font-size:12px;color:var(--tinta3)}
.prop-btn{display:flex;gap:7px}
.ps-cuenta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;margin:0 0 12px;
  padding:10px 13px;border-radius:var(--radio-sm);background:var(--marca-suave);
  border:1px solid rgba(15,108,196,.22)}
.ps-cuenta-et{flex:0 0 100%;font-size:10.5px;font-weight:700;letter-spacing:.5px;
  text-transform:uppercase;color:var(--marca)}
.ps-cuenta code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13.5px;
  font-weight:600;color:var(--tinta);word-break:break-all}
.ps-copiar{margin-left:auto;border:1px solid rgba(15,108,196,.3);background:var(--panel);
  color:var(--marca);border-radius:8px;padding:5px 11px;font-size:12.5px;font-weight:600;
  cursor:pointer;font-family:inherit}
.ps-copiar:hover{background:var(--fondo2)}
.ps-copiar:focus-visible{outline:2px solid var(--marca);outline-offset:2px}
.ps-cuenta-falta{background:var(--ambar-f,#FBF0DE);border-color:#E0B475}
.ps-cuenta-falta .ps-cuenta-et{color:#8A5A12}
.ps-cuenta-falta span:not(.ps-cuenta-et){font-size:13px;color:var(--tinta2)}
/* Una burbuja que acaba de llegar entra con un gesto corto: lo justo para que el
   ojo la registre sin que parezca que la pagina se movio sola. */
@keyframes llega{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}
.recien{animation:llega .22s ease-out}
@media(prefers-reduced-motion:reduce){.recien{animation:none}}
/* Campana. Sin JS para abrir y cerrar: <details> lo hace solo y funciona con
   teclado. El JS solo actualiza el número, y si no corre, el conteo sigue siendo
   correcto al cargar la página — degrada a lo que había antes, no a nada. */
.campana{position:relative;margin-right:2px}
.campana summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:center;
  width:34px;height:34px;border-radius:10px;color:var(--tinta2);position:relative;
  border:1px solid transparent;transition:background .14s,border-color .14s}
.campana summary::-webkit-details-marker{display:none}
.campana summary:hover{background:var(--fondo2);border-color:var(--borde)}
.campana summary:focus-visible{outline:2px solid var(--marca);outline-offset:2px}
.camp-n{position:absolute;top:1px;right:1px;min-width:16px;height:16px;padding:0 4px;
  border-radius:99px;background:#C4453A;color:#fff;font-size:10.5px;font-weight:800;
  display:flex;align-items:center;justify-content:center;line-height:1;
  box-shadow:0 0 0 2px var(--panel)}
.camp-n[hidden]{display:none}
.camp-caja{position:absolute;right:0;top:40px;width:min(320px,calc(100vw - 28px));z-index:60;
  background:var(--panel);border:1px solid var(--borde);border-radius:14px;padding:10px;
  box-shadow:0 4px 12px rgba(11,26,38,.09),0 18px 40px rgba(11,26,38,.12)}
/* En el teléfono la campana NO está a la derecha de la cabecera: la cabecera se
   parte en tres filas y el timbre queda a media fila, con su borde derecho en
   x=141 de 375. El panel colgaba de ESE borde, así que sus 320 px se iban hacia
   la izquierda y empezaba en x=-179: media notificación fuera de la pantalla, con
   los asuntos cortados justo por donde dicen de qué se trata.
   Aquí se ancla al ancho de la pantalla y no a la campana. El 'top' es fijo
   porque el timbre siempre va en la primera fila de la cabecera, que está pegada
   arriba; lo que cambia con las filas es el alto de la cabecera, no eso. */
@media (max-width:640px){
  .camp-caja{position:fixed;left:10px;right:10px;top:48px;width:auto;
    max-height:calc(100dvh - 62px);overflow-y:auto}
}
.camp-tit{font-size:10.5px;font-weight:600;letter-spacing:.7px;text-transform:uppercase;
  color:var(--tinta3);padding:4px 8px 8px}
.camp-item{display:flex;gap:10px;align-items:flex-start;padding:9px 8px;border-radius:9px;
  text-decoration:none;color:inherit;line-height:1.45}
/* Cada categoría es una TARJETA, no una lista con rayitas: el encabezado sobre
   el tono y los suyos dentro, sobre la superficie del panel. Es el patrón de las
   listas agrupadas de iOS, y funciona porque la caja es la que agrupa — el color
   solo dice de qué clase es. Dos tonos, no seis: con un color por grupo esto se
   vuelve un semáforo descompuesto y ninguno significa nada.
     ámbar → detiene a alguien más hasta que tú decidas (las firmas)
     azul  → algo que tienes que hacer tú
   El tono se declara UNA vez en el contenedor y todo lo de dentro lo hereda por
   variable; así agregar un tercero algún día es una línea, no seis reglas. */
.camp-grupo{--t:var(--marca);--tf:var(--marca-suave);
  background:var(--tf);border-radius:14px;padding:3px;margin-bottom:7px}
.camp-grupo.g-firma{--t:var(--ambar);--tf:var(--ambar-f)}
.camp-grupo:last-child{margin-bottom:0}
.camp-item{padding:9px 11px 8px;font-size:13px;font-weight:600;letter-spacing:-.15px;border-radius:11px}
.camp-item:hover{background:rgba(255,255,255,.45);text-decoration:none}
.camp-item .camp-ico{color:var(--t)}
/* La lista interior va sobre el panel: ese contraste es lo que hace que se lean
   como "los de esta categoría" y no como pendientes sueltos. */
.camp-lista{background:var(--panel);border-radius:11px;overflow:hidden}
.camp-sub{padding:9px 11px;border-radius:0}
.camp-sub + .camp-sub{border-top:1px solid var(--borde2)}
.camp-mas{border-top:1px solid var(--borde2);padding:7px 11px;color:var(--t)}
.ico{width:16px;height:16px;flex:none;display:block}
.camp-ico{flex:0 0 auto;display:flex;align-items:center;height:19px;color:var(--tinta3)}
.camp-item:hover .camp-ico{color:var(--marca)}
.camp-nada{margin:0;padding:4px 8px 10px;font-size:13px;color:var(--tinta3);line-height:1.5}
/* El detalle de cada pendiente. El encabezado del grupo sigue siendo el enlace a
   la lista completa; debajo van los primeros con su asunto, que es lo que decide
   si abres ahora o el lunes. Sangrados bajo el ícono para que se lea como lo que
   son: el desglose de la línea de arriba, no seis pendientes sueltos. */
.camp-sub{display:flex;gap:10px;align-items:baseline;border-radius:8px;
  color:var(--tinta2);text-decoration:none;line-height:1.4}
.camp-sub:hover{background:var(--fondo2);text-decoration:none;color:var(--tinta)}
.camp-et{flex:0 0 auto;min-width:4.6em;font-size:11.5px;font-weight:500;color:var(--tinta3);
  font-variant-numeric:tabular-nums}
/* Los folios y las etiquetas de activo van en monoespaciada, como en el resto del
   sistema: un identificador en la tipografía del texto se lee como prosa y estorba;
   en mono se lee como lo que es, un código, y de paso alinea columnas solo. */
.camp-et.cod{font-family:ui-monospace,SFMono-Regular,'SF Mono',Menlo,monospace;
  font-size:11px;letter-spacing:-.3px}
/* El asunto se corta con puntos suspensivos en vez de romper la caja: el título
   completo queda en el title=, que es donde no estorba. */
.camp-que{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;
  font-size:13px;font-weight:400;color:var(--tinta2)}
.camp-sub.urge .camp-et{color:var(--rojo)}
.camp-sub.urge .camp-que{color:var(--rojo)}
.camp-mas{display:block;font-size:11.5px;font-weight:600;letter-spacing:-.1px;text-decoration:none}
.camp-mas:hover{text-decoration:underline}
/* Íconos en línea con texto. Un emoji se sentaba solo sobre la línea base; un
   vector hay que bajarlo a mano, y a cambio hereda el color y mide lo mismo en
   cualquier máquina. */
.hero .pulso-op a{display:inline-flex;align-items:center;gap:7px}
.hero .pulso-op .ico{width:15px;height:15px}
.riesgo h3{display:flex;align-items:center;gap:7px}
.riesgo h3 .ico{width:16px;height:16px;flex:none}
/* El mismo desajuste del aviso de aprobaciones: este <b> lleva texto detrás en la
   MISMA linea, y un inline-flex con align-items:center no expone linea base, asi que
   la frase que sigue quedaba unos pixeles mas abajo. '.tb-ok-linea' si puede seguir
   siendo flex: ocupa su propio renglon y nada la acompana. */
.tb-ok-linea{display:inline-flex;align-items:center;gap:7px}
.tb-ok b .ico{display:inline-block;vertical-align:-3px;margin-right:7px}
.tb-ok .ico,.tb-ok-linea .ico{width:16px;height:16px;color:var(--verde)}
.kpi .pie .ico{width:13px;height:13px;color:var(--marca2)}
@media(max-width:860px){.camp-caja{right:-6px}}
/* Copiar sin sacar el mouse del dato: el nombre del colaborador se teclea a mano
   en Entra, en Nimbo y en el correo de bienvenida, y cada vez que se teclea puede
   escribirse distinto. Se ve como texto normal hasta que el cursor lo toca. */
/* Consultas dirigidas. La que es PARA TI va en ámbar y arriba de todo: si alguien
   entra por el correo, lo primero que tiene que encontrar es la pregunta. */
.oculto{display:none}
.aviso-reservado{margin:0 0 14px;padding:10px 12px;font-size:12.5px;line-height:1.5;
  background:var(--fondo2);border:1px dashed var(--borde);border-radius:10px;color:var(--tinta2)}
.cons{border-radius:12px;padding:14px 16px;margin:0 0 12px;border:1px solid var(--borde)}
.cons b{display:block;font-size:14px;margin-bottom:4px}
.cons-q{margin:0 0 10px;font-size:13.5px;color:var(--tinta2);white-space:pre-wrap}
.cons small{display:block;font-size:12px;color:var(--tinta3);margin-top:6px}
.cons-mia{background:var(--ambar-f,#FBF0DE);border-color:#E0B475}
.cons-mia b{color:#8A5A12}
.cons-mia textarea{width:100%;font:inherit;padding:9px 11px;border:1px solid var(--borde);
  border-radius:9px;background:var(--panel);color:inherit;resize:vertical}
.cons-mia button{margin-top:8px}
.cons-espera{background:var(--fondo2);border-style:dashed}
.cons-lista{background:var(--fondo2);opacity:.85}
.cons-pedir{margin:0 0 14px}
.cons-pedir>summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--marca2);
  padding:8px 0;list-style:none;display:inline-flex;align-items:center;gap:6px}
.cons-pedir>summary::-webkit-details-marker{display:none}
.cons-pedir>summary::before{content:'+';font-size:16px;line-height:1}
.cons-pedir[open]>summary::before{content:'−'}
/* La marca de obligatorio. Va como <abbr> con title para que diga POR QUÉ lo es
   —"para poder mandarlo a firma"— en vez de ser un asterisco mudo, y sin borde
   punteado, que ensucia una etiqueta. */
.oblig{color:var(--rojo);font-weight:700;text-decoration:none;cursor:help;margin-left:1px}
/* El domicilio solo es obligatorio en un alta O UN CAMBIO QUE PIDE EQUIPO: es ahí
   donde el dato hace falta -donde vive el equipo- y donde su ausencia frena la
   entrega. El cambio se sumó el 10-sep-2026: colgaba solo de #tp-alta, y un cambio
   a corporativo entrega equipo igual que un alta.
   La marca aparece con la casilla, sin JavaScript, igual que el resto de esta
   pantalla. Un asterisco fijo mentiría la mayor parte del tiempo, y una marca
   que miente enseña a ignorarlas todas. */
.oblig-si{display:none}
body:has(:is(#tp-alta,#tp-cambio):checked):has(input[name="equipo_computo"]:checked) .oblig-si{display:inline}
/* El campo que faltó, marcado donde está. El aviso de arriba dice QUÉ falta; en
   un formulario de seis pasos eso deja a la persona recorriéndolos a ver cuál.
   Borde y no relleno: el relleno rojo sobre un campo vacío se lee como error de
   lo escrito, y aquí no hay nada escrito -es justamente el punto. */
.campo-falta>label{color:var(--rojo)}
.campo-falta input,.campo-falta select,.campo-falta textarea{border-color:var(--rojo)}
.campo-falta input:focus,.campo-falta select:focus{outline-color:var(--rojo)}
/* Abierto, esto era un formulario DESNUDO sobre el fondo de la página, mientras
   todo lo demás del ticket vive en tarjetas: por eso se veía amontonado y suelto
   a la vez. Ahora al abrirse se vuelve su propio panel, con aire y con el texto
   a un ancho que se lee. */
.cons-pedir[open]{background:var(--fondo2);border:1px solid var(--borde);
  border-radius:14px;padding:2px 16px 16px;margin-bottom:18px}
.cons-pedir[open]>summary{margin-bottom:2px}
.cons-nota{font-size:12.5px;color:var(--tinta3);margin:0 0 8px;line-height:1.55;max-width:62ch}
/* La garantía de privacidad va aparte y no dentro del párrafo: es lo que decide
   si alguien se anima a usar esto, y enterrada a la mitad no la leía nadie. */
.cons-priv{display:flex;gap:8px;align-items:flex-start;margin:0 0 16px;max-width:62ch;
  font-size:12.5px;line-height:1.5;color:var(--tinta2)}
.cons-priv .ico{width:15px;height:15px;flex:none;margin-top:2px;color:var(--verde)}
.cons-priv b{color:var(--tinta);font-weight:650}
.cons-form label{display:block;font-size:12.5px;font-weight:650;color:var(--tinta2);margin-bottom:5px}
.cons-form .campo{margin-bottom:14px}
.cons-form button{margin-top:2px}
.cons-pedir textarea,.cons-pedir select{width:100%;font:inherit;padding:9px 11px;
  border:1px solid var(--borde);border-radius:9px;background:var(--panel);color:inherit}
.cons-pedir textarea{resize:vertical}
.d-copiable{font:inherit;color:inherit;background:none;border:0;padding:0;text-align:left;
  cursor:pointer;border-bottom:1px dashed transparent;transition:border-color .15s,color .15s}
.d-copiable:hover,.d-copiable:focus-visible{color:var(--marca);border-bottom-color:var(--marca)}
.d-copiable:focus-visible{outline:2px solid var(--marca);outline-offset:3px;border-radius:3px}
.d-copiable::after{content:'copiar';margin-left:7px;font-size:10.5px;font-weight:600;
  text-transform:uppercase;letter-spacing:.05em;color:var(--tinta3);opacity:0;transition:opacity .15s}
.d-copiable:hover::after,.d-copiable:focus-visible::after{opacity:1}
.d-copiable.copiado{color:var(--verde,#2C7A5B);border-bottom-color:transparent}
.d-copiable.copiado::after{content:'copiado';color:var(--verde,#2C7A5B);opacity:1}
@media (hover:none){ .d-copiable::after{opacity:1} }
.d-copiar b a{color:inherit;text-decoration:none;border-bottom:1px dashed var(--borde)}
.d-copiar b a:hover{color:var(--marca);border-bottom-color:var(--marca)}
.adm-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:12px;margin-bottom:22px}
.adm{display:flex;flex-direction:column;gap:5px;padding:16px 18px;background:var(--panel);
  border:1px solid var(--borde);border-radius:var(--radio-sm);text-decoration:none;color:inherit;
  transition:border-color .16s,transform .16s,box-shadow .16s}
.adm:hover{border-color:var(--marca2);transform:translateY(-1px);text-decoration:none;
  box-shadow:0 2px 6px rgba(15,108,196,.08),0 8px 20px rgba(15,108,196,.08)}
.adm-t{font-weight:700;font-size:15.5px}
.adm-d{font-size:13px;color:var(--tinta2);line-height:1.5}
.adm-n{margin-top:4px;font-size:12px;color:var(--tinta3);font-variant-numeric:tabular-nums}
.adm-n.alta{color:var(--marca);font-weight:600}
.pie-adm{font-size:13px;color:var(--tinta3);line-height:1.9;padding-left:14px;
  border-left:2px solid var(--borde)}
.chip-fijo{display:inline-block;padding:6px 12px;border-radius:99px;background:var(--fondo2);
  border:1px solid var(--borde);font-size:13px;font-weight:600;color:var(--tinta2)}
/* Cómo se entra a cada sistema. Un renglón por sistema, cada uno su propio form:
   guardar uno no toca a los demás, que es lo que se espera cuando cada renglón
   trae su botón. El nombre manda y ocupa su columna fija, para que la vista sea
   una lista de sistemas y no una hilera de controles. */
.ing-fila{display:grid;grid-template-columns:140px auto minmax(150px,1fr) minmax(140px,1fr) auto;gap:12px;align-items:center;
  padding:12px 0;border-bottom:1px solid var(--borde)}
.ing-fila:last-child{border-bottom:0;padding-bottom:0}
.ing-fila b{font-size:14px}
.ing-chk{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--tinta2);
  white-space:nowrap;cursor:pointer}
.ing-chk input{margin:0;cursor:pointer}
.ing-fila select,.ing-fila input[type=text],.ing-fila input:not([type]){font-size:13px;padding:7px 10px;width:100%}
.ing-aviso{grid-column:1/-1;font-size:12px;color:var(--ambar);margin-top:-2px}
@media(max-width:700px){
  .ing-fila{grid-template-columns:1fr;gap:8px}
  .ing-fila b{font-size:15px}
}

.tabla-sis{width:100%;border-collapse:collapse;font-size:14px}
.tabla-sis th{text-align:left;font-size:11px;letter-spacing:.5px;text-transform:uppercase;
  color:var(--tinta3);font-weight:700;padding:0 10px 8px 0;border-bottom:1px solid var(--borde)}
.tabla-sis td{padding:10px 10px 10px 0;border-bottom:1px solid var(--borde);vertical-align:middle}
.tabla-sis tr.apagado{opacity:.5}
.tabla-sis .num{font-variant-numeric:tabular-nums;text-align:right;padding-right:18px}
.tabla-sis .fech{font-size:12px;color:var(--tinta3);white-space:nowrap}
.tabla-sis .fech small{display:block;font-size:11px}
.sis-ren{display:flex;gap:7px;margin:0;min-width:230px}
.sis-ren input{flex:1;min-width:130px}
.chip-off{font-size:11px;padding:1px 7px;border-radius:99px;background:var(--fondo2);
  border:1px solid var(--borde);color:var(--tinta3);font-weight:600}
@media(max-width:760px){
  .tabla-sis,.tabla-sis tbody,.tabla-sis tr,.tabla-sis td{display:block;width:100%}
  .tabla-sis thead{display:none}
  .tabla-sis tr{border-bottom:1px solid var(--borde);padding:10px 0}
  .tabla-sis td{border:0;padding:3px 0}
  .tabla-sis .num::before{content:'Pedido: ';color:var(--tinta3)}
}
/* El icono del titulo de "Sin buzon". display:inline-block EXPLICITO: la clase global
   .ico trae display:block, y sobre un bloque vertical-align no hace nada — el simbolo
   se iba a su propio renglon encima del titulo. Medido en el navegador. Y el selector
   va acotado a esta tarjeta y no a .tarjeta h3 svg, que alcanzaria a cualquier titulo
   con icono del resto de la aplicacion. */
.sin-buzon h3 svg{display:inline-block;vertical-align:-3px;margin-right:6px}
/* Quien tiene cuenta y nunca ha entrado. Mismo cuidado con el icono: la clase global
   .ico trae display:block y sobre un bloque vertical-align no hace nada. */
.avisar h3 svg{display:inline-block;vertical-align:-3px;margin-right:6px}
.avisar-lista{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
.avisar-uno{border:1px solid var(--borde);border-radius:9px;padding:7px 10px;
  font-size:13px;font-weight:600;line-height:1.3;min-width:0}
.avisar-uno small{display:block;font-weight:400;font-size:11.5px;color:var(--tinta3);
  word-break:break-all}
.puesto-nom small{display:block;font-size:11px;color:var(--tinta3);font-weight:400}
.puestos-grid{display:flex;flex-direction:column;gap:7px}
.puesto-fila{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin:0}
/* El renglon vacio se senala: es lo que hay que llenar, no un renglon mas. */
.puesto-fila.falta input{border-color:var(--ambar);background:var(--ambar-f)}
.puesto-fila.falta .puesto-nom{color:var(--ambar)}
.puesto-nom{flex:0 0 210px;font-size:13.5px;font-weight:600}
.puesto-fila input{flex:1;min-width:180px}
.lista-permiso{list-style:none;padding:0;margin:0 0 10px;display:flex;flex-direction:column;gap:7px}
.lista-permiso li{padding:9px 12px;background:var(--fondo2);border-radius:var(--radio-sm);
  border-left:3px solid var(--marca)}
.lista-permiso small{display:block;color:var(--tinta3);font-size:12px;margin-top:1px}
.cifras-exc{display:flex;gap:12px;margin:16px 0}
.cifras-exc>div{flex:1;background:var(--panel);border:1px solid var(--borde);
  border-radius:var(--radio-sm);padding:14px 16px;display:flex;flex-direction:column;gap:2px}
.cifras-exc b{font-size:26px;line-height:1;font-variant-numeric:tabular-nums}
.cifras-exc span{font-size:12.5px;color:var(--tinta3)}
.exc{padding:14px 16px}
.exc-cab{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 12px;margin-bottom:6px}
.exc-cab time{font-size:12.5px;color:var(--tinta3);font-variant-numeric:tabular-nums}
.exc-folio{font-weight:600;font-size:13px}
.exc-tit{font-size:13px;color:var(--tinta2);flex:1;min-width:160px}
.exc-quien{font-size:14.5px}
.exc-det{margin:5px 0 0;font-size:13px;color:var(--tinta2);line-height:1.5}
.chip-sola{background:#FDECEC;color:#992A1E;border:1px solid #DCA097}
.chip-supl{background:#FAEEDC;color:#9A5B08;border:1px solid #E0B475}
.accesos-grid input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px;margin:0;padding:0}
.accesos-grid label{text-align:center;padding:11px 8px;cursor:pointer;font-weight:600;font-size:14px;
  border:1.5px solid var(--borde);border-radius:11px;background:var(--panel);transition:all .12s ease}
.accesos-grid label:hover{border-color:var(--marca2)}
/* Lo ya otorgado se ve marcado y no se puede soltar: es un hecho, no una casilla. */
.corregir-acc .accesos-grid{margin-top:4px}
.corregir-acc .acc-dado{opacity:.62;cursor:not-allowed;border-style:dashed}
.accesos-grid input:checked+label{border-color:var(--marca);color:var(--marca);
  background:linear-gradient(120deg,rgba(30,155,224,.10),rgba(43,211,226,.12))}
.aviso-datos{border-left:3px solid var(--marca2)}
.nota-privacidad{font-size:12.5px;color:var(--tinta2);line-height:1.55;margin:-4px 0 16px;
  background:var(--fondo2);border-radius:10px;padding:11px 13px}
.nota-cambio{background:var(--ambar-f);color:var(--tinta);
  border-left:3px solid var(--ambar)}
@media (max-width:640px){.campos-2,.tipo-sol{grid-template-columns:1fr}}
/* Dentro de su tarjeta las opciones ya no necesitan pesar tanto: el borde de la
   tarjeta es el que contiene, y las tarjetitas de adentro pueden ser más ligeras.
   Sin margen inferior porque ahora lo pone el padding de la tarjeta. */
.tar-modo{padding-bottom:18px}
.tar-modo .paso{position:relative;justify-content:flex-start}
.modo-sel{display:grid;grid-template-columns:repeat(auto-fit,minmax(238px,1fr));gap:12px;margin-bottom:0}
/* El botón de volver a empezar. Solo aparece cuando hay algo elegido: antes de
   eso no hay nada que deshacer y sería una instrucción sin sentido. */
.modo-nada{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px}
.modo-limpiar{display:none;margin-left:auto;align-self:center;cursor:pointer;
  font-size:12px;font-weight:600;color:var(--tinta2);padding:4px 11px;border-radius:99px;
  border:1px solid var(--borde);background:var(--panel);transition:border-color .15s,color .15s}
.modo-limpiar:hover{border-color:var(--marca2);color:var(--marca)}
.modo-sel input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px;margin:0;padding:0}
.modo-sel label{display:flex;gap:14px;align-items:flex-start;padding:16px 18px;cursor:pointer;
  border:1.5px solid var(--borde);border-radius:14px;background:var(--panel);transition:all .12s ease;position:relative}
.modo-sel label:hover{border-color:var(--marca2)}
.tar-modo .modo-sel label{background:var(--fondo2);box-shadow:none;padding:14px 15px}
.tar-modo .modo-sel label:hover{background:var(--panel)}
.modo-sel .mi{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;
  justify-content:center;flex:0 0 auto;transition:all .12s ease}
.modo-sel .mi-falla{background:rgba(30,155,224,.11);color:var(--marca)}
.modo-sel .mi-personal{background:rgba(110,91,230,.11);color:#6E5BE6}
/* "Pedir un acceso" y "Alta, baja o cambio" quedan lado a lado y son fáciles de
   confundir: se distinguen por color, no solo por el texto. */
.modo-sel .mi-acceso{background:rgba(43,211,226,.13);color:#0E8FA0}
.mi-equipo{background:rgba(110,91,230,.11);color:#6E5BE6}
.modo-sel .mt{display:flex;flex-direction:column;gap:4px;min-width:0}
.modo-sel label b{font-size:15px}
.modo-sel label small{color:var(--tinta2);font-size:12.5px;line-height:1.45}
/* ELEGIDO: borde de color, fondo teñido y una sombra suave — pedido del dueño,
   "porque se ve más". La tarjeta marcada tiene que destacar sobre las otras tres,
   no confundirse con ellas.
   La palomita SÍ va, pero en la esquina del ÍCONO y no arriba a la derecha. En
   esa posición se encimaba con el título ("Reportar una falla" se metía debajo) y
   además se perdía; sobre el ícono se ve, no estorba a nada y no le quita ancho
   al texto. El aro del color de la tarjeta la despega del dibujo.
   El ícono se queda PÁLIDO: llenarlo de color competía con la palomita y con el
   título, y volvía a hacer que la tarjeta elegida gritara. */
.tar-modo .modo-sel input:checked+label::after{top:44px;right:auto;left:47px;
  width:18px;height:18px;font-size:11px;box-shadow:0 0 0 2.5px var(--fondo2)}
.modo-sel input:checked+label::after{content:'✓';position:absolute;border-radius:50%;
  color:#fff;font-weight:800;display:flex;align-items:center;justify-content:center}
#modo-falla:checked+label{border-color:var(--marca);
  background:linear-gradient(120deg,rgba(30,155,224,.09),rgba(43,211,226,.11));
  box-shadow:0 2px 10px rgba(30,155,224,.16)}
#modo-falla:checked+label b{color:var(--marca)}
#modo-falla:checked+label::after{background:var(--marca)}
#modo-acceso:checked+label{border-color:#0E8FA0;
  background:linear-gradient(120deg,rgba(43,211,226,.08),rgba(14,143,160,.12));
  box-shadow:0 2px 10px rgba(14,143,160,.16)}
#modo-acceso:checked+label b{color:#0E8FA0}
#modo-acceso:checked+label::after{background:#0E8FA0}
#modo-personal:checked+label,#modo-equipo:checked+label{border-color:#6E5BE6;
  background:linear-gradient(120deg,rgba(110,91,230,.07),rgba(151,120,246,.12));
  box-shadow:0 2px 10px rgba(110,91,230,.16)}
#modo-personal:checked+label b,#modo-equipo:checked+label b{color:#6E5BE6}
#modo-personal:checked+label::after,#modo-equipo:checked+label::after{background:#6E5BE6}
/* El modo se resuelve con :has() (Safari 15.4+, Chrome 105+, Firefox 121+).
   En un navegador sin soporte, ocultar por defecto dejaría a RH sin formulario.
   Por eso se oculta SOLO si :has() existe; si no, se muestra todo y el servidor decide. */
.fin-form{display:flex;align-items:center;gap:14px;margin:4px 0 30px}
/* Los pasos se numeran solos. Antes el número iba escrito en el HTML y el
   mismo "Descríbelo" tenía que ser el 2 en una falla, el 3 al pedir equipo y
   el 5 en alta/baja/cambio: salían dos pasos "2" en la misma pantalla. Un
   contador de CSS no cuenta las tarjetas ocultas (display:none no incrementa),
   así que cada camino queda numerado 1,2,3… solo con lo que se ve. */
.form-ticket{counter-reset:paso}
.form-ticket .paso{counter-increment:paso}
.form-ticket .paso .num::before{content:counter(paso)}
@supports selector(html:has(*)){
  /* Revelacion progresiva: NADA nace preseleccionado y cada respuesta descubre
     el siguiente paso. La leccion es de SOP-2026-0001: 'Reportar una falla'
     venia marcado por defecto, RH nunca eligio camino, y un cambio de personal
     acabo capturado como falla — sin aprobacion ni palomeo. El sistema no debe
     elegir por la persona. */
  .solo-falla,.blq-personal,.blq-acceso,.blq-equipo,.fin-form{display:none}
  body:has(.modo-sel input:checked) .modo-limpiar{display:inline-flex}
  /* elegir FALLA descubre las categorias… */
  body:has(#modo-falla:checked) .solo-falla.paso-cat{display:block}
  /* …y elegir categoria descubre el resto de la falla y el boton */
  body:has(#modo-falla:checked):has(input[name="categoria_id"]:checked) .solo-falla{display:block}
  body:has(#modo-falla:checked):has(input[name="categoria_id"]:checked) .fin-form{display:flex}
  /* elegir PERSONAL descubre el tipo (alta/baja/cambio)… */
  body:has(#modo-personal:checked) .blq-personal.paso-tipo{display:block}
  /* …y elegir tipo descubre el resto y el boton */
  body:has(#modo-personal:checked):has(input[name="tipo"]:checked) .blq-personal{display:block}
  body:has(#modo-personal:checked):has(input[name="tipo"]:checked) .fin-form{display:flex}
  /* Pedir un acceso PARA UNO MISMO no tiene tipos: al elegir el modo ya está
     completo. Vive en su propio #modo-acceso y no colgado de #modo-personal,
     que es lo que hacía que quien administra personal se quedara sin la opción:
     los dos selectores eran excluyentes y uno perdió la tarjeta. RH, dirección
     y supervisores no tenían por dónde pedir un acceso para ellos. */
  body:has(#modo-acceso:checked) .blq-acceso{display:block}
  body:has(#modo-acceso:checked) .fin-form{display:flex}
  /* Quien tiene gente a su cargo dice para quién; la lista y la nota de quién firma
     dependen de la respuesta. Sin respuesta no se pinta ninguna de las dos notas: las
     dos serían ciertas para uno de los casos y falsas para el otro. */
  .accp-quien,.accp-nota-yo,.accp-nota-equipo{display:none}
  body:has(#accp-equipo:checked) .accp-quien{display:block}
  body:has(#accp-yo:checked) .accp-nota-yo{display:block}
  body:has(#accp-equipo:checked) .accp-nota-equipo{display:block}
  /* Tercer modo: solicitar equipo. Mismas reglas que los otros — revelación
     progresiva y nada preseleccionado. */
  body:has(#modo-equipo:checked) .blq-equipo.paso-mov{display:block}
  body:has(#modo-equipo:checked):has(input[name="eq_movimiento"]:checked) .blq-equipo{display:block}
  body:has(#modo-equipo:checked):has(input[name="eq_movimiento"]:checked) .fin-form{display:flex}
  /* En una BAJA la persona YA trabaja aquí: se elige de la lista en vez de
     escribir su nombre. Así el vínculo con su cuenta es exacto y la mesa sabe
     de inmediato qué equipo tiene en resguardo. En un alta todavía no existe,
     así que ahí sigue siendo texto libre. */
  .solo-baja{display:none}
  body:has(#tp-baja:checked) .solo-baja{display:block}
  /* "Otro" abre el campo donde se escribe qué herramienta es. */
  .otro-sistema{display:none}
  .accesos-grid:has(.chk-otro:checked)+.otro-sistema{display:block}
  body:has(#tp-baja:checked) .no-baja{display:none}
  /* los bloques aparecen con una entrada suave, no de golpe */
  .solo-falla,.blq-personal,.fin-form{animation:aparece .3s ease}
  @keyframes aparece{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
}
@supports not selector(html:has(*)){
  .blq-equipo{display:block}
  .modo-sel{display:none}   /* sin :has() el selector de modo no haría nada */
  .blq-personal{display:block}
  .blq-acceso{display:block}
  .accp-quien,.accp-nota-yo,.accp-nota-equipo{display:block}
  /* Estos campos también se revelan con :has(). Sin soporte quedarían inalcanzables
     (una casilla que no hace nada), así que se muestran siempre. */
  .cuenta-otra-inp{display:block}
  .anombre-campos{display:block}
  .otro-sistema{display:block}
  /* Sin :has() se muestran AMBOS campos del colaborador: el de texto y el
     selector. Feo pero utilizable; esconder uno dejaría la baja sin a quién
     apuntar. El servidor decide cuál usar según el tipo. */
  .solo-baja{display:block}
  /* Igual el campo de "quien lo otorga" y el bloque de accesos del cliente: sin
     :has() quedarian inalcanzables, y de ese nombre depende poder pedir la
     revocacion el dia de la baja. */
  .otg-quien{display:block}
  .blq-cliente{display:block}
}
@media (max-width:640px){.modo-sel{grid-template-columns:1fr}}
.org-celda{display:flex;flex-direction:column;gap:7px;min-width:190px}
.org-celda form{margin:0;display:flex;flex-direction:column;gap:2px}
.org-celda label{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--tinta3);font-weight:700}
.org-celda select{width:100%;font-size:13px;padding:5px 8px}
.cuenta-seg{display:flex;flex-wrap:wrap;gap:8px}
.cuenta-seg input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px;margin:0;padding:0}
.cuenta-seg label{padding:9px 15px;border:1.5px solid var(--borde);border-radius:11px;font-weight:600;font-size:14px;cursor:pointer;transition:all .12s ease;background:var(--panel)}
.cuenta-seg label:hover{border-color:var(--marca2)}
.cuenta-seg input:checked+label{border-color:var(--marca);background:linear-gradient(120deg,rgba(30,155,224,.10),rgba(43,211,226,.12));color:var(--marca);box-shadow:0 2px 8px rgba(30,155,224,.14)}
.cuenta-otra-inp{margin-top:10px;display:none}
.accp-quien{margin-top:14px}
.cuenta-seg:has(#cta-otra:checked)~.cuenta-otra-inp{display:block}
.anombre-tog{display:flex;gap:12px;align-items:flex-start;cursor:pointer;margin:0}
.anombre-tog input{width:auto;margin-top:3px;flex:none}
.anombre-tog small{display:block;color:var(--tinta2);font-weight:500;margin-top:2px}
.anombre-campos{display:none;margin-top:16px;padding-top:16px;border-top:1px solid var(--borde)}
.tarjeta:has(#afx-otro:checked) .anombre-campos{display:block}
.cal-hero{display:flex;gap:18px;align-items:center;background:linear-gradient(130deg,var(--marca),var(--turquesa));color:#fff;border-radius:20px;padding:26px 28px;margin-bottom:22px}
.cal-escudo{flex:none;width:60px;height:60px;border-radius:16px;background:rgba(255,255,255,.18);display:flex;align-items:center;justify-content:center;color:#fff}
.cal-hero h1{color:#fff}.cal-hero .sub{color:rgba(255,255,255,.9)}
.cal-bloque{background:var(--panel);border:1px solid var(--borde);border-radius:16px;padding:22px 24px;margin-bottom:16px}
.cal-bloque h3{margin:0 0 14px;font-size:16px}
.cal-lista{list-style:none;margin:0;padding:0;display:grid;gap:14px}
.cal-lista li{display:flex;gap:12px;align-items:flex-start}
.cal-check{flex:none;color:var(--marca);margin-top:1px}
.cal-lista b{display:block;font-size:14.5px;margin-bottom:2px}
.cal-lista span{color:var(--tinta2);font-size:13.5px;line-height:1.5}
.cal-nota{background:#F6FAFE;border:1px solid var(--borde);border-radius:14px;padding:18px 22px;font-size:13.5px;color:var(--tinta2);line-height:1.6}
.cal-nota b{color:var(--tinta)}
.ok{background:var(--verde-f);color:var(--verde);border:1px solid #C6E9D8;border-radius:12px;
  padding:11px 15px;font-size:14px;margin-bottom:16px}

/* ── hero del tablero */
.hero{background:linear-gradient(130deg,#0F6CC4 0%,#1E9BE0 55%,#2BD3E2 100%);color:#fff;
  border-radius:20px;padding:26px 28px;margin-bottom:22px;position:relative;overflow:hidden;
  box-shadow:0 10px 30px rgba(15,108,196,.25)}
.hero::after{content:'';position:absolute;right:-70px;top:-70px;width:260px;height:260px;
  border-radius:50%;background:rgba(255,255,255,.07);pointer-events:none}
.hero::before{content:'';position:absolute;right:60px;bottom:-110px;width:220px;height:220px;
  border-radius:50%;background:rgba(255,255,255,.05);pointer-events:none}
.hero h1{color:#fff;margin-bottom:2px}
.hero .fecha{opacity:.75;font-size:13px}
.hero .pulso-op{margin-top:14px;display:flex;gap:10px;flex-wrap:wrap}
.hero .pulso-op a{background:rgba(255,255,255,.14);color:#fff;border:1px solid rgba(255,255,255,.22);
  border-radius:999px;padding:6px 14px;font-size:13px;font-weight:600;transition:background .15s}
.hero .pulso-op a:hover{background:rgba(255,255,255,.24)}

/* ── KPIs interactivos (estilo tarjeta métrica premium) */
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(178px,1fr));gap:14px;margin-bottom:18px}
a.kpi{background:var(--panel);border:1px solid var(--borde);border-radius:var(--radio);padding:18px 18px 16px;
  color:var(--tinta);display:flex;flex-direction:column;gap:2px;position:relative;box-shadow:var(--s1);
  transition:transform .18s,box-shadow .18s,border-color .18s;overflow:hidden}
a.kpi:hover{transform:translateY(-2px);box-shadow:var(--s2);border-color:#D4E2EC;text-decoration:none}
a.kpi .t{font-size:12.5px;color:var(--tinta2);font-weight:650;letter-spacing:-.1px;order:1;
  display:flex;align-items:center;gap:6px}
a.kpi .t .pip{width:7px;height:7px;border-radius:50%;background:var(--tinta3);flex:0 0 auto}
a.kpi .n{font-size:33px;font-weight:800;line-height:1.02;letter-spacing:-1.2px;
  font-variant-numeric:tabular-nums;order:2;margin-top:2px}
a.kpi .n.chico{font-size:23px;letter-spacing:-.4px}
a.kpi .pie{font-size:11.5px;color:var(--tinta3);font-weight:600;order:3;margin-top:5px;
  display:flex;align-items:center;gap:4px}
a.kpi .pie.up{color:var(--verde)} a.kpi .pie.down{color:var(--rojo)}
a.kpi .ver{position:absolute;top:15px;right:16px;font-size:16px;color:var(--tinta3);
  opacity:0;transform:translateX(-3px);transition:all .18s}
a.kpi:hover .ver{opacity:1;transform:none;color:var(--marca)}
a.kpi.alerta .n{color:var(--rojo)} a.kpi.alerta .t .pip{background:var(--rojo)}
a.kpi.cuidado .n{color:var(--ambar)} a.kpi.cuidado .t .pip{background:var(--ambar)}
a.kpi.bien .t .pip{background:var(--verde)}
a.kpi.destacado{background:var(--grad);border:0;color:#fff;grid-column:span 2}
@media(max-width:560px){a.kpi.destacado{grid-column:span 1}}
a.kpi.destacado .t,a.kpi.destacado .pie{color:rgba(255,255,255,.85)}
a.kpi.destacado .t .pip{background:rgba(255,255,255,.7)}
a.kpi.destacado .n{color:#fff}
a.kpi.destacado .ver{color:rgba(255,255,255,.8)}
a.kpi.destacado::after{content:'';position:absolute;right:-40px;bottom:-50px;width:150px;height:150px;
  border-radius:50%;background:rgba(255,255,255,.10)}

/* ── layouts */
.dos{display:grid;grid-template-columns:2fr 1fr;gap:18px}
.mitades{display:grid;grid-template-columns:1fr 1fr;gap:18px}
@media(max-width:860px){.dos,.mitades{grid-template-columns:1fr}header nav{overflow-x:auto}
  main{margin-top:20px}h1{font-size:22px}}
/*MOBILEFIX*/
/* El menú pasa a su propia fila desde 860px: entre 601 y 860 (iPad vertical, iPhone
   en horizontal) los enlaces se apretaban y "Nuevo ticket" se partía en dos líneas. */
@media(max-width:860px){
  header{height:auto;flex-wrap:wrap;padding:8px 14px;gap:8px 10px}
  header .logo{order:1}
  header .quien{order:2;margin-left:auto;max-width:40vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  header form{order:3}
  header nav{order:4;flex-basis:100%;margin-left:0;gap:2px;overflow-x:auto;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;
    scroll-snap-type:x proximity;padding-right:22px;
    -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 22px),transparent);
    mask-image:linear-gradient(90deg,#000 calc(100% - 22px),transparent)}
  header nav::-webkit-scrollbar{display:none}
  header nav a{white-space:nowrap;padding:7px 11px;scroll-snap-align:start}
  /* Las tablas de administración (usuarios, correos) no caben: se desplazan DENTRO
     de su tarjeta. Sin esto, arrastran a la página entera y todo se mueve de lado. */
  .tarjeta{overflow-x:auto}
  main table{min-width:600px}
}
@media(max-width:600px){
  header .logo img{height:26px}
  header .logo span{font-size:13.5px;padding-left:9px}
  main{margin:16px auto;padding:0 14px}
  h1{font-size:20px}
  /* iPhone: respetar la muesca y la barra inferior */
  header{padding-left:max(14px,env(safe-area-inset-left));padding-right:max(14px,env(safe-area-inset-right))}
  main{padding-bottom:max(16px,env(safe-area-inset-bottom))}
}

/* ── La tabla de tickets no se lee en un teléfono: cada fila pasa a ser una tarjeta.
   Se prefirió esto al scroll lateral, que parte los títulos palabra por palabra. */
@media(max-width:700px){
  /* En móvil los contadores no deben empujar la lista fuera de la primera pantalla:
     se compactan a dos columnas bajas en vez de cuatro tarjetas altas. */
  .kpis-activos{grid-template-columns:1fr 1fr;gap:8px}
  .ka{padding:10px 12px;flex-direction:row;align-items:baseline;gap:7px}
  .ka b{font-size:20px}
  .ka span{font-size:11.5px}
  .tabla-activos{overflow:visible}
  .tabla-activos table{min-width:0;width:100%;display:block}
  .tabla-activos thead{display:none}
  .tabla-activos tbody{display:flex;flex-direction:column;gap:10px}
  .tabla-activos tr.fila{display:flex;flex-wrap:wrap;align-items:center;gap:7px 10px;
    padding:12px 14px;background:var(--panel);border:1px solid var(--borde);border-radius:14px}
  .tabla-activos tr.fila td{display:block;border:none;padding:0}
  .tabla-activos td[data-c=etiqueta]{order:1}
  .tabla-activos td[data-c=estado]{order:2;margin-left:auto}
  /* En la tarjeta no hay encabezados que expliquen cada celda, así que marca y
     modelo vuelven a leerse juntos ("Lenovo IdeaPad") en su propio renglón, con el
     tipo arriba. Separarlos en columnas es útil en la tabla; aquí sería un acertijo. */
  .tabla-activos td[data-c=tipo]{order:3;flex:0 0 100%}
  .tabla-activos td[data-c=marca]{order:4;line-height:1.4;font-weight:600;margin-top:-4px}
  .tabla-activos td[data-c=equipo]{order:5;flex:1 1 auto;line-height:1.4;font-weight:600;margin-top:-4px}
  .tabla-activos td[data-c=serie]{order:6}
  .tabla-activos td[data-c=quien]{order:7;font-size:12.5px;color:var(--tinta2)}
  .tabla-activos td[data-c=valor]{order:8;margin-left:auto;text-align:right;font-weight:600}
  .tabla-activos td[data-c=mercado]{order:9;flex:0 0 100%;text-align:right;font-size:12.5px}
  .tabla-activos td[data-c=mercado]:not(:empty)::before{content:"Vale hoy ";
    font-weight:500;color:var(--tinta3);font-size:11.5px}
  .tabla-activos td[data-c=valor]::before{content:"Valor ";font-weight:500;
    color:var(--tinta3);font-size:11.5px}
  .tabla-tickets{overflow:visible}
  .tabla-tickets table{min-width:0;width:100%;display:block}
  .tabla-tickets thead{display:none}
  .tabla-tickets tbody{display:flex;flex-direction:column;gap:10px}
  .tabla-tickets tr.fila{display:flex;flex-wrap:wrap;align-items:center;gap:7px 10px;
    border:1px solid var(--borde);border-radius:14px;padding:13px 15px;background:var(--panel);
    box-shadow:var(--s1);border-left-width:4px;border-left-style:solid;border-left-color:var(--borde)}
  .tabla-tickets tr.fila.p-critica{border-left-color:#B3261E}
  .tabla-tickets tr.fila.p-alta{border-left-color:var(--rojo)}
  .tabla-tickets tr.fila.p-media{border-left-color:var(--ambar)}
  .tabla-tickets tr.fila.p-baja{border-left-color:var(--verde)}
  .tabla-tickets tr.fila td{display:block;border:none;padding:0}
  .tabla-tickets tr.fila td:first-child{border-left:none}
  /* orden de lectura en la tarjeta: folio y fecha arriba, título, chips, asignado */
  .tabla-tickets td[data-c=folio]{order:1;flex:0 1 auto}
  .tabla-tickets td[data-c=creado]{order:2;margin-left:auto;font-size:11.5px;color:var(--tinta3)}
  .tabla-tickets td[data-c=asunto]{order:3;flex:0 0 100%;line-height:1.4}
  .tabla-tickets td[data-c=prioridad]{order:4}
  .tabla-tickets td[data-c=estado]{order:5}
  .tabla-tickets td[data-c=sla]{order:6}
  .tabla-tickets td[data-c=csat]{order:7}
  /* En la tarjeta, un 'Sin calificar' por cada ticket abierto sería ruido en la
     mitad de la pantalla: ahí la ausencia de carita ya dice lo mismo. */
  .tabla-tickets td[data-c=csat].sin{display:none}
  .tabla-tickets td[data-c=asignado]{order:8;flex:0 0 100%;font-size:12px;color:var(--tinta3)}
  .tabla-tickets td[data-c=asignado]::before{content:'Asignado a: '}
}

/* ── listas con barra de proporción, clicables */
.lista-barra a{display:grid;grid-template-columns:1fr auto;gap:4px 12px;padding:10px 10px;
  border-radius:11px;color:var(--tinta);align-items:center;transition:background .12s}
.lista-barra a:hover{background:var(--marca-suave);text-decoration:none}
.lista-barra .nom{font-size:14px;font-weight:600}
.lista-barra .num{font-weight:800;font-variant-numeric:tabular-nums}
.lista-barra .barra{grid-column:1/-1;height:5px;border-radius:99px;background:#EDF2F0;overflow:hidden}
.lista-barra .barra i{display:block;height:100%;border-radius:99px;
  background:linear-gradient(90deg,var(--marca2),var(--turquesa))}

/* ── el parque por tipo y por estado ───────────────────────────────────────────
   El largo de la barra compara TIPOS (n contra el tipo más numeroso) y los segmentos
   reparten ese largo por ESTADO. Por eso la barra no lleva pista de fondo: un canal
   gris detrás se leería como "aquí hay más de este tipo que no se está contando", y
   lo que sobra a la derecha es otro tipo, no otro estado.

   Cada estado define su color UNA vez en la variable --c, y de ahí salen el fondo del
   segmento y el color de su cifra. Con dos declaraciones separadas, el día que cambien
   una, el color diría una cosa y el texto de al lado otra. */
.parque{display:flex;flex-direction:column;gap:2px}
.pq{display:grid;grid-template-columns:1fr auto;gap:6px 12px;padding:11px 10px 12px;
  border-radius:11px;align-items:baseline}
.pq:hover{background:var(--marca-suave)}
.pq-nom{font-size:14px;font-weight:650;color:var(--tinta);overflow-wrap:anywhere}
.pq-num{font-weight:800;font-variant-numeric:tabular-nums;font-size:15px;white-space:nowrap}
.pq-num small{font-weight:600;font-size:11.5px;color:var(--tinta3);letter-spacing:0}
.pq-barra{grid-column:1/-1;display:flex;gap:2px;height:9px;min-width:0}
/* min-width para que un solo equipo no desaparezca: en un tipo de 25 vale el 4% del
   largo, y sin piso quedaría en una línea de menos de un pixel. */
.pq-barra i{display:block;height:100%;border-radius:3px;min-width:4px;background:var(--c)}
.pq-det{grid-column:1/-1;display:flex;flex-wrap:wrap;gap:3px 12px;font-size:11.5px;
  color:var(--tinta2);font-weight:600}
.pq-det a{color:var(--tinta2)}
.pq-det a:hover{text-decoration:underline}
.pq-det b{color:var(--c);font-weight:800;font-variant-numeric:tabular-nums}
/* Los MISMOS colores que el chip de estado en la lista de activos: un equipo por
   localizar es rojo en las dos pantallas o el color deja de significar algo. */
.ep-asignado{--c:var(--marca)}
.ep-disponible{--c:var(--verde)}
.ep-restablecer{--c:var(--ambar)}
.ep-reparacion{--c:var(--ambar)}
.ep-localizar{--c:var(--rojo)}
.ep-falta{--c:var(--ambar)}
/* El hueco de captura va pegado al IMPORTE y no al desglose de estados: es una
   advertencia sobre ese número —"este total no incluye 9 equipos"— y no un sexto
   estado del equipo. Abajo, entre los estados, se leía como uno más; y la raya que
   lo separaba quedaba flotando al principio del renglón cuando el texto envolvía. */
.pq-num .ep-falta{margin-left:8px;font-size:11.5px;font-weight:600;color:var(--c)}
.cob-mal b{color:var(--rojo)}

/* ── atención requerida */
.atencion a{display:flex;gap:12px;align-items:flex-start;padding:12px 12px;border-radius:12px;
  color:var(--tinta);transition:background .12s;border-left:3px solid var(--rojo)}
.atencion a:hover{background:var(--rojo-f);text-decoration:none}
.atencion a.est-ambar{border-left-color:var(--ambar)}
.atencion a.est-ambar:hover{background:var(--ambar-f)}
.atencion .cuerpo{flex:1;min-width:0}
.atencion .tit{font-weight:700;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.atencion .det{font-size:12.5px;color:var(--tinta2);margin-top:2px}

.comentario{border:1px solid var(--borde);border-radius:14px;padding:13px 15px;margin-bottom:10px;background:var(--panel)}
.comentario.interno{background:#FFFBEE;border-color:#EFDFB2}
.comentario .meta{font-size:12px;color:var(--tinta2);margin-bottom:6px;font-weight:600}
.filtros{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:16px;align-items:center}
.filtros select{width:auto;padding:8px 12px}

/* ── Cabezales que ordenan.
   El cabezal ya está encima de la columna: es donde la mano va a buscar cómo
   ordenarla. La flecha se pinta SOLO en la columna activa; una flecha en las
   siete no dice cuál manda. En móvil el <thead> no existe (cada fila es una
   tarjeta), así que ahí el orden se elige con el select .orden-movil.
   OJO: nada de acentos graves en estos comentarios — este bloque de CSS vive
   dentro de una plantilla de JS y uno solo la cierra a media página. */
th.orde{padding:0}
/* El relleno del <a> repite el de la celda: el #96 recortó el costado a 10px para
   que ocho columnas cupieran en una laptop de 1280, y con 14px aquí el cabezal se
   los devolvía y la tabla volvía a deslizarse. */
th.orde a{display:flex;align-items:center;gap:5px;padding:11px 10px;color:inherit;
  font:inherit;letter-spacing:inherit;text-transform:inherit;white-space:nowrap}
th.orde a:hover{text-decoration:none;color:var(--marca);background:var(--marca-suave)}
th.orde .fl{font-size:9px;line-height:1;color:var(--marca)}
/* La flecha fantasma aparece al pasar el puntero por un cabezal que NO ordena
   hoy: es lo que avisa de que el cabezal se puede tocar. */
th.orde:not(.act) a:hover .fl{visibility:visible}
th.orde:not(.act) .fl{visibility:hidden;color:var(--tinta3)}
th.orde.act a{color:var(--marca)}

/* ── Filtros de varios valores.
   Un <select multiple> obliga a Ctrl+clic y en un teléfono no se puede usar; con
   casillas dentro de un desplegable, cada criterio se prende y se apaga con un
   clic. El panel se queda ABIERTO después de aplicar (el servidor recuerda cuál
   en el parámetro 'abierto'): sin eso, marcar tres estados eran nueve clics. */
.fdrop{position:relative}
.fdrop>summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:9px;
  padding:8px 12px;border:1px solid var(--borde);border-radius:10px;background:var(--panel);
  font-size:14px;font-weight:600;color:var(--tinta);white-space:nowrap;user-select:none}
.fdrop>summary::-webkit-details-marker{display:none}
.fdrop>summary::after{content:'';width:6px;height:6px;flex:0 0 auto;
  border-right:2px solid var(--tinta3);border-bottom:2px solid var(--tinta3);
  transform:rotate(45deg) translateY(-2px)}
.fdrop[open]>summary::after{transform:rotate(-135deg) translateY(-2px)}
.fdrop[open]>summary{border-color:var(--marca)}
.fdrop.act>summary{background:var(--marca-suave);border-color:var(--marca);color:var(--marca)}
.fdrop.act>summary::after{border-color:var(--marca)}
/* z-index 15 y no más: el encabezado pegajoso va en 20, y un panel por encima de él
   se le monta al menú al bajar la página. Basta con estar arriba de la tabla. */
.fdrop-panel{position:absolute;z-index:15;top:calc(100% + 6px);left:0;min-width:250px;
  max-height:min(58vh,380px);overflow:auto;background:var(--panel);border:1px solid var(--borde);
  border-radius:13px;box-shadow:var(--s2);padding:7px}
.fdrop-panel label{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:9px;
  font-size:14px;cursor:pointer;line-height:1.3}
.fdrop-panel label:hover{background:var(--marca-suave)}
.fdrop-panel input[type=checkbox]{width:16px;height:16px;min-width:16px;flex:0 0 auto;margin:0;padding:0;
  accent-color:var(--marca);cursor:pointer}
.fdrop-pie{display:flex;justify-content:space-between;gap:10px;align-items:center;
  border-top:1px solid var(--borde);margin-top:5px;padding:8px 10px 3px;font-size:12.5px;color:var(--tinta2)}
.fdrop-pie a{font-weight:600}
.filtros-barra{margin-bottom:12px}
.filtros-chips{margin-bottom:16px}
.orden-movil{display:none}
@media(max-width:700px){
  /* En un teléfono el panel flotante tapa la lista y se sale de la pantalla:
     se abre en su lugar, empujando lo de abajo. */
  .fdrop{width:100%}
  .fdrop>summary{width:100%;justify-content:space-between}
  .fdrop>summary::after{margin-left:auto}
  .fdrop-panel{position:static;min-width:0;max-height:none;margin-top:6px;box-shadow:none}
  .orden-movil{display:flex;gap:8px;align-items:center;width:100%}
  .orden-movil select{flex:1;width:auto}
}
.filtro-activo{background:var(--marca);color:#fff;border-radius:999px;padding:6px 8px 6px 14px;
  font-size:13px;font-weight:700;display:inline-flex;align-items:center;gap:8px}
.filtro-activo a{color:#fff;background:rgba(255,255,255,.22);border-radius:50%;width:20px;height:20px;
  display:inline-flex;align-items:center;justify-content:center;font-size:12px;line-height:1}
.detalle-dato{margin-bottom:12px}.detalle-dato b{display:block;font-size:11px;color:var(--tinta3);
  text-transform:uppercase;letter-spacing:.6px;margin-bottom:2px}

/* ── nuevo ticket: tarjetas de categoría */
.cat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}
.cat-grid input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px;margin:0;padding:0}
.cat-grid label{display:flex;flex-direction:column;gap:8px;align-items:flex-start;cursor:pointer;
  border:1.5px solid var(--borde);border-radius:14px;padding:14px;margin:0;font-size:13.5px;
  font-weight:700;color:var(--tinta);transition:all .15s;background:var(--panel)}
.cat-grid label svg{width:22px;height:22px;stroke:var(--tinta3);transition:stroke .15s}
.cat-nota{display:block;font-weight:500;font-size:12px;color:var(--tinta3);margin-top:2px;line-height:1.35}
.cat-grid label:hover{border-color:var(--marca2);transform:translateY(-1px);box-shadow:var(--sombra)}
.cat-grid input:checked+label{border-color:var(--marca);background:var(--marca-suave);
  box-shadow:0 0 0 3px rgba(30,155,224,.16)}
.cat-grid input:checked+label svg{stroke:var(--marca)}
.cat-grid input:focus-visible+label{outline:2px solid var(--marca2);outline-offset:2px}

/* ── prioridad segmentada con compromiso SLA en vivo */
.prio{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px}
.prio input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px;margin:0;padding:0}
.prio label{display:block;cursor:pointer;border:1.5px solid var(--borde);border-radius:14px;
  padding:12px 14px;margin:0;transition:all .15s;background:var(--panel)}
.prio label b{display:flex;align-items:center;gap:7px;font-size:14px}
.prio label b i{width:9px;height:9px;border-radius:50%;flex:none}
.prio label small{display:block;color:var(--tinta2);font-weight:500;font-size:12px;margin-top:3px;line-height:1.35}
.prio label:hover{transform:translateY(-1px);box-shadow:var(--sombra)}
.prio .p-baja i{background:var(--tinta3)} .prio .p-media i{background:var(--marca2)}
.prio .p-alta i{background:var(--ambar)} .prio .p-critica i{background:var(--rojo)}
.prio input:checked+label{border-color:var(--marca);background:var(--marca-suave);
  box-shadow:0 0 0 3px rgba(30,155,224,.16)}
.prio input:focus-visible+label{outline:2px solid var(--marca2);outline-offset:2px}
.sla-vivo{display:none;align-items:center;gap:12px;background:linear-gradient(130deg,var(--marca-suave),#E9FBFD);
  border:1px solid #CFE7F8;border-radius:14px;padding:13px 16px;margin-top:12px;font-size:13.5px}
.sla-vivo b{font-size:14px}
.sla-vivo .reloj{width:34px;height:34px;flex:none;border-radius:50%;background:var(--panel);
  display:flex;align-items:center;justify-content:center;box-shadow:var(--sombra)}
#np-baja:checked~.sla-vivo.s-baja,#np-media:checked~.sla-vivo.s-media,
#np-alta:checked~.sla-vivo.s-alta,#np-critica:checked~.sla-vivo.s-critica{display:flex}
.contador{float:right;font-size:11.5px;color:var(--tinta3);font-weight:600}
.paso{display:flex;align-items:baseline;gap:10px;margin:22px 0 12px}
.paso .num{width:22px;height:22px;flex:none;border-radius:50%;background:var(--marca);color:#fff;
  font-size:12px;font-weight:800;display:inline-flex;align-items:center;justify-content:center;
  transform:translateY(3px)}
.paso h3{margin:0}
.paso small{color:var(--tinta2);font-weight:500}

/* ── usuarios: tarjetas de rol con explicación */
.rol-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px}
.rol-cards input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px;margin:0;padding:0}
.rol-cards label{display:block;cursor:pointer;border:1.5px solid var(--borde);border-radius:14px;
  padding:16px;margin:0;transition:all .15s;background:var(--panel)}
.rol-cards label:hover{transform:translateY(-1px);box-shadow:var(--sombra)}
.rol-cards input:checked+label{border-color:var(--marca);background:var(--marca-suave);
  box-shadow:0 0 0 3px rgba(30,155,224,.16)}
.rol-cards input:focus-visible+label{outline:2px solid var(--marca2);outline-offset:2px}
.rol-cards .rc-tit{display:flex;align-items:center;gap:9px;font-size:15px;font-weight:800}
.rol-cards .rc-tit svg{width:20px;height:20px;stroke:var(--marca);flex:none}
.rol-cards .rc-que{font-size:13px;color:var(--tinta2);margin-top:6px;line-height:1.45}
.rol-cards .rc-quien{font-size:12px;font-weight:700;color:var(--marca);margin-top:8px}
form:has(#rol-solicitante:checked) .pista-ext-si{display:block}
form:has(#rol-agente:checked) .pista-ext-no,form:has(#rol-supervisor:checked) .pista-ext-no{display:block}
.pista-ext-si,.pista-ext-no{display:none;font-size:12.5px;margin-top:6px;font-weight:600}
.pista-ext-si{color:var(--verde)} .pista-ext-no{color:var(--ambar)}
.avatar{width:34px;height:34px;border-radius:50%;flex:none;display:inline-flex;align-items:center;
  justify-content:center;font-size:12.5px;font-weight:800;color:#fff;
  background:linear-gradient(130deg,var(--marca2),var(--turquesa))}
.badge.b-agente{background:#E7F3FC;color:var(--marca)}
.badge.b-supervisor{background:var(--marca);color:#fff}
.badge.b-solicitante{background:#EDF2F5;color:var(--tinta2)}
.rol-mini{display:flex;gap:6px;align-items:center}
.rol-mini select{width:auto;padding:6px 9px;font-size:13px;border-radius:9px}
.rol-mini button{padding:6px 11px;font-size:13px;box-shadow:none}
.login-caja{max-width:390px;margin:8vh auto}
.login-caja .marca{text-align:center;margin-bottom:22px}
.login-caja .marca .n{font-size:25px;font-weight:800;letter-spacing:-.5px;color:var(--marca)}
footer{max-width:1160px;margin:12px auto 44px;padding:0 24px;color:var(--tinta3);font-size:12px}
/* Aviso de estado del respaldo. Solo lo ven los supervisores. Ambar es
   "vigila esto"; rojo es "hay que actuar hoy". */
.av-respaldo{max-width:1160px;margin:0 auto 18px;padding:13px 16px;border-radius:12px;
  font-size:13.5px;line-height:1.55;display:flex;gap:10px;flex-wrap:wrap;align-items:baseline}
.av-respaldo b{font-weight:700}
.av-respaldo span{color:inherit;opacity:.85}
.av-respaldo.n-aviso{background:#FFF8E8;border:1px solid #F0DBA8;color:#7A5A12}
.av-respaldo.n-critico{background:#FDEDEA;border:1px solid #F2C4BB;color:#8C2F1E}
/* ── organigrama ──────────────────────────────────────────────────────────────
   Arbol con conectores curvos dibujados en CSS (no SVG): aguanta cualquier
   profundidad, se reflowea solo en telefono y no necesita medir nada en JS.
   La jerarquia se lee por TRES señales a la vez —sangria, color del riel y
   tamaño de la tarjeta— para que no dependa de contar niveles. */
.org-cab{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:20px}
.org-kpi{background:var(--panel);border:1px solid var(--borde);border-radius:14px;padding:14px 16px;
  box-shadow:var(--s1)}
.org-kpi .k-n{font-size:26px;font-weight:800;letter-spacing:-1px;line-height:1.1}
.org-kpi .k-t{font-size:11px;font-weight:700;letter-spacing:.7px;text-transform:uppercase;
  color:var(--tinta3);margin-top:3px}
.org-kpi.alerta{border-color:var(--ambar)}
.org-kpi.alerta .k-n{color:var(--ambar)}
.org-kpi.bien .k-n{color:var(--verde)}
.org-deptos{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:22px}
.org-dep{font-size:11.5px;font-weight:600;border:1px solid var(--borde);border-radius:999px;
  padding:5px 12px;color:var(--tinta2);display:inline-flex;gap:7px;align-items:center}
.org-dep i{width:8px;height:8px;border-radius:3px;display:inline-block}
.org-dep b{color:var(--tinta);font-variant-numeric:tabular-nums}

/* ── Organigrama de verdad: árbol de arriba abajo ────────────────────────────
   Era una lista con sangría —se leía como un árbol de carpetas, no como una
   estructura de mando—. Ahora cada jefe queda ARRIBA y su gente colgando
   debajo, unidos por líneas: la jerarquía se ve de un vistazo en vez de
   contarse por niveles de indentación.

   Sin JavaScript: los conectores son bordes de pseudo-elementos sobre la misma
   lista anidada que ya venía del servidor. */
.org-lienzo{overflow-x:auto;overflow-y:hidden;padding:6px 2px 10px}
.org-arbol,.org-arbol ul{list-style:none;margin:0;padding:0}
/* Cada nivel es una fila de hermanos, centrada bajo su jefe. El nivel de arriba
   también: si hay más de una raíz —gente sin jefe— van una junto a otra, no
   apiladas, que apiladas parecen una cadena de mando que no existe. */
.org-arbol{display:flex;justify-content:center;align-items:flex-start;gap:10px;width:max-content;
  min-width:100%;margin:0 auto}
.org-arbol ul{display:flex;justify-content:center;padding-top:26px;position:relative}
.org-arbol li{display:flex;flex-direction:column;align-items:center;position:relative;
  padding:26px 10px 0}
/* Los dos medios-tramos horizontales que unen a los hermanos entre sí. */
.org-arbol li::before,.org-arbol li::after{content:'';position:absolute;top:0;width:50%;
  height:26px;border-top:1.5px solid var(--borde2,var(--borde))}
.org-arbol li::before{right:50%}
.org-arbol li::after{left:50%;border-left:1.5px solid var(--borde2,var(--borde))}
/* Hijo único: no hace falta la barra horizontal, solo la caída recta. */
.org-arbol li:only-child::before,.org-arbol li:only-child::after{display:none}
.org-arbol li:only-child{padding-top:26px}
.org-arbol li:only-child>.org-caida{display:block}
/* Las puntas de la barra se redondean; los extremos no siguen de largo. */
.org-arbol li:first-child::before{border:0}
.org-arbol li:last-child::after{border:0}
.org-arbol li:last-child::before{border-right:1.5px solid var(--borde2,var(--borde));border-radius:0 9px 0 0}
.org-arbol li:first-child::after{border-radius:9px 0 0 0}
/* La caída desde el jefe hasta la barra de sus hijos. */
.org-arbol ul::before{content:'';position:absolute;top:0;left:50%;height:26px;
  border-left:1.5px solid var(--borde2,var(--borde))}
/* La raíz no cuelga de nadie. */
.org-arbol>li{padding-top:0}
.org-arbol>li::before,.org-arbol>li::after{display:none}
.org-caida{display:none;position:absolute;top:0;left:50%;height:26px;border-left:1.5px solid var(--borde2,var(--borde))}

/* El nodo: compacto y de ancho fijo, que en un árbol lo que importa es la forma
   del conjunto, no que cada tarjeta luzca por su cuenta. */
.org-p{display:flex;flex-direction:column;align-items:center;gap:9px;width:186px;
  padding:18px 14px 15px;border:1px solid var(--borde);border-radius:16px;background:var(--panel);
  text-decoration:none;color:var(--tinta);box-shadow:var(--s1);
  transition:box-shadow .18s ease,border-color .18s ease,transform .18s ease;
  position:relative;text-align:center}
/* El color del área es una línea fina, no un borde grueso: identifica sin gritar.
   Va ABAJO, no arriba: arriba viven las insignias (sin jefe, cuánta gente cuelga)
   y la línea les pasaba por encima como un tachado. Abajo, además, es de donde
   sale el conector hacia los subordinados. */
.org-p::after{content:'';position:absolute;bottom:0;left:22px;right:22px;height:2px;
  border-radius:2px 2px 0 0;background:var(--acento,transparent);opacity:.85}
.org-p:hover{border-color:var(--marca2);box-shadow:var(--s2);transform:translateY(-2px);text-decoration:none}
.org-p:hover .org-ini{opacity:1}
/* La raíz pesa más: es de donde cuelga todo lo demás. */
.org-arbol>li>.org-p{width:212px;padding:20px 16px 17px}
.org-arbol>li>.org-p .org-n{font-size:15.5px}
.org-arbol>li>.org-p .org-puesto{font-size:12.5px}
.org-arbol>li>.org-p .org-ini{width:48px;height:48px;font-size:15px;border-radius:15px}

.org-ini{width:40px;height:40px;border-radius:13px;flex:0 0 auto;display:flex;align-items:center;
  justify-content:center;font-size:13px;font-weight:700;letter-spacing:-.3px;color:#fff;opacity:.92}
.org-d{min-width:0;width:100%}
.org-n{font-size:13.5px;font-weight:650;letter-spacing:-.2px;display:block;line-height:1.3;
  text-wrap:balance}
/* El puesto: es lo que uno viene a buscar en un organigrama. */
.org-puesto{display:block;font-size:12px;line-height:1.35;color:var(--tinta2);margin-top:3px;
  text-wrap:balance}
.org-puesto.falta{color:var(--ambar);opacity:.75;font-style:italic}
.org-m{font-size:10.5px;color:var(--tinta3);margin-top:7px;display:flex;gap:5px;flex-wrap:wrap;
  align-items:center;justify-content:center;letter-spacing:.15px}
/* El área es un dato, no un pie de página: se lee igual de claro que el puesto.
   Puesto y área son las dos preguntas del organigrama —qué hace y en dónde— y
   una en gris claro de 10px no se contesta de un vistazo. */
.org-area{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;
  color:var(--tinta2)}
.org-punto{width:6px;height:6px;border-radius:2px;display:inline-block;opacity:.9}
.org-falta{color:var(--ambar)}
/* Facultad de aprobación, no rol de la herramienta: por eso esta sí se queda. */
/* En minúsculas y sin recuadro fuerte: es un apunte, no un cargo. En mayúsculas
   competía con el puesto, que es lo que la tarjeta viene a decir. */
.org-rh{font-size:10px;font-weight:600;color:var(--marca);background:var(--marca-suave);
  border-radius:4px;padding:1px 6px}
.org-m .sep{opacity:.45}
/* Cuánta gente cuelga de aquí: va como insignia sobre el borde, no como renglón. */
.org-eq{position:absolute;top:-9px;right:-8px;z-index:1;font-size:10.5px;font-weight:700;color:var(--tinta2);
  background:var(--panel);border:1px solid var(--borde);border-radius:999px;padding:2px 8px;
  font-variant-numeric:tabular-nums;display:inline-flex;gap:4px;align-items:center;box-shadow:var(--s1)}
.org-eq svg{opacity:.55}
.org-p.sin-jefe{border-color:var(--ambar);background:var(--ambar-f)}
.org-pie{font-size:12px;color:var(--tinta3);text-align:center;margin:14px 0 0}
/* ── Accesos de una persona ────────────────────────────────────────────────── */
.acc-lista{display:flex;flex-direction:column;gap:8px}
.acc-item{display:flex;gap:10px;align-items:flex-start;flex-wrap:wrap;padding:10px 12px;
  border:1px solid var(--borde);border-radius:11px;background:var(--fondo2)}
.acc-item.ret{opacity:.72;background:var(--fondo)}
.acc-id{flex:1;min-width:150px;display:flex;flex-direction:column;gap:2px}
.acc-id b{font-size:13.5px}
.acc-id small{font-size:11.5px;color:var(--tinta3);line-height:1.4}
/* De dónde salió el dato: con folio es un hecho; a mano es lo que alguien afirma.
   Se distinguen a propósito, que no es lo mismo y quien lo lea después lo merece. */
.acc-org{font-size:10px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;
  padding:2px 6px;border-radius:5px;width:max-content}
.acc-org.tk{background:var(--verde-f);color:var(--verde)}
.acc-org.tk a{color:inherit}
.acc-org.mano{background:var(--ambar-f);color:var(--ambar)}
/* Y una tercera procedencia, la que cambia el VERBO: esto no lo otorga la mesa. Va en
   rojo y no en ambar porque ambar aqui significa "lo afirma alguien"; esto es "la mesa
   no puede apagarlo", que no es un matiz de captura sino otra cosa. */
.acc-org.ext{background:var(--rojo-f);color:var(--rojo)}
/* El grupo de lo que apaga un tercero, dentro de la hoja de apagado.
   NO cuelga de .ap-extra a proposito: esa clase trae .ap-extra b con display:block, que
   es un selector de DESCENDIENTE y alcanzaba tambien al <b> de dentro del <small>,
   partiendo "pedirle a CITI" a su propio renglon a media frase. Se vio mirando la
   pantalla. Aqui se declara lo que hace falta y nada mas. */
.ap-tercero{margin-top:12px;padding:11px 12px;border:1px solid var(--rojo);
  border-radius:9px;background:var(--rojo-f)}
.ap-tercero > b{display:block;font-size:13.5px;color:var(--rojo);margin-bottom:8px}
.ap-tercero > b svg{vertical-align:-3px;margin-right:5px}
.ap-tercero .d-lista{margin-bottom:8px}
/* El <b> de este texto va EN LINEA: es enfasis a media frase, no un titulo. */
.ap-tercero > small{display:block;font-size:12px;color:var(--tinta2);line-height:1.5}
.ap-tercero > small b{display:inline;font-weight:700;color:inherit}
/* El campo de "quien lo otorga" solo aparece si se eligio un tercero: en el caso
   normal —lo da la mesa— no hay nada que escribir. Con el respaldo de :has() al final
   del archivo, un navegador viejo lo muestra siempre, que es lo seguro. */
.otg-quien{display:none;margin-top:8px}
/* El bloque de lo que otorga el cliente: solo si la cuenta elegida NO es Corporativo.
   Los radios viven en otra tarjeta, asi que el :has() cuelga de body, como el selector
   de modo. Para Corporativo no hay tercero y estas casillas no aplican. */
.blq-cliente{display:none;margin-top:18px;padding:14px;border:1px solid var(--rojo);
  border-radius:10px;background:var(--rojo-f)}
.blq-cliente .bc-tit{display:block;color:var(--rojo);margin-bottom:6px}
.blq-cliente .bc-tit svg{vertical-align:-3px;margin-right:5px}
/* Un renglon de acceso que otorga un tercero. El borde a la izquierda es lo que hace
   que se lea como otra cosa al recorrer el carril, sin tener que leer la etiqueta. */
.ps-acc.ext{border-left:3px solid var(--rojo);padding-left:9px}
.ps-acc-form{display:flex;gap:6px;align-items:center;min-width:0;flex-wrap:wrap}
/* El campo de la cuenta del tercero. Base corta y tope de ancho, para que en un
   telefono no empuje el boton fuera de la tarjeta: medido a 390 px, con 160 px de base
   el renglon pedia 324 px dentro de una caja de 281. */
.ps-acc-cta{font-size:12.5px;padding:6px 9px;min-width:0;flex:1 1 120px;max-width:230px}
/* Cargar el padron en bloque. */
.pad-pasos{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:14px}
/* Selector de HIJO, no de descendiente. Con li b (descendiente) el <b> de dentro del <small>
   tambien se volvia bloque y partia "no se importan" a su propio renglon a media
   frase — el mismo defecto que ya tenia .ap-extra, y lo repeti aqui. El delator es
   facil: un display:block sobre <b> sin acotar al hijo directo. */
.pad-pasos > li > b{display:block;font-size:14px}
.pad-pasos li small{display:block;margin-top:4px;font-size:12.5px;color:var(--tinta2);line-height:1.5}
.pad-nota{display:flex;gap:8px;align-items:flex-start;margin:16px 0 0;padding:11px 12px;
  border:1px solid var(--ambar);border-radius:9px;background:var(--ambar-f);
  font-size:12.5px;line-height:1.5}
.pad-nota svg{flex:0 0 auto;margin-top:1px;color:var(--ambar)}
.pad-mal{border-color:var(--rojo)}
.pad-mal h3{color:var(--rojo)}
.pad-mal h3 svg{vertical-align:-3px;margin-right:5px}
.pad-lista{margin:0;padding-left:20px;font-size:13px;line-height:1.7;color:var(--tinta)}
/* La tabla de la previsualizacion se desliza DENTRO de su tarjeta, nunca encima de la
   pagina: siete columnas no caben en un telefono y apilarlas aqui no ayuda — lo que
   uno hace en esta pantalla es recorrerla comparando renglones. */
.tabla-envoltura{overflow-x:auto}
.tabla-pad{width:100%;border-collapse:collapse;font-size:12.5px}
.tabla-pad th{text-align:left;font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;
  color:var(--tinta3);font-weight:700;padding:6px 8px;border-bottom:1px solid var(--borde)}
.tabla-pad td{padding:7px 8px;border-bottom:1px solid var(--borde-suave,#EEF2F5);vertical-align:top}
.tabla-pad td small{display:block;color:var(--tinta3);font-size:11.5px;margin-top:2px}
.tabla-pad .pad-cor{font-family:ui-monospace,monospace;font-size:11.5px}
.tabla-pad .pad-ojo{color:var(--ambar)}
.tabla-pad .pad-ojo svg{vertical-align:-2px;margin-right:3px}
.tabla-pad .pad-sin{color:var(--tinta3);font-style:italic;font-family:var(--fuente,inherit)}
/* Aviso dentro de la lista de datos de la solicitud. Ambar: hay algo que revisar, no
   una entrega detenida. */
.d-aviso{display:flex;gap:7px;align-items:flex-start;margin-top:10px;padding:10px 11px;
  border:1px solid var(--ambar);border-radius:9px;background:var(--ambar-f);
  font-size:12.5px;line-height:1.45;color:var(--tinta)}
.d-aviso svg{flex:0 0 auto;margin-top:1px;color:var(--ambar)}
body:has(#cta-eph:checked) .blq-cliente,
body:has(#cta-citi:checked) .blq-cliente,
body:has(#cta-oxal:checked) .blq-cliente,
body:has(#cta-otra:checked) .blq-cliente{display:block}
.det-alta:has(#otg-ter:checked) .otg-quien{display:block}
.acc-quitar{display:flex;gap:6px;align-items:center;flex:1 1 220px;min-width:0}
.acc-quitar input{flex:1;min-width:0;font-size:12.5px;padding:6px 9px}
.pf-otros{font-size:12px;color:var(--tinta3);margin-top:12px;padding-top:10px;
  border-top:1px solid var(--borde)}
/* Quién detiene la solicitud, a la vista sin tener que bajar. Una solicitud
   parada sin dueño visible se queda parada. */
.detalle-dato.detenido b{color:var(--ambar)}
.detalle-dato.detenido{color:var(--ambar);font-weight:650}
.ap-suplencia{border-color:var(--ambar)}
.ap-nota{font-size:13px;color:var(--tinta2);line-height:1.5;margin:6px 0 0}
/* Recordarle a quien firma. Va antes que el botón de suplir a propósito: insistir
   es lo barato, firmar por otro es lo que hay que pensar dos veces. */
.rec-firma{display:flex;flex-direction:column;gap:8px;margin-top:12px}
.rec-firma input{font-size:13px}
.rec-firma button{align-self:flex-start}
.rec-firma small{font-size:11.5px;color:var(--tinta3)}
.ap-sep{font-size:11.5px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;
  color:var(--tinta3);margin:16px 0 4px;padding-top:12px;border-top:1px solid var(--borde)}
.org-flag{font-size:9.5px;font-weight:800;letter-spacing:.5px;color:#8A6410;background:var(--panel);
  border:1px solid var(--ambar);border-radius:6px;padding:2px 7px;position:absolute;top:-9px;left:-6px;z-index:1}

/* En una pantalla angosta un árbol a lo ancho no se puede leer: vuelve a ser una
   lista con sangría, que en un teléfono sí funciona. */
@media(max-width:760px){
  .org-lienzo{overflow-x:visible}
  /* Sin esto el árbol conserva su ancho de árbol y desborda las tarjetas fuera
     de la pantalla: en modo lista tiene que ocupar el ancho disponible, no el
     que necesitaría dibujado. */
  .org-arbol{display:block;width:auto;min-width:0;margin:0}
  .org-arbol ul{display:block;padding-top:0;padding-left:15px}
  .org-arbol li{display:block;padding:5px 0;align-items:stretch}
  .org-arbol li::before,.org-arbol li::after,.org-arbol ul::before{display:none}
  /* La caída del hijo único gana por especificidad si no se apaga con la misma. */
  .org-arbol li:only-child>.org-caida,.org-caida{display:none}
  .org-arbol ul{border-left:2px solid var(--borde);margin-left:9px}
  .org-p{flex-direction:row;align-items:center;width:auto;text-align:left;gap:11px;
    padding:11px 13px;border-top:1px solid var(--borde);
    border-left:3px solid var(--acento,var(--borde))}
  /* En lista el acento ya es la barra izquierda: la linea de color sobra y solo
     ensucia el renglon. */
  .org-p::after{display:none}
  .org-arbol>li>.org-p{width:auto}
  .org-m{justify-content:flex-start}
  /* El nombre se queda con el espacio; las insignias van al final y no lo
     estrujan hasta partirlo en tres renglones. */
  .org-d{flex:1 1 auto;width:auto;min-width:0}
  .org-n{text-wrap:pretty}
  .org-eq{position:static;margin-left:auto;flex:0 0 auto}
  .org-flag{position:static;flex:0 0 auto}
}

/* ── ficha de persona ─────────────────────────────────────────────────────────
   Encabezado con identidad, luego dos columnas: lo suyo a la izquierda, su
   lugar en la organizacion a la derecha. */
.pf-cab{display:flex;gap:18px;align-items:center;flex-wrap:wrap;margin-bottom:20px}
.pf-ini{width:64px;height:64px;border-radius:20px;flex:0 0 auto;display:flex;align-items:center;
  justify-content:center;font-size:22px;font-weight:800;letter-spacing:-1px;color:#fff}
.pf-id{flex:1;min-width:220px}
.pf-id h1{margin:0;font-size:26px;letter-spacing:-.7px}
.pf-id .pf-c{font-size:13.5px;color:var(--tinta2);margin-top:2px}
.pf-tags{display:flex;gap:7px;flex-wrap:wrap;margin-top:9px}
.pf-tag{font-size:11px;font-weight:700;letter-spacing:.3px;border:1px solid var(--borde);
  border-radius:999px;padding:4px 11px;color:var(--tinta2)}
.pf-tag.sup{background:rgba(110,91,230,.11);color:#6E5BE6;border-color:transparent}
.pf-tag.rh{background:var(--marca-suave);color:var(--marca);border-color:transparent}
.pf-tag.no{background:var(--ambar-f);color:#8A6410;border-color:var(--ambar)}
.pf-tag.off{background:var(--rojo-f);color:var(--rojo);border-color:transparent}
.pf-mini{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px;margin-bottom:18px}
.pf-mini div{background:var(--panel);border:1px solid var(--borde);border-radius:12px;padding:12px 14px}
.pf-mini .n{font-size:21px;font-weight:800;letter-spacing:-.6px}
.pf-mini .t{font-size:10.5px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--tinta3);margin-top:2px}
.pf-lista a{display:flex;gap:11px;align-items:center;padding:9px 0;border-top:1px solid var(--borde);
  text-decoration:none;color:var(--tinta);font-size:13.5px}
.pf-lista a:first-child{border-top:0}
.pf-lista .pf-av{width:28px;height:28px;border-radius:9px;flex:0 0 auto;display:flex;align-items:center;
  justify-content:center;font-size:10.5px;font-weight:800;color:#fff}
.pf-lista .pf-sub{font-size:11.5px;color:var(--tinta3)}
.pf-vacio{font-size:13px;color:var(--tinta3);padding:6px 0}
.pf-bit{font-size:12.5px;color:var(--tinta2);padding:7px 0;border-top:1px solid var(--borde);line-height:1.5}
.pf-bit:first-child{border-top:0}
.pf-bit b{color:var(--tinta);font-weight:650}
.pf-bit span{color:var(--tinta3);font-size:11.5px}

/* ── asistente previo al ticket ───────────────────────────────────────────────
   Discreto: un boton de texto; la tarjeta solo aparece si hay sugerencia. */
.asis-btn{display:inline-flex;gap:8px;align-items:center;border:1px dashed var(--marca2);
  background:rgba(30,155,224,.05);color:var(--marca);border-radius:11px;padding:9px 15px;
  cursor:pointer;font:inherit;font-size:13.5px;font-weight:600;box-shadow:none}
.asis-btn:hover{background:rgba(30,155,224,.10)}
.asis-btn[disabled]{opacity:.55;cursor:wait}
.asis-caja{margin-top:12px;border:1px solid rgba(30,155,224,.35);border-radius:14px;
  background:linear-gradient(140deg,rgba(30,155,224,.05),rgba(43,211,226,.07));padding:16px 18px}
.asis-caja h4{margin:0 0 8px;font-size:13.5px;color:var(--marca);display:flex;gap:7px;align-items:center}
.asis-caja .asis-txt{font-size:14px;line-height:1.65;color:var(--tinta);white-space:pre-wrap}
.asis-acciones{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}
.asis-acciones button{font:inherit;font-size:13px;font-weight:600;border-radius:999px;
  padding:8px 16px;cursor:pointer;box-shadow:none}
.asis-si{border:0;background:var(--verde);color:#fff}
.asis-no{border:1.5px solid var(--borde);background:var(--panel);color:var(--tinta2)}
.asis-fin{font-size:14px;color:var(--verde);font-weight:600}

/* ── paleta de busqueda (⌘K) ──────────────────────────────────────────────────
   Overlay estilo Spotlight: fondo esfumado, tarjeta centrada arriba, resultados
   navegables con flechas. Se abre con ⌘K / Ctrl+K o con la lupa del encabezado. */
.pal-fondo{position:fixed;inset:0;z-index:100;background:rgba(15,25,40,.42);
  backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
  display:flex;justify-content:center;align-items:flex-start;padding:12vh 16px 0}
.pal{width:100%;max-width:560px;background:var(--panel);border-radius:16px;overflow:hidden;
  box-shadow:0 24px 70px rgba(10,25,50,.35);border:1px solid var(--borde)}
.pal input{width:100%;border:0;outline:0;background:transparent;padding:17px 20px;
  font:inherit;font-size:16.5px;color:var(--tinta)}
.pal-res{max-height:52vh;overflow-y:auto;border-top:1px solid var(--borde)}
.pal-res a{display:flex;gap:12px;align-items:baseline;padding:11px 18px;text-decoration:none;color:var(--tinta)}
.pal-res a .pf{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;color:var(--marca);
  font-weight:700;flex:0 0 auto}
.pal-res a .pt{flex:1;min-width:0;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pal-res a .pe{font-size:11.5px;color:var(--tinta3);flex:0 0 auto}
.pal-res a.sel{background:var(--fondo)}
.pal-pie{padding:9px 18px;font-size:11px;color:var(--tinta3);border-top:1px solid var(--borde);
  display:flex;gap:14px}
.pal-vacio{padding:22px 18px;font-size:13.5px;color:var(--tinta3);text-align:center}
.btn-lupa{display:flex;align-items:center;gap:6px;border:1px solid var(--borde);background:var(--panel);
  border-radius:9px;padding:6px 11px;cursor:pointer;color:var(--tinta3);font:inherit;font-size:12.5px;box-shadow:none}
.btn-lupa:hover{border-color:var(--marca2);color:var(--tinta2)}
.btn-lupa kbd{font-family:inherit;font-size:10.5px;border:1px solid var(--borde);border-radius:4px;
  padding:1px 4px;background:var(--fondo)}
@media(max-width:700px){.btn-lupa kbd{display:none}}

/* ── calendario propio ────────────────────────────────────────────────────────
   El popup nativo de <input type=date> no se puede estilizar y desentona con
   todo lo demas. Este lo reemplaza por mejora progresiva: sin JavaScript, el
   input nativo sigue ahi y funciona. */
.fx{position:relative;max-width:280px}
.fx-btn{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;
  padding:11px 13px;border:1.5px solid var(--borde);border-radius:11px;background:var(--panel);
  font:inherit;font-size:14.5px;color:var(--tinta);cursor:pointer;text-align:left;transition:border-color .12s}
.fx-btn:hover{border-color:var(--marca2)}
.fx-btn .fx-ph{color:var(--tinta3)}
.fx-btn svg{flex:0 0 auto;color:var(--tinta3)}
.fx-pop{position:absolute;z-index:60;top:calc(100% + 6px);left:0;width:296px;background:var(--panel);
  border:1px solid var(--borde);border-radius:16px;padding:14px;
  box-shadow:0 12px 34px rgba(20,40,70,.16),0 2px 8px rgba(20,40,70,.08)}
.fx-cab{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.fx-cab b{font-size:14px;letter-spacing:-.2px;text-transform:capitalize}
.fx-nav{display:flex;gap:4px}
.fx-nav button{width:30px;height:30px;border:0;border-radius:9px;background:transparent;cursor:pointer;
  color:var(--tinta2);font-size:15px;display:flex;align-items:center;justify-content:center;padding:0;box-shadow:none}
.fx-nav button:hover{background:var(--fondo)}
.fx-sem{display:grid;grid-template-columns:repeat(7,1fr);margin-bottom:2px}
.fx-sem span{text-align:center;font-size:10.5px;font-weight:700;letter-spacing:.4px;color:var(--tinta3);padding:4px 0}
.fx-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.fx-grid button{height:34px;border:0;border-radius:9px;background:transparent;cursor:pointer;
  font:inherit;font-size:13px;color:var(--tinta);padding:0;box-shadow:none;transition:background .1s}
.fx-grid button:hover{background:var(--fondo)}
.fx-grid button.fx-otro{color:var(--tinta3);opacity:.55}
.fx-grid button.fx-hoy{box-shadow:inset 0 0 0 1.5px var(--marca2);font-weight:700}
.fx-grid button.fx-sel{background:var(--marca);color:#fff;font-weight:700;box-shadow:none}
.fx-pie{display:flex;justify-content:space-between;margin-top:10px;padding-top:10px;border-top:1px solid var(--borde)}
.fx-pie button{border:0;background:transparent;color:var(--marca);font:inherit;font-size:13px;
  font-weight:700;cursor:pointer;padding:4px 6px;border-radius:7px;box-shadow:none}
.fx-pie button:hover{background:var(--fondo)}
/* ── tablero: capa analitica ─────────────────────────────────────────────── */
.sel-periodo{display:inline-flex;gap:2px;background:rgba(255,255,255,.16);border-radius:11px;padding:3px}
.sel-periodo a{padding:5px 14px;border-radius:8px;font-size:12.5px;font-weight:600;color:#fff;text-decoration:none;opacity:.75}
.sel-periodo a.act{background:#fff;color:var(--marca);opacity:1}
.kpi .delta{display:inline-block;margin-left:7px;font-size:11.5px;font-weight:700;padding:2px 7px;border-radius:20px;vertical-align:middle}
.kpi .delta.buena{background:#E2F5EC;color:#127A57}
.kpi .delta.mala{background:#FBEAE7;color:#B03A28}
.kpi .delta.neutra{background:var(--fondo);color:var(--tinta2)}
.aging{display:flex;height:14px;border-radius:8px;overflow:hidden;margin:6px 0 10px}
.aging i{display:block;height:100%}
.aging-leyenda{display:flex;flex-wrap:wrap;gap:12px;font-size:12px;color:var(--tinta2)}
.aging-leyenda b{font-weight:700;color:var(--tinta)}
.aging-leyenda .pt{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:5px;vertical-align:-1px}
.riesgo{border:1px solid #F2C4BB;background:#FDEDEA;border-radius:var(--radio);padding:16px 18px;margin-bottom:18px}
.riesgo h3{margin:0 0 4px;color:#8C2F1E;font-size:15px}
.riesgo .sub-r{font-size:12.5px;color:#A54836;margin-bottom:10px}
.riesgo a{display:flex;justify-content:space-between;gap:10px;padding:8px 10px;border-radius:9px;
  text-decoration:none;color:var(--tinta);font-size:13.5px;background:rgba(255,255,255,.65)}
.riesgo a + a{margin-top:6px}
.riesgo .ya{color:#B03A28;font-weight:700}
.csat-mini{display:flex;gap:14px;align-items:center;margin-top:4px}
.csat-mini span{display:flex;gap:5px;align-items:center;font-size:12.5px;font-weight:600;color:var(--tinta2)}
/* La calificación en la lista de tickets. El color va en el trazo de la carita
   (--csat, el mismo de CSAT_DEF) y el texto se queda en la tinta normal: un
   renglón entero de color competiría con los chips de prioridad y SLA, que son
   los que tienen que ganar cuando el ticket está vivo. */
.csat-fila{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;
  font-size:13px;font-weight:600}
.csat-fila svg{flex:0 0 auto}
/* Tonos de los de CSAT_DEF, bajados para que 13px sobre blanco pase de 4.5:1
   (el verde original da 3.4 y se lee borroso en una tabla). */
.csat-fila.cs-feliz{color:#16794C}
.csat-fila.cs-neutro{color:#8A6011}
.csat-fila.cs-triste{color:#A83A3A}
.csat-pt{font-size:11px;cursor:help;filter:grayscale(.15)}
.csat-nada{font-size:12.5px;color:var(--tinta3)}
/* El asunto es la razón de ser del renglón: nunca por debajo de esto, aunque
   haya que deslizar. Y si la suma de las columnas no cabe, la tabla se desliza
   DENTRO de su tarjeta —el mismo patrón de las tablas de administración— en vez
   de desbordarse encima de la página. */
.tabla-tickets{overflow-x:auto}
/* El mínimo va DENTRO de una consulta de ancho mínimo y no suelto: por debajo de
   700px la tabla es una tarjeta apilada y ahí 280px la desbordan en un iPhone SE
   (comprobado a 320px). Apagarlo en el bloque de móvil no bastaba: ese bloque va
   antes en el archivo y la regla suelta le ganaba por orden.
   OJO: nada de acentos graves en estos comentarios — el CSS vive dentro de una
   plantilla de JS y uno solo la cierra a media página. Ya pasó al escribir esto. */
@media(min-width:701px){ .tabla-tickets td[data-c=asunto]{min-width:280px} }
/* Ocho columnas son 16 costados de celda: los 14px de todo el sitio se convertían
   aquí en 224px de aire, más que el asunto entero. Se recorta el costado —no el
   alto, que es lo que hace legible el renglón— y con eso la tabla cabe en una
   laptop de 1280 en vez de deslizarse. */
.tabla-tickets td,.tabla-tickets th{padding-left:10px;padding-right:10px}
.tabla-tickets td[data-c=creado]{color:var(--tinta2)}
.cr-hora{white-space:nowrap}
.cr-tz{white-space:nowrap;font-size:11.5px;color:var(--tinta3)}
.tabla-ag{width:100%;border-collapse:collapse;font-size:13.5px}
.tabla-ag th{text-align:left;font-size:11px;letter-spacing:.5px;text-transform:uppercase;color:var(--tinta3);
  font-weight:700;padding:0 8px 8px 0}
.tabla-ag td{padding:7px 8px 7px 0;border-top:1px solid var(--borde)}
.tabla-ag td.num,.tabla-ag th.num{text-align:right;font-variant-numeric:tabular-nums}

/* ── tablero por dominio: secciones, índice y matriz de cruce ───────────────
   El tablero dejó de ser una pila de tarjetas y pasó a cinco bloques con
   nombre, cada uno contestando una pregunta distinta. Todo lo que sigue existe
   para eso — y para sacar del HTML los 45 atributos style="" que tenía la
   vista, que es como está escrito el resto de este archivo. */
/* Rejilla de KPIs con número de columnas FIJO. 'auto-fit' más la tarjeta que
   ocupa dos huecos daba un reparto distinto en cada ancho, y a 1280px dejaba
   "Garantías" sola en su renglón con tres huecos vacíos. Con tres columnas los
   dos bloques cierran exacto: Servicio son 9 huecos (8 tarjetas, la primera
   doble) y Patrimonio 6. */
.kpis.k3{grid-template-columns:repeat(3,1fr)}
@media(max-width:900px){.kpis.k3{grid-template-columns:repeat(2,1fr)}}
@media(max-width:560px){.kpis.k3{grid-template-columns:1fr}}
.hero-fila{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap}
.hero-sub{opacity:.85;font-size:14px}

/* Índice pegajoso. El tablero es largo A PROPÓSITO: cada sección contesta algo
   distinto y ninguna sobra. Sin este índice había que recorrerlo entero para
   llegar al parque. Va bajo el encabezado, que mide 60px y también es pegajoso. */
.tb-indice{position:sticky;top:60px;z-index:15;display:flex;gap:4px;flex-wrap:wrap;
  margin:0 0 20px;padding:7px 6px;border-radius:14px;background:var(--panel);
  border:1px solid var(--borde);box-shadow:var(--s1);
  -webkit-backdrop-filter:saturate(180%) blur(12px);backdrop-filter:saturate(180%) blur(12px)}
.tb-indice a{padding:6px 13px;border-radius:9px;font-size:13px;font-weight:650;
  color:var(--tinta2);text-decoration:none;transition:background .14s,color .14s}
.tb-indice a:hover{background:var(--marca-suave);color:var(--marca);text-decoration:none}

.tb-sec{margin-bottom:34px;scroll-margin-top:118px}
.tb-sec-h{margin:0 0 14px;padding-bottom:10px;border-bottom:1px solid var(--borde)}
.tb-sec-h h2{font-size:20px;font-weight:700;letter-spacing:-.025em;margin:0 0 3px;color:var(--tinta)}
.tb-sec-h p{margin:0;font-size:13.5px;line-height:1.5;color:var(--tinta2);max-width:74ch}

/* Título y bajada DENTRO de una tarjeta. Antes iban con style="" repetido
   quince veces, y cada copia tenía su propio tamaño de letra. */
.tb-h{margin:0 0 5px;font-size:15px}
.tb-nota{color:var(--tinta2);font-size:12.5px;line-height:1.5;margin-bottom:10px}
.tb-nota a{color:var(--marca);font-weight:600}
.tb-vacio{color:var(--tinta3);font-size:13px;padding:4px 0}
.tb-vacio a{color:var(--marca);font-weight:600}
.tb-vacio-grande{color:var(--tinta2);font-size:13.5px;line-height:1.6}
.tb-ok{font-size:13.5px;line-height:1.6;color:var(--tinta2)}
.tb-ok b{color:var(--verde)}
.tb-ok-linea{color:var(--tinta2);font-size:13.5px;padding:6px 0}
.tb-aviso{margin-top:10px;padding:9px 12px;border-radius:10px;background:var(--ambar-f);
  color:#8A5A08;font-size:12.5px;line-height:1.5}
.tb-aviso a{color:#8A5A08;font-weight:700}

/* Contadores compactos: un número y qué es. Para los bloques donde importa el
   conjunto (el parque, los huecos de captura) y no cada cifra por separado. */
.tb-minis{display:grid;grid-template-columns:repeat(auto-fit,minmax(92px,1fr));gap:8px}
.tb-mini{display:flex;flex-direction:column;gap:1px;padding:11px 13px;border-radius:12px;
  background:var(--fondo2);border:1px solid var(--borde2);color:var(--tinta);
  text-decoration:none;transition:border-color .14s,background .14s}
.tb-mini:hover{border-color:var(--marca2);background:var(--marca-suave);text-decoration:none}
.tb-mini b{font-size:21px;font-weight:800;letter-spacing:-.6px;font-variant-numeric:tabular-nums;line-height:1.1}
.tb-mini span{font-size:11.5px;color:var(--tinta2);font-weight:600;line-height:1.35}
.tb-mini.alerta b{color:var(--ambar)}

/* ── la matriz del cruce ──────────────────────────────────────────────────
   Volumen, mediana, cumplimiento y reaperturas en el mismo renglón. Cuatro
   números que por separado no dicen nada: juntos dicen qué sale caro. */
.cruce-caja{overflow-x:auto}
.cruce{width:100%;border-collapse:collapse;font-size:13.5px}
.cruce th{text-align:left;font-size:10.5px;letter-spacing:.5px;text-transform:uppercase;
  color:var(--tinta3);font-weight:700;padding:0 10px 8px 0;white-space:nowrap}
.cruce td{padding:9px 10px 9px 0;border-top:1px solid var(--borde);vertical-align:middle}
.cruce td.num,.cruce th.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.cruce tr:hover td{background:var(--marca-suave)}
.cruce .cr-nom{width:42%;min-width:150px}
.cruce .cr-nom a{color:var(--tinta);font-weight:650;text-decoration:none;display:block}
.cruce tr:hover .cr-nom a{color:var(--marca)}
/* La barra va bajo el nombre: conserva el lenguaje visual de las listas que
   sustituye, y deja las cuatro columnas para lo que antes no cabía. */
.cr-barra{display:block;height:3px;border-radius:99px;background:var(--borde);
  overflow:hidden;margin-top:5px;max-width:220px}
.cr-barra i{display:block;height:100%;border-radius:99px;background:var(--marca2)}
.cruce td.num b{font-weight:750}
.cruce td.num small{display:block;font-size:10.5px;color:var(--tinta3);font-weight:600}
.cr-cumpl{display:inline-block;padding:2px 8px;border-radius:20px;font-weight:700;font-size:12px}
.cr-cumpl.ok{background:var(--verde-f);color:#0F7A57}
.cr-cumpl.reg{background:var(--ambar-f);color:#8A5A08}
.cr-cumpl.mal{background:var(--rojo-f);color:#A8301F}
.cr-nd{color:var(--tinta3)}
.cr-link{color:var(--marca);text-decoration:none;font-weight:600}
/* En un teléfono las cinco columnas no caben. Primero se va la menos accionable
   —las reaperturas ya se leen en su KPI—; abajo de 620px ni cuatro caben, así que
   la fila deja de ser una fila: el nombre arriba y los tres números debajo, con
   su etiqueta. Se prefirió esto al scroll lateral, que esconde justo las columnas
   por las que existe la matriz: alguien vería "28 tickets" y nunca sabría que
   tardan 2.5 h. Es el mismo trato que ya reciben las tablas de tickets y activos. */
@media(max-width:760px){
  .cruce .col-reab{display:none}
  .cruce .cr-nom{min-width:120px}
}
@media(max-width:620px){
  /* OJO con el ancho. Dos cosas la empujaban a 600px dentro de una tarjeta de
     360, dejando la matriz con scroll lateral —justo lo que este bloque venía a
     evitar—: dejarla en width:auto, y sobre todo la regla "main table{min-width:600px}"
     del bloque móvil de arriba, que existe para que las tablas de administración
     se deslicen DENTRO de su tarjeta. Esta no se desliza: se apila. Por eso hay
     que soltarle ese mínimo explícitamente. */
  .cruce-caja{overflow-x:visible}
  main table.cruce{min-width:0}
  .cruce{display:block;width:100%;max-width:100%;table-layout:fixed}
  .cruce tbody,.cruce tr,.cruce td{display:block;width:auto;max-width:100%}
  .cruce thead{display:none}
  .cruce tr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:3px 8px;
    border-top:1px solid var(--borde);padding:11px 0}
  .cruce td{border:0;padding:0;min-width:0}
  .cruce tr:hover td{background:none}
  .cruce .cr-nom{grid-column:1/-1;width:auto;min-width:0;margin-bottom:4px}
  .cruce td.num{text-align:left;white-space:normal}
  .cruce td.num::before{content:attr(data-c);display:block;font-size:9.5px;
    letter-spacing:.3px;text-transform:uppercase;color:var(--tinta3);font-weight:700;
    margin-bottom:2px;white-space:normal}
  .cruce td.num small{display:inline;margin-left:5px}
  .cr-barra{max-width:none}
}
.av-aprob{max-width:1160px;margin:0 auto 18px;padding:13px 16px;border-radius:12px;
  background:#F3F0FE;border:1px solid #D8CFF7;color:#4A3AB8;font-size:13.5px;line-height:1.55}
/* El <b> NO puede ser inline-flex: con align-items:center el contenedor no tiene
   ningún hijo alineado a la línea base, así que el navegador se la sintetiza del borde
   inferior de la caja. Resultado: la frase en negritas quedaba unos pixeles arriba y el
   texto que la sigue ("Nada avanza hasta que decidas.") se veía hundido en la misma
   línea. Se queda inline y el ícono se acomoda con vertical-align, que sí respeta la
   línea base compartida. */
.av-aprob b{font-weight:700}
.av-aprob b .ico{width:16px;height:16px;display:inline-block;vertical-align:-3px;margin-right:7px}
.av-aprob a{display:inline-block;margin:6px 8px 0 0;padding:5px 12px;border-radius:999px;
  background:var(--panel);border:1px solid #D8CFF7;color:#4A3AB8;text-decoration:none;font-weight:600;font-size:12.5px}
.av-aprob a:hover{border-color:#6E5BE6}
.ap-yafirmo{font-size:13px;color:var(--tinta2);margin-top:-4px}
.pie-respaldo{font-weight:600;cursor:default}
.pie-respaldo.n-ok{color:#17966B}
.pie-respaldo.n-aviso{color:#B07B10}
.pie-respaldo.n-critico{color:#C0392B}
/* Aviso de privacidad. Se lee de corrido, asi que el ancho se limita a algo
   comodo (unos 70 caracteres) en vez de ocupar toda la pantalla. */
.aviso{max-width:640px}
.aviso .av-sec{margin-top:16px}
.aviso .av-sec h2{font-size:12.5px;font-weight:700;letter-spacing:-.1px;margin:0 0 4px;color:var(--tinta)}
.aviso .av-sec p{margin:0 0 6px;line-height:1.5;color:var(--tinta3);font-size:12.5px}
.aviso .av-sec ul{margin:0 0 6px;padding-left:16px}
.aviso .av-sec li{line-height:1.45;color:var(--tinta3);margin-bottom:2px;font-size:12.5px}
.aviso .av-nota{border-left:3px solid var(--marca);background:var(--fondo);padding:12px 14px;
  border-radius:0 10px 10px 0;font-size:13.5px;line-height:1.6;color:var(--tinta2)}
.aviso .av-acepto{display:flex;gap:10px;align-items:flex-start;margin:22px 0 18px;
  font-size:14.5px;line-height:1.55;color:var(--tinta)}
.aviso .av-acepto input{width:18px;height:18px;margin:1px 0 0;flex:0 0 auto}
.aviso .av-ver{font-size:12px;color:var(--tinta3);margin-top:4px}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

/* Modo oscuro: ajustes puntuales de componentes. VAN AL FINAL a proposito —
   misma especificidad que las reglas claras de arriba, asi que aqui gana el
   orden: lo ultimo escrito decide (leccion aprendida: al inicio, perdian). */
@media (prefers-color-scheme: dark){
  a.kpi:hover{border-color:var(--marca2)}
  .av-respaldo.n-aviso{background:#33290F;border-color:#57451C;color:#E5C36A}
  .av-respaldo.n-critico{background:#3A1F1A;border-color:#5E322A;color:#F0A395}
  .riesgo{background:#341E19;border-color:#5E322A}
  .riesgo h3{color:#F0A395}
  .riesgo .sub-r{color:#D89486}
  .riesgo a{background:rgba(255,255,255,.05);color:var(--tinta)}
  .riesgo .ya{color:#F0A395}
  .av-aprob{background:#231D3D;border-color:#3E3568;color:#BCAEF6}
  .av-aprob a{background:rgba(255,255,255,.05);border-color:#3E3568;color:#BCAEF6}
  .pal-fondo{background:rgba(0,0,0,.55)}
  .asis-caja{background:linear-gradient(140deg,rgba(79,168,236,.09),rgba(43,211,226,.06))}
  .modo-sel .mi-personal{background:rgba(140,120,250,.14);color:#A18BF0}
  #tp-cambio:checked+label b,#tp-cambio:checked+label .ico-tipo{color:var(--ambar)}
  .ia-pedir-fila{background:linear-gradient(180deg,#1B222B,var(--panel))}
  .ia-pedir{background:#2A2350;color:#B9A8F8;border-color:#453A7E}
  .ia-pedir:hover{background:#332B60;border-color:#584CA0}
  .csat-fila.cs-feliz{color:#5FC98F}
  .csat-fila.cs-neutro{color:#E0AE4A}
  .csat-fila.cs-triste{color:#F0A395}
  .fila-msg.t0{--tono:#5AB6F0}
  .fila-msg.t1{--tono:#4FC7B4}
  .fila-msg.t2{--tono:#A98CF0}
  .fila-msg.t3{--tono:#F080B4}
  .fila-msg.t4{--tono:#9BCE5A}
  .fila-msg.t5{--tono:#EFA268}
  .msg-interno{background:#2E2812;border-color:#57451C}
  .msg-interno .mi-head{color:#D8B45C}
  .msg-interno .mi-cuerpo{color:#E2CE96}
  .comentario.interno{background:#2E2812;border-color:#57451C}
  .ps-privado{background:#2E2812;border-color:#57451C}
  .ps-priv-tit{color:#D8B45C}
  .ps-contacto{color:#E2CE96}
  .ps-dom>span{color:#D8B45C}
  .ps-dom>b{color:#E2CE96}
  .ps-dom>small{color:#BFA972}
  .dom-caja{border-color:var(--borde)}
  .dom-pend>b{color:#E8C46A}
  
  .eq-op:has(input:checked){background:rgba(59,178,240,.08)}
  .panel-ap{background:#231F14}
  /* encabezado: el vidrio esmerilado se oscurece, no se queda lechoso */
  header{background:rgba(15,19,24,.82)}
  tr.fila:hover td{background:#1B232C}
  .persona.inactiva{background:#12171E}
  .lista-barra .barra{background:#242E38}
  .cal-nota{background:var(--panel)}
  /* chips de estado: mismo matiz, fondo hundido y texto que respira */
  .c-gris{background:#232B31;color:var(--tinta2)}
  .c-azul{background:#152A3D;color:#7FBCF2}
  .chk>input[type=checkbox]+.caja{background:var(--panel);border-color:var(--borde)}
  .soltar.puesto{background:#12312655;border-color:var(--verde)}
  .soltar.puesto .soltar-ico{border-color:#1F4A3A}
  select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23A7B5C1' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E")}
  .dict.ok{background:#123126;color:#4FD0A0}
  .dict.mal{background:#3A1E19;color:#EA7360}
  .dict.pend{background:#3A2F16;color:#E3B45B}
  .ka{background:var(--panel)}
  .chk-alto{background:#2A2416;border-color:#57451C}
  .tabla-activos tr.fila:hover{background:#1B2530}
  .e-nuevo{background:#1D2340;color:#9FADF2}
  .e-asignado{background:#2C1F3C;color:#C79BEA}
  .e-encurso{background:#0F2E35;color:#5FC9DC}
  .e-espera{background:#391F2B;color:#EF8FB2}
  .e-cerrado{background:#33211E;color:#D9A69C}
  .e-sinresp{background:#222A31;color:#9DB0BF}
  .e-espaprob{background:#33290F;color:#E0B776}
  .badge.b-agente{background:#13293C;color:var(--marca)}
  .badge.b-solicitante{background:#242C33;color:var(--tinta2)}
  .attr.rh{border-color:#2B4B66}
  .attr.falta{border-color:#57451C}
  .kpi .delta.buena{background:#123126;color:#4FD0A0}
  .kpi .delta.mala{background:#3A1E19;color:#F09A88}
  .ia-sug{background:linear-gradient(180deg,#221E3C,var(--panel));box-shadow:0 4px 16px rgba(0,0,0,.35)}
  .ia-badge{color:#B9A8F8}
  .ia-sug-tag{color:#8F81CF}
  .delia-tip:hover{border-color:#5B4B8F;background:rgba(124,92,251,.14);color:#C0AFFA}
  .delia-m.ia .delia-quien,.delia-verif summary{color:#B9A8F8}
  .delia-verif code{background:rgba(185,168,248,.14);color:#C7B9FA}
  .delia-acc button:hover{border-color:#5B4B8F;color:#C0AFFA;background:rgba(124,92,251,.12)}
  .delia{box-shadow:-14px 0 44px rgba(0,0,0,.5)}
  .ia-verif b{color:#8F81CF}
  .ia-verif code{background:rgba(185,168,248,.12);color:#B9A8F8}
  .av-aprob a{background:rgba(255,255,255,.05)}
  .pie-respaldo.n-ok{color:#33B888}
  .pie-respaldo.n-aviso{color:#E3A93F}
  .pie-respaldo.n-critico{color:#EA7360}
  /* tablero por dominio. Los tres chips de cumplimiento y el aviso de la foto
     vieja llevan color de texto fijo sobre un fondo que SÍ cambia con el tema:
     sin esta réplica, en oscuro quedaban ilegibles. */
  .cr-cumpl.ok{color:#4FD0A0}
  .cr-cumpl.reg{color:#E3B45B}
  .cr-cumpl.mal{color:#F09A88}
  .tb-aviso{color:#E3B45B}
  .tb-aviso a{color:#E3B45B}
  .tb-mini{background:#12181F}
  .tb-mini:hover{background:var(--marca-suave)}
  .cr-barra{background:#242E38}
  .dest-op{background:var(--panel)}
  .dest-guia{background:#12181F}
  .dest-freno{color:#E3B45B}
  /* El tinte de la opción elegida, en oscuro. Los mismos porcentajes que sobre un
     fondo claro aquí no se ven: hay que subirlos. */
  #modo-falla:checked+label{background:linear-gradient(120deg,rgba(79,168,236,.16),rgba(43,211,226,.10))}
  #modo-acceso:checked+label{background:linear-gradient(120deg,rgba(43,211,226,.14),rgba(14,143,160,.10))}
  #modo-acceso:checked+label b{color:#3FC8DA}
  #modo-personal:checked+label,#modo-equipo:checked+label{background:linear-gradient(120deg,rgba(140,120,250,.18),rgba(151,120,246,.11))}
  #modo-personal:checked+label b,#modo-equipo:checked+label b{color:#A18BF0}
  /* La campana agrupada: en claro el encabezado se aclara al pasar el puntero,
     en oscuro tiene que oscurecerse — el mismo blanco translúcido ahí lava el
     tono en vez de resaltarlo. */
  .camp-item:hover{background:rgba(0,0,0,.22)}
  .camp-grupo{--tf:rgba(79,168,236,.10)}
  .camp-grupo.g-firma{--tf:rgba(227,169,63,.12)}
  .tb-indice{background:rgba(23,29,36,.88)}
}
