/* ⚠️ TODO color del sistema sale de una ficha, y las fichas se definen
   SOLO aca. Mas abajo no hay ni un hex suelto: si aparece uno, esa regla
   se queda igual cuando alguien cambia de paleta y la pantalla sale con
   dos temas encima. Lo vigila `tests/test_estilos.py`.

   La paleta viaja en `data-paleta` sobre el <html>, que pone el context
   processor con lo que eligio quien entro (`app/apariencia.py`). Un valor
   desconocido --o ninguno-- cae en `:root`, que es la clara: la pantalla
   nunca se queda sin colores.

   Las dos pasan 4.5:1 de contraste en texto normal.

   El acento es INDIGO y no el verde-azulado de Incentivos: es lo que hace
   que los tres sistemas dejen de parecerse. Y los semanticos van
   separados del acento -- si el color de marca tambien significa
   "urgente", deja de significar las dos cosas.

   Los dos selectores juntos NO son un descuido: `:root` es la paleta por
   defecto y `[data-paleta="dia"]` es lo que hace que la MUESTRA de la
   pantalla de apariencia se pinte sola aunque la puesta ya sea esa. */

:root,
[data-paleta="dia"] {
  color-scheme: light;
  /* Neutros con sesgo indigo: un gris puro al lado de un acento
     cromatico se ve sucio. */
  --tinta: #1a1c2b;
  --suave: #5a5f78;
  --linea: #dcdde8;
  --fondo: #f5f5fa;
  --papel: #ffffff;
  --papel2: #edeef6;
  --acento: #3a3f8f;
  --sobre-acento: #ffffff;
  --acento-suave: #eeeffa;
  --acento-linea: #c3c6ea;
  --vencida: #a3262c;
  --vencida-fondo: #fceceb;
  --hoy: #8a5a10;
  --hoy-fondo: #fdf5e6;
  --ok: #1f6b45;
  --ok-fondo: #e9f4ed;
  --quieto: #5f6478;
  --quieto-fondo: #eeeff3;
  --sombra: rgba(26, 28, 43, .13);
  /* El velo de la ventanita de confirmacion. Ficha propia porque cambia
     entre paletas: un velo claro sobre la paleta de noche no tapa nada. */
  --velo: rgba(26, 28, 43, .5);
  /* Lo que entro de mas. No es urgencia ni exito: es un renglon que se
     mira distinto, y por eso no se cuelga de un semantico. */
  --bonificada-fondo: #f7f4ec;
  /* El unico color que NO cambia entre paletas: es el fondo del video de
     la camara, y detras de una imagen en vivo lo que va es negro en los
     dos temas. Tiene ficha igual, para que no quede un hex suelto. */
  --negro-camara: #000000;
}

[data-paleta="noche"] {
  color-scheme: dark;
  /* El jefe revisa la deuda desde el telefono, de noche. */
  --tinta: #e7e8f2;
  --suave: #9aa0ba;
  --linea: #343850;
  --fondo: #14161f;
  --papel: #1c1f2b;
  --papel2: #252938;
  --acento: #8b91e8;
  --sobre-acento: #14161f;
  --acento-suave: #232741;
  --acento-linea: #444a7c;
  --vencida: #f2909a;
  --vencida-fondo: #331e24;
  --hoy: #e8bf72;
  --hoy-fondo: #322818;
  --ok: #7fd3a4;
  --ok-fondo: #16301f;
  --quieto: #9aa0ba;
  --quieto-fondo: #262a38;
  --sombra: rgba(0, 0, 0, .45);
  --velo: rgba(0, 0, 0, .65);
  --bonificada-fondo: #2b2a20;
  --negro-camara: #000000;
}

* { box-sizing: border-box; }

/* EL RELLENO DE LOS CONTROLES NATIVOS. `color-scheme` --que esta en cada
   ficha-- arregla el fondo, el borde y las barras de desplazamiento, pero
   NO el color con que el navegador rellena un radio o un casillero
   marcado: eso es `accent-color`, que es otra propiedad.

   Sin esto, el circulito de la paleta elegida salia con el azul de
   Chromium --0, 120, 212, que no es ninguna ficha-- en las DOS paletas,
   justo en la pantalla
   donde se elige la paleta. Se vio mirando, el 2026-08-20; ninguna prueba
   podia agarrarlo porque el HTML estaba bien. */
html { accent-color: var(--acento); }

/* La raiz fija el tamano de los rem: asi bajar la escala general es un
   solo numero y todos los paddings/margenes/h1/h2 que estan en rem se
   achican en la misma proporcion, en vez de tener que retocar cada uno
   a mano. Antes no habia font-size en la raiz, asi que los rem quedaban
   pegados al 16px por defecto del navegador aunque el body bajara a 15px:
   con escalado de Windows al 125% eso se veia enorme. */
html { font-size: 13px; }

body {
  margin: 0;
  font: 13px/1.5 "Segoe UI", system-ui, sans-serif;
  color: var(--tinta);
  background: var(--fondo);
}

/* LA BARRA DEL RECORRIDO. Los cinco destinos en el orden en que ocurre el
   trabajo, y el de la pantalla en que estoy parado MARCADO. La marca se
   achica --el sistema no necesita gritar su nombre en cada pantalla-- para
   que el recorrido sea lo primero que se lee. */
.barra {
  display: flex;
  align-items: center;
  gap: 1.5rem;
  padding: .55rem 1.25rem;
  background: var(--papel);
  color: var(--tinta);
  border-bottom: 1px solid var(--linea);
}
/* EL LOGO (12-09-2026, maqueta aprobada, variante B): cuadro lleno con el
   acento y la caja de un pedido. Dos clics abren «Ir a otro sistema»
   (`js/cambio_sistema.js`). Es un <button>: un clic no lleva a ningún
   lado, como la marca de antes. */
.barra .marca {
  display: inline-flex;
  align-items: center;
  gap: .55rem;
  font: inherit;
  color: var(--tinta);
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
  white-space: nowrap;
  touch-action: manipulation;
  user-select: none;
  -webkit-user-select: none;
}
.marca-logo, .cambio-logo { width: 2rem; height: 2rem; flex: none; display: block; }
.logo-fondo { fill: var(--acento); }
.logo-trazo {
  fill: none;
  stroke: var(--sobre-acento);
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.marca-texto { display: flex; flex-direction: column; align-items: flex-start; line-height: 1; }
.marca-texto small {
  font-size: .6rem;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--suave);
  margin-bottom: .2rem;
}
.marca-texto b { font-size: 1.1rem; font-weight: 700; letter-spacing: -.01em; }

/* La ventana de «Ir a otro sistema». Los otros dos van con el cuadro en
   gris: su color es el de SU paleta, que aquí no se conoce. */
.cambio {
  padding: 0;
  border: 1px solid var(--linea);
  border-radius: 12px;
  background: var(--papel);
  color: var(--tinta);
  width: min(440px, calc(100vw - 2rem));
  margin: 4rem auto auto;
  box-shadow: 0 18px 48px var(--sombra);
}
.cambio::backdrop { background: var(--velo); }
.cambio-caja { padding: .2rem 0 0; }
.cambio-cab { display: flex; justify-content: space-between; align-items: center; padding: .7rem 1rem .3rem; }
.cambio-cab h2 { font-size: 1.05rem; margin: 0; padding: 0; border: 0; }
.cambio-cab form { margin: 0; }
.cambio-cerrar {
  font: inherit;
  font-size: 1.3rem;
  line-height: 1;
  background: none;
  border: 0;
  color: var(--suave);
  cursor: pointer;
  padding: .2rem .5rem;
  border-radius: 6px;
}
.cambio-lista { list-style: none; margin: 0; padding: .2rem .5rem; }
.cambio-fila {
  display: flex;
  align-items: center;
  gap: .75rem;
  padding: .6rem .5rem;
  border-radius: 8px;
  color: var(--tinta);
  text-decoration: none;
}
a.cambio-fila:hover { background: var(--fondo); }
a.cambio-fila .logo-fondo { fill: var(--suave); }
.cambio-fila.aqui { background: var(--acento-suave); }
.cambio-txt { display: flex; flex-direction: column; gap: .1rem; min-width: 0; }
.cambio-txt b { font-size: 1rem; }
.cambio-txt small { color: var(--suave); font-size: .82rem; }
.cambio-dom { color: var(--suave); font-size: .75rem; overflow-wrap: anywhere; font-family: Consolas, monospace; }
.cambio-etq, .cambio-ir { margin-left: auto; color: var(--suave); font-size: .8rem; white-space: nowrap; }
.cambio-pie { margin: .3rem 0 0; padding: .6rem 1rem .9rem; font-size: .82rem; color: var(--suave); border-top: 1px solid var(--linea); }
@media (max-width: 480px) { .cambio-etq { display: none; } }

/* LA PANTALLA DE ENTRAR del servidor web (12-09-2026), del molde de
   Liquidación: un panel angosto con el logo grande. */
main.entrar { display: flex; justify-content: center; padding-top: 3rem; }
.entrar-panel {
  width: 100%;
  max-width: 360px;
  display: flex;
  flex-direction: column;
  gap: .9rem;
  background: var(--papel);
  border: 1px solid var(--linea);
  border-radius: 12px;
  padding: 1.6rem 1.6rem 1.4rem;
}
.entrar-logo { width: 3.2rem; height: 3.2rem; display: block; }
.entrar-panel h1 { margin: .2rem 0 0; font-size: 1.3rem; }
.entrar-panel .nota { margin: 0; }
.entrar-panel label { display: flex; flex-direction: column; gap: .25rem; font-weight: 600; font-size: .9rem; }
.entrar-panel input { font: inherit; font-weight: 400; }
.entrar-panel .mal {
  margin: 0;
  padding: .5rem .7rem;
  border-radius: 6px;
  background: var(--vencida-fondo);
  color: var(--vencida);
  font-size: .9rem;
}
/* ⚠️ SE ENVUELVE, NO SE DESLIZA. Con `overflow-x: auto` y el scrollbar
   apagado, a 390px se veian CUATRO destinos de cinco: 437px de enlaces en
   367px utiles, con `scrollLeft` en 0. "Productos" quedaba entero afuera
   y ni siquiera se notaba que hubiera algo mas. Estando parado EN
   Productos, el item activo tampoco se veia: la barra decia que no estabas
   en ningun lado. Igual en una ventana de PC de 700px.

   El defecto que en su momento hizo descartar el envolver --que "Pagar
   facturas" se partiera en tres renglones-- lo impide el `white-space:
   nowrap` de cada enlace, que esta unas lineas mas abajo: se corta ENTRE
   enlaces, nunca adentro de uno.

   El `overflow-x` se queda de red: envuelto ya no hace falta, pero un
   destino nuevo con un nombre larguisimo no puede empujar la pagina. */
.barra nav {
  display: flex;
  flex-wrap: wrap;
  gap: .15rem;
  overflow-x: auto;
  scrollbar-width: none;
}
.barra nav::-webkit-scrollbar { display: none; }
.barra nav a:not(.boton) {
  color: var(--suave);
  text-decoration: none;
  padding: .4rem .7rem;
  border-radius: 5px;
  white-space: nowrap;
}
.barra nav a:hover:not(.boton) { background: var(--papel2); color: var(--tinta); }
/* NUNCA SOLO COLOR: el activo además se pone en negrita y lleva un borde
   propio, para quien no distingue el relleno del vecino. */
.barra nav a[aria-current="page"] {
  background: var(--acento-suave);
  color: var(--acento);
  font-weight: 600;
  box-shadow: inset 0 0 0 1px var(--acento-linea);
}
.barra a:not(.boton) { color: var(--suave); text-decoration: none; }
.barra a:hover:not(.boton) { color: var(--tinta); }

/* EL ANCHO SE ACOTA. El hallazgo de fondo del redisenio: casi nunca
   sobra espacio -- lo que pasa es que el contenido se estira. Una tabla
   de dos columnas al 100 % de 1500px deja el monto a 1400px de su
   rotulo, y para leer la fila hay que barrer la pantalla con la vista.
   Decision cerrada de Abner el 2026-08-19: 1080px. */
main { max-width: 1080px; margin: 0 auto; padding: 1.1rem 1.25rem 2.5rem; }
/* El editor de pedidos lleva doce columnas por linea: necesita mas ancho
   que el resto de las pantallas. Fluido y con un padding lateral mas
   chico -- nunca un max-width fijo mayor que la ventana, o desborda el
   body en cualquier PC mas angosta que 1560px (el bug original: 1503px
   utiles con la ventana maximizada y escalado Windows al 125%). */
main.ancho { width: 100%; max-width: 1440px; padding: 1.1rem 1rem 2.5rem; }

h1 { font-size: 1.35rem; margin: 0 0 1rem; }
h2 { font-size: 1.1rem; margin: 1.5rem 0 .75rem; }

.panel {
  background: var(--papel);
  border: 1px solid var(--linea);
  border-radius: 6px;
  padding: 1.25rem;
  margin-bottom: 1.25rem;
}

/* LA TABLA, ENCAJONADA. La caja pone el borde y las esquinas; la tabla
   de adentro no lleva borde propio para que las lineas no se dupliquen, y
   la ultima fila pierde la suya contra el filo de la caja. */
.tabla-caja {
  background: var(--papel);
  color: var(--tinta);
  border: 1px solid var(--linea);
  border-radius: 8px;
  overflow: hidden;
  margin-bottom: 1.25rem;
}
table { width: 100%; border-collapse: collapse; background: var(--papel); }
th, td { padding: .42rem .7rem; border-bottom: 1px solid var(--linea); text-align: left; }
.tabla-caja tbody tr:last-child td { border-bottom: 0; }
th {
  font-size: .74rem;
  text-transform: uppercase;
  letter-spacing: .05em;
  color: var(--suave);
  background: var(--papel2);
  font-weight: 600;
  white-space: nowrap;
}
tbody tr:hover td { background: var(--acento-suave); }
/* LOS MONTOS, A LA DERECHA Y CON CIFRAS DE ANCHO FIJO: en una columna de
   dinero es la diferencia entre leer y contar digitos.
   `.numero` es el nombre viejo de exactamente lo mismo y sigue vivo
   porque lo usan el editor de pedidos y los documentos impresos, que no
   entran en este redisenio. Van en la MISMA regla a proposito: dos
   declaraciones identicas con dos nombres distintos se separan con el
   tiempo y nadie se entera hasta que una columna deja de alinear. */
.num, td.numero, th.numero {
  text-align: right;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
/* La columna que carga el total de la fila: se despega del resto sin
   cambiar de color, solo con el papel de atras y el peso. */
.total-col { background: var(--papel2); font-weight: 600; }
/* El hueco que no tiene dato. Apagado y no vacio: un `—` gris dice "no
   hay", una celda en blanco parece que se rompio algo. */
.sin-dato { color: var(--suave); }
td.centro { text-align: center; }
td.centro input[type="checkbox"] { width: auto; }

label { display: block; font-size: .8rem; color: var(--suave); margin-bottom: .2rem; }
input, select, textarea {
  font: inherit;
  padding: .4rem .5rem;
  border: 1px solid var(--linea);
  border-radius: 4px;
  background: var(--papel);
  /* El color del texto va explicito: un campo que lo hereda se ve gris
     oscuro sobre papel oscuro el dia que aparece la segunda paleta. */
  color: var(--tinta);
  width: 100%;
}
textarea { min-height: 5rem; resize: vertical; }

/* EL BOTON QUE TRAE ADENTRO `input[type="file"]`. Ni `color-scheme` ni la
   regla de `input` de arriba lo alcanzan: es una parte del control que el
   navegador dibuja aparte, y salia con su propio gris --medido: 107, 107,
   107 sobre la paleta Noche--, el unico gris del sistema, en la
   pantalla de Productos. Se vio mirando el 2026-08-20.

   El texto que va al lado ("Ningun archivo seleccionado") lo escribe el
   navegador y esta fuera de nuestro alcance: no se puede traducir ni
   reemplazar sin esconder el control entero, que es otra cosa. */
input[type="file"] { padding: .25rem; }
input[type="file"]::file-selector-button {
  font: inherit;
  margin-right: .6rem;
  padding: .3rem .7rem;
  border: 1px solid var(--acento);
  border-radius: 4px;
  background: var(--papel);
  color: var(--acento);
  cursor: pointer;
}

/* Todo <a> toma el acento. Sin esta regla, un enlace sin clase sale con
   el azul por defecto del navegador -- que sobre la paleta Noche es azul
   oscuro sobre fondo casi negro. Ya paso en Incentivos. */
a { color: var(--acento); }

/* EL HILO DE IDENTIDAD. 3 px con el acento del sistema, arriba de todo.
   Es lo que distingue a los tres de un vistazo cuando estan abiertos en
   pestanas vecinas: Incentivos verde-azulado, Ordenes indigo. */
.hilo { height: 3px; background: var(--acento); }

.rejilla { display: grid; gap: .9rem; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); }

.boton {
  display: inline-block;
  padding: .45rem .9rem;
  border: 1px solid var(--acento);
  border-radius: 4px;
  background: var(--acento);
  color: var(--sobre-acento);
  font: inherit;
  text-decoration: none;
  cursor: pointer;
}
.boton:hover { filter: brightness(1.1); }
/* UN BOTON QUE NO PUEDE HACER NADA NO SE VE COMO EL QUE SI. El unico
   `disabled` del sistema --"Confirmar y aprobar" cuando hay un lote sin
   costear-- se dibujaba identico al principal: relleno de acento, borde
   de acento y el cursor de la mano. Se vio mirando el 2026-08-20. */
.boton:disabled {
  background: var(--papel2);
  border-color: var(--linea);
  color: var(--suave);
  cursor: not-allowed;
}
.boton:disabled:hover { filter: none; }
.boton-tenue { background: var(--papel); color: var(--acento); }
.boton-riesgo { background: var(--papel); color: var(--vencida); border-color: var(--vencida); }
.acciones { display: flex; gap: .6rem; flex-wrap: wrap; margin-top: 1rem; }

/* La segunda fila de botones: lo que NO cambia el documento -- imprimir,
   volver. Va mas junta a la de arriba y mas apagada, para que la vista
   caiga primero en la fila que si hace avanzar el trabajo. */
.acciones-aparte { margin-top: .45rem; }
.acciones-aparte .boton { font-size: .88rem; padding: .45rem .8rem; }

/* LO QUE NO TIENE VUELTA, siempre al final y separado por una linea.
   Abner, 2026-08-11, sobre la pantalla de pagos: *"hay un boton que dice
   borrar ahi abajo; eso esta muy mal, no puedes poner un boton de crear
   abajo de eliminar"*. La regla que salio de ahi: una accion destructiva
   no comparte fila con una normal, y nunca va dentro de una lista -- va
   adentro de la cosa que se va a destruir, donde se la puede ver. */
.zona-riesgo {
  margin-top: 2.5rem;
  padding-top: 1rem;
  border-top: 1px solid var(--linea);
}
.zona-riesgo form { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; }
.zona-riesgo .nota { margin: 0; }

/* EL BOTON QUE NO COMPITE. Se pone donde hay una accion principal cerca y
   lo demas tiene que leerse despues: en Recibir facturas eran siete
   controles del mismo tamano antes de llegar a la tabla, y con siete
   cosas iguales no hay ninguna que se lea primero. Va siempre junto a
   `boton-tenue`: chico y apagado son la misma idea dicha dos veces.

   ⚠️ SE DECLARA COMO `.boton.boton-chico` --dos clases-- a proposito.
   `.acciones-aparte .boton`, unas lineas mas arriba, tambien vale 0,2,0 y
   fija su propio tamano; con una sola clase esta regla perdia por
   especificidad justo en el bloque donde hacia falta, y el boton salia
   igual de grande sin que nada se quejara. */
.boton.boton-chico { min-height: 0; padding: .28rem .6rem; font-size: .84rem; }

.aviso { padding: .6rem .9rem; border-radius: 4px; border-left: 4px solid; }
.aviso-exito { background: var(--ok-fondo); border-color: var(--ok); color: var(--ok); }
.aviso-error { background: var(--vencida-fondo); border-color: var(--vencida); color: var(--vencida); }
/* `.aviso-aviso` sale de `aviso-{{ categoria }}` con la categoria "aviso",
   que es la que usan los `flash(...)` de todo el sistema. Estaba SIN
   declarar: el bloque tomaba el `.aviso` de arriba -- que trae
   `border-left: 4px solid` sin color -- y el borde caia en `currentColor`.
   O sea que los avisos de atencion se veian como una caja gris cualquiera,
   sin nada que dijera "mira esto". Encontrado el 2026-08-10 por
   tests/test_clases_css.py. */
.aviso-atencion,
.aviso-aviso { background: var(--hoy-fondo); border-color: var(--hoy); color: var(--hoy); }

.etiqueta { font-size: .72rem; padding: .15rem .5rem; border-radius: 999px; border: 1px solid; }
.estado-BORRADOR { color: var(--quieto); border-color: var(--linea); background: var(--quieto-fondo); }
.estado-ENVIADO_JEFE { color: var(--hoy); border-color: var(--hoy); background: var(--hoy-fondo); }
.estado-APROBADO { color: var(--ok); border-color: var(--ok); background: var(--ok-fondo); }

.aviso-error h1 { color: var(--vencida); }

/* Editor de pedido */
/* minmax(0,1fr) en la primera columna es lo que evita el desborde: sin el
   0 el minimo implicito de un grid item es "auto", que toma el ancho
   intrinseco de su contenido (el min-width de .tabla-lineas) y empuja el
   grid entero mas alla del viewport. Con el 0 la columna se puede encoger
   todo lo que haga falta y es la tabla, adentro suyo, la que gana un
   scroll horizontal propio (.tabla-ancha). */
.editor { display: grid; grid-template-columns: minmax(0, 1fr) 240px; gap: 1rem; align-items: start; }
.panel-vivo { position: sticky; top: 1rem; }
.panel-vivo dl { display: grid; grid-template-columns: 1fr auto; gap: .35rem .75rem; margin: 0; }
.panel-vivo dt { color: var(--suave); font-size: .85rem; }
.panel-vivo dd { margin: 0; text-align: right; font-variant-numeric: tabular-nums; font-weight: 600; }
.panel-vivo .destacado { font-size: 1.25rem; color: var(--acento); }

.linea-BONIFICADA { background: var(--bonificada-fondo); }
.buscador { position: relative; }
/* Tarea 3: `position: fixed`, no `absolute`. La casilla vive dentro de
   `.tabla-ancha`, que tiene `overflow-x: auto` -- y un contenedor que
   recorta en un eje recorta en los DOS, asi que una lista `absolute` de
   260px de alto quedaba atrapada ahi adentro y generaba un scroll vertical
   que habia que bajar a mano para ver los productos. `fixed` la saca de
   ese contenedor por completo: flota sobre toda la pagina y ningun
   ancestro con overflow la puede recortar. left/top/width los pone
   pedido.js con getBoundingClientRect() de la casilla al abrirla. */
.sugerencias {
  position: fixed; z-index: 20;
  background: var(--papel); border: 1px solid var(--linea); border-radius: 4px;
  max-height: 260px; overflow-y: auto; margin: 0; padding: 0; list-style: none;
  box-shadow: 0 4px 10px var(--sombra);
}
.sugerencias li { padding: .4rem .6rem; cursor: pointer; font-size: .9rem; }
.sugerencias li:hover, .sugerencias li[aria-selected="true"] { background: var(--acento-suave); }
.sugerencias .historial { font-weight: 600; }
.sugerencias .detalle { color: var(--suave); font-size: .8rem; }

/* La tabla de lineas del editor: mas apretada que las demas para que el
   nombre del producto se lea completo. Si la ventana se hace angosta la
   tabla no se estruja: se desliza de lado dentro de su propia caja. */
.tabla-ancha { overflow-x: auto; }
/* El minimo lo manda el desplegable mas apretado, no el nombre del
   producto. Se midio clonando cada <select> en width:auto fuera de
   pantalla y leyendo cuanto ocupa de verdad -- calcular a mano cuanto se
   come la flecha nativa no funciona, Chromium le reserva sitio propio
   ademas del padding que uno declare. La opcion mas larga de "Unidad" es
   "media caja" (91px de ancho natural) y la de "Tipo" es "Bonificada"
   (90px); con esas columnas en 9 % cada una, el minimo tiene que dar
   91 / 0.09 = 1011px. 1150 deja margen y ademas permite que
   "Presentación" muestre entera "bolsa de 60".
   El nombre del producto ya no es la restriccion: necesita 159px
   (146.6 de texto + 12.4 de padding y borde) y con el 21 % se lleva
   241px. Las tres casillas de costo bajan a 7 %: los 62.3px que pide
   "2.992728" caben de sobra en 80px.
   El techo tambien esta atado: con el panel al costado la tabla dispone
   de ~1186px a 1503px de ventana, asi que el minimo NO puede pasar de
   ahi sin devolver el scroll horizontal que esta fase vino a quitar.
   Hay una prueba que fija estos numeros (test_editor_presentaciones.py)
   y otra que los mide de verdad en el navegador, incluidos los
   desplegables (test_layout_responsive.py). */
.tabla-lineas { min-width: 1150px; font-size: 12.5px; }
.tabla-lineas th, .tabla-lineas td { padding: .35rem .3rem; }
.tabla-lineas th:first-child, .tabla-lineas td:first-child { padding-left: 0; }
.tabla-lineas th:last-child, .tabla-lineas td:last-child { padding-right: 0; }
.tabla-lineas input, .tabla-lineas select { padding: .35rem .4rem; }
/* `text-overflow: ellipsis` y NADA de padding-right extra. Un <select>
   ya se reserva solo el sitio de su flecha nativa, asi que un
   padding-right propio no la "esquiva": se SUMA a ese hueco y lo unico
   que hace es encoger el texto. Probado: con 1.35rem de padding-right,
   "Facturada" -- que cabe holgado -- salia "Factur...". Sin el, entra.
   Lo que evita que las letras se metan debajo del triangulito es el
   ellipsis, que corta limpio antes de llegar. "CHORIZO ARGENTINO S/P"
   en "Viene por" no entra en ninguna columna razonable y se corta; al
   desplegarlo el navegador muestra la lista entera a su ancho natural,
   asi que no se pierde informacion. */
.tabla-lineas select { text-overflow: ellipsis; }
.tabla-lineas .quitar { padding: .3rem .5rem; line-height: 1; }
/* La equivalencia es un dato de lectura, no una casilla: se distingue de
   las que se teclean estando más tenue y sin recuadro. */
.tabla-lineas .campo-equivalencia {
  font-variant-numeric: tabular-nums;
  color: var(--suave);
  font-size: .9rem;
  white-space: nowrap;
}

/* El resumen se apila debajo en ventanas angostas. No es por desborde
   -- de eso ya se encarga minmax(0,1fr) -- sino por reparto de espacio:
   el panel y su gap se comen 253px, y a 1280px eso deja la tabla en
   ~968px, por debajo de los 1150 que necesitan los desplegables, asi
   que aparecia scroll de lado. Apilado, a 1280px la tabla dispone de
   ~1221px y entra entera. El umbral son 1300px: por encima (la ventana
   maximizada de la PC de Gerson da 1503px utiles) el panel se queda al
   costado, que es como se quiere ver. */
@media (max-width: 1300px) {
  .editor { grid-template-columns: minmax(0, 1fr); }
  .panel-vivo { position: static; }
}

.cuadre-ok { color: var(--ok); font-weight: 600; }
.cuadre-mal { color: var(--vencida); font-weight: 600; }

/* Fase 8: cuentas por pagar.
   El color acompaña al texto, nunca lo reemplaza: la fila también dice
   "vencida hace 3 días" con letras. El borde de la izquierda se ve
   igual en blanco y negro, que es como se imprime esta pantalla. */
.vencimiento-VENCIDA {
  background: var(--vencida-fondo);
  border-left: 4px solid var(--vencida);
}

.vencimiento-HOY {
  background: var(--hoy-fondo);
  border-left: 4px solid var(--hoy);
}

.vencimiento-PROXIMA {
  border-left: 4px solid transparent;
}

.filtros {
  display: flex;
  flex-wrap: wrap;
  gap: .75rem;
  align-items: end;
  margin: 1rem 0;
}

.acciones-fila {
  display: flex;
  flex-wrap: wrap;
  gap: .5rem;
  /* Sin esto, un botón que convive con un formulario más alto se estira a
     todo el alto de la fila y deja de parecer un botón. */
  align-items: flex-start;
}

/* La confirmación dentro de una fila de la lista. Va separada por una
   línea de los botones que solo MIRAN la factura: eran cuatro controles
   pegados en una celda y se leían como un bloque, aunque "Ver qué trae" y
   "Llegó" hacen cosas de naturaleza muy distinta. */
.confirmar-en-fila {
  display: flex;
  gap: .4rem;
  align-items: center;
  padding-left: .7rem;
  margin-left: .3rem;
  border-left: 1px solid var(--linea);
}

/* MANTENIMIENTO: lo que se hace una vez al mes, no todos los días.
   Va al final de la pantalla y apagado. Antes el botón de archivar estaba
   arriba, del mismo tamaño y color que "Escanear factura", compitiendo con
   el trabajo diario. Abner, 2026-08-11: *"me parece que hay muchos botones
   y que están muy juntos o muy confusos"*. */
.mantenimiento {
  margin-top: 2.5rem;
  padding-top: 1rem;
  border-top: 1px solid var(--linea);
}
.mantenimiento h2 {
  font-size: .95rem;
  color: var(--suave);
  margin: 0 0 .3rem;
}
.mantenimiento .acciones { margin-top: .6rem; }
.mantenimiento .boton { font-size: .88rem; padding: .45rem .8rem; }

.nota {
  color: var(--suave);
  font-size: .9rem;
}

/* Fase 9: la pantalla de escaneo.
   El video ocupa el ancho disponible porque en el telefono se sostiene con
   una mano y hay que ver bien adonde se apunta. */
#camara-caja { max-width: 480px; margin: 1rem 0; }
#camara {
    width: 100%;
    aspect-ratio: 4 / 3;
    border-radius: 6px;
    background: var(--negro-camara);
    object-fit: cover;
}

/* Las pestanas de "Recibir facturas" (2026-08-10).
   Reemplazan tres tablas apiladas en una pagina de unas 150 filas. El
   numero al lado del nombre es la respuesta a "cuanto me falta" sin entrar
   a mirar. */
.pestanas {
    display: flex;
    flex-wrap: wrap;
    gap: .25rem;
    border-bottom: 2px solid var(--linea);
    margin: 1rem 0 1.25rem;
}
.pestana {
    display: flex;
    align-items: center;
    gap: .45rem;
    padding: .55rem .9rem;
    text-decoration: none;
    color: var(--suave);
    border-bottom: 3px solid transparent;
    /* Que se pise el borde del contenedor, para que la activa se lea como
       una pestana y no como un subrayado suelto. */
    margin-bottom: -2px;
}
.pestana:hover { background: var(--papel2); }
/* CON EL ACENTO Y NO CON LA TINTA. Lo eligio Abner el 2026-08-20
   mirando la maqueta: marcada con el gris del texto, la activa se
   distingue de las otras solo por el peso de la letra y hay que
   buscarla. El indigo se ve de lejos, y es el unico lugar de la
   pantalla donde "estas aca" se dice con color. */
.pestana-activa {
    font-weight: 600;
    color: var(--acento);
    border-bottom-color: var(--acento);
}
/* "Por pagar" lleva a otra pantalla y nunca se marca activa: no es una
   pestana de esta pagina, es un atajo a la lista de deuda. Separada para
   que se note que sale de aca. */
.pestana-otra { margin-left: auto; }
.pestana-cuenta {
    background: var(--papel2);
    border-radius: 10px;
    padding: .05rem .5rem;
    font-size: .85rem;
    font-variant-numeric: tabular-nums;
}
.pestana-activa .pestana-cuenta { background: var(--acento); color: var(--sobre-acento); }

/* Fase 10: la pantalla de pagar.
   Tarjetas y no tabla: una tabla de seis columnas en un telefono obliga a
   desplazarse de lado para leer un renglon. Y el boton grande porque se
   toca con el pulgar, parado, con el telefono en una mano.

   Se llamaba `.pantalla-jefe` hasta el 2026-08-10, cuando dejo de ser solo
   del jefe. */
.pantalla-pagos { max-width: 1180px; }
.total-deuda { font-size: 1.05rem; margin: .25rem 0 0; }
.bloque-pago { margin-bottom: 1.75rem; }
.bloque-pago h2 {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 1rem;
}
.bloque-pago .suma { font-variant-numeric: tabular-nums; }

/* En el telefono, una tarjeta por renglon. En la computadora se acomodan
   solas de a varias: la queja que origino este cambio fue justamente una
   columna que baja "para abajo, para abajo, para abajo". Es la MISMA
   plantilla en los dos lados -- lo que cambia es cuantas caben. */
.tarjetas {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
    gap: .6rem;
    align-items: start;
}
.tarjeta {
    border: 1px solid var(--linea);
    border-left-width: 5px;
    border-radius: 6px;
    padding: .75rem;
}
.tarjeta .proveedor { font-weight: 600; margin: 0; }
.tarjeta .monto {
    font-size: 1.5rem;
    margin: .2rem 0;
    font-variant-numeric: tabular-nums;
}
.tarjeta .detalle { margin: 0 0 .5rem; color: var(--suave); font-size: .9rem; }
/* Cada dato en su renglon. Iban los tres seguidos separados por puntos y
   el renglon se partia por donde cayera: "Entro el 30/07/2026 · Vence el"
   y abajo "13/08/2026 · DTE-03-M001-0011907". Dos fechas cortadas al medio
   se leen peor que tres renglones. Abner lo levanto el 2026-08-19 mirando
   la maqueta. */
.tarjeta .detalle .dato { display: block; }
/* Dos botones al lado, mitad y mitad. La regla de abajo los estira a todo
   el ancho para que "Ya pague" se toque con el pulgar; con dos, cada uno
   toma su mitad y los dos siguen siendo grandes. */
.tarjeta .acciones { display: flex; gap: .5rem; }
.tarjeta .acciones .boton { flex: 1; }
/* La fecha del pago llevaba el dia del vencimiento y ninguna etiqueta, asi
   que se leia como un dato de la factura y no como algo que se esta
   escribiendo. Ahora dice que es y arranca en hoy. */
.tarjeta .campo-pago span {
    display: block;
    color: var(--suave);
    font-size: .82rem;
    margin-bottom: .15rem;
}
.tarjeta input { width: 100%; margin-bottom: .5rem; }
.tarjeta .boton { width: 100%; padding: .8rem; font-size: 1.05rem; }
/* Anular va debajo del boton de pagar y separado: son dos formularios y
   sin esto quedan pegados como si fueran el mismo. */
.tarjeta form + form { margin-top: .5rem; }
/* Y va CHICO, contra la regla de arriba que estira los botones de la
   tarjeta a todo el ancho. Esa regla existe para que "Ya pague" se toque
   con el pulgar; aplicada tambien a anular daba dos botones del mismo
   tamano, uno que salda una deuda y otro que la destruye, uno encima del
   otro. Es exactamente asi como se aprieta el que no era. */
.tarjeta .boton-riesgo {
    width: auto;
    padding: .3rem .7rem;
    font-size: .85rem;
}

/* El sellito de "se confirmo escaneando el QR" (2026-08-10).
   Ver app/templates/_marca_qr.html. */
.marca-qr {
    display: inline-flex;
    align-items: center;
    vertical-align: -.15em;
    margin-left: .35rem;
    /* Verde y no el color del texto: dice que este dato se verifico contra
       el documento. Pero el color NO es el mensaje -- el `title` del SVG lo
       dice con palabras, porque hay gente que no distingue verde de gris y
       porque un simbolo solo no le explica nada a quien lo ve por primera
       vez. Misma regla que gobierna las filas de vencimiento. */
    color: var(--ok);
}

/* El color acompana al texto y no lo reemplaza: el titulo del bloque ya
   dice "Vencidas" con letras. Misma regla que los documentos impresos. */
.pago-vencidas .tarjeta { border-left-color: var(--vencida); background: var(--vencida-fondo); }
.pago-hoy .tarjeta { border-left-color: var(--hoy); background: var(--hoy-fondo); }
.pago-proximas .tarjeta { border-left-color: var(--linea); }
.pago-lejanas .tarjeta { border-left-color: var(--linea); }
/* Las sin fecha no son urgentes, son DESCONOCIDAS. Gris y no rojo: el rojo
   ya significa vencida, y decir dos cosas con un color es no decir
   ninguna. */
.pago-sin-fecha .tarjeta { border-left-color: var(--quieto); background: var(--quieto-fondo); }

/* Quien esta usando el sistema, al final de la barra. */
.quien {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: .6rem;
  color: var(--suave);
  font-size: .88rem;
  white-space: nowrap;
}
/* Apariencia se elige una vez y no se vuelve a tocar: va en la barra, pero
   sin competir con el recorrido ni con el nombre de quien esta adentro. */
.enlace-tenue { color: var(--suave); text-decoration: none; font-size: .85rem; }
.enlace-tenue:hover { color: var(--acento); text-decoration: underline; }
.quien form { display: inline; }
.quien .enlace {
    background: none;
    border: 0;
    color: inherit;
    text-decoration: underline;
    cursor: pointer;
    font: inherit;
    padding: 0;
}

/* ==========================================================================
   TELEFONO
   ==========================================================================
   Hasta el 2026-08-10 este archivo NO tenia una sola regla para telefono:
   la unica media query era la de 1300px, y solo tocaba la grilla del editor
   de pedidos. La Fase 6 se hizo para que el editor anduviera "entre 900 y
   1920px" -- el telefono nunca estuvo en el alcance.

   El sintoma que lo destapo: Abner instalo la aplicacion en su Android y la
   barra ocupaba media pantalla antes de que apareciera nada util. `.barra`
   es una fila flex con 2rem de separacion que mete la marca, seis enlaces y
   el nombre de quien esta; en 360px no hay lugar, flex encoge cada elemento
   y el texto se parte palabra por palabra ("Cuentas / por / pagar").

   Esto importa aunque EscanerD tenga su propia puerta sin barra --y su
   propia hoja, `escaner.css`, desde el 2026-08-17--: **Don Edwin usa el
   telefono todos los dias** para ver lo que hay que pagar, y lo ve por
   aca, con la barra y las tablas de la computadora. */
@media (max-width: 640px) {
  .barra {
    flex-wrap: wrap;
    gap: .5rem 1rem;
    padding: .6rem .9rem;
  }
  /* El nombre completo del sistema no cabe y no hace falta: quien lo abre
     ya sabe que abrio. Por eso en la barra clara la marca ya viene corta
     ("D'ELIZA · Ordenes") y aca solo se le da un poco mas de cuerpo, que es
     lo unico que se lee de lejos con el telefono en la mano. */
  .barra .marca { font-size: .95rem; }

  /* Los enlaces en una sola linea que se desliza, en vez de una columna que
     empuja el contenido fuera de la pantalla. Cada enlace entero: partir
     "Cuentas por pagar" en tres renglones fue justamente el defecto.
     El deslizar (`overflow-x`, el scrollbar escondido y el `nowrap` de cada
     enlace) ya no se repite aca: vive con `.barra nav` arriba. Lo que si es
     del telefono es BAJAR los enlaces a su propio renglon completo. */
  .barra nav {
    order: 3;
    width: 100%;
    gap: .15rem;
    -webkit-overflow-scrolling: touch;
    padding-bottom: .15rem;
  }
  /* Los destinos se tocan con el pulgar: mas alto que en la computadora. */
  .barra nav a { padding: .45rem .65rem; }

  main { padding: .9rem; }

  /* ⚠️ EL "DOS Y DOS" DE LA FRANJA NO VIVE ACA. Vivia, y no servia: la
     regla base de `.resumen` --cuatro columnas-- se escribio mucho mas
     abajo, con el bloque de la franja, y le ganaba por orden con la misma
     especificidad. Ahora esta pegada a la regla que pisa, al final de la
     hoja. Ver `.resumen`. */

  /* ⚠️ ACA VIVIA `main table { display: block; overflow-x: auto; }`, que
     convertia TODA tabla del sistema en una tira que habia que arrastrar
     con el dedo. Se borro el 2026-08-19. Abner: *"no quiero que sea un
     deslizable, ya que en telefono es incomodo usar eso"*. En su lugar
     cada lista trae su version apilada, y la eligen las reglas
     `.solo-pc` / `.solo-tel` del final de esta hoja.

     PERO NO TODAS LAS TABLAS TIENEN TODAVIA SU VERSION APILADA. Las seis
     listas del rediseño si; las de adentro --revisar una factura,
     confirmar el costeo, la ficha de un producto, la huella-- no. Si a
     esas se les quita el deslizar sin darles la lista apilada, no mejoran:
     se estrujan, que es peor que arrastrar.

     Asi que el deslizar se retira SOLO de donde hay reemplazo. Una tabla
     que ya vive en `.tabla-caja` --las seis-- nunca se desliza; las demas
     lo conservan hasta que les toque su fase. Cuando ya no quede ninguna
     afuera, esta regla se borra entera y no queda deuda escondida. */
  main table:not(.tabla-caja table) {
    display: block;
    overflow-x: auto;
    white-space: nowrap;
  }

  /* Los botones dejan de ser pastillitas: en un telefono se tocan con el
     pulgar, no se apunta con un mouse. */
  .acciones { flex-wrap: wrap; }
  .acciones .boton { flex: 1 1 auto; text-align: center; padding: .7rem 1rem; }
}

/* Los controles de la camara: zoom y linterna. Los dibuja escaner.js y
   solo cuando el aparato los tiene de verdad, asi que este cajon puede
   quedar vacio -- por eso no lleva ni borde ni fondo: vacio tiene que
   ocupar cero. */
.camara-controles {
  display: flex;
  align-items: center;
  gap: .8rem;
  flex-wrap: wrap;
  margin-bottom: .8rem;
}

.camara-control {
  display: flex;
  align-items: center;
  gap: .5rem;
  flex: 1 1 12rem;
  font-size: .85rem;
}

/* Ancho porque se maneja con el pulgar y con una sola mano: la otra
   sostiene la factura. Y alto de sobra por lo mismo -- el area que se
   puede tocar importa mas que la linea que se ve. */
.camara-zoom {
  flex: 1;
  min-width: 6rem;
  height: 2rem;
}

/* El `<input type=file>` de verdad se esconde y lo dispara su `<label>`.
   NO con `display: none`: eso lo saca del arbol de accesibilidad y del
   orden de tabulacion, y el campo deja de existir para quien navega con
   teclado o con lector de pantalla. Asi sigue estando, solo que no se ve
   -- el boton que se ve es la etiqueta. */
.camara-archivo {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
}

.camara-foto { cursor: pointer; }

/* La camara en vivo se toca para enfocar, asi que tiene que verse tocable.
   `manipulation` apaga el retardo de 300 ms que Chrome deja para adivinar
   si viene un doble toque: enfocar tiene que pasar cuando uno toca. */
#camara { touch-action: manipulation; cursor: pointer; }

/* Un formulario de un solo botón que va al lado de un dato, no debajo. */
.en-linea { display: inline; margin-left: .5rem; }

/* El formulario para marcar un emisor como gasto. Va en linea con su
   campo: es una accion de una sola vez y no un bloque de trabajo. */
.marcar-gasto {
  display: flex;
  align-items: flex-end;
  gap: .6rem;
  flex-wrap: wrap;
  margin-bottom: 1.25rem;
}

/* Lo que entro de verdad cuando hubo bonificacion. Destacado sobre la
   cantidad facturada: es el numero con el que se cuenta la mercaderia y del
   que sale el costo real. El de arriba es lo que dice el papel. */
.recibidas {
  display: block;
  margin-top: .2rem;
  color: var(--ok);
  font-weight: 600;
  font-size: .85rem;
}

/* Una fila del registro, apilada. La etiqueta (Pago/Abono) y el monto van
   arriba y juntos: son las dos cosas que se buscan cuando algo no cuadra. */
.movimiento {
  background: var(--papel);
  color: var(--tinta);
  border: 1px solid var(--linea);
  border-radius: 6px;
  padding: .75rem;
  margin-bottom: .6rem;
}
.movimiento-cabeza {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: .75rem;
}
.movimiento-monto {
  font-size: 1.35rem;
  font-variant-numeric: tabular-nums;
}
.movimiento .proveedor { font-weight: 600; margin: .25rem 0 .35rem; }
/* Etiqueta y dato en la misma linea, con la etiqueta apagada: sin el
   nombre del campo, "TRF-884210" suelto no se sabe que es. */
.movimiento dl {
  margin: 0;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .1rem .6rem;
  font-size: .9rem;
}
.movimiento dt { color: var(--suave); }
.movimiento dd { margin: 0; }
/* Deshacer NO se estira a todo el ancho como "Ya pague": borra un
   movimiento de plata, y un boton grande al final de cada tarjeta es el
   que se aprieta con el pulgar sin querer al desplazarse. Es el mismo
   criterio que saco a "anular" de la lista de pagos el 2026-08-11. */
.movimiento .acciones { margin-top: .6rem; }

/* ── LA FILA APILADA ─────────────────────────────────────────────────
   La misma fila de la tabla, dibujada para el pulgar. Es la hermana de
   `.movimiento` de aca arriba --misma anatomia: cabeza con lo que se
   busca primero, titulo, pares etiqueta/dato, acciones al final-- y se
   escribe aparte solo porque se diferencia donde importa: en una lista
   de compras el dato de la derecha es un monto, y un monto se alinea a
   la derecha. `.movimiento` no se toca: las tarjetas de Pagar facturas
   se quedan como tarjetas, decision cerrada de Abner. */
.fila-apilada {
  background: var(--papel);
  color: var(--tinta);
  border: 1px solid var(--linea);
  border-radius: 7px;
  padding: .7rem .8rem;
  margin-bottom: .55rem;
}
.fila-cabeza {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: .8rem;
}
.fila-cabeza .cifra {
  font-size: 1.2rem;
  font-variant-numeric: tabular-nums;
  font-weight: 600;
}
.fila-apilada .titulo { font-weight: 600; margin: .2rem 0 .35rem; }
.fila-apilada dl {
  margin: 0;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .05rem .7rem;
  font-size: .87rem;
}
.fila-apilada dt { color: var(--suave); }
.fila-apilada dd { margin: 0; text-align: right; }
.fila-apilada .acciones { margin-top: .6rem; }

/* Texto apagado donde iria un boton que siempre daria error -- por
   ejemplo "Deshacer" sobre un abono cuya factura ya tiene un pago
   encima. No es un hueco vacio: explica por que no hay boton ahi. */
.tenue { color: var(--suave); font-size: .85rem; }

/* La etiqueta de que fue el movimiento. Nunca solo color: dice la palabra
   ademas de pintarse. */
.etiqueta-tipo {
  display: inline-block;
  font-size: .78rem;
  padding: .05rem .45rem;
  border-radius: 3px;
  border: 1px solid;
  white-space: nowrap;
}
.tipo-pago { background: var(--acento-suave); color: var(--acento); border-color: var(--acento-linea); }
.tipo-abono { background: var(--hoy-fondo); color: var(--hoy); border-color: var(--hoy); }


/* ── ELEGIR LA PALETA ────────────────────────────────────────────────
   Cada muestra lleva su propio `data-paleta`, asi que se pinta con SUS
   fichas y no con las de la pantalla. Ningun color se repite aca: lo
   que se ve al elegir es exactamente lo que va a usar el sistema.
   Ver app/apariencia.py y app/templates/apariencia.html. */
.muestra {
  display: block;
  background: var(--papel);
  color: var(--tinta);
  border: 1px solid var(--linea);
  border-radius: 6px;
  padding: 1rem;
  cursor: pointer;
}
/* La casilla se ve: es lo que dice cual esta puesta. Y no se estira a
   todo el ancho como los demas `input` de la hoja. */
.muestra input[type="radio"] { width: auto; margin: 0 0 .5rem; }
.muestra-nombre { display: block; font-weight: 600; font-size: 1.05rem; }
.muestra-texto {
  display: block;
  color: var(--suave);
  font-size: .9rem;
  margin-bottom: .6rem;
}
/* Tres tiras: el papel, el acento y una alerta. Con eso se ve de que se
   trata la paleta sin tener que ponersela. */
.muestra-tiras { display: flex; gap: .35rem; }
.muestra-tiras i {
  flex: 1;
  height: 1.4rem;
  border-radius: 3px;
  border: 1px solid var(--linea);
}
.muestra-papel { background: var(--fondo); }
.muestra-acento { background: var(--acento); }
.muestra-alerta { background: var(--vencida); }

/* ── LA CABECERA DE PANTALLA ─────────────────────────────────────────
   UN SOLO COMPONENTE que junta volver + titulo + acciones. Antes cada
   pantalla los tenia sueltos y en distinto orden, y varias no tenian
   enlace de volver. Ver app/templates/_cabecera.html. */
.cabecera {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
  padding-bottom: .7rem;
  border-bottom: 1px solid var(--linea);
  margin-bottom: 1.1rem;
}
.cabecera-texto { min-width: 0; }
/* Pisa el `margin-bottom` de `h1`: acá el aire lo pone `.cabecera`, y
   sumar los dos abria un hueco entre el titulo y su propia linea. */
.cabecera h1 { margin: 0; font-size: 1.3rem; line-height: 1.25; text-wrap: balance; }
.cabecera .bajada { margin: .2rem 0 0; color: var(--suave); font-size: .88rem; }
.cabecera-acciones { display: flex; gap: .5rem; flex-wrap: wrap; }

/* VOLVER QUE NOMBRA SU DESTINO. Nunca un "atras" generico: un enlace que
   no dice adonde lleva obliga a apretarlo para saberlo. */
.volver {
  display: inline-flex;
  align-items: center;
  gap: .3rem;
  color: var(--suave);
  text-decoration: none;
  font-size: .85rem;
  margin-bottom: .15rem;
}
.volver:hover { color: var(--acento); }

/* ── LA FRANJA DE RESUMEN ────────────────────────────────────────────
   CUATRO NUMEROS ARRIBA DE LA LISTA, y nada mas compitiendo. Decision
   cerrada de Abner el 19-08-2026: con seis no se lee ninguno. Ver
   app/templates/_resumen.html.

   ⚠️ TODO VA COLGADO DE `.resumen`, y no suelto. `.dato` YA EXISTE en
   esta hoja: es cada renglon del detalle de las tarjetas de pagar --las
   dos fechas y el numero de control--. Una regla `.dato { border; padding;
   background }` suelta le caeria encima a esas tres lineas de cada
   tarjeta, en la misma pantalla que estrena la franja. */
.resumen {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: .6rem;
  margin-bottom: 1.1rem;
}
.resumen .dato {
  background: var(--papel);
  border: 1px solid var(--linea);
  border-radius: 7px;
  padding: .6rem .75rem;
}
.resumen .dato-rotulo {
  font-size: .72rem;
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--suave);
}
/* `tabular-nums` para que los cuatro numeros se alineen entre si: con
   cifras de ancho variable la franja se ve torcida. */
.resumen .dato-cifra {
  font-size: 1.4rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  line-height: 1.15;
}
.resumen .dato-pie { font-size: .8rem; color: var(--suave); }

/* EL MEDIDOR: la señal SIN DEPENDER DEL COLOR. Ademas del tinte hay una
   forma, y su ancho dice cuanto pesa ese numero dentro del total de su
   pantalla. El ancho llega por `style` inline desde la plantilla --es la
   unica forma de dar un ancho calculado sin generar una regla por fila--
   y ese `style` NO lleva color. */
.resumen .dato-medidor {
  height: 3px;
  border-radius: 2px;
  background: var(--papel2);
  margin-top: .45rem;
}
.resumen .dato-medidor > i {
  display: block;
  height: 100%;
  border-radius: 2px;
  background: var(--acento);
}
.resumen .dato-alerta .dato-cifra { color: var(--vencida); }
.resumen .dato-alerta .dato-medidor > i { background: var(--vencida); }
.resumen .dato-atento .dato-cifra { color: var(--hoy); }
.resumen .dato-atento .dato-medidor > i { background: var(--hoy); }

/* DOS Y DOS EN EL TELEFONO. Cuatro cajas en 360px de ancho dejan cada
   cifra en una tira de 85px y el rotulo partido en tres renglones -- que
   es como se vio de verdad el 2026-08-20, con "MAS DE 3 DIAS SIN
   CONFIRMAR" en tres lineas.

   ⚠️ VA PEGADA A LA REGLA QUE PISA y no en la media query de la mitad de
   la hoja, donde estuvo. Las dos valen 0,1,0: puesta antes, ganaba la de
   cuatro columnas por orden y el telefono nunca veia el dos y dos. Es el
   mismo tropiezo que ya cuenta el comentario de `.solo-pc`/`.solo-tel`.
   Toda regla de telefono que pise a una de estas va DESPUES de ella. */
@media (max-width: 640px) {
  .resumen { grid-template-columns: repeat(2, 1fr); }
}

/* ── LA PANTALLA DE FACTURAS (2026-08-21) ────────────────────────────
   Maqueta aprobada por Abner ese dia. Las tres pestanas --por confirmar,
   sin identificar y gastos-- bajaron a filtros de una sola lista. */

/* EL ENCABEZADO DE CADA DIA. La lista se agrupa por el dia que entro la
   mercaderia y cada grupo dice cuantas son y cuanto suman: es lo que
   deja cuadrar una jornada contra el papel sin sacar la calculadora. */
.dia {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: .6rem; margin: 1.1rem 0 .35rem;
  padding-bottom: .2rem; border-bottom: 1px solid var(--linea);
}
.dia h3 {
  margin: 0; font-size: .82rem; text-transform: uppercase;
  letter-spacing: .06em; color: var(--suave);
}
.dia .suma {
  font-size: .82rem; color: var(--suave);
  font-variant-numeric: tabular-nums;
}

/* EL DIA COMO FILA SEPARADORA, DENTRO DE LA TABLA.

   ⚠️ UNA SOLA TABLA Y NO UNA POR DIA. Se probo con una tabla por dia y
   se vio mirando el 2026-08-21: cada tabla calcula SUS anchos por
   separado, asi que las columnas no alineaban entre bloques y el
   encabezado se repetia una vez por dia. Una columna de montos que no
   alinea es una columna que hay que leer digito por digito. */
.fila-dia th {
  background: var(--papel);
  border-top: 2px solid var(--linea);
  border-bottom: 1px solid var(--linea);
  padding-top: .7rem;
  font-size: .8rem;
  color: var(--tinta);
  text-transform: none;
  letter-spacing: 0;
}
.fila-dia th.num { color: var(--suave); font-weight: 400; }
/* El primer dia no lleva la linea de arriba: ya la pone la caja. */
.tabla-caja tbody:first-of-type .fila-dia th { border-top: 0; }

/* EL ESTADO DE UNA FACTURA. Nunca solo color: la etiqueta dice la
   palabra, y ademas del relleno lleva borde propio para quien no
   distingue un tinte del vecino.

   ⚠️ `.etiqueta` YA EXISTE mas arriba y la usan los estados del PEDIDO
   --BORRADOR, ENVIADO_JEFE, APROBADO-- y la pastilla del <h1> de
   `_cabecera.html`. **NO se redeclara.** Aca van SOLO los modificadores,
   con el mismo apellido `estado-` que ya usan los del pedido: una
   `.etiqueta { padding; border-radius }` nueva le caeria encima a tres
   pantallas que no entran en este trabajo.

   Los nombres NO son los de la base --POR_CONFIRMAR, PENDIENTE-- sino
   los de la pantalla, que es lo que estas fichas pintan. */
.estado-recibir { color: var(--hoy); border-color: var(--hoy); background: var(--hoy-fondo); }
.estado-pagar { color: var(--acento); border-color: var(--acento-linea); background: var(--acento-suave); }
.estado-pagada { color: var(--ok); border-color: var(--ok); background: var(--ok-fondo); }
.estado-anulada { color: var(--quieto); border-color: var(--linea); background: var(--quieto-fondo); }
.estado-vencida { color: var(--vencida); border-color: var(--vencida); background: var(--vencida-fondo); }

/* EL AVISO PLEGADO DE ARRIBA. Una linea con su cuenta, no un bloque
   (GUIA-INTERFAZ §3). El del buzon nace de los cinco dias de silencio
   del 15 al 20 de agosto: el servicio fallo cada diez minutos y nadie se
   entero porque la pantalla no lo decia en ninguna parte. */
.aviso-linea {
  display: flex; align-items: center; gap: .55rem; flex-wrap: wrap;
  padding: .5rem .75rem; margin-bottom: .9rem;
  border: 1px solid var(--linea); border-radius: 6px;
  background: var(--papel); font-size: .9rem;
}
.aviso-linea p { margin: 0; }
.aviso-linea .cuenta {
  font-weight: 600; padding: .05rem .45rem; border-radius: 999px;
  background: var(--quieto-fondo); color: var(--quieto);
  white-space: nowrap;
}
.aviso-linea .estirar { margin-left: auto; }
.aviso-linea.mal { border-color: var(--vencida); background: var(--vencida-fondo); }
.aviso-linea.mal .cuenta { background: var(--vencida); color: var(--papel); }
.aviso-linea.mal strong { color: var(--vencida); }

/* LA FRANJA DE LO QUE NO SE PUDO LEER (2026-08-29).

   AMBAR Y NO ROJO, y son los MISMOS tokens de "Por recibir": el buzon
   esta sano, solo recibio algo que no sabe abrir. El rojo dice "algo se
   rompio" y aca no se rompio nada; gastarlo en esto le quita fuerza el
   dia que el buzon de verdad deje de leer. Las dos franjas pueden salir
   juntas y tienen que distinguirse de un vistazo. */
.aviso-linea.mirar { border-color: var(--hoy); background: var(--hoy-fondo); }
.aviso-linea.mirar .cuenta { background: var(--hoy); color: var(--papel); }
.aviso-linea.mirar strong { color: var(--hoy); }

/* LOS DATOS DE UNA FICHA: rotulo chico arriba, valor abajo, en rejilla
   que se acomoda sola. Se usa en el historial del proveedor.

   El rotulo va ARRIBA y no al lado a proposito: al lado, un valor largo
   --el nombre legal de una sociedad-- empuja la columna y desalinea todas
   las demas filas. */
.datos-ficha {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: .7rem 1.2rem; margin: 0;
}
.datos-ficha dt {
  font-size: .72rem; text-transform: uppercase;
  letter-spacing: .06em; color: var(--suave);
}
.datos-ficha dd { margin: 0; font-weight: 600; }

/* LOS FILTROS. `.filtros` ya existia; esto son sus hijos nuevos. */
.campo { flex: 1 1 150px; min-width: 0; }
.campo-ancho { flex: 2 1 200px; }
.casilla {
  display: flex; align-items: center; gap: .4rem;
  font-size: .85rem; color: var(--tinta);
}
.casilla input { width: auto; margin: 0; }

/* EL CONMUTADOR DE "QUE SE VE". Son ENLACES y no botones: cada opcion es
   una direccion que se puede guardar y compartir, y el filtro tiene que
   sobrevivir a recargar la pagina. */
.conmutador {
  display: inline-flex; border: 1px solid var(--linea);
  border-radius: 4px; overflow: hidden; margin-bottom: .9rem;
}
.conmutador-opcion {
  padding: .35rem .65rem; color: var(--suave);
  text-decoration: none; white-space: nowrap; background: var(--papel);
}
.conmutador-opcion + .conmutador-opcion { border-left: 1px solid var(--linea); }
/* Nunca solo color: la activa ademas va en negrita y con borde propio. */
.conmutador-opcion.activa {
  background: var(--acento-suave); color: var(--acento);
  font-weight: 600; box-shadow: inset 0 0 0 1px var(--acento-linea);
}

/* LA LISTA APILADA DEL TELEFONO. `.fila-apilada` ya existe desde el
   redisenio del 19-08; lo que falta es el contenedor que le da el aire
   entre tarjetas. */
.apilada { display: grid; gap: .5rem; margin-bottom: .5rem; }

/* LA MARCA DE LA FACTURA QUE NADIE SELLO. Apagada y explicita: son 1,274
   de 1,562, y una fila que solo mostrara la fecha de la factura haria
   creer que ese dia entro mercaderia que nunca se registro entrando. */
.marca-sin-sello { color: var(--suave); font-size: .82rem; white-space: nowrap; }

/* EL NOMBRE DE QUIEN EMITIO LA FACTURA, en su fila.

   ⚠️ SE LLAMA `fila-quien` Y NO `quien`. `.quien` YA EXISTE: es el bloque
   del final de la barra que dice quien esta usando el sistema, y trae
   `display: flex`, `color: var(--suave)` y `white-space: nowrap`. Puesta
   sobre un `<td>` lo volvia flex, lo apagaba y le impedia partir el
   nombre, que en esta columna mide hasta cuarenta caracteres
   --"REPUESTOS Y SERVICIOS AUTOMOTRICES, S.A. DE C.V."--. Se vio mirando
   la pantalla el 2026-08-21. */
.fila-quien { font-weight: 600; color: var(--tinta); }

/* EL NUMERO DE CONTROL: treinta y un caracteres que se comparan contra
   un papel. Cifras de ancho fijo y apagado, porque no es lo que se lee
   primero. */
.control { font-variant-numeric: tabular-nums; color: var(--suave); font-size: .85rem; }

/* CUANDO NO HAY NADA. Un cuadro que lo dice, nunca una tabla vacia con
   sus encabezados: una tabla vacia parece que se rompio algo. */
.vacio {
  padding: 1.5rem; text-align: center; color: var(--suave);
  background: var(--papel); border: 1px dashed var(--linea);
  border-radius: 8px;
}
.mas { display: flex; justify-content: center; margin: 1.2rem 0 .4rem; }


/* ── EL ALTA DE FACTURA A MANO, CON LINEAS (2026-08-21) ──────────────
   Maqueta aprobada por Abner:
   https://claude.ai/code/artifact/90b41670-2d6e-4f03-80e8-5bb100989504

   Dos bloques en vez de once casillas apiladas. El bloque agrupa lo que
   se lee junto: "La factura" es el papel, "Lo que trae" es la
   mercaderia. Once <label> seguidos no dicen donde termina una cosa y
   empieza la otra. */
.bloque {
  background: var(--papel);
  border: 1px solid var(--linea);
  border-radius: 8px;
  padding: 1rem 1.1rem;
  margin-bottom: 1rem;
}
.bloque h2 {
  font-size: .74rem;
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--suave);
  font-weight: 600;
  margin: 0 0 .9rem;
}
/* La pista va DEBAJO de la casilla y no en el `placeholder`: un
   placeholder desaparece apenas se teclea la primera letra, justo cuando
   todavia hace falta. */
.pista { display: block; font-size: .74rem; color: var(--suave); margin-top: .2rem; }
/* EL CAMPO QUE CAUSO EL PROBLEMA queda marcado, no solo el mensaje de
   arriba: en una pantalla con nueve casillas, un aviso arriba no dice
   cual tocar. */
input.malo { border-color: var(--vencida); }

/* La tabla de lineas. Es UN SOLO juego de casillas -- ver el comentario
   de facturas/formulario.html: dos copias mandarian cada linea dos
   veces. En telefono estas mismas filas se apilan como tarjetas, mas
   abajo. */
.lineas-mano { width: 100%; border-collapse: collapse; font-size: .88rem; }
.lineas-mano th { background: transparent; padding: 0 .35rem .4rem; }
.lineas-mano td { padding: .25rem .35rem; vertical-align: middle; border-bottom: 0; }
.lineas-mano tbody tr + tr td { border-top: 1px solid var(--linea); }
.lineas-mano input { width: 100%; }
.lineas-mano .col-producto input + input { margin-top: .25rem; }
.col-producto { width: 42%; }
.col-quitar { width: 2.6rem; }
.lineas-mano .total-linea {
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  color: var(--suave);
}
.quitar {
  font: inherit; line-height: 1;
  padding: .25rem .5rem;
  border: 1px solid transparent; border-radius: 4px;
  background: transparent; color: var(--suave); cursor: pointer;
}
.quitar:hover { color: var(--vencida); border-color: var(--vencida); }

.pie-lineas {
  display: flex; align-items: center; gap: .8rem; flex-wrap: wrap;
  margin-top: .9rem; padding-top: .9rem;
  border-top: 1px solid var(--linea);
}
/* LA REGLA DEL IVA, escrita donde se teclea. Discreto y de trazo cortado:
   no es una alarma, es un recordatorio. */
.sello {
  font-size: .78rem; color: var(--suave);
  border: 1px dashed var(--linea); border-radius: 6px;
  padding: .25rem .6rem;
}
/* La suma de las lineas. NO se compara con el monto del papel y no avisa
   si difieren: son dos numeros distintos y el que manda es el tecleado.
   Decision de Abner del 21-08. */
.suma-lineas { margin-left: auto; font-size: .78rem; color: var(--suave); }
.suma-lineas strong {
  display: block; text-align: right;
  font-size: 1.15rem; color: var(--tinta);
  font-variant-numeric: tabular-nums;
}

/* LA COLUMNA DEL SELLITO DE QR en la lista de facturas (2026-08-21).
   Angosta y centrada: no lleva rotulo porque el simbolo ya se explica
   solo con su `title`, y un encabezado ahi solo agregaria ruido a una
   columna de 2.2rem. */
.col-qr { width: 2.2rem; text-align: center; }

/* ═══════════════════════════════════════════════════════════════════
   LA EQUIVALENCIA SOBRE LA FACTURA (2026-08-22)
   Maqueta aprobada por Abner despues de dos vueltas. La primera tenia
   un panel apilado y lo devolvio: *"es muy grande la tabla, en el caso
   que sean muchos productos seria muy molesto facturar"*. De ahi que
   todo esto sea de UN RENGLON.
   ═══════════════════════════════════════════════════════════════════ */

.estado-inventario { white-space: nowrap; }

/* NUNCA SOLO CON COLOR: van el signo y las palabras junto al color,
   porque quien no distingue el rojo tambien tiene que enterarse. Es la
   regla de GUIA-INTERFAZ.md, y aca importa mas que en otras pantallas:
   lo que se avisa es que una mercaderia NO va a entrar al inventario. */
.marca-estado {
  display: inline-flex; align-items: center; gap: .25rem;
  padding: 0 .4rem 0 .12rem; border-radius: 1rem;
  font-size: .72rem; font-weight: 600; white-space: nowrap;
}
.marca-estado .signo {
  display: inline-grid; place-items: center;
  width: .95rem; height: .95rem; border-radius: 50%;
  font-size: .68rem; font-weight: 700;
}
.marca-estado.mala { background: var(--vencida-fondo); color: var(--vencida); }
.marca-estado.mala .signo { background: var(--vencida); color: var(--vencida-fondo); }
.marca-estado.buena { background: var(--ok-fondo); color: var(--ok); }
.marca-estado.buena .signo { background: var(--ok); color: var(--ok-fondo); }
.entra-como { display: block; font-size: .7rem; color: var(--ok); }

/* LA FRANJA. Va debajo de su fila y no en una ventana aparte: quien la
   llena esta comparando contra el papel, y una ventana le tapa justo la
   tabla que esta mirando. */
tr.franja > td { padding: 0; background: var(--acento-suave); }
.franja-caja {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: .35rem .75rem;
  padding: .5rem .6rem .5rem .8rem;
  border-left: 3px solid var(--acento);
  margin: 0;
}
.franja-caja.mala { border-left-color: var(--vencida); }
.franja-caja .es { font-size: .78rem; color: var(--suave); }
.franja-caja .par { display: flex; align-items: center; gap: .3rem; }
.franja-caja .par input {
  width: 4.2rem; text-align: right; font-variant-numeric: tabular-nums;
}
.franja-caja .igual { font-weight: 700; color: var(--acento); }
.franja-caja .unidad { font-size: .78rem; color: var(--suave); }
.franja-caja .cierra { display: flex; gap: .35rem; align-items: center; }
.franja-caja .aviso-codigo {
  flex: 1 1 22rem; margin: 0; font-size: .82rem; color: var(--vencida);
}
.franja-caja .aviso-codigo code {
  padding: 0 .2rem; border-radius: 3px; background: var(--papel);
}
.vale-para { flex-basis: 100%; font-size: .72rem; color: var(--suave); }
.vale-para code { color: var(--tinta); }

/* LA CUENTA EN VIVO. Es lo unico que hay que mirar antes de apretar
   Guardar, y por eso dice la FRASE ENTERA en tres renglones rotulados
   (Abner, 23-08-2026):

     TRAE LA FACTURA      100 lb - son 20 unidades segun la descripcion
     EQUIVALENCIA         cada 5 lb = 1 de lo nuestro
     ENTRA AL INVENTARIO  20 CHORIZO ARGENTINO PIC 60 UND W600008

   Antes era una linea sola --"entran 100 60 und a $1.6460"-- donde el
   100 es la cantidad de la FACTURA y el "60 UND" la unidad NUESTRA,
   pegados sin separacion. Quien leia eso tecleaba 1 = 1 y metia 100 al
   kardex en vez de 20.

   Ocupa el ancho completo de la franja (`flex-basis: 100%`) y ya no cabe
   en la misma linea de los campos: la frase no entra en un renglon, y
   partirla era el defecto. */
.cuenta {
  flex-basis: 100%;
  display: grid; grid-template-columns: max-content 1fr;
  gap: .15rem .7rem;
  padding: .5rem .65rem; border-radius: 6px;
  background: var(--ok-fondo); color: var(--ok);
  font-size: .82rem;
  font-variant-numeric: tabular-nums;
}
.cuenta.vacia { background: var(--quieto-fondo); color: var(--suave); }
.cuenta .falta { grid-column: 1 / -1; }
.cuenta .rot {
  font-size: .68rem; text-transform: uppercase; letter-spacing: .05em;
  color: var(--suave); font-weight: 600;
  padding-top: .12rem; white-space: nowrap;
}
.cuenta .val { font-weight: 600; }
.cuenta .apunte { color: var(--suave); font-weight: 400; }
/* El unico numero del que depende el kardex, y por eso el unico grande. */
.cuenta .cifra { font-size: 1.15rem; font-weight: 700; }
.cuenta .prod { font-weight: 700; }
.cuenta .cod {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: .78rem; font-weight: 500;
  padding: 0 .25rem; border-radius: 3px;
  background: var(--papel); color: var(--tinta);
}
/* ⚠️ EL AVISO CUANDO NO CUADRA. No bloquea: las piezas son una lectura
   de la descripcion del proveedor y pueden diferir con razon. Lo que no
   puede pasar es que la diferencia no se vea. Va con palabras, no solo
   con color. */
.cuenta .ojo {
  grid-column: 1 / -1;
  margin-top: .25rem; padding: .25rem .45rem; border-radius: 4px;
  background: var(--hoy-fondo); color: var(--hoy);
  font-size: .76rem; font-weight: 600;
}

/* EL BUSCADOR DEL CATALOGO. No es un `datalist`: ese no deja ensenar el
   codigo ni la unidad, y sin la unidad los dos numeros de al lado no se
   pueden llenar bien. Se abre AL ENFOCAR, sin teclear nada, con lo que
   ya se parece a lo que dice la factura. */
.busca { position: relative; }
.busca .producto { width: 12rem; max-width: 100%; }
.sugeridos {
  position: absolute; z-index: 20; top: calc(100% + 3px); left: 0;
  width: 21rem; max-width: 78vw; max-height: 16rem; overflow-y: auto;
  border: 1px solid var(--acento-linea); border-radius: 6px;
  background: var(--papel); box-shadow: 0 6px 18px var(--sombra);
}
.sugeridos[hidden] { display: none; }
.sugeridos .cabeza {
  position: sticky; top: 0;
  padding: .3rem .6rem; border-bottom: 1px solid var(--linea);
  background: var(--papel2); color: var(--suave);
  font-size: .65rem; font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase;
}
.sugeridos button:not(.boton) {
  display: flex; align-items: baseline; gap: .5rem; width: 100%;
  padding: .35rem .6rem; border: 0; border-bottom: 1px solid var(--linea);
  background: transparent; color: var(--tinta);
  font: inherit; font-size: .82rem; text-align: left; cursor: pointer;
}
.sugeridos button:last-child { border-bottom: 0; }
.sugeridos button .nom { flex: 1; font-weight: 600; }
.sugeridos button .cod { font-size: .7rem; color: var(--suave); }
.sugeridos button .uni {
  padding: 0 .35rem; border-radius: 1rem;
  background: var(--quieto-fondo); color: var(--suave);
  font-size: .65rem; font-weight: 600;
  letter-spacing: .04em; text-transform: uppercase; white-space: nowrap;
}
.sugeridos button.puntero, .sugeridos button:hover {
  background: var(--acento-suave);
}
.sugeridos button.puntero .cod { color: var(--acento); }
.sugeridos .nada { padding: .5rem .6rem; font-size: .78rem; color: var(--suave); }

/* EN EL TELEFONO SE CONSULTA. La franja roja se ve; el boton de
   arreglarla, no. Buscar entre cuatrocientos productos no es trabajo de
   quien esta parado frente a un camion que descarga (Abner,
   22-08-2026). Lo que hay en su lugar es la frase que dice donde SI se
   arregla, para que nadie se quede buscando el boton. */
.aca-no {
  display: flex; align-items: center; min-height: 44px;
  padding: .5rem .7rem; border-radius: 5px;
  background: var(--quieto-fondo); color: var(--suave); font-size: .82rem;
}

/* ── LA MISMA LISTA, DOS VECES, y la hoja elige ──────────────────────
   Decision cerrada en GUIA-INTERFAZ.md: tablas anchas sin barra de
/* ── EL PLAZO SOBRE LA FACTURA (2026-08-28) ──────────────────────────
   Maqueta aprobada por Abner el 27-08. El plazo va JUNTO al vencimiento
   y no en columna nueva: la tabla de facturas ya tiene ocho y una mas la
   empuja de lado en la pantalla del jefe. */
.col-vence { white-space: nowrap; }
.plazo {
  display: block; font-size: .76rem; color: var(--suave);
  font-variant-numeric: tabular-nums;
}
.linea-vence {
  font-size: .82rem; color: var(--suave); font-variant-numeric: tabular-nums;
}
.linea-vence strong { color: var(--tinta); font-weight: 600; }

/* POR QUE NO HAY BOTON. Va donde iba el boton y no como aviso arriba:
   quien lo busca lo busca ahi. */
.porque { color: var(--suave); font-size: .82rem; margin-top: .35rem; }

.aviso-plazo {
  display: flex; gap: .5rem; align-items: baseline; flex-wrap: wrap;
  margin-top: .4rem; padding: .45rem .6rem; border-radius: 4px;
  background: var(--hoy-fondo); border: 1px solid var(--hoy);
  color: var(--hoy); font-size: .82rem;
}
.aviso-plazo .texto { flex: 1; min-width: 14rem; }

/* LA VENTANITA. `dialog` nativo: sube al top layer, asi que ningun
   `overflow: hidden` de arriba la recorta, y el navegador ya trae el foco
   atrapado, el Escape y el fondo inerte -- que a mano salen mal. */
dialog#confirmacion {
  border: 1px solid var(--linea); border-radius: 6px;
  background: var(--papel); color: var(--tinta);
  padding: 1.1rem 1.25rem; max-width: 22rem; width: calc(100% - 2rem);
  box-shadow: 0 8px 24px var(--sombra); font: inherit;
}
dialog#confirmacion::backdrop { background: var(--velo); }
dialog#confirmacion p { margin: 0 0 1rem; font-size: .95rem; }
dialog#confirmacion .botones {
  display: flex; gap: .5rem; justify-content: flex-end;
}
dialog#confirmacion .botones .boton { min-width: 5rem; }

/* ── LO DE ARRIBA TERMINA ACA ────────────────────────────────────────

   deslizar, y en telefono lista apilada -- una tarjeta por fila. Abner,
   2026-08-19, mirando la maqueta del registro: *"no quiero que sea un
   deslizable, ya que en telefono es incomodo usar eso"*.

   Las dos versiones viajan en el mismo HTML y esto elige cual se ve. El
   servidor NO adivina con que aparato entraron: no hay deteccion de
   agente ni plantillas separadas que se desincronizan.

   VAN AL FINAL DEL ARCHIVO a proposito. Son reglas de una sola clase, y
   puestas antes, cualquier `display` declarado despues les gana por orden
   con la misma especificidad -- y la lista del telefono aparece tambien
   en la PC. Ya paso una vez. */
.solo-tel { display: none; }

@media (max-width: 640px) {
  .solo-pc { display: none; }
  .solo-tel { display: block; }
  /* DESPUES de `.solo-tel`, o la lista apilada pierde su rejilla y las
     tarjetas quedan pegadas una contra otra. Misma trampa de la cascada
     que ya mordio dos veces. */
  .apilada.solo-tel { display: grid; }
  /* El conmutador de "que se ve" ocupa el ancho: cuatro opciones en 390
     px dejan cada una en una tira que no se puede tocar con el pulgar. */
  .conmutador { display: flex; width: 100%; }
  .conmutador-opcion { flex: 1; text-align: center; padding: .55rem .3rem; }
  .campo { flex: 1 1 100%; }

  /* LAS LINEAS DE LA FACTURA A MANO SE APILAN: una tarjeta por producto.
     Es el MISMO marcado que la tabla de la PC --no hay dos copias-- y por
     eso el rotulo de cada dato sale de `data-rotulo`, que es el unico
     lugar donde puede vivir sin repetir la casilla.

     Va DESPUES de `.solo-tel`, que es lo que ya mordio dos veces en este
     archivo: son reglas de una sola clase y la que va despues gana. */
  /* LA FRANJA EN EL TELEFONO. Se apila en dos o tres renglones en vez de
     desbordarse, y todo lo que se toca sube a 44 px. Los campos van a
     16 px: abajo de eso iOS hace zoom solo al enfocar y descoloca la
     pantalla. (GUIA-INTERFAZ.md § Objetivos tactiles.)

     No es que aca se vaya a llenar --el boton que la abre no se dibuja en
     telefono-- pero el candado de `PLU:` SI se abre, y ese hay que poder
     leerlo con el pulgar. */
  .franja-caja { gap: .5rem; }
  .franja-caja .busca, .franja-caja .busca .producto { width: 100%; }
  .franja-caja input, .franja-caja .boton { min-height: 44px; font-size: 16px; }
  /* EL CUADRITO EN EL TELEFONO. Los rotulos pasan ARRIBA de su dato: en
     390 px una columna de rotulos deja al nombre del producto partido en
     cuatro renglones. */
  .cuenta { grid-template-columns: 1fr; gap: .05rem; }
  .cuenta .rot { padding-top: .3rem; }
  .sugeridos { width: 100%; max-width: none; }

  .lineas-mano thead { display: none; }
  .lineas-mano, .lineas-mano tbody, .lineas-mano tr, .lineas-mano td { display: block; }
  .lineas-mano tr {
    background: var(--papel2);
    border: 1px solid var(--linea); border-radius: 8px;
    padding: .6rem .7rem; margin-bottom: .6rem;
    position: relative;
  }
  .lineas-mano tbody tr + tr td { border-top: 0; }
  .lineas-mano td { padding: .3rem 0; text-align: left; }
  .lineas-mano td::before {
    content: attr(data-rotulo);
    display: block; font-size: .74rem; color: var(--suave); margin-bottom: .15rem;
  }
  .lineas-mano .total-linea { font-size: 1rem; color: var(--tinta); }
  /* La × en la esquina de la tarjeta: dentro del apilado quedaria como un
     renglon mas, del mismo tamano que los datos, y se aprieta sin querer. */
  .lineas-mano .col-quitar { position: absolute; top: .35rem; right: .35rem; padding: 0; }
  .lineas-mano .col-quitar::before { content: none; }
  .quitar { min-width: 44px; min-height: 44px; }
  .pie-lineas { flex-direction: column; align-items: stretch; }
  .pie-lineas .boton { text-align: center; }
  .suma-lineas { margin-left: 0; }
  .suma-lineas strong { text-align: left; }
  /* A 16 px: abajo de eso iOS hace zoom solo al enfocar y descoloca la
     pantalla. Y 44 px de alto es el objetivo tactil minimo. */
  .bloque input, .bloque select { font-size: 16px; min-height: 44px; }

  /* EL FILTRO, CON EL PULGAR. Es el control con el que el jefe mira desde
     el telefono lo que se le debe a UNA empresa, y salia de 28 px de alto
     medido en el navegador a 390 px: abajo del objetivo tactil, y con la
     fuente heredada iOS hace zoom solo al enfocarlo y descoloca la
     pantalla. (GUIA-INTERFAZ.md, objetivos tactiles.)

     El rotulo baja a renglon propio porque al lado el nombre legal de una
     sociedad --"DISTRIBUIDORA SIGMA, S.A. DE C.V."-- no deja ancho para
     nada mas. */
  .filtros > label { flex: 1 1 100%; }
  .filtros select, .filtros input {
    width: 100%; font-size: 16px; min-height: 44px;
  }
  /* Y el boton que los acompana, del mismo alto: al lado de un campo de
     44 px, uno de 34 se lee como si estuviera apagado. */
  .filtros .boton { min-height: 44px; display: inline-flex; align-items: center; }
}
