/* Tema del clon: ROSADO OSCURO.
 *
 * Mantiene la estructura, las medidas y el contraste del "Office365Dark" que
 * usa el original, pero con una paleta ciruela/rosa para poder distinguir de un
 * vistazo esta aplicacion del sistema ASP.NET cuando ambos estan abiertos.
 *
 * Todo el color sale de estos tokens: cambiando el bloque :root se cambia el
 * tema entero.
 */

:root{
  /* superficies, de la mas clara a la mas oscura */
  --fondo:#241019;          /* fondo de pagina        (era #222) */
  --panel:#1c0c14;          /* barras, pies, tarjetas (era #191919) */
  --barra:#1c0b13;          /* barra de menu superior (era #1b1b1b) */
  --barra-activa:#3a1826;
  --fondo-fila:#180a10;     /* filas de la grilla     (era #000) */
  --fondo-fila-alt:#1f0e16;
  --campo:#150910;          /* interior de los editores */

  /* controles */
  --control:#3a1c2a;
  --control-borde:#562c3d;
  --menu:#3a1c2a;           /* desplegables y popups */

  /* texto y lineas */
  --texto:#fbe9f1;
  --texto-tenue:#b58ba0;
  --linea:#4a2634;
  --linea-fina:#2a1119;

  /* acento */
  --acento:#ff5c99;
  --acento-texto:#1a0a11;   /* texto legible sobre el acento */
  --acento-suave:#4a1b30;   /* celda con edicion pendiente */
  /* Importe sobre la barra de sumatoria. En --acento se perdia con el fondo:
     rosa sobre rosa oscuro es la misma familia de tono y da 4.9:1. En blanco
     sube a 12:1 y la cifra, que es lo que se va a leer, salta a la vista. */
  --cifra-total:#ffffff;
  /* Nombre del total (PIEZAS, PESO, TOTAL COMPRA...). En --texto-tenue
     quedaba 10px y rosa apagado sobre el panel: se leia como una marca de
     agua. Cerca del blanco da ~12:1 y se lee igual que la cifra. */
  --etiqueta-total:#f6e6ee;
  --seleccion:#74234d;      /* fila seleccionada */

  /* semanticos (se mantienen para que el significado no cambie) */
  --ok:#2fa84f;
  --aviso:#e0a32f;
  --error:#e04b4b;

  /* La pieza que va SIN cabeza (columna Cabeza de GANADO). Ambar, fuera de
     la familia rosa del tema, para que salte en una pantalla que es rosa
     entera; el texto oscuro encima da 9:1 de contraste. */
  --sin-cabeza:#f4c04a;
  --sin-cabeza-texto:#2a1608;
  --sin-cabeza-marca:#8a5a00;

  /* GANADO: sombreado de la fila segun la liquidacion de venta. */
  --sombra-enviado:#143a6e;
  --sombra-enviado-texto:#e8f0ff;
  --sombra-saldo:#6eb3e0;
  --sombra-saldo-texto:#0a1a28;
  --sombra-sin-cobro:#a32d3a;
  --sombra-sin-cobro-texto:#fff0f2;
  --sombra-cobrado:#d9b441;
  --sombra-cobrado-texto:#1a1408;
  --sombra-facturado:#1a6b44;
  --sombra-facturado-texto:#e8fff4;
  --sombra-iniciales:#0a0a0a;
  --sombra-iniciales-texto:#f0f0f0;
  /* Sin cliente, o sin nada que mostrar en Iniciales: fila blanca. */
  --sombra-sin-iniciales:#ffffff;
  --sombra-sin-iniciales-texto:#111111;
  /* GANADO: fila marcada o enfocada. Violeta: no se parece a ninguno de los
     colores de estado (azules, rojo, dorado, verde, negro, amarillo). */
  --seleccion-ganado:#7c3aed;
  --seleccion-ganado-texto:#ffffff;
  --seleccion-ganado-borde:#d8c4ff;
}

*{box-sizing:border-box}
[hidden]{display:none !important}
/* La pagina no se desplaza: lo hace la rejilla por dentro.
   Antes .pantalla media calc(100vh - 58px), un alto fijo que suponia que
   encima solo estaba la barra de menu. Con la ventana algo baja, o con una
   banda extra arriba (la de "AMBIENTE DE PRUEBAS", por ejemplo), la pantalla
   se pasaba del alto disponible y la barra inferior -Vista Previa, Guardar,
   Cancelar- se iba por debajo del borde. Ahora el alto lo reparte el
   navegador y nadie tiene que acertar ningun numero. */
html,body{margin:0;padding:0;height:100%}
body{display:flex;flex-direction:column}
.barra-menu{flex:0 0 auto}
/* min-height:0 es lo que deja encoger a un hijo flexible: sin esto su alto
   minimo es el de su contenido, crece sin limite y el que acaba
   desplazandose es el documento entero. */
main.contenido{flex:1 1 auto;min-height:0;overflow:auto;
  display:flex;flex-direction:column}
body{
  background:var(--fondo);
  color:var(--texto);
  font:13px/1.35 "Segoe UI",Tahoma,Geneva,sans-serif;
}
/* Hojas de impresion / vista previa: no son el tablero. html,body al 100%
   en columna deja el documento pegado a la izquierda y una barra de
   desplazamiento a la derecha, como si siguiera main.contenido.
   .impresion anula ese layout y deja que la hoja ocupe la ventana. */
html.impresion,body.impresion{
  height:auto;min-height:100%;display:block;overflow:auto;
  background:#fff;color:#111;
}
a{color:inherit;text-decoration:none}
button{font:inherit}

/* ------------------------------------------------------------------ */
/* Barra de menu superior: Gestion | Ganado | Maestros | Otros         */
/* ------------------------------------------------------------------ */
.barra-menu{display:flex;background:var(--barra);border-bottom:1px solid #000}
.menu-raiz{
  position:relative;display:flex;align-items:center;gap:8px;
  padding:0 22px;height:42px;cursor:pointer;color:var(--texto);
  border-right:1px solid #000;white-space:nowrap;
}
.menu-raiz:hover,.menu-raiz:focus,.menu-raiz.activo{background:var(--barra-activa);color:#fff;outline:none}
.menu-icono{width:18px;height:18px;border-radius:3px;display:inline-block}
.icono-1{background:linear-gradient(#2fa84f,#1c7a37)}
.icono-2{background:linear-gradient(#c78ba0,#8a5c6e)}
.icono-3{background:
  linear-gradient(90deg,#e04b7d 0 50%,#4bb7e0 50% 100%),
  linear-gradient(90deg,#e0c04b 0 50%,#5ad06a 50% 100%);
  background-size:100% 50%;background-position:0 0,0 100%;background-repeat:no-repeat}
.icono-4{background:linear-gradient(#e0518b,#a8124e)}
.chevron{color:var(--texto-tenue);font-size:11px}
.submenu{
  display:none;position:absolute;top:42px;left:0;min-width:200px;z-index:60;
  background:var(--menu);border:1px solid #000;box-shadow:0 6px 18px rgba(0,0,0,.6);
}
.menu-raiz:hover .submenu,.menu-raiz:focus-within .submenu{display:block}
.submenu a{display:block;padding:9px 16px;color:var(--texto)}
.submenu a:hover{background:var(--acento);color:var(--acento-texto)}
.menu-usuario{margin-left:auto;padding:0 18px;display:flex;align-items:center;color:var(--texto-tenue)}

.contenido{padding:8px}

/* ------------------------------------------------------------------ */
/* Login                                                               */
/* ------------------------------------------------------------------ */
body.tema-login{
  background:linear-gradient(160deg,#3d1729 0%,#2a1019 60%,#1c0b13 100%);
  min-height:100vh;
  display:flex;align-items:flex-start;justify-content:center;
}
/* La pantalla de acceso no lleva barra de menu, igual que en el original. */
body.tema-login .barra-menu{display:none}
.caja-login{
  width:min(380px,92vw);margin-top:14px;background:#43182f;border:1px solid #5c2340;
  border-radius:6px;padding:24px;box-shadow:0 6px 22px rgba(0,0,0,.45);
}
.avatar-login{width:82px;height:82px;border-radius:50%;background:var(--acento);
  margin:0 auto 18px;display:flex;align-items:center;justify-content:center;
  font-size:44px;color:var(--acento-texto)}
.caja-login label{display:block;color:#f4d3e2;font-size:20px;margin-bottom:6px}
.caja-login input[type=text],.caja-login input[type=password]{
  width:100%;height:62px;font-size:30px;padding:0 8px;border:none;border-radius:10px;
  background:#fdf3f7;color:#2a1019;
}
.fila-pass{display:flex}
.fila-pass input{border-radius:10px 0 0 10px !important;flex:1}
.ver-pass{width:56px;border:none;border-radius:0 10px 10px 0;background:var(--acento);
  color:var(--acento-texto);font-size:22px;cursor:pointer}
.fila-recordar{display:flex;align-items:center;justify-content:flex-end;gap:8px;
  margin:14px 0;color:#f4d3e2}
.interruptor{position:relative;width:56px;height:26px;background:var(--error);
  border-radius:14px;cursor:pointer}
.interruptor input{display:none}
.interruptor .bola{position:absolute;top:3px;left:3px;width:20px;height:20px;
  border-radius:50%;background:#fff;transition:.2s}
.interruptor .etiqueta{position:absolute;right:8px;top:4px;font-size:12px;color:#fff;font-weight:700}
.interruptor.si{background:var(--ok)}
.interruptor.si .bola{left:33px}
.btn-entrar{
  display:block;margin:0 auto;background:var(--acento);color:var(--acento-texto);
  border:none;border-radius:8px;font-size:30px;font-weight:700;padding:8px 26px;cursor:pointer;
}
.error-login{background:#8e1d3f;color:#fff;padding:8px 10px;border-radius:6px;margin-bottom:12px}

/* ------------------------------------------------------------------ */
/* Portada de mosaicos (index.aspx)                                    */
/* ------------------------------------------------------------------ */
/* Los colores de los mosaicos NO se tocan: son datos copiados del original
   (core/navegacion.py) y las simulaciones los verifican uno a uno. */
.mosaicos{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));
  gap:6px;padding:6px;
}
.mosaico{
  min-height:150px;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:12px;font-weight:700;font-size:15px;text-align:center;
  padding:14px;border:none;cursor:pointer;letter-spacing:.3px;
}
.mosaico .glifo{font-size:40px;line-height:1}
.mosaico.bloqueado{opacity:.45;cursor:not-allowed}

/* ------------------------------------------------------------------ */
/* Grilla (ASPxGridView)                                               */
/* ------------------------------------------------------------------ */
.pantalla{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;
  position:relative}
/* Once acciones no caben en una linea en una pantalla estrecha, y recortar
   la barra escondia justo los botones del final. Se envuelve. */
.barra-herramientas{
  display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:6px;
  background:var(--panel);border:1px solid var(--linea);border-bottom:none;
  position:sticky;top:0;z-index:45;
}
.tb-btn{
  background:var(--control);border:1px solid var(--control-borde);color:var(--texto);
  border-radius:3px;padding:5px 10px;cursor:pointer;display:flex;align-items:center;gap:6px;
}
.tb-btn:hover{background:var(--acento);color:var(--acento-texto);border-color:var(--acento)}
/* NUEVO es el boton que se busca primero al entrar en una pantalla: con el
   mismo aspecto que "Limpiar Filtros" habia que leer la barra entera para
   encontrarlo. Va en el color de acento, con el signo mas grande. */
.tb-btn.tb-nuevo{
  background:var(--acento);border-color:var(--acento);color:var(--acento-texto);
  font-weight:700;padding:5px 14px;box-shadow:0 1px 4px rgba(0,0,0,.35);
}
.tb-btn.tb-nuevo span{font-size:15px;line-height:1}
.tb-btn.tb-nuevo:hover{filter:brightness(1.12)}
/* Los botones plegables siguen repartiendose como hijos de la barra: el
   contenedor existe solo para poder esconderlos de una vez. */
.acciones-barra{display:contents}
/* La tira de la barra de herramientas: en el monitor no existe a efectos de reparto;
   en el telefono se desliza de lado (static/css/movil.css). */
.tb-tira{display:contents}
/* El interruptor que los devuelve. Se distingue de las acciones -no hace
   nada a los datos- sin competir con NUEVO. */
.tb-btn.tb-plegar{background:var(--panel);border-color:var(--linea);
  color:var(--texto-tenue)}
.tb-btn.tb-plegar:hover{background:var(--barra-activa);color:var(--texto);
  border-color:var(--control-borde)}
.tb-btn.tb-plegar.plegado{border-color:var(--acento);color:var(--acento)}
/* El rango de fechas se pliega entero, con sus dos etiquetas. */
.bloque-fechas{display:flex;align-items:center;gap:14px}
.tb-menu{position:relative}
.tb-menu .desplegable{
  display:none;position:absolute;top:32px;left:0;min-width:170px;z-index:50;
  background:var(--menu);border:1px solid #000;box-shadow:0 6px 18px rgba(0,0,0,.6);
}
.tb-menu.abierto .desplegable{display:block}
.desplegable button{display:block;width:100%;text-align:left;padding:9px 14px;
  background:none;border:none;color:var(--texto);cursor:pointer}
.desplegable button:hover{background:var(--acento);color:var(--acento-texto)}
/* La opcion puesta va marcada con un ✓ y en negrita: al abrir el
   desplegable se ve de un vistazo por donde esta filtrando. */
.desplegable button.elegido{font-weight:700;color:var(--acento)}
.desplegable button.elegido:hover{color:var(--acento-texto)}
/* Con catorce especies la lista cabe; si el maestro crece, se desplaza
   dentro del desplegable en vez de salirse de la pantalla. */
.desplegable.lista-especies{max-height:60vh;overflow-y:auto;white-space:pre}
/* Un boton de la barra que esta filtrando se distingue del que no: si no,
   una grilla filtrada parece una grilla vacia. */
.tb-btn.filtrando,.tb-menu.filtrando > .tb-btn{
  background:var(--acento);color:var(--acento-texto);border-color:var(--acento)}
.titulo-pantalla{margin-left:auto;font-size:20px;font-weight:700;letter-spacing:2px;
  padding-right:14px;color:var(--acento)}

/* Se envuelve si no cabe: en GANADO los selectores Liquidacion y Cliente
   no entran en una sola linea en una pantalla estrecha. */
.barra-filtros{
  display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;padding:6px;background:var(--panel);
  border:1px solid var(--linea);border-top:none;border-bottom:none;
}
.buscador{background:var(--control);border:1px solid var(--control-borde);color:var(--texto);
  padding:5px 8px;border-radius:3px;width:220px}
.buscador::placeholder{color:var(--texto-tenue)}
/* Una tabla filtrada se parece demasiado a una tabla vacia. */
.marca-filtro{color:var(--acento);font-size:12px;font-weight:600;
  border:1px solid var(--acento);border-radius:10px;padding:2px 10px}
.conmutador{display:flex;align-items:center;gap:7px;cursor:pointer;user-select:none}
.conmutador .pista{width:38px;height:18px;border-radius:9px;background:#6b4354;
  position:relative;transition:.15s}
.conmutador .pista i{position:absolute;top:2px;left:2px;width:14px;height:14px;
  border-radius:50%;background:#fff;transition:.15s}
.conmutador.on .pista{background:var(--acento)}
.conmutador.on .pista i{left:22px}
/* Selector de tres opciones de GANADO (Liquidacion, Cliente): botones
   pegados, uno solo elegido, con el color de acento. */
.selector-opciones{display:inline-flex;align-items:center;white-space:nowrap;font-size:12px}
.selector-opciones .selector-titulo{color:var(--texto-tenue);margin-right:6px}
.selector-opciones button{background:var(--control);border:1px solid var(--control-borde);
  color:var(--texto);padding:4px 9px;cursor:pointer;font:inherit;line-height:1.2}
.selector-opciones button + button{border-left:none}
.selector-opciones button:first-of-type{border-radius:3px 0 0 3px}
.selector-opciones button:last-of-type{border-radius:0 3px 3px 0}
.selector-opciones button:hover{border-color:var(--acento)}
.selector-opciones button.elegido{background:var(--acento);color:var(--acento-texto);
  border-color:var(--acento);font-weight:600}
/* Filtro propio de una pantalla dentro de la barra (bloque filtros_extra). */
.filtro-barra{display:flex;align-items:center;gap:6px;color:var(--texto-tenue);
  font-size:12px;white-space:nowrap}
.filtro-barra select,.filtro-barra input[type=date]{
  background:var(--control);border:1px solid var(--control-borde);
  color:var(--texto);padding:5px 8px;border-radius:3px}
/* Sin esto el icono del calendario se dibuja negro sobre fondo oscuro y el
   campo parece no tener calendario. */
.filtro-barra input[type=date]{color-scheme:dark}
.filtro-barra input[type=date]:focus{border-color:var(--acento);outline:none}

.marco-grilla{flex:1 1 auto;min-height:0;overflow:auto;
  border:1px solid var(--linea);background:var(--fondo-fila)}
/* La barra de desplazamiento del navegador (¬17px, con flechas) es la que
   mas se ve en esta pantalla -esta siempre ahi, la tabla es mas ancha que
   el monitor- y competia en tamano con los datos. Mas fina, sigue siendo
   facil de arrastrar con el raton. */
.marco-grilla::-webkit-scrollbar{height:8px;width:8px}
.marco-grilla::-webkit-scrollbar-track{background:var(--fondo-fila)}
.marco-grilla::-webkit-scrollbar-thumb{background:var(--linea);border-radius:4px}
.marco-grilla::-webkit-scrollbar-thumb:hover{background:var(--texto-tenue)}
/* El pie, el paginador y las dos barras no encogen: son lo ultimo que
   se debe perder de vista. */
.pie-resumen,.barra-paginas,.barra-acciones,
.barra-herramientas,.barra-filtros{flex:0 0 auto}
/* ``table-layout:fixed``: cada columna mide lo que declara su definicion
   (Column.width) y no lo que pida el texto mas largo que le toque. Antes un
   nombre de proveedor largo estiraba su columna y empujaba a las demas
   fuera de la pantalla, de modo que el ancho de la tabla cambiaba de una
   pagina a otra. El texto que no cabe se corta con puntos suspensivos y se
   ve entero al pasar por encima (el JS le pone el title).

   El ancho total lo escribe el JS con la suma de las columnas
   (Grid.ajustarAnchoTabla); ``min-width`` es para cuando caben de sobra: asi
   se reparten la pantalla en vez de dejar un hueco a la derecha. En cuanto
   alguien arrastra un borde, ``anchos-propios`` quita ese minimo: si no, el
   navegador volveria a repartir el hueco y estrechar una columna no se
   notaria. */
table.grilla{border-collapse:collapse;table-layout:fixed;min-width:100%;font-size:12px}
table.grilla.anchos-propios{min-width:0}
table.grilla th{
  position:sticky;top:0;z-index:5;background:var(--fondo);color:#fff;font-weight:600;
  text-align:left;padding:6px 8px;border:1px solid var(--linea);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;
  cursor:grab;
}
table.grilla th .embudo{float:right;color:var(--texto-tenue);margin-left:6px;
  margin-right:8px;cursor:pointer}
table.grilla th .embudo:hover{color:var(--acento)}
/* El embudo de una columna que esta filtrando se ve: si no, faltan filas y
   no hay forma de saber por que. */
table.grilla th .embudo.filtrando{color:var(--acento)}
table.grilla th .embudo.filtrando::after{content:"\2022"}
table.grilla th.orden-asc::after{content:" ▲";color:var(--acento)}
table.grilla th.orden-desc::after{content:" ▼";color:var(--acento)}
table.grilla td{
  padding:4px 8px;border:1px solid var(--linea-fina);color:var(--texto);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;
}
table.grilla tbody tr{background:var(--fondo-fila)}
table.grilla tbody tr:nth-child(even){background:var(--fondo-fila-alt)}
table.grilla tbody tr.seleccionada{background:var(--seleccion)}
table.grilla tbody tr.enfocada td{outline:1px solid var(--acento);outline-offset:-1px}
table.grilla td.editada{background:var(--acento-suave)}
/* Una fila que no se edita (en GANADO, la pieza ya liquidada). Se lee igual
   de bien -sigue siendo un dato que hay que consultar- pero el cursor y el
   tono dicen que ahi no se teclea, sin tener que intentarlo para enterarse. */
table.grilla tbody tr.bloqueada > td{
  color:var(--texto-tenue);
  cursor:not-allowed;
  font-style:italic;
}
table.grilla tbody tr.bloqueada .casilla-bool{cursor:not-allowed}
/* Columnas inmovilizadas -------------------------------------------------
   Una tabla de veinte columnas se desplaza de lado, y al hacerlo se puede
   perder de vista cual es la fila. Las columnas fijas se quedan pegadas a la
   izquierda, con la casilla de seleccion. El desplazamiento de cada una lo
   calcula el JS con los anchos reales (Grid.fijarColumnas).

   background:inherit y no un color fijo: asi la celda se lleva el de su
   fila -alterna, seleccionada, enfocada- en vez de romper el rayado. */
table.grilla th.fija,table.grilla td.fija{position:sticky}
/* La celda se lleva el fondo de su fila -alterna, seleccionada, enfocada-
   en vez de romper el rayado. En la cabecera no vale heredar: la fila del
   thead no tiene fondo propio y la celda saldria transparente, dejando ver
   pasar por debajo lo que se desplaza. */
table.grilla td.fija{background:inherit;z-index:3}
table.grilla th.fija{background:var(--fondo);z-index:7}
/* Una linea marca donde termina lo que no se mueve. La ultima la senala el
   JS: el selector que lo haria en CSS (:nth-last-of-type(1 of .fija)) aun no
   esta en todos los navegadores. */
table.grilla th.ultima-fija,table.grilla td.ultima-fija{
  border-right:2px solid var(--linea)}

/* La pieza que va SIN cabeza (columna Cabeza de GANADO) se marca en su
   propia celda: al repasar un romaneo hay que separarlas de un vistazo,
   porque pesan -y se pagan- distinto. Color propio, no el de "editada", y
   un borde a la izquierda para que se distinga tambien sin color
   (impresion, daltonismo).

   Va detras de las reglas de columna fija a proposito: Pieza es la columna
   fija de GANADO y ``td.fija{background:inherit}`` tiene la misma
   especificidad, asi que puesto antes se quedaba con el fondo de su fila y
   el texto oscuro encima, ilegible.

   La variante tr.bloqueada hace falta por lo mismo pero con el color: esa
   regla es ``tr.bloqueada > td{color:...}``, mas especifica que un simple
   ``td.sin-cabeza``, y sin este empate el texto oscuro pensado para leerse
   sobre el amarillo salia con el tono apagado de "no se edita" -bajisimo
   contraste sobre fondo dorado. Una pieza liquidada sigue pudiendo ser
   S/CABEZA y las dos marcas tienen que convivir legibles. */
table.grilla td.sin-cabeza,
table.grilla tbody tr.seleccionada td.sin-cabeza,
table.grilla tbody tr.enfocada td.sin-cabeza,
table.grilla tbody tr.bloqueada td.sin-cabeza,
table.grilla tbody tr[class*="sombra-"] td.sin-cabeza{
  background:var(--sin-cabeza);
  color:var(--sin-cabeza-texto);
  font-weight:700;
  box-shadow:inset 3px 0 0 var(--sin-cabeza-marca);
}

/* GANADO: un color por fila segun la liquidacion de venta. Gana al rayado
   par/impar y a la seleccion, para que el estado se lea aunque la fila
   este marcada. El texto de ``bloqueada`` (tenue) se pisa con el de cada
   color: si no, una pieza LIQUIDADO se leeria apagada sobre rojo o verde. */
table.grilla tbody tr.sombra-enviado,
table.grilla tbody tr.sombra-enviado:nth-child(even),
table.grilla tbody tr.sombra-enviado.seleccionada{background:var(--sombra-enviado)}
table.grilla tbody tr.sombra-enviado > td,
table.grilla tbody tr.sombra-enviado.bloqueada > td{color:var(--sombra-enviado-texto)}

table.grilla tbody tr.sombra-facturado,
table.grilla tbody tr.sombra-facturado:nth-child(even),
table.grilla tbody tr.sombra-facturado.seleccionada{background:var(--sombra-facturado)}
table.grilla tbody tr.sombra-facturado > td,
table.grilla tbody tr.sombra-facturado.bloqueada > td{color:var(--sombra-facturado-texto)}

table.grilla tbody tr.sombra-saldo,
table.grilla tbody tr.sombra-saldo:nth-child(even),
table.grilla tbody tr.sombra-saldo.seleccionada{background:var(--sombra-saldo)}
table.grilla tbody tr.sombra-saldo > td,
table.grilla tbody tr.sombra-saldo.bloqueada > td{color:var(--sombra-saldo-texto)}

table.grilla tbody tr.sombra-cobrado,
table.grilla tbody tr.sombra-cobrado:nth-child(even),
table.grilla tbody tr.sombra-cobrado.seleccionada{background:var(--sombra-cobrado)}
table.grilla tbody tr.sombra-cobrado > td,
table.grilla tbody tr.sombra-cobrado.bloqueada > td{color:var(--sombra-cobrado-texto)}

table.grilla tbody tr.sombra-sin-cobro,
table.grilla tbody tr.sombra-sin-cobro:nth-child(even),
table.grilla tbody tr.sombra-sin-cobro.seleccionada{background:var(--sombra-sin-cobro)}
table.grilla tbody tr.sombra-sin-cobro > td,
table.grilla tbody tr.sombra-sin-cobro.bloqueada > td{color:var(--sombra-sin-cobro-texto)}

table.grilla tbody tr.sombra-iniciales,
table.grilla tbody tr.sombra-iniciales:nth-child(even),
table.grilla tbody tr.sombra-iniciales.seleccionada{background:var(--sombra-iniciales)}
table.grilla tbody tr.sombra-iniciales > td,
table.grilla tbody tr.sombra-iniciales.bloqueada > td{color:var(--sombra-iniciales-texto)}

table.grilla tbody tr.sombra-sin-iniciales,
table.grilla tbody tr.sombra-sin-iniciales:nth-child(even),
table.grilla tbody tr.sombra-sin-iniciales.seleccionada{background:var(--sombra-sin-iniciales)}
table.grilla tbody tr.sombra-sin-iniciales > td,
table.grilla tbody tr.sombra-sin-iniciales.bloqueada > td{color:var(--sombra-sin-iniciales-texto)}

/* GANADO: la fila marcada (casilla) o enfocada (clic) se pinta de violeta, y
   aqui SI gana al color de estado. Antes pasaba al reves: casi toda fila con
   comprador lleva sombra-iniciales, asi que marcar una no cambiaba nada a la
   vista. El estado no se pierde: queda como franja a la izquierda, en la
   casilla. La enfocada lleva ademas un borde, para distinguirla de las
   solo marcadas. */
table.grilla-ganado tbody tr.sombra-enviado{--color-estado:var(--sombra-enviado)}
table.grilla-ganado tbody tr.sombra-facturado{--color-estado:var(--sombra-facturado)}
table.grilla-ganado tbody tr.sombra-saldo{--color-estado:var(--sombra-saldo)}
table.grilla-ganado tbody tr.sombra-cobrado{--color-estado:var(--sombra-cobrado)}
table.grilla-ganado tbody tr.sombra-sin-cobro{--color-estado:var(--sombra-sin-cobro)}
table.grilla-ganado tbody tr.sombra-iniciales{--color-estado:var(--sombra-iniciales)}
table.grilla-ganado tbody tr.sombra-sin-iniciales{--color-estado:var(--sombra-sin-iniciales)}
table.grilla-ganado tbody tr.seleccionada,
table.grilla-ganado tbody tr.enfocada,
table.grilla-ganado tbody tr.seleccionada:nth-child(even),
table.grilla-ganado tbody tr.enfocada:nth-child(even),
table.grilla-ganado tbody tr[class*="sombra-"].seleccionada,
table.grilla-ganado tbody tr[class*="sombra-"].enfocada{background:var(--seleccion-ganado)}
table.grilla-ganado tbody tr.seleccionada > td,
table.grilla-ganado tbody tr.enfocada > td,
table.grilla-ganado tbody tr[class*="sombra-"].seleccionada > td,
table.grilla-ganado tbody tr[class*="sombra-"].enfocada > td{color:var(--seleccion-ganado-texto)}
table.grilla-ganado tbody tr[class*="sombra-"].seleccionada > td:first-child{
  box-shadow:inset 6px 0 0 var(--color-estado)}
/* El borde de la enfocada va como sombra interior y no como border: un
   border mas grueso cambiaria el alto de la fila y la tabla saltaria. */
table.grilla-ganado tbody tr.enfocada > td{
  outline:none;
  box-shadow:inset 0 2px 0 var(--seleccion-ganado-borde),
             inset 0 -2px 0 var(--seleccion-ganado-borde)}
table.grilla-ganado tbody tr[class*="sombra-"].enfocada > td:first-child{
  box-shadow:inset 6px 0 0 var(--color-estado),
             inset 0 2px 0 var(--seleccion-ganado-borde),
             inset 0 -2px 0 var(--seleccion-ganado-borde)}
/* La celda S/CABEZA conserva su amarillo con texto oscuro: el blanco de la
   fila marcada no se leeria encima. */
table.grilla-ganado tbody tr.seleccionada > td.sin-cabeza,
table.grilla-ganado tbody tr.enfocada > td.sin-cabeza,
table.grilla-ganado tbody tr[class*="sombra-"].seleccionada > td.sin-cabeza,
table.grilla-ganado tbody tr[class*="sombra-"].enfocada > td.sin-cabeza{
  color:var(--sin-cabeza-texto)}
/* La celda editada lleva fondo rosa oscuro, y el texto tiene que ser claro
   sea cual sea la fila: el color de estado (#111 en la fila blanca, oscuro
   en saldo y cobrado) dejaba lo tecleado negro sobre granate, ilegible. Va
   al final para ganar a las reglas de fila; S/CABEZA conserva su amarillo. */
table.grilla tbody tr > td.editada:not(.sin-cabeza){
  background:var(--acento-suave);
  color:var(--texto)}
table.grilla-ganado tbody tr.seleccionada > td.editada:not(.sin-cabeza),
table.grilla-ganado tbody tr.enfocada > td.editada:not(.sin-cabeza){
  color:var(--seleccion-ganado-texto)}

/* Mover una columna arrastrando su cabecera. El borde derecho es otra
   cosa: cambia el ancho, y el cursor lo dice antes de agarrarlo. */
/* touch-action:none: sin el, el dedo sobre la cabecera desplaza la tabla y el
   navegador cancela el arrastre; el resto de la tabla se sigue desplazando. */
table.grilla th.arrastrable{cursor:grab;touch-action:none;
  -webkit-user-select:none;user-select:none}
body.moviendo-columna{cursor:grabbing;-webkit-user-select:none;user-select:none}
body.moviendo-columna table.grilla th.arrastrable{cursor:grabbing}
.asa-redimension{position:absolute;top:0;right:0;bottom:0;width:7px;
  cursor:col-resize;z-index:6;touch-action:none}
.asa-redimension:hover,.asa-redimension.activo{background:var(--acento)}
body.redimensionando-columna{cursor:col-resize;user-select:none}
table.grilla th.arrastrando{opacity:.45}
table.grilla th.destino{box-shadow:inset 3px 0 0 var(--acento)}

td.num,th.num{text-align:right}
.celda-check{width:34px;text-align:center;cursor:default}
.casilla-sel{accent-color:var(--acento)}
.casilla-bool{accent-color:var(--acento);cursor:pointer;width:15px;height:15px}
.casilla-bool:disabled{cursor:default;opacity:.6}
.fila-filtros input{width:100%;background:var(--campo);border:1px solid var(--control-borde);
  color:var(--texto);padding:3px 5px;font-size:11px}
.editor-celda{width:100%;background:var(--campo);border:1px solid var(--acento);
  color:#fff;padding:2px 4px;font-size:12px}
.editor-inline{width:90px;background:var(--campo);border:1px solid var(--control-borde);
  color:var(--texto);padding:3px 5px;font-size:12px;text-align:right}
.editor-inline:focus{border-color:var(--acento);outline:none}
/* Una descripcion que se teclea en la fila (CONCEPTOS ADICIONALES,
   DESCUENTOS): es texto y no una cifra, asi que va a la izquierda y ocupa
   toda la celda. */
.editor-inline.editor-texto{width:100%;text-align:left}
/* Un valor que GUARDAR va a rechazar (p. ej. un Descuento mayor que lo que
   vale la pieza): se ve antes de pulsarlo. */
.editor-inline.invalido,.editor-inline.invalido:focus{border-color:var(--error);
  box-shadow:0 0 0 1px var(--error)}

/* El precio unitario se pierde entre las demas columnas y es el dato que mas
   se revisa al liquidar: se resalta para poder recorrerlo de un vistazo. */
.precio{color:var(--acento);font-weight:600}
input.precio{color:var(--acento);border-color:var(--acento-suave)}

/* Pie de sumatorias: Piezas, Peso, Monto, Cantidad, Total Precio Compra y
   Total Precio Venta. Antes era un renglon de texto corrido del tamano de
   una celda mas, en el que la cifra habia que buscarla leyendo. Ahora cada
   total es un bloque con su nombre encima y el numero grande, pegado debajo
   de la tabla, que es donde se mira al cerrar el dia. */
.pie-resumen{
  display:flex;flex-wrap:wrap;gap:2px;align-items:stretch;
  padding:0;background:var(--panel);border:1px solid var(--linea);border-top:none;
  border-bottom:2px solid var(--acento);color:var(--texto);font-size:12px;
}
.pie-resumen .total{
  display:flex;flex-direction:column;justify-content:center;gap:1px;
  padding:6px 16px;min-width:120px;border-right:1px solid var(--linea-fina);
}
.pie-resumen .total:last-child{border-right:none}
.pie-resumen .total-etiqueta{
  color:var(--etiqueta-total);font-size:12px;font-weight:700;
  letter-spacing:.35px;text-transform:uppercase;white-space:nowrap;
}
.pie-resumen .total-cifra{
  color:var(--cifra-total);font-size:18px;font-weight:800;
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.pie-resumen .total-cuenta{background:var(--fondo)}
.pie-resumen .total-cuenta .total-cifra{color:var(--cifra-total);font-size:18px}
/* El nombre corto se ve en el telefono y en la tableta, donde
   "TOTAL PRECIO COMPRA" no cabe en una fila de ocho. En el monitor
   se lee el rotulo entero. */
.pie-resumen .total-etiqueta-corta{display:none}
.barra-paginas{
  display:flex;align-items:center;gap:6px;padding:6px;background:var(--panel);
  border:1px solid var(--linea);border-top:none;
}
.barra-paginas button{background:var(--control);border:1px solid var(--control-borde);
  color:var(--texto);min-width:28px;padding:3px 7px;cursor:pointer;border-radius:2px}
.barra-paginas button.actual{background:var(--acento);color:var(--acento-texto);
  border-color:var(--acento)}
.barra-acciones{display:flex;justify-content:flex-end;gap:8px;padding:8px;
  background:var(--panel);border:1px solid var(--linea);border-top:none}
/* El resumen y los botones cierran el dia en la misma franja, siempre a
   la vista. Los totales toman el hueco de la izquierda; Guardar y
   Cancelar se quedan a la derecha, a la misma altura. */
.barra-acciones.con-resumen{align-items:stretch;padding:0 8px 0 0;
  border-bottom:2px solid var(--acento)}
.barra-acciones.con-resumen .pie-resumen{
  flex:1 1 auto;min-width:0;overflow-x:auto;align-items:stretch;
  border:none;background:transparent}
.barra-acciones.con-resumen .pie-resumen .total{
  min-width:100px;padding:6px 12px}
.barra-acciones.con-resumen .pie-resumen .total-cifra{font-size:18px}
.barra-acciones.con-resumen .btn{align-self:center;flex:0 0 auto}
.acciones-proceso{
  position:sticky;bottom:0;z-index:45;display:flex;justify-content:flex-end;
  gap:8px;flex-wrap:wrap;padding:10px;margin:8px 0 0;
  background:var(--panel);border:1px solid var(--linea);
  box-shadow:0 -6px 18px rgba(0,0,0,.35);
}
.btn{background:var(--control);border:1px solid var(--control-borde);color:var(--texto);
  border-radius:3px;padding:6px 16px;cursor:pointer}
.btn:hover{background:var(--barra-activa)}
.btn-primario{background:var(--acento);border-color:var(--acento);
  color:var(--acento-texto);font-weight:600}
/* Guardar cierra la edicion de la tabla: es la accion de la barra de abajo
   y tiene que distinguirse de Cancelar sin tener que leer las dos. */
.btn-guardar{background:var(--acento);border-color:var(--acento);
  color:var(--acento-texto);font-weight:700;font-size:14px;
  padding:8px 30px;letter-spacing:.4px;box-shadow:0 1px 5px rgba(0,0,0,.4)}
.btn-guardar:hover{background:var(--acento);filter:brightness(1.12)}

/* Selector de columnas ------------------------------------------------- */
.panel-columnas{position:absolute;z-index:60;top:44px;left:8px;min-width:220px;
  max-height:60vh;overflow-y:auto;background:var(--menu);
  border:1px solid var(--control-borde);border-radius:3px;
  box-shadow:0 8px 24px rgba(0,0,0,.6);padding:6px}
.panel-columnas-cabecera{display:flex;align-items:center;justify-content:space-between;
  gap:10px;padding:4px 6px 8px;border-bottom:1px solid var(--linea)}
.panel-columnas-cabecera .btn{padding:3px 8px;font-size:11px}
.columna-opcion{display:flex;align-items:center;gap:7px;padding:5px 6px;
  cursor:pointer;color:var(--texto);white-space:nowrap}
.columna-opcion:hover{background:var(--seleccion)}
.columna-opcion input{flex:0 0 auto;margin:0}
/* Mover la columna sin arrastrar: en un telefono no hay arrastre comodo, y
   con el teclado tampoco. */
.columna-opcion .mover{margin-left:auto;display:flex;gap:3px;flex:0 0 auto}
.columna-opcion .mover button{background:var(--control);color:var(--texto);
  border:1px solid var(--control-borde);border-radius:3px;cursor:pointer;
  padding:1px 7px;font-size:12px;line-height:1.3}
.columna-opcion .mover button:hover:not(:disabled){background:var(--acento);
  color:var(--acento-texto);border-color:var(--acento)}
.columna-opcion .mover button:disabled{opacity:.3;cursor:default}
.columna-opcion.fija{color:var(--texto-tenue)}
.columna-opcion .marca-fija{margin-left:auto;font-size:10px;
  letter-spacing:.5px;text-transform:uppercase;color:var(--acento)}

/* Desplegable del embudo de una cabecera -------------------------------- */
/* Antes el embudo era un prompt() en el que habia que acertar el texto de
   memoria. Ahora despliega lo que hay en esas celdas para marcarlo. Va en
   coordenadas de ventana (colocarFlotante) porque el marco de la tabla tiene
   overflow y lo recortaria. */
.panel-valores{
  position:fixed;z-index:80;min-width:min(240px,92vw);max-width:min(340px,94vw);
  background:var(--menu);border:1px solid var(--control-borde);border-radius:3px;
  box-shadow:0 8px 24px rgba(0,0,0,.6);padding:8px;
  display:flex;flex-direction:column;gap:6px;
}
.panel-valores-titulo{color:var(--acento);font-weight:600;letter-spacing:.4px;
  padding-bottom:4px;border-bottom:1px solid var(--linea)}
.buscador-valores{background:var(--campo);border:1px solid var(--control-borde);
  color:var(--texto);padding:5px 7px;border-radius:2px;width:100%}
.buscador-valores:focus{border-color:var(--acento);outline:none}
.buscador-valores.contiene{border-style:dashed}
.lista-valores{max-height:min(320px,40vh);overflow-y:auto;
  border:1px solid var(--linea-fina);border-radius:2px}
.valor-opcion{display:flex;align-items:center;gap:7px;padding:4px 7px;
  cursor:pointer;color:var(--texto);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.valor-opcion:hover{background:var(--seleccion)}
.valor-opcion input{flex:0 0 auto;margin:0;accent-color:var(--acento)}
.valor-opcion.valor-todos{border-bottom:1px solid var(--linea);font-weight:600}
.panel-valores-pie{display:flex;justify-content:flex-end;gap:6px}
.panel-valores-pie .btn{padding:4px 12px;font-size:12px}

/* Popups -------------------------------------------------------------- */
.popup{position:fixed;inset:0;background:rgba(20,6,12,.7);display:flex;
  align-items:center;justify-content:center;z-index:100}
.popup-caja{background:var(--menu);border:1px solid #000;
  min-width:min(360px,94vw);max-width:90vw;
  box-shadow:0 10px 40px rgba(0,0,0,.7)}
.popup-caja-movimiento{min-width:min(820px,96vw);max-width:min(920px,96vw);
  max-height:90vh;display:flex;flex-direction:column}
.popup-caja-movimiento .popup-cuerpo{overflow:auto}
.modo-nuevo .solo-ficha{display:none}
.modo-detalle .solo-escritura,.modo-detalle .busca-pieza,.modo-detalle .btn-quitar{display:none}
.modo-detalle #mvTablaPiezas th:last-child,.modo-detalle #mvTablaPiezas td:last-child{display:none}
.modo-detalle .busca-liquidacion{display:none}
.modo-detalle #mvTablaLiquidaciones th:last-child,.modo-detalle #mvTablaLiquidaciones td:last-child{display:none}
/* VINCULAR LIQUIDACION: el movimiento se ve como en DETALLE y solo se
   eligen liquidaciones; las piezas no se tocan. */
.modo-vincular .solo-escritura,.modo-vincular #mvBloquePiezas .busca-pieza,
.modo-vincular #mvBloquePiezas .btn-quitar{display:none}
.modo-vincular #mvTablaPiezas th:last-child,.modo-vincular #mvTablaPiezas td:last-child{display:none}
/* LEER VOUCHER: la foto y, al lado, lo que se leyo de ella. Los campos que
   la lectura lleno quedan marcados hasta que alguien los toca. */
.nota-voucher{margin:-4px 0 10px 120px}
.voucher-vista{display:flex;gap:12px;align-items:flex-start;margin:0 0 12px 120px}
.voucher-vista[hidden]{display:none}
.voucher-vista img{max-width:220px;max-height:220px;border:1px solid var(--control-borde);
  flex:0 0 auto}
.voucher-lectura{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:8px;
  align-items:flex-start}
.lectura-voucher{width:100%;box-sizing:border-box;padding:8px 10px;border:1px solid var(--linea);
  border-left:3px solid var(--texto-tenue);border-radius:4px;font-size:12.5px;line-height:1.45;
  display:flex;flex-direction:column;gap:4px}
.lectura-voucher[hidden]{display:none}
.lectura-voucher.leido{border-left-color:var(--ok)}
.lectura-voucher.error,.lectura-voucher.repetido{border-left-color:var(--aviso)}
.lectura-voucher.leyendo .lv-titulo::before{content:"";display:inline-block;width:10px;height:10px;
  margin-right:6px;border:2px solid var(--texto-tenue);border-top-color:transparent;
  border-radius:50%;animation:girar-voucher .8s linear infinite;vertical-align:-1px}
@keyframes girar-voucher{to{transform:rotate(360deg)}}
.lectura-voucher .lv-titulo{font-weight:700}
.lectura-voucher .lv-datos{font-weight:600;font-variant-numeric:tabular-nums}
.lectura-voucher .lv-nombres,.lectura-voucher .lv-nota{color:var(--texto-tenue)}
.lectura-voucher .lv-aviso{color:var(--aviso)}
.lectura-voucher .lv-distintos{display:flex;flex-direction:column;gap:4px;align-items:flex-start}
.campo .autollenado{border-color:var(--ok) !important;box-shadow:inset 0 0 0 1px var(--ok)}
/* En una tarjeta (el voucher del deposito de un CREDITO) los campos van en
   rejilla: la foto no se alinea con la columna de las etiquetas. */
.nota-voucher.en-tarjeta{margin:0 0 10px}
.voucher-vista.en-tarjeta{margin:0 0 4px}
.bloque-piezas{margin:14px 0 8px;padding-top:10px;border-top:1px solid var(--linea)}
.bloque-piezas .busca-pieza{margin-bottom:10px}
.bloque-piezas .busca-pieza input{width:100%;box-sizing:border-box;
  background:var(--campo);border:1px solid var(--control-borde);color:var(--texto);
  padding:7px 10px;border-radius:2px;min-height:34px}
.bloque-piezas .busca-pieza input:focus{border-color:var(--acento);outline:none}
.lista-piezas{min-width:100%}
.opcion-pieza{display:grid;grid-template-columns:70px 78px 70px minmax(70px,1fr) minmax(90px,1.3fr) 78px;
  gap:8px;align-items:baseline;font-variant-numeric:tabular-nums}
.opcion-pieza .n{text-align:right}
.opcion-pieza .nombre,.opcion-pieza .fecha{color:var(--texto-tenue);font-size:11px}
.tabla-piezas-cuenta{overflow-x:auto;margin-top:8px}
#mvTablaPiezas th,#mvTablaPiezas td{white-space:nowrap;padding:6px 10px;
  vertical-align:middle}
#mvTablaPiezas td:nth-child(5){white-space:normal}
.saldo-piezas{margin-top:10px;background:var(--panel);border:1px solid var(--linea);
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr))}
.saldo-piezas div{display:flex;flex-direction:column;gap:3px;padding:10px 12px;
  border-right:1px solid var(--linea)}
.saldo-piezas div:last-child{border-right:none}
.saldo-piezas span{color:var(--texto-tenue);font-size:11px;letter-spacing:.4px;
  text-transform:uppercase}
.saldo-piezas b{font-size:16px;font-variant-numeric:tabular-nums}
.saldo-piezas .resto{margin:0;padding-top:10px;border-top:none;font-size:inherit}
.saldo-piezas .resto b{color:var(--acento)}
.saldo-piezas.con-sobra .resto b{color:var(--cifra-total)}
/* Vincular LIQUIDACION: la misma presentacion que las piezas. */
.opcion-liquidacion{display:grid;grid-template-columns:110px 78px minmax(90px,1.4fr) 100px 80px;
  gap:8px;align-items:baseline;font-variant-numeric:tabular-nums}
.opcion-liquidacion .n{text-align:right}
.opcion-liquidacion .nombre,.opcion-liquidacion .fecha{color:var(--texto-tenue);font-size:11px}
.opcion-liquidacion .facturada,.marca-facturado{color:var(--ok);font-weight:700;letter-spacing:.3px}
.opcion-liquidacion .facturada{font-size:11px}
#mvTablaLiquidaciones th,#mvTablaLiquidaciones td{white-space:nowrap;padding:6px 10px;
  vertical-align:middle}
#mvTablaLiquidaciones td:nth-child(3){white-space:normal}
#mvTablaLiquidaciones input.l-aplicar{width:100px;text-align:right;background:var(--campo);
  border:1px solid var(--control-borde);color:var(--texto);padding:4px 6px;border-radius:2px}
.saldo-piezas.con-exceso .resto b{color:var(--error)}
.marca-cuenta{color:var(--acento);font-size:10px;font-weight:700;
  letter-spacing:.4px;text-transform:uppercase;margin-left:6px}
.popup-cabecera{background:var(--panel);padding:9px 14px;font-weight:600;
  border-bottom:1px solid #000;color:var(--acento)}
.popup-cuerpo{padding:16px 14px}
.popup-pie{padding:10px 14px;display:flex;justify-content:flex-end;gap:8px;
  border-top:1px solid #000;background:var(--barra-activa)}
.opcion-cuota{display:block;width:100%;text-align:left;background:transparent;
  border:none;border-bottom:1px solid var(--linea);color:var(--texto);
  padding:12px 16px;cursor:pointer;font:inherit}
.opcion-cuota:hover,.opcion-cuota:focus{background:var(--seleccion);outline:none}
.opcion-cuota:last-child{border-bottom:none}
.campo{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.campo label{width:110px;color:var(--texto-tenue)}
.campo input,.campo select,.campo textarea{flex:1;min-width:0;background:var(--campo);border:1px solid var(--control-borde);
  color:var(--texto);padding:5px 7px;border-radius:2px}
.campo textarea{font:inherit;resize:vertical}
/* Observaciones del comprobante: el texto ocupa varias lineas, la etiqueta
   va arriba a la izquierda y no centrada en la altura. */
.campo-observaciones{align-items:flex-start;max-width:820px}
.campo-observaciones label{padding-top:6px}
/* Sin esto el icono del selector de fecha se dibuja negro sobre fondo oscuro
   y queda invisible: el campo parece no tener calendario. */
.campo input[type=date]{color-scheme:dark}

/* Combo de busqueda: un input que al escribir despliega coincidencias
   debajo, en vez de un input de filtro mas un <select> aparte. */
.campo-combo{position:relative;flex:1}
.combo-lista{position:absolute;z-index:50;top:100%;left:0;right:0;margin-top:2px;
  max-height:220px;overflow-y:auto;background:var(--menu);border:1px solid var(--control-borde);
  border-radius:2px;box-shadow:0 8px 24px rgba(0,0,0,.6)}
/* El banco queda al final del formulario: hacia abajo la tapa el borde
   y no se ve. Se abre encima del campo. */
.combo-lista.hacia-arriba{top:auto;bottom:100%;margin-top:0;margin-bottom:2px}
.combo-opcion{padding:6px 8px;cursor:pointer;color:var(--texto)}
.combo-opcion:hover,.combo-opcion.activa{background:var(--seleccion)}
/* El mismo combo, pero dentro de una celda de la grilla: la lista tiene que
   flotar sobre las filas de abajo, no empujarlas. */
.celda-combo{position:relative}
.celda-combo .combo-lista{min-width:220px;font-size:12px}
.combo-crear{border-top:1px solid var(--linea);color:var(--acento);font-weight:600}
.combo-cliente{color:var(--acento);font-style:italic}
.combo-cliente + .combo-crear{border-top:1px solid var(--linea)}
.combo-sin-resultados{padding:6px 8px;color:var(--texto-tenue)}

.alta-descuento-pieza{margin-top:12px}
.alta-descuento-pieza .busca-pieza{max-width:520px;margin-bottom:10px}
.alta-descuento-pieza .busca-pieza input{width:100%;box-sizing:border-box;
  background:var(--campo);border:1px solid var(--control-borde);color:var(--texto);
  padding:7px 10px;border-radius:2px;min-height:34px}
.alta-descuento-pieza .busca-pieza input:focus{border-color:var(--acento);outline:none}
.lista-desc-pieza{min-width:100%}
.opcion-desc-pieza{grid-template-columns:70px minmax(90px,1fr) minmax(110px,1.4fr) 80px}
.vista-pieza{margin:8px 0 10px;background:var(--panel);border:1px solid var(--linea);
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr))}
.vista-pieza div{display:flex;flex-direction:column;gap:3px;padding:10px 12px;
  border-right:1px solid var(--linea)}
.vista-pieza div:last-child{border-right:none}
.vista-pieza span{color:var(--texto-tenue);font-size:11px;letter-spacing:.4px;
  text-transform:uppercase}
.vista-pieza b{font-size:14px;font-variant-numeric:tabular-nums}

/* Formulario generico de NUEVO / EDITAR / DETALLE ----------------------- */
.caja-formulario{min-width:min(700px,94vw);max-height:88vh;display:flex;
  flex-direction:column}
.caja-formulario .popup-cuerpo{overflow:auto}
.campo-formulario{display:flex;flex-direction:column;gap:3px}
.etiqueta-campo{color:var(--texto-tenue);font-size:11px;letter-spacing:.4px;
  text-transform:uppercase}
.campo-formulario input,.campo-formulario select{
  background:var(--campo);border:1px solid var(--control-borde);color:var(--texto);
  padding:6px 8px;border-radius:2px;width:100%}
.campo-formulario input:focus,.campo-formulario select:focus{
  border-color:var(--acento);outline:none}
.campo-formulario input[type=checkbox]{width:18px;height:18px;accent-color:var(--acento)}
.campo-formulario input[type=date]{color-scheme:dark}
/* Formulario por bloques (USUARIOS): un bloque por grupo del menu, con su
   cuenta de permisos puestos y un boton para marcarlos todos. */
.caja-secciones{width:min(860px,96vw)}
.form-secciones{display:flex;flex-direction:column;gap:8px}
.seccion-form{border:1px solid var(--linea);background:var(--panel);border-radius:3px}
.seccion-cabecera{display:flex;align-items:center;gap:8px;padding:5px 10px;
  border-bottom:1px solid var(--linea-fina)}
.seccion-titulo{flex:1;font-size:11px;font-weight:700;letter-spacing:.6px;
  text-transform:uppercase;color:var(--acento)}
.seccion-cuenta{font-size:11px;color:var(--texto-tenue);font-variant-numeric:tabular-nums}
.seccion-cuenta.completa{color:var(--ok)}
.btn.btn-mini{padding:2px 8px;font-size:11px;min-height:0;line-height:1.5}
.form-secciones .rejilla-campos.compacta{padding:8px 10px;
  grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;align-items:end}
.rejilla-interruptores{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));
  gap:2px 10px;padding:6px 10px}
.barra-permisos{display:flex;align-items:center;gap:6px;padding:2px 2px 0}
.permisos-total{flex:1;font-size:12px;color:var(--texto-tenue)}
/* Interruptor: la casilla real queda encima, invisible, y recibe el clic y
   el teclado; la pista es solo el dibujo. */
.switch-permiso{position:relative;display:flex;align-items:center;gap:8px;
  padding:5px 4px;border-radius:3px;cursor:pointer;user-select:none;min-height:30px}
.switch-permiso:hover{background:var(--fondo-fila-alt)}
.switch-caja{position:absolute;opacity:0;width:32px;height:18px;margin:0;cursor:pointer}
.switch-pista{flex:0 0 32px;height:18px;border-radius:9px;background:var(--control);
  border:1px solid var(--control-borde);position:relative;transition:background .15s}
.switch-pista::after{content:"";position:absolute;top:2px;left:2px;width:12px;
  height:12px;border-radius:50%;background:var(--texto-tenue);transition:transform .15s,background .15s}
.switch-caja:checked + .switch-pista{background:var(--acento);border-color:var(--acento)}
.switch-caja:checked + .switch-pista::after{transform:translateX(14px);
  background:var(--acento-texto)}
.switch-caja:focus-visible + .switch-pista{outline:2px solid var(--acento);
  outline-offset:2px}
.switch-texto{font-size:13px;color:var(--texto-tenue)}
.switch-caja:checked ~ .switch-texto{color:var(--texto)}
/* La ficha de una fila: etiqueta a la izquierda y valor a la derecha, para
   poder leer las veinticinco columnas sin desplazarse de lado. */
.tabla-detalle{width:100%}
.tabla-detalle th{width:40%;text-align:left;color:var(--texto-tenue);
  font-weight:600;background:var(--fondo)}

/* Alertas temporales --------------------------------------------------- */
.alerta{position:fixed;top:16px;right:16px;z-index:200;display:flex;align-items:center;gap:10px;
  background:var(--menu);border-left:4px solid var(--ok);color:var(--texto);padding:11px 14px;
  box-shadow:0 6px 20px rgba(0,0,0,.5);opacity:0;transform:translateX(20px);transition:.35s}
.alerta.mostrar{opacity:1;transform:none}
.alerta.ocultar{opacity:0;transform:translateX(20px)}
.alerta-warning{border-left-color:var(--aviso)}
.alerta-error{border-left-color:var(--error)}
.alerta-cerrar{background:none;border:none;color:var(--texto-tenue);font-size:18px;cursor:pointer}

/* Formularios de proceso ---------------------------------------------- */
.tarjeta{background:var(--panel);border:1px solid var(--linea);padding:14px;margin-bottom:8px}
.tarjeta h2{margin:0 0 12px;font-size:15px;letter-spacing:1px;color:var(--acento)}
.rejilla-campos{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px}
/* Empieza fila nueva: en la cabecera de la compra, los dos pesos van juntos
   en su propia fila, debajo de los campos que se teclean. */
.rejilla-campos .campo-salto{grid-column-start:1}
/* Totales de NUEVO COMPROBANTE: el mismo tope que un campo de DATOS
   (260px), sin estirarse a todo el ancho de la tarjeta. */
.totales-comprobante{grid-template-columns:repeat(4,minmax(180px,260px));
  justify-content:start}
.totales-comprobante .campo{margin-bottom:0}
.totales-comprobante .campo label{width:auto;flex:0 1 auto;white-space:nowrap}
.totales-comprobante .campo input{flex:1 1 72px;max-width:110px;text-align:right}
.detraccion-campos{grid-template-columns:minmax(240px,1fr) minmax(300px,1.3fr) minmax(170px,.7fr) minmax(170px,.7fr)}
table.simple{border-collapse:collapse;width:100%;font-size:12px}
table.cuentas-deposito input,table.cuentas-deposito select{width:100%;box-sizing:border-box}
table.cuentas-deposito td{vertical-align:middle}
table.cuentas-deposito .quita{width:42px;text-align:center}
/* Facturacion: el detalle no se estira a todo el ancho. Cada columna
   mide lo que pide su dato; Articulo es la unica que puede crecer un poco.
   table.simple ya pone width:100% y padding mas holgado: hay que ganarles. */
table.simple.tabla-detalle-fe{width:auto;max-width:100%;table-layout:fixed}
table.simple.tabla-detalle-fe .col-num{width:28px}
table.simple.tabla-detalle-fe .col-articulo{width:220px}
table.simple.tabla-detalle-fe .col-um{width:200px}
table.simple.tabla-detalle-fe .col-cant{width:96px}
table.simple.tabla-detalle-fe .col-precio{width:92px}
table.simple.tabla-detalle-fe .col-afecta{width:88px}
table.simple.tabla-detalle-fe .col-importe{width:76px}
table.simple.tabla-detalle-fe .col-quita{width:28px}
table.simple.tabla-detalle-fe th,table.simple.tabla-detalle-fe td{
  padding:3px 5px;vertical-align:middle}
table.simple.tabla-detalle-fe .nota-col{display:block;font-weight:400;font-size:10px;
  letter-spacing:0;color:var(--texto-tenue)}
table.simple.tabla-detalle-fe input,table.simple.tabla-detalle-fe select{
  width:100%;min-width:0;max-width:100%;
  background:var(--campo);border:1px solid var(--control-borde);color:var(--texto);
  padding:3px 5px;border-radius:2px}
table.simple.tabla-detalle-fe input[type=number]{-moz-appearance:textfield;appearance:textfield}
table.simple.tabla-detalle-fe input[type=number]::-webkit-inner-spin-button,
table.simple.tabla-detalle-fe input[type=number]::-webkit-outer-spin-button{
  appearance:none;margin:0}
/* Cantidad lleva las flechas y avanza de centésima en centésima, como el precio. */
table.simple.tabla-detalle-fe input.l-cantidad[type=number]{
  -moz-appearance:auto;appearance:auto}
table.simple.tabla-detalle-fe input.l-cantidad[type=number]::-webkit-inner-spin-button,
table.simple.tabla-detalle-fe input.l-cantidad[type=number]::-webkit-outer-spin-button{
  -webkit-appearance:inner-spin-button;appearance:auto;opacity:1;margin:0}
table.simple.tabla-detalle-fe .btn{padding:1px 7px}
table.simple th{background:var(--fondo);padding:6px 8px;border:1px solid var(--linea);
  text-align:left;position:relative}
/* El ancho arrastrado manda sobre el 100% de la tabla: si no, el borde
   se moveria y la columna seguiria midiendo lo mismo. */
table.simple.anchos-propios,table.caja-formas.anchos-propios,
table.caja-arqueo.anchos-propios{table-layout:fixed;width:auto;max-width:none}
table.simple td{padding:4px 8px;border:1px solid var(--linea-fina)}
/* Subtotal de cada cuadro: tiene que saltar a la vista, no confundirse
   con una fila mas de la tabla. */
table.simple tfoot td{background:var(--acento-suave);font-weight:700;
  color:var(--texto);border-top:2px solid var(--acento);padding:7px 8px;
  font-size:13px;letter-spacing:.3px}
table.simple tfoot td.num{color:var(--cifra-total);font-size:14px}
/* Columna Cabeza de PIEZAS en la liquidacion: la de GANADO, con el mismo
   amarillo para S/cabeza. El desplegable se tiñe con la celda para que el
   texto oscuro se lea sobre el amarillo; la lista abierta vuelve al tema. */
table.simple td.lin-cabeza-celda{white-space:nowrap}
select.lin-cabeza{width:96px;text-align:left;cursor:pointer}
table.simple td.sin-cabeza{background:var(--sin-cabeza);color:var(--sin-cabeza-texto);
  font-weight:700;box-shadow:inset 3px 0 0 var(--sin-cabeza-marca)}
table.simple td.sin-cabeza select.lin-cabeza{background:var(--sin-cabeza);
  color:var(--sin-cabeza-texto);font-weight:700;border-color:var(--sin-cabeza-marca)}
select.lin-cabeza option{background:var(--campo);color:var(--texto);font-weight:400}
/* PIEZAS de la liquidacion: hasta 13 columnas. Cada una mide lo que su
   cifra: titulos abreviados (el nombre entero en su title), menos relleno,
   campos de 66 px sin las flechas del numero -con flechas, 90 px daban una
   tabla de ~1000 px y una barra de desplazamiento-. */
table.simple.piezas-compactas th,table.simple.piezas-compactas td{padding:4px 5px}
table.simple.piezas-compactas th{white-space:nowrap}
table.simple.piezas-compactas tfoot td{padding:7px 5px}
table.simple.piezas-compactas .editor-inline{width:66px;padding:3px 4px;
  -moz-appearance:textfield;appearance:textfield}
table.simple.piezas-compactas .editor-inline::-webkit-inner-spin-button,
table.simple.piezas-compactas .editor-inline::-webkit-outer-spin-button{
  -webkit-appearance:none;margin:0}
table.simple.piezas-compactas input.lin-dscto,
table.simple.piezas-compactas input.lin-redondeo{width:56px}
table.simple.piezas-compactas select.lin-cabeza{width:84px;padding-left:3px;padding-right:3px}
.totales{display:flex;gap:22px;flex-wrap:wrap;margin-top:12px;color:var(--texto)}
.totales b{color:var(--acento)}

/* ------------------------------------------------------------------ */
/* REPORTES: la pantalla dice lo mismo que el PDF                       */
/* ------------------------------------------------------------------ */
/* El informe se pinta agrupado tambien aqui -mismo corte, mismos
   subtotales, mismas cifras formateadas- para que lo que se ve antes de
   descargar sea lo que sale impreso. El aspecto es el del tema oscuro; el
   del papel esta en css/informe.css. */
table.simple th.n,table.simple td.n{text-align:right;white-space:nowrap;
  font-variant-numeric:tabular-nums}

.resumen-informe{display:flex;flex-wrap:wrap;gap:0;margin:12px 0;
  border:1px solid var(--linea);border-radius:4px;overflow:hidden}
.resumen-informe > div{flex:1 1 0;min-width:130px;padding:8px 12px;
  border-right:1px solid var(--linea-fina)}
.resumen-informe > div:last-child{border-right:none}
.resumen-informe span{display:block;color:var(--texto-tenue);font-size:10px;
  letter-spacing:.6px;text-transform:uppercase}
.resumen-informe b{font-size:16px;color:var(--acento)}

h3.corte{margin:16px 0 4px;font-size:12px;letter-spacing:.6px;
  text-transform:uppercase;color:var(--texto);padding:4px 8px;
  background:var(--fondo);border-left:3px solid var(--acento)}
h3.corte small{float:right;font-weight:400;color:var(--texto-tenue);
  text-transform:none;letter-spacing:0}

table.simple tr.subtotal td{background:var(--acento-suave);font-weight:700;
  border-top:2px solid var(--acento)}
/* El detalle de una fila -los documentos de un articulo, los clientes de
   una especie- va dentro de ella y sangrado: se lee como lo que es, de que
   se compone la cifra de arriba. */
table.simple tr.detalle-fila > td{padding:0 0 8px 26px;border-top:none;
  background:transparent}
table.simple table.menor{font-size:11px;margin-top:2px}
table.simple table.menor th{background:transparent;border:none;
  border-bottom:1px solid var(--linea);color:var(--texto-tenue);
  font-size:10px;letter-spacing:.4px;text-transform:uppercase;padding:2px 6px}
table.simple table.menor td{border:none;border-bottom:1px solid var(--linea-fina);
  padding:2px 6px}
table.simple table.menor td.entrada{color:#5fd18c;font-weight:700}
table.simple table.menor td.salida{color:#ff8f7a;font-weight:700}

/* ------------------------------------------------------------------ */
/* Facturacion electronica                                             */
/* ------------------------------------------------------------------ */
/* Modulos propios del clon, ausentes en el original */
.menu-raiz.menu-extension{border-left:2px solid var(--acento)}
.menu-raiz.menu-extension .menu-icono{background:var(--acento)}

.aviso-pruebas{
  background:#4a3a12;border-left:4px solid var(--aviso);color:#ffe9b0;
  padding:9px 14px;margin:0 0 8px;font-weight:600;letter-spacing:.3px;
}
.aviso-pruebas a{color:#ffe9b0;text-decoration:underline}
.aviso-ok{background:#123a1e;border-left:4px solid var(--ok);color:#c8f0d4;
  padding:9px 14px;margin:0 0 8px}
.aviso-error{background:#4a151d;border-left:4px solid var(--error);color:#ffd0d6;
  padding:9px 14px;margin:0 0 8px}
.aviso-error ul{margin:6px 0 0 18px}
table.simple th.num,table.simple td.num{text-align:right;white-space:nowrap}

/* ASIGNAR PIEZAS: el estado de cada fila de la lista, legible de un vistazo */
.estado-asignacion{display:inline-block;padding:2px 8px;border:1px solid var(--linea);
  border-radius:3px;font-size:11px;font-weight:700;letter-spacing:.4px;white-space:nowrap}
.estado-ASIGNADO,.estado-YA_ASIGNADA{border-color:var(--ok);color:var(--ok)}
.estado-ENCONTRADO{border-color:var(--acento);color:var(--acento)}
.estado-NO_ENCONTRADO,.estado-ERROR{border-color:var(--error);color:var(--error)}
.estado-VARIAS,.estado-OTRO_CLIENTE,.estado-LIQUIDADA,.estado-INCOMPLETA{
  border-color:var(--aviso);color:var(--aviso)}
.btn-intentar{display:block;margin:5px 0 0;padding:3px 10px;font-size:12px}
/* ASIGNAR PIEZAS: "Anotar camal en la compra N", junto a INTENTAR pero en
   verde -corrige la causa en vez de solo repetir la busqueda. */
.btn-anotar-camal{display:block;margin:5px 0 0;padding:3px 10px;font-size:12px;
  border-color:var(--ok);color:var(--ok)}
/* Una tabla de detalle con muchas columnas se desplaza dentro de su
   propia caja: la pagina entera no debe irse de lado. */
.tabla-ancha{overflow-x:auto}
/* PIEZAS de una liquidacion: la tabla se desplaza DENTRO de su caja, hacia los
   lados y hacia abajo (12/10/2026). Con treinta piezas la tabla medía mas de
   mil pixeles de alto y su barra horizontal quedaba al final, fuera de la
   pantalla: las columnas de la derecha (TOTAL, Redond., Margen) no se podian
   alcanzar y la rueda solo movia la pagina. Aqui la barra esta siempre a la
   vista, los titulos y la sumatoria se quedan pegados, y al llegar al final de
   la tabla la rueda sigue con la pagina. */
.tabla-desplazable{overflow:auto;max-height:72vh;max-height:72dvh;
  overscroll-behavior:auto}
.tabla-desplazable thead th{position:sticky;top:0;z-index:2;
  box-shadow:inset 0 -1px 0 var(--linea)}
.tabla-desplazable tfoot td{position:sticky;bottom:0;z-index:2;
  box-shadow:inset 0 1px 0 var(--acento)}
/* Un campo con su boton pegado al lado (Id + Buscar): el boton no debe
   robarle sitio al campo ni caerse a la linea siguiente. */
.campo-con-boton{display:flex;gap:6px;align-items:center}
.campo-con-boton input{flex:1;min-width:0}
.campo-con-boton .btn{flex:none;padding:4px 10px}

/* Celda que enlaza a un documento (el voucher de COBROS/PAGOS). */
.enlace-celda{color:var(--acento);text-decoration:underline}
.enlace-celda:hover{color:var(--texto)}
/* Liquidacion ya mandada por WhatsApp: el rotulo ENVIADO, de un vistazo. */
table.grilla td.enviado-whatsapp,table.grilla td.facturado-liq{color:var(--ok);font-weight:700;letter-spacing:.3px}
/* Liquidacion ANULADA: se queda en la lista, pero se lee que ya no cuenta. */
table.grilla td.anulada-liq{color:var(--error);font-weight:700;letter-spacing:.3px}

/* Ventana "Pagos / Cobros" del detalle de liquidacion ------------------- */
.caja-pagos{min-width:min(880px,94vw);max-height:88vh;overflow:auto}
.titulo-bloque{margin:16px 0 6px;font-size:13px;letter-spacing:.6px;
  color:var(--acento);text-transform:uppercase}
.titulo-bloque:first-child{margin-top:0}
.btn-quitar{background:none;border:1px solid var(--control-borde);color:var(--texto-tenue);
  border-radius:3px;padding:1px 8px;font-size:11px;cursor:pointer}
.btn-quitar:hover{border-color:var(--error);color:var(--error)}
/* El icono de quitar de cada fila de PIEZAS en la liquidacion: la pieza
   vuelve a GANADO. En el detalle se aplica al GUARDAR; hasta entonces la fila
   queda tachada y el icono pasa a ser "deshacer". */
.btn-icono{background:none;border:1px solid var(--control-borde);color:var(--texto-tenue);
  border-radius:3px;padding:3px 5px;line-height:0;cursor:pointer}
.btn-icono svg{width:15px;height:15px}
.btn-icono:hover,.btn-icono:focus-visible{border-color:var(--error);color:var(--error);outline:none}
.btn-icono.deshacer:hover,.btn-icono.deshacer:focus-visible{border-color:var(--acento);color:var(--acento)}
tr.fila-quitada td{opacity:.45;text-decoration:line-through}
tr.fila-quitada td:last-child{opacity:1;text-decoration:none}
tr.fila-nueva td:first-child{color:var(--acento);font-weight:700;font-size:11px;
  letter-spacing:.4px;text-transform:uppercase}
.aviso-piezas{margin-top:8px}
/* AGREGAR PRODUCTO: la ventana con las piezas de GANADO sin liquidar. */
.popup-caja-piezas{min-width:min(760px,96vw);max-width:min(920px,96vw);max-height:90vh;
  display:flex;flex-direction:column}
.popup-caja-piezas .popup-cuerpo{display:flex;flex-direction:column;gap:10px;min-height:0;
  overflow:hidden}
.buscador-piezas{width:100%;box-sizing:border-box;background:var(--campo);
  border:1px solid var(--control-borde);color:var(--texto);padding:7px 10px;
  border-radius:2px;min-height:34px}
.buscador-piezas:focus{border-color:var(--acento);outline:none}
.lista-agregar{overflow:auto;max-height:min(440px,55vh);border:1px solid var(--linea-fina)}
.lista-agregar table{width:100%}
.lista-agregar thead th{position:sticky;top:0;background:var(--panel);z-index:1}
.lista-agregar tbody tr[data-pieza]{cursor:pointer}
.lista-agregar tbody tr.elegida{background:var(--seleccion)}
.resumen-agregar{margin-right:auto;align-self:center;color:var(--texto-tenue);font-size:12px}
/* Sin piezas elegidas, Agregar no hace nada: que se note. */
.popup-caja-piezas .btn:disabled{opacity:.45;cursor:not-allowed}
/* Liq. Compra: de donde se agrega, piezas sueltas de GANADO o compras enteras. */
.selector-origen{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px}
.selector-origen-rotulo{color:var(--texto-tenue);font-size:12px}
.selector-origen label{display:inline-flex;align-items:center;gap:6px;cursor:pointer;
  padding:5px 10px;border:1px solid var(--control-borde);border-radius:3px}
.selector-origen label:has(input:checked){border-color:var(--acento);color:var(--acento)}
.selector-origen input{accent-color:var(--acento);margin:0}
.resumen-pagos{display:flex;gap:22px;flex-wrap:wrap;margin-top:16px;
  padding-top:12px;border-top:1px solid var(--linea)}
.resumen-pagos b{color:var(--acento)}
/* Un cobro ya metido en la cuenta del formulario de liquidacion: se
   distingue de los que siguen disponibles para marcar. */
tr.fila-aplicada{opacity:.7}
.estado-pago{font-size:11px;letter-spacing:.4px;text-transform:uppercase;
  color:var(--texto-tenue);white-space:nowrap}
tr.fila-aplicada .estado-pago{color:var(--acento);font-weight:700;opacity:1}
/* Cobro/Pago en 0: esa liquidacion no se cobra con esta. Sigue visible
   para poder reactivarla, pero no entra en TOTAL ADEUDADO. */
tr.fila-omitida{opacity:.45}
/* Liquidacion ya saldada: se ve como referencia y no se vuelve a marcar. */
tr.fila-referencia{opacity:.55}
tr.fila-referencia .estado-pago{opacity:1;color:var(--texto-tenue)}

/* Tarjeta TOTALES del detalle de liquidacion: resumen alineado a la derecha,
   como el recuadro de totales del documento impreso. */
.caja-totales{margin-left:auto;width:100%;max-width:360px}
.caja-totales td{padding:5px 10px}
/* En la caja de TOTALES el borde grueso va solo arriba del bloque y en la
   linea del SALDO, no repetido en cada fila. */
.caja-totales tfoot td{font-size:14px;border-top:none}
.caja-totales tfoot tr:first-child td{border-top:2px solid var(--acento)}
/* SALDO y TOTAL ADEUDADO son las dos cifras que se leen de un vistazo. */
.caja-totales tfoot tr.fila-saldo td{border-top:1px solid var(--acento);font-size:16px}
.caja-totales tfoot tr.fila-adeudado td{border-top:2px solid var(--acento);font-size:17px}
/* Descuento resta del SALDO igual que Cobrado resta del TOTAL: el mismo
   signo de menos para que se lea al mismo ritmo. Y la caja de edicion va
   al tamano de las cifras de al lado -a 90px y 12px, la unica fila que se
   puede tocar aqui era la que menos se notaba. */
.caja-totales tfoot .signo-resta{color:var(--texto-tenue);margin-right:2px}
.caja-totales input.editor-inline{width:100px;font-size:13px;padding:5px 8px;
  border-radius:3px}
.nota-totales{color:var(--texto-tenue);font-size:12px;margin:8px 0 0;text-align:right}
.nota-tabla{color:var(--texto-tenue);font-size:12px;margin:8px 0 0}


/* ------------------------------------------------------------------ */
/* Pantallas estrechas: telefono y tableta en vertical                  */
/* ------------------------------------------------------------------ */
/* El tema se escribio para el monitor del mostrador. En un telefono el
   menu se salia por la derecha -a FACTURACION no se llegaba-, la barra de
   acciones ocupaba cinco filas antes del primer dato, y las ventanas median
   mas que la pantalla. Aqui se aprieta lo que estorba; en el monitor no
   cambia nada. */
@media (max-width:760px){

  /* --- menu superior: se desplaza de lado en vez de perder entradas --- */
  .barra-menu{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch}
  .barra-menu::-webkit-scrollbar{height:3px}
  .barra-menu::-webkit-scrollbar-thumb{background:var(--linea)}
  .menu-raiz{flex:0 0 auto;padding:0 13px;height:40px;gap:6px;font-size:13px}
  .menu-usuario{flex:0 0 auto;padding:0 12px;font-size:12px}
  /* Un submenu anclado a su entrada se sale por el borde derecho: en
     estrecho se abre a lo ancho de la pantalla. */
  .submenu{position:fixed;top:40px;left:6px;right:6px;min-width:0}
  .submenu a{padding:11px 14px}

  /* El marco de 8px alrededor de la pantalla, en un telefono, son 16px de
     ancho y 16px de alto que no muestran nada. */
  .contenido{padding:4px}

  /* --- barra de acciones: de cinco filas a dos ---------------------- */
  /* Los botones de accion no caben en una linea y envolverlos con el tamano
     del monitor se comia media pantalla. Se aprietan; siguen todos, con
     su texto, porque un icono suelto no se entiende. */
  .barra-herramientas{gap:4px;padding:5px}
  .tb-btn{padding:4px 7px;font-size:11px;gap:4px;border-radius:4px}
  .tb-btn span{font-size:11px}
  .tb-btn.tb-nuevo{padding:4px 11px}
  .tb-btn.tb-nuevo span{font-size:13px}
  /* El titulo deja de disputarle el sitio a los botones: va encima, en su
     propia linea, que es donde se lee de un vistazo. */
  .titulo-pantalla{order:-1;flex:1 0 100%;margin:0;padding:0;
    font-size:12px;line-height:1.2;letter-spacing:1.5px}
  .tb-menu .desplegable{min-width:150px}
  /* Especie y los filtros rapidos son selectores siempre a la vista:
     se aprietan un poco mas que NUEVO/Acciones. */
  .barra-herramientas .tb-menu .tb-btn{padding:3px 6px;font-size:10px;gap:3px}

  /* --- barra de filtros -------------------------------------------- */
  /* El buscador y el selector (almacen, fechas, Todos) compartian el
     alto de un editor de formulario (36px) y se comian una fila de la
     tabla. Bajan a 26px: se sigue tocando el control entero, no hace
     falta el blanco de un campo de alta. Si entra algo mas (el rango
     de fechas) se sigue envolviendo. */
  .barra-filtros{flex-wrap:wrap;gap:4px;padding:3px 5px;align-items:center}
  .buscador{flex:1 1 110px;width:auto;min-width:0;padding:2px 6px;font-size:12px;
    min-height:26px;line-height:1.2}
  .conmutador{min-height:26px;gap:5px;font-size:12px}
  .conmutador .pista{width:28px;height:14px;border-radius:7px}
  .conmutador .pista i{top:2px;left:2px;width:10px;height:10px}
  .conmutador.on .pista i{left:16px}
  .selector-opciones{font-size:11px}
  .selector-opciones .selector-titulo{margin-right:4px}
  .selector-opciones button{padding:2px 6px;min-height:26px}
  .filtro-barra{flex-wrap:nowrap;font-size:11px;gap:4px}
  .filtro-barra select,.filtro-barra input[type=date]{padding:2px 5px;font-size:12px;
    min-height:26px;line-height:1.2}
  .marca-filtro{font-size:10px;padding:1px 6px}

  /* --- la tabla: se desplaza de lado, que es lo que toca ------------ */
  /* Una tabla de veinte columnas no se "adapta" a 375px sin dejar de ser
     una tabla. Lo que se hace es que el desplazamiento sea comodo y que la
     cabecera siga pegada arriba. */
  .marco-grilla{-webkit-overflow-scrolling:touch}
  table.grilla{font-size:11px}
  /* Filas de 37px dejaban ver seis: la casilla traia 3px de margen del
     navegador arriba y abajo, que con el relleno de la celda fijaba el alto
     de toda la fila. Sin ese margen la fila baja a 28px. El dedo no pierde
     blanco: la celda entera de la casilla marca la fila (Grid.pintarFilas). */
  table.grilla th{padding:5px 6px}
  table.grilla td{padding:5px 6px}
  .celda-check{width:38px}
  .casilla-sel,.casilla-bool{width:17px;height:17px;margin:0;vertical-align:middle}
  /* El embudo flotaba a la derecha y, si no cabia junto al titulo ("ID
     Compra"), bajaba a otro renglon: la cabecera entera pasaba a 41px. Fijo
     al borde de la celda la cabecera queda en una linea y el embudo, de alto
     completo, se toca mejor que el triangulo suelto. El ultimo tramo del
     borde es el asa del ancho, asi que el embudo se corre a su izquierda. */
  table.grilla th[data-campo]{padding-right:22px}
  table.grilla th .embudo{position:absolute;top:0;right:8px;bottom:0;width:14px;
    margin:0;float:none;display:flex;align-items:center;justify-content:center}
  table.grilla th .asa-redimension{width:10px}

  /* --- pie de sumatorias ---------------------------------------------
     Ocho totales en UNA sola fila, chicos, para devolver alto a la tabla.
     Antes ``flex-shrink`` los apretaba a todos en un renglon con el rotulo
     largo ("TOTAL PRECIO COMPRA") partido en dos lineas, o los envolvia en
     dos renglones de cuentas e importes que, con Guardar/Cancelar, se
     comian tres lineas. Ahora cada bloque es estrecho, la etiqueta larga
     se cambia por la corta (``.total-etiqueta-corta``) y, si aun asi no
     caben, la fila se desplaza de lado. La cifra no se parte.

     El selector repite ``.barra-acciones.con-resumen .pie-resumen``: la
     regla de escritorio lleva ese prefijo y, con mas clases, ganaria por
     especificidad aunque esta vaya dentro de la media query. */
  .barra-acciones.con-resumen .pie-resumen{
    flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;gap:0}
  .barra-acciones.con-resumen .pie-resumen::-webkit-scrollbar{height:3px}
  .barra-acciones.con-resumen .pie-resumen::-webkit-scrollbar-thumb{
    background:var(--linea)}
  .barra-acciones.con-resumen .pie-resumen .total{flex:1 0 auto;min-width:max-content;
    padding:3px 5px;gap:0;text-align:center;
    border-right:1px solid var(--linea-fina);border-bottom:none}
  .barra-acciones.con-resumen .pie-resumen .total-num,
  .barra-acciones.con-resumen .pie-resumen .total-money{order:0;flex-basis:0}
  .pie-resumen .total-etiqueta{white-space:nowrap;line-height:1.15;font-size:8px;
    letter-spacing:0;font-weight:700}
  .pie-resumen .total-etiqueta-larga{display:none}
  .pie-resumen .total-etiqueta-corta{display:block}
  .barra-acciones.con-resumen .pie-resumen .total-cifra,
  .barra-acciones.con-resumen .pie-resumen .total-cuenta .total-cifra{
    font-size:12px;line-height:1.15}

  /* --- paginador y barras de abajo ---------------------------------
     "- baje para cargar mas" empujaba el boton Cargar mas a un segundo
     renglon; el boton ya dice lo mismo, asi que en el telefono sobra. */
  .barra-paginas{flex-wrap:wrap;font-size:12px;padding:3px 6px}
  .barra-paginas .pista-cargar{display:none}
  .barra-paginas button{min-width:34px;padding:5px 9px}
  .barra-acciones{padding:6px}
  .barra-acciones .btn{flex:1 1 0;padding:9px 10px}
  /* Los totales van en una sola fila a todo el ancho; Guardar y Cancelar
     bajan al renglon de abajo. En 375px no caben ocho cifras y dos botones
     sin recortar Chancho o partir el rotulo. */
  .barra-acciones.con-resumen{flex-wrap:wrap;padding:0;gap:0}
  .barra-acciones.con-resumen .pie-resumen{flex:1 1 100%}
  .barra-acciones.con-resumen .btn{flex:1 1 0;margin:3px 3px 3px 0;padding:6px 8px;
    font-size:12px}
  .barra-acciones.con-resumen .btn:first-of-type{margin-left:3px}
  .barra-acciones.con-resumen .btn-guardar{font-size:12px;padding:6px 8px}
  .acciones-proceso{padding:7px}
  .acciones-proceso .btn{flex:1 1 auto;padding:9px 10px}
  .btn-guardar{font-size:13px;padding:9px 10px;letter-spacing:0}

  /* --- ventanas y formularios -------------------------------------- */
  .popup{align-items:flex-start;padding:8px 0}
  .popup-caja,.caja-formulario,.caja-pagos{min-width:0;width:96vw;
    max-height:92vh}
  .popup-caja-movimiento{width:96vw;max-width:96vw}
  .saldo-piezas{grid-template-columns:1fr 1fr}
  .saldo-piezas div:nth-child(1),
  .saldo-piezas div:nth-child(2){border-bottom:1px solid var(--linea)}
  .opcion-pieza{grid-template-columns:64px 1fr 1fr;gap:2px 8px}
  .opcion-liquidacion{grid-template-columns:1fr 1fr;gap:2px 8px}
  .opcion-desc-pieza{grid-template-columns:56px 1fr 1fr}
  .vista-pieza{grid-template-columns:1fr 1fr}
  .vista-pieza div:nth-child(1),
  .vista-pieza div:nth-child(2){border-bottom:1px solid var(--linea)}
  .popup-cuerpo{padding:12px 10px}
  .popup-pie{flex-wrap:wrap}
  .popup-pie .btn{flex:1 1 auto}
  /* Etiqueta encima del campo: en 375px, una etiqueta de 110px a la
     izquierda deja al campo sin sitio para escribir. */
  .campo{flex-wrap:wrap;gap:4px}
  .campo label{width:100%}
  .rejilla-campos{grid-template-columns:1fr}
  .totales-comprobante{grid-template-columns:1fr 1fr}
  .totales-comprobante .campo label{white-space:normal}
  .totales-comprobante .campo input{max-width:none}
  /* Los editores de formulario se tocan con el dedo. El buscador de la
     grilla no entra aqui: vive en la barra de filtros, mas bajo, para no
     restarle filas a la tabla. */
  .campo input,.campo select,.campo-formulario input,.campo-formulario select,
  .editor-inline{min-height:36px}
  .barra-filtros .buscador,.filtro-barra select,.filtro-barra input[type=date]{
    min-height:26px}
  .panel-valores{max-height:80vh}
  .lista-valores{max-height:44vh}
  .valor-opcion{padding:7px}
  .columna-opcion{padding:8px 6px}
  .panel-columnas{left:6px;right:6px;min-width:0}

  /* --- portada y fichas -------------------------------------------- */
  .mosaicos{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:5px}
  .mosaico{min-height:112px;font-size:13px;padding:10px}
  .mosaico .glifo{font-size:30px}
  /* Un cuadro de detalle con muchas columnas se desplaza dentro de su
     tarjeta; la pagina entera no debe irse de lado.

     flex:0 0 auto no es un adorno: overflow-x:auto vuelve tambien "auto" el
     eje vertical, y una caja con overflow deja de tener alto minimo propio.
     Siendo hija de un contenedor flexible en columna, el navegador la
     encogia hasta dejar asomando una franja con su propia barra: los campos
     se veian comprimidos y sin poder llegar a ellos. */
  .tarjeta{padding:10px;overflow-x:auto;flex:0 0 auto}
  .tarjeta h2{font-size:14px}
  .totales{gap:12px}
  .caja-totales{max-width:none}
}

/* Tableta (entre el telefono y el monitor): los ocho totales caben en
   UNA fila si se achican y se usa el rotulo corto. Por encima de 760px
   no entra la query del telefono, y el layout de escritorio (etiqueta
   larga, min-width 100px, flex-wrap) los partia en dos renglones junto
   a Guardar y Cancelar. El telefono no se toca: sigue con los botones
   abajo. El monitor (>1280) sigue con el rotulo entero. */
@media (min-width:761px) and (max-width:1280px){
  .barra-acciones.con-resumen{flex-wrap:nowrap;align-items:stretch}
  .barra-acciones.con-resumen .pie-resumen{
    flex:1 1 auto;flex-wrap:nowrap;overflow-x:auto;min-width:0;gap:0;
    -webkit-overflow-scrolling:touch}
  .barra-acciones.con-resumen .pie-resumen .total{
    flex:1 1 0;min-width:0;padding:4px 6px;gap:0;text-align:center}
  .barra-acciones.con-resumen .pie-resumen .total-etiqueta{
    white-space:nowrap;line-height:1.15;font-size:9px;
    letter-spacing:0;font-weight:700}
  .pie-resumen .total-etiqueta-larga{display:none}
  .pie-resumen .total-etiqueta-corta{display:block}
  .barra-acciones.con-resumen .pie-resumen .total-cifra,
  .barra-acciones.con-resumen .pie-resumen .total-cuenta .total-cifra{
    font-size:14px;line-height:1.15}
  .barra-acciones.con-resumen .btn{flex:0 0 auto;padding:6px 12px;font-size:13px}
  .barra-acciones.con-resumen .btn-guardar{padding:6px 14px;font-size:13px}
}

/* Telefono en vertical: lo que aun asi va justo. */
@media (max-width:420px){
  .titulo-pantalla{font-size:12px}
  .tb-btn{padding:4px 6px;font-size:10px}
  .barra-filtros{padding:2px 4px;gap:3px}
  .barra-filtros .buscador,.filtro-barra select,.filtro-barra input[type=date]{
    padding:1px 5px;font-size:11px;min-height:24px}
  .conmutador{min-height:24px;font-size:11px}
  .selector-opciones button{padding:1px 4px;min-height:24px}
  .barra-acciones.con-resumen .pie-resumen .total{padding:2px 4px}
  .caja-login{padding:16px}
  .caja-login input[type=text],.caja-login input[type=password]{height:52px;
    font-size:24px}
  .btn-entrar{font-size:24px}
  .avatar-login{width:64px;height:64px;font-size:34px;margin-bottom:12px}
  .agente-entrada textarea{min-height:36px;font-size:16px}
}

/* Copiloto de demostracion (apagado en produccion) */
.agente-sugeridos{display:flex;flex-wrap:wrap;gap:6px}
.agente-chat{display:flex;flex-direction:column;gap:10px}
.agente-mensajes{display:flex;flex-direction:column;gap:8px;max-height:55vh;
  overflow:auto;padding:4px 2px}
.agente-msg{max-width:min(680px,94%);padding:8px 12px;border:1px solid var(--linea);
  background:var(--campo);white-space:pre-wrap}
.agente-msg.usuario{align-self:flex-end;background:var(--acento-suave)}
.agente-msg.asistente{align-self:flex-start}
.agente-motor{margin-top:6px;font-size:11px;color:var(--texto-tenue);letter-spacing:.3px}
.agente-enlace{display:inline-block;margin-top:8px;color:var(--acento);text-decoration:underline}
.agente-entrada{display:flex;gap:8px;align-items:flex-end;flex-wrap:wrap}
.agente-entrada textarea{flex:1;min-height:44px;resize:vertical;background:var(--campo);
  border:1px solid var(--control-borde);color:var(--texto);padding:8px 10px;
  font:inherit}
.agente-adjunto{font-size:12px;color:var(--texto-tenue);display:flex;flex-direction:column;gap:4px}
.agente-acciones{display:flex;gap:8px;margin-top:8px}

/* --- CAJA: el panel de la caja del dia ----------------------------------
   Va entre la barra y la tabla: el estado de la caja, con cuanto se abrio,
   lo que entro y salio y el efectivo que deberia haber en el cajon, y los
   botones ABRIR / CERRAR (arqueo) / REABRIR. Las cifras de efectivo van
   grandes porque son las que se comprueban contando; las demas formas de
   pago, al lado, en una tabla. */
.caja-dia{flex:0 0 auto;background:var(--panel);border:1px solid var(--linea);
  padding:8px 12px;margin:0 0 6px}
.caja-dia-cabecera{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.caja-dia-fecha{display:flex;align-items:center;gap:4px}
.caja-dia-fecha input[type=date]{background:var(--campo);border:1px solid var(--control-borde);
  color:var(--texto);padding:4px 6px;font:inherit}
.caja-dia-fecha .btn{padding:4px 9px}
.caja-estado{font-weight:700;letter-spacing:.8px;padding:3px 10px;border-radius:3px;
  border:1px solid var(--linea);font-size:12px}
.caja-estado.abierta{background:var(--ok);border-color:var(--ok);color:#fff}
.caja-estado.cerrada{background:var(--control);color:var(--texto)}
.caja-estado.sin-abrir{background:transparent;color:var(--aviso);border-color:var(--aviso)}
.caja-quien{color:var(--texto-tenue);font-size:12px;flex:1 1 200px}
.caja-dia-botones{display:flex;gap:6px;flex-wrap:wrap;margin-left:auto}
.caja-dia-botones .btn{padding:5px 11px}
.caja-dia-cuerpo{display:flex;gap:14px;align-items:flex-start;margin-top:8px;flex-wrap:wrap}
.caja-cifras{display:flex;gap:6px;flex-wrap:wrap;flex:1 1 520px}
.caja-cifra{flex:1 1 110px;min-width:110px;background:var(--fondo-fila);border:1px solid var(--linea-fina);
  padding:6px 9px;display:flex;flex-direction:column;gap:2px}
.caja-cifra span{font-size:10px;letter-spacing:.6px;text-transform:uppercase;color:var(--texto-tenue)}
.caja-cifra b{font-size:18px;font-variant-numeric:tabular-nums;color:var(--cifra-total)}
.caja-cifra.entra b{color:#7fd69a}
.caja-cifra.sale b{color:#ff8f8f}
.caja-cifra.cuadra b{color:var(--cifra-total)}
.caja-cifra.destacada{border-color:var(--acento)}
table.caja-formas{flex:0 1 380px;border-collapse:collapse;font-size:12px}
table.caja-formas th,table.caja-formas td{padding:3px 8px;border-bottom:1px solid var(--linea-fina);
  text-align:left;white-space:nowrap}
table.caja-formas th,table.caja-arqueo th{position:relative}
table.caja-formas th{color:var(--texto-tenue);font-weight:600;font-size:11px}
table.caja-formas .n{text-align:right;font-variant-numeric:tabular-nums}
table.caja-formas tfoot td{font-weight:700;border-top:1px solid var(--linea);border-bottom:none}
.caja-nota{margin:6px 0 0;color:var(--texto-tenue);font-size:12px}
.caja-nota:empty{display:none}
.caja-sin-clasificar{margin-top:8px;padding:8px 10px;border:1px dashed var(--aviso);
  color:var(--texto);font-size:12px}
.caja-otros{display:flex;align-items:center;gap:8px;margin-top:5px;flex-wrap:wrap}
.caja-otros span{flex:1 1 260px}
.caja-otros .btn{padding:2px 10px}
.caja-conmutador{display:flex;gap:14px;flex-wrap:wrap}
.caja-conmutador label{width:auto;color:var(--texto);display:flex;gap:5px;align-items:center}
.popup-caja-caja{width:min(720px,96vw);min-width:0;max-width:96vw;max-height:92vh;
  display:flex;flex-direction:column}
.popup-caja-caja .popup-cuerpo{overflow:auto;padding:12px 16px}
.popup-caja-caja .campo{margin-bottom:8px}
.popup-caja-caja .campo>label{width:150px;flex:none;white-space:nowrap}
/* El input del combo va dentro de un div: sin esto se queda en su ancho
   por defecto y corta el placeholder. */
.popup-caja-caja .campo-combo input{width:100%;box-sizing:border-box}
.popup-caja-caja .nota-tabla{margin:-3px 0 8px 160px;font-size:11.5px}
.vinculos-caja{flex:1;display:flex;flex-wrap:wrap;gap:6px;min-width:0}
.vinculo-caja{display:inline-flex;align-items:center;gap:8px;max-width:100%;
  background:var(--campo);border:1px solid var(--control-borde);border-radius:2px;
  padding:3px 4px 3px 8px;font-size:12px}
.vinculo-caja span{overflow:hidden;text-overflow:ellipsis}
.vinculo-caja button{background:none;border:none;color:var(--acento);cursor:pointer;
  font:inherit;font-weight:600;padding:0 4px}
.popup-caja-arqueo{min-width:min(460px,96vw)}
table.caja-arqueo{width:100%;border-collapse:collapse;font-size:13px}
table.caja-arqueo th,table.caja-arqueo td{padding:3px 6px;border-bottom:1px solid var(--linea-fina);
  text-align:left}
table.caja-arqueo .n{text-align:right;font-variant-numeric:tabular-nums}
table.caja-arqueo input{width:90px;text-align:right;background:var(--campo);
  border:1px solid var(--control-borde);color:var(--texto);padding:3px 6px;font:inherit}
table.caja-arqueo tfoot td{font-weight:700;border-bottom:none;padding-top:5px}
table.caja-arqueo tr.ci-diferencia.entra td{color:#7fd69a}
table.caja-arqueo tr.ci-diferencia.sale td{color:#ff8f8f}
.ci-diferencia.entra,.ci-diferencia.entra b{color:#7fd69a}
.ci-diferencia.sale,.ci-diferencia.sale b{color:#ff8f8f}
.aviso-formulario{margin-top:8px;padding:7px 10px;border:1px solid var(--error);
  color:#ffd6d6;background:rgba(224,75,75,.15);font-size:12.5px}
@media (max-width:760px){
  .caja-dia{padding:8px}
  .caja-dia-botones{margin-left:0;width:100%}
  .caja-dia-botones .btn{flex:1 1 45%}
  .caja-cifra{min-width:45%}
  .caja-cifra b{font-size:16px}
  table.caja-formas{flex:1 1 100%}
  .popup-caja-caja .campo>label{width:100%;white-space:normal}
  .popup-caja-caja .nota-tabla{margin-left:0}
}

/* Las opciones propias del clon dentro de un grupo del original (CUENTAS POR
   COBRAR / POR PAGAR en Gestion) van despues de una raya: se ve que se
   anadieron a la lista heredada. */
.submenu a:not(.submenu-extension) + a.submenu-extension{border-top:1px solid var(--linea)}
.cuentas-formula{margin:0 0 6px;flex:0 0 auto}

/* PRECIO A VARIAS PIEZAS (liquidaciones): la barra sobre PIEZAS y las casillas
   que van en la celda del #, junto al numero de fila. */
.barra-precio-masivo{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;
  margin:6px 0 8px;padding:6px 8px;border:1px solid var(--linea-fina);
  border-radius:4px;background:var(--fondo)}
.barra-precio-masivo .pm-titulo{font-weight:600}
.barra-precio-masivo .pm-cuenta{opacity:.8;min-width:84px}
.barra-precio-masivo .pm-campo{display:flex;align-items:center;gap:6px}
.barra-precio-masivo .pm-campo input{width:96px;text-align:right}
.barra-precio-masivo .pm-alteclear{display:flex;align-items:center;gap:6px;cursor:pointer}
.barra-precio-masivo .pm-estado{opacity:.8}
td.celda-n,th.celda-n{white-space:nowrap}
td.celda-n .casilla-sel,th.celda-n .casilla-sel{margin:0 4px 0 0;vertical-align:middle}
tr.fila-marcada > td{background:var(--acento-suave)}

/* TRUEQUE: la diferencia en kilos y en dinero, bajo Kg devueltos. */
.tru-kg{display:block;max-width:230px;margin:3px 0 0 auto;text-align:right;
  font-size:11px;line-height:1.25;white-space:normal;opacity:.85}
/* COMPENSACION: el calculo por la diferencia. */
tr.fila-diferencia > td{border-top:0}
tr.total-diferencia > td{font-size:1.05em;border-top:1px solid var(--linea-fina)}
