/* ═══════════════════════════════════════════════════════════════════════
   LAS FICHAS. Ningun color literal fuera de este bloque (GUIA-INTERFAZ §4).
   Un hex suelto se queda igual cuando alguien cambia de paleta, y NO se
   nota con la clara -que se parece a lo que habia antes- sino con la
   oscura, cuando ya esta publicado.

   La paleta viaja en `data-paleta` sobre el <html>, y la pone el context
   processor con lo que cada quien eligio en «Mi cuenta». Los selectores van
   SIN `:root` a proposito: asi se pueden poner sobre cualquier elemento y
   la muestra de cada paleta se pinta con sus propias fichas, sin repetir un
   hex en Python ni en la plantilla.

   🔑 SEIS paletas, aprobadas por Abner el 22-08-2026. Agregar una es
   escribir su bloque aca Y nombrarla en `servicios/apariencia.py`:
   `tests/test_apariencia.py` compara las dos listas y no deja que se
   separen. Todo bloque tiene que traer las MISMAS fichas que los demas
   -la prueba tambien lo vigila-: una que falte se hereda de la anterior y
   nadie lo nota hasta que esta publicado, que fue lo que paso con --velo.

   Quien no elige nada NO lleva `data-paleta`, y entonces manda el
   `@media (prefers-color-scheme)` de mas abajo: clara de dia y oscura de
   noche, que es lo que el sistema hacia antes de que esto existiera.

   El acento de Liquidacion es CIRUELA en las seis. No podia ser
   azul-verdoso -es el de Incentivos- ni indigo -el de Ordenes- ni chocar
   con el verde de exito, el rojo de alerta o el ambar de aviso, que ya
   significan cosas. Que cada paleta cambiara el acento seria perder de
   un vistazo en que sistema estas.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── CLARA: la de siempre. Tambien es el respaldo de `:root`, o sea lo
      que ve quien sigue al sistema con Windows en claro. ────────────── */
:root,
[data-paleta="clara"] {
  --tinta: #20222c;
  --tinta-2: #4a4f5e;
  --tenue: #767c8c;
  --borde: #dcdde6;
  --borde-2: #eceef4;
  --fondo: #f3f3f7;
  --papel: #ffffff;
  --piso: #f8f8fb;
  --realce: #f0f0f6;
  --acento: #6a3d6e;
  --acento-tinta: #ffffff;
  --acento-piso: #f2ecf3;
  --sobre-acento-tenue: #e8dcea;
  --exito: #1c7c54;
  --alerta: #a33a2c;
  --aviso: #8a6116;
  --exito-piso: #e7f3ed;
  --alerta-piso: #fbeae7;
  --aviso-piso: #fbf1de;
  --sombra-desliz: rgba(32, 34, 44, 0.16);
  --sombra: rgba(32, 34, 44, 0.12);
  /* El velo de la ventanita que pregunta antes de salir. Apaga lo de
     atras sin taparlo: se tiene que ver que la cuenta sigue ahi. */
  --velo: rgba(32, 34, 44, 0.42);
  color-scheme: light;
  /* `color-scheme` arregla el FONDO de los controles nativos, no el color
     con que se marcan: sin `accent-color` los radios y los casilleros salen
     con el azul del navegador aunque la paleta sea oscura. */
  accent-color: #6a3d6e;
}

/* ── ARENA: clara y calida, papel color hueso. Cansa menos en jornada
      larga con la ventana abierta, que es como trabaja recepcion. ──── */
[data-paleta="arena"] {
  --tinta: #2a241d;
  --tinta-2: #554c40;
  --tenue: #7e7365;
  --borde: #e2dacf;
  --borde-2: #efe9e0;
  --fondo: #f6f1e8;
  --papel: #fffdf9;
  --piso: #faf6ef;
  --realce: #f1eae0;
  --acento: #6d3f60;
  --acento-tinta: #ffffff;
  --acento-piso: #f3ecf1;
  --sobre-acento-tenue: #e9dce6;
  --exito: #1d7550;
  --alerta: #a1382a;
  --aviso: #7d5710;
  --exito-piso: #e8f2ec;
  --alerta-piso: #fbeae6;
  --aviso-piso: #f8efd9;
  --sombra-desliz: rgba(60, 48, 36, 0.16);
  --sombra: rgba(60, 48, 36, 0.12);
  --velo: rgba(45, 36, 28, 0.45);
  color-scheme: light;
  accent-color: #6d3f60;
}

/* ── ALTO CONTRASTE: negro sobre blanco puro. Para pantalla con reflejo o
      vista cansada. El gris `--tenue` va mucho mas oscuro que en las otras
      a proposito: si el texto secundario se aclarara, esta paleta dejaria
      de cumplir justo lo que vino a hacer. ─────────────────────────── */
[data-paleta="contraste"] {
  --tinta: #000000;
  --tinta-2: #1c1c1c;
  --tenue: #3c3c3c;
  --borde: #5f5f5f;
  --borde-2: #c4c4c4;
  --fondo: #ffffff;
  --papel: #ffffff;
  --piso: #f1f1f1;
  --realce: #e4e4e4;
  --acento: #54225a;
  --acento-tinta: #ffffff;
  --acento-piso: #efe6f0;
  --sobre-acento-tenue: #d9c6dc;
  --exito: #0a5734;
  --alerta: #8a1c10;
  --aviso: #5f3e00;
  --exito-piso: #e2f0e9;
  --alerta-piso: #fbe5e2;
  --aviso-piso: #f7eed6;
  --sombra-desliz: rgba(0, 0, 0, 0.35);
  --sombra: rgba(0, 0, 0, 0.3);
  --velo: rgba(0, 0, 0, 0.55);
  color-scheme: light;
  accent-color: #54225a;
}

/* ── OSCURA: gris azulado neutro. Es tambien la que ve quien sigue al
      sistema con Windows en oscuro; las dos definiciones tienen que decir
      lo mismo, y por eso el @media de abajo repite estos valores. ──── */
[data-paleta="oscura"] {
  --tinta: #e7e7ee;
  --tinta-2: #b4b8c6;
  --tenue: #878d9d;
  --borde: #343747;
  --borde-2: #282b38;
  --fondo: #16171f;
  --papel: #1e202a;
  --piso: #22242f;
  --realce: #282b38;
  --acento: #c39bc8;
  --acento-tinta: #1b1420;
  --acento-piso: #2a2130;
  --sobre-acento-tenue: #3d2f44;
  --exito: #5cc494;
  --alerta: #e88b7c;
  --aviso: #d8ac54;
  --exito-piso: #1a2c25;
  --alerta-piso: #2f2020;
  --aviso-piso: #2c2618;
  --sombra-desliz: rgba(0, 0, 0, 0.5);
  --sombra: rgba(0, 0, 0, 0.55);
  --velo: rgba(8, 9, 13, 0.62);
  color-scheme: dark;
  accent-color: #c39bc8;
}

/* ── NOCHE: oscura y calida, marron en vez de azul. Para la oficina de
      noche, que es cuando el jefe cuadra. ─────────────────────────── */
[data-paleta="noche"] {
  --tinta: #efe8e0;
  --tinta-2: #c3b8ac;
  --tenue: #948a7e;
  --borde: #3d372f;
  --borde-2: #2e2925;
  --fondo: #1a1713;
  --papel: #23201b;
  --piso: #282320;
  --realce: #302a25;
  --acento: #cfa0c2;
  --acento-tinta: #201620;
  --acento-piso: #322630;
  --sobre-acento-tenue: #453341;
  --exito: #62c795;
  --alerta: #ea8f7a;
  --aviso: #dfb35d;
  --exito-piso: #1c2c23;
  --alerta-piso: #32211c;
  --aviso-piso: #2e2818;
  --sombra-desliz: rgba(0, 0, 0, 0.5);
  --sombra: rgba(0, 0, 0, 0.55);
  --velo: rgba(14, 11, 8, 0.62);
  color-scheme: dark;
  accent-color: #cfa0c2;
}

/* ── PIZARRA: oscura y fria, mas azul que la oscura. Para monitor
      grande, donde el gris neutro se ve lavado. ────────────────────── */
[data-paleta="pizarra"] {
  --tinta: #e3e9f2;
  --tinta-2: #aeb8c9;
  --tenue: #808b9e;
  --borde: #2e3949;
  --borde-2: #232c39;
  --fondo: #101620;
  --papel: #18202b;
  --piso: #1d2531;
  --realce: #232c3a;
  --acento: #bfa0d6;
  --acento-tinta: #171225;
  --acento-piso: #262034;
  --sobre-acento-tenue: #3a3049;
  --exito: #56c48f;
  --alerta: #ef8b7f;
  --aviso: #d9ae55;
  --exito-piso: #16281f;
  --alerta-piso: #2c1e1e;
  --aviso-piso: #2a2417;
  --sombra-desliz: rgba(0, 0, 0, 0.5);
  --sombra: rgba(0, 0, 0, 0.55);
  --velo: rgba(6, 10, 16, 0.62);
  color-scheme: dark;
  accent-color: #bfa0d6;
}

/* Quien NO eligio paleta le sigue a su Windows. La condicion es «no tiene
   `data-paleta`», no «no es la clara»: con seis paletas, preguntar por una
   sola dejaria a las otras cinco claras pintadas de oscuro cuando el
   sistema este en modo noche. */
@media (prefers-color-scheme: dark) {
  :root:not([data-paleta]) {
    --tinta: #e7e7ee;
    --tinta-2: #b4b8c6;
    --tenue: #878d9d;
    --borde: #343747;
    --borde-2: #282b38;
    --fondo: #16171f;
    --papel: #1e202a;
    --piso: #22242f;
    --realce: #282b38;
    --acento: #c39bc8;
    --acento-tinta: #1b1420;
    --acento-piso: #2a2130;
    --sobre-acento-tenue: #3d2f44;
    --exito: #5cc494;
    --alerta: #e88b7c;
    --aviso: #d8ac54;
    --exito-piso: #1a2c25;
    --alerta-piso: #2f2020;
    --aviso-piso: #2c2618;
    --sombra-desliz: rgba(0, 0, 0, 0.5);
    --sombra: rgba(0, 0, 0, 0.55);
    --velo: rgba(8, 9, 13, 0.62);
    color-scheme: dark;
    accent-color: #c39bc8;
  }
}

* { box-sizing: border-box; }

/* La raiz fija el tamano de los rem: con el escalado de Windows al 125%
   de la PC de la distribuidora, dejarlos pegados al 16px del navegador se
   ve enorme. Bajar la escala general es este solo numero. */
html { font-size: 13px; }

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

h1, h2, h3 { font-family: "Archivo", "Segoe UI", system-ui, sans-serif; }
h1 { font-size: 1.55rem; font-weight: 600; letter-spacing: -0.015em; margin: 0 0 0.6rem; text-wrap: balance; }
h2 { font-size: 1.1rem; font-weight: 600; margin: 0 0 0.6rem; text-wrap: balance; }
h3 { font-size: 0.95rem; font-weight: 600; margin: 0 0 0.4rem; }

:focus-visible { outline: 2px solid var(--acento); outline-offset: 2px; border-radius: 3px; }
@media (prefers-reduced-motion: reduce) { * { transition: none !important; animation: none !important; } }

/* El hilo de identidad: 3 px del acento arriba de todo. Es lo que
   distingue a los tres sistemas de un vistazo (GUIA-INTERFAZ §3). */
body::before {
  content: "";
  display: block;
  height: 3px;
  background: var(--acento);
}

.barra {
  display: flex;
  align-items: center;
  gap: 1.2rem;
  padding: 0.55rem 1.1rem;
  background: var(--piso);
  color: var(--tinta);
  border-bottom: 1px solid var(--borde-2);
}
.barra .marca {
  font-family: "Archivo", "Segoe UI", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.82rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  white-space: nowrap;
}
/* `flex-wrap` NO es opcional: sin el, el destino que no cabe desaparece sin
   ninguna senal -no hay barra de deslizar ni puntos suspensivos- y queda
   una seccion del sistema a la que no se puede llegar. */
.barra nav { display: flex; flex-wrap: wrap; gap: 0.1rem; margin-right: auto; }
.barra nav a {
  color: var(--tinta-2);
  text-decoration: none;
  font-weight: 500;
  padding: 0.45rem 0.55rem;
  border-radius: 6px;
  white-space: nowrap;
}
.barra nav a:hover { background: var(--realce); color: var(--tinta); }
.barra nav a.aqui { background: var(--acento-piso); color: var(--acento); font-weight: 600; }

/* Quien entro, al final de la barra. Es tambien el enlace para salir y
   para cambiarse el PIN. */
.barra .quien { margin-left: auto; color: var(--tenue); font-size: 0.88rem; }
.barra .quien a { color: var(--tenue); text-decoration: none; }
.barra .quien a:hover { color: var(--acento); text-decoration: underline; }

main { padding: 1.2rem; }

/* La pantalla de entrar: una sola cosa que hacer, centrada y angosta. */
.entrar { max-width: 26rem; margin: 2rem auto; }
.entrar label { display: block; margin-bottom: 0.2rem; }
.entrar input { width: 100%; }

.panel {
  background: var(--papel);
  border: 1px solid var(--borde);
  border-radius: 10px;
  padding: 1rem 1.1rem;
  margin-bottom: 1rem;
}
.panel-error { border-left: 4px solid var(--alerta); }

table { border-collapse: collapse; width: 100%; }
th, td {
  padding: 0.4rem 0.5rem;
  border-bottom: 1px solid var(--borde-2);
  text-align: left;
  vertical-align: middle;
}
th {
  font-family: "Archivo", "Segoe UI", system-ui, sans-serif;
  font-weight: 600;
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--tenue);
  border-bottom-color: var(--borde);
}
/* El dinero en mono y con cifras de ancho fijo: en una columna de montos es
   la diferencia entre leer y contar digitos. */
td.num, th.num {
  text-align: right;
  font-family: "IBM Plex Mono", "Consolas", monospace;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
th.num { font-family: "Archivo", "Segoe UI", system-ui, sans-serif; }
tbody tr:hover > td, tbody tr:hover > th { background: var(--realce); }
tfoot th, tfoot td {
  border-top: 2px solid var(--borde);
  border-bottom: 0;
  background: var(--piso);
  font-weight: 600;
  color: var(--tinta);
  font-size: 0.92rem;
  text-transform: none;
  letter-spacing: 0;
}
tfoot .num { font-family: "IBM Plex Mono", "Consolas", monospace; }

/* La aclaracion que acompana a un numero sin competirle: por ejemplo
   "de 6 - bodega no mando 2" debajo de lo que el cliente recibio. */
.tenue {
  display: block;
  font-size: 0.8rem;
  color: var(--tenue);
  font-family: "IBM Plex Sans", "Segoe UI", system-ui, sans-serif;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
}
/* `.tenue` va en `block` para que la aclaracion caiga DEBAJO del dato. En
   una celda eso rompe la tabla: un `<td>` en block se sale de la fila y la
   columna entera queda corrida respecto de las demas. Se veia en la lista
   de la planilla, con "En la liquidacion" e "Ingreso" desalineadas. */
td.tenue, th.tenue { display: table-cell; }

input, select, textarea {
  font: inherit;
  padding: 0.4rem 0.5rem;
  border: 1px solid var(--borde);
  border-radius: 6px;
  background: var(--papel);
  color: var(--tinta);
}
input:hover, select:hover, textarea:hover { border-color: var(--tinta-2); }
input.num {
  text-align: right;
  width: 6rem;
  font-family: "IBM Plex Mono", "Consolas", monospace;
  font-variant-numeric: tabular-nums;
}
/* El boton de un input de archivo se dibuja con el gris del navegador por
   mucho que el input tenga estilo: es un pseudo-elemento propio. */
input[type="file"] { padding: 0.3rem; }
input[type="file"]::file-selector-button {
  font: inherit;
  font-weight: 600;
  cursor: pointer;
  margin-right: 0.6rem;
  padding: 0.35rem 0.7rem;
  border-radius: 5px;
  border: 1px solid var(--acento);
  background: var(--papel);
  color: var(--acento);
}

.boton {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font: inherit;
  font-weight: 600;
  padding: 0.45rem 0.9rem;
  min-height: 2.2rem;
  border: 1px solid var(--acento);
  border-radius: 6px;
  background: var(--acento);
  color: var(--acento-tinta);
  text-decoration: none;
  cursor: pointer;
}
.boton:hover { filter: brightness(1.08); }
.boton-tenue { background: var(--papel); color: var(--acento); }
.boton-tenue:hover { background: var(--acento-piso); filter: none; }
/* Un boton apagado tiene que verse apagado. Sin regla propia queda con el
   color de `.boton` -el mismo fondo del acento, el mismo texto- y la
   persona lo toca y no pasa nada, sin ninguna explicacion. Se veia en
   «Dar el dia por cuadrado» con rutas sin cerrar. */
.boton[disabled], .boton:disabled {
  background: var(--realce);
  color: var(--tenue);
  border-color: var(--borde);
  cursor: not-allowed;
  filter: none;
  opacity: 1;
}
.boton-peligro { background: var(--papel); color: var(--alerta); border-color: var(--alerta); }
.boton-peligro:hover { background: var(--alerta-piso); filter: none; }

/* ── Las DOS opciones de deshacer una venta ──────────────────────────
   Eliminar y Nota de credito, una al lado de la otra en PC y una debajo
   de la otra en telefono. Cuando el documento es credito fiscal, la de
   Eliminar va APAGADA y no escondida: quien mira la pantalla tiene que
   ver que existe y que no se puede, sin leer un aviso (Abner, 24-08). */
.dos-opciones { display: grid; gap: 0.8rem; grid-template-columns: 1fr 1fr; }
/* 🔑 SE LLAMABA `.opcion` Y ESE NOMBRE YA ESTABA TOMADO. Mas abajo, en el
   buscador de producto, `.opcion` es un renglon de la lista y pide
   `display: grid` de cuatro columnas. Misma especificidad, asi que mandaba
   el orden: la rejilla del buscador se le imponia a este panel y en 390 px
   dejaba el titulo partido en una columna de una palabra de ancho. En PC
   no se notaba, porque en 645 px la rejilla todavia entra.
   La vigila `test_ninguna_clase_declara_dos_display_distintos`. */
.una-opcion {
  border: 1px solid var(--borde); border-radius: 9px; padding: 0.85rem;
  background: var(--piso); display: flex; flex-direction: column; gap: 0.55rem;
}
.una-opcion h3 { margin: 0; font-size: 0.98rem; }
.una-opcion .tenue { flex: 1; margin: 0; }
.una-opcion .aviso { margin: 0; }
/* Punteada y sin relieve: se lee «desactivada» antes de leer el texto. */
.una-opcion-apagada { background: var(--realce); border-style: dashed; }
.una-opcion-apagada h3 { color: var(--tenue); }
/* Un <span>, no un <button disabled>: no es un control que se pueda
   apretar, es el hueco donde estaria si se pudiera. */
.boton-apagado {
  display: inline-block; padding: 0.6rem 1rem; border-radius: 7px;
  background: var(--piso); color: var(--tenue); border: 1px solid var(--borde);
  cursor: not-allowed; text-align: center; font-size: 0.92rem;
}
@media (max-width: 640px) {
  .dos-opciones { grid-template-columns: 1fr; }
}

.aviso { padding: 0.6rem 0.9rem; border-radius: 7px; margin: 0 0 1rem; border-left: 3px solid transparent; }
.aviso-exito { background: var(--exito-piso); color: var(--exito); border-left-color: var(--exito); }
.aviso-error { background: var(--alerta-piso); color: var(--alerta); border-left-color: var(--alerta); }
/* Ni éxito ni error: algo que hay que saber y no es culpa de nadie. El
   catálogo sin cargar, o una ruta que no lleva nada que empacar. */
.aviso-atencion { background: var(--aviso-piso); color: var(--aviso); border-left-color: var(--aviso); }

/* Los dos botones de imprimir de la ruta, uno al lado del otro. */
.papeles { display: flex; gap: 0.5rem; margin: 0.8rem 0 0; }

/* La pantalla de una ruta: pestañas a la izquierda, cuadre siempre a la
   vista a la derecha. Celvin teclea mirando el numero que va cambiando. */
.con-cuadre { display: grid; grid-template-columns: 1fr 20rem; gap: 1rem; align-items: start; }
@media (max-width: 60rem) { .con-cuadre { grid-template-columns: 1fr; } }

/* Los avisos cruzan las dos columnas. Sin esto un flash se queda con la
   columna ancha y manda la pantalla entera a la de 20rem del cuadre:
   pasaba cada vez que se guardaba algo, que es cuando hay flash. */
.avisos { grid-column: 1 / -1; }

/* Las pestanas cargan CUATRO grupos nuevos desde el 20-08-2026 -Dias,
   Cuadre, Clientes y Reportes-, asi que dejaron de ser un detalle de la
   planilla y son el segundo nivel de navegacion de todo el sistema.

   Se dibujan como subrayado y no como carpetas: la carpeta necesita
   borde arriba, a los lados y fondo distinto -cuatro cosas- para decir lo
   mismo que dice una linea de 2 px, y con ocho pestanas eso es mucho
   dibujo compitiendo con la tabla, que es lo que hay que leer. */
.pestanas {
  display: flex;
  gap: 0.2rem;
  margin: 0 0 1rem;
  flex-wrap: wrap;
  border-bottom: 1px solid var(--borde);
}
.pestanas a {
  padding: 0.55rem 0.8rem;
  /* El margen negativo monta el borde de abajo de la pestana sobre la
     linea del grupo: sin el quedan dos lineas de 1 px una encima de otra
     y la activa se ve despegada. */
  margin-bottom: -1px;
  border: 0;
  border-bottom: 2px solid transparent;
  background: none;
  color: var(--tenue);
  font-weight: 600;
  text-decoration: none;
  /* 40 px de alto: es un destino de navegacion y se toca. */
  min-height: 2.6rem;
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
}
.pestanas a:hover { color: var(--tinta); }
.pestanas a.activa { color: var(--acento); border-bottom-color: var(--acento); }

/* Las pestañas de la ficha de producto son BOTONES y no enlaces: no van a
   ninguna parte, muestran un pedazo de esta misma pantalla. Se dibujan
   igual que las otras —quien las mira no tiene por qué notar la
   diferencia— pero hay que apagarles lo que el navegador le pone a un
   `<button>` por su cuenta. */
.pestanas-ficha button {
  padding: 0.55rem 0.8rem;
  margin-bottom: -1px;
  border: 0;
  border-bottom: 2px solid transparent;
  background: none;
  color: var(--tenue);
  font: inherit;
  font-weight: 600;
  cursor: pointer;
  min-height: 2.6rem;
}
.pestanas-ficha button:hover { color: var(--tinta); }
.pestanas-ficha button.activa { color: var(--acento); border-bottom-color: var(--acento); }

/* Cada ticket de la recepcion se lee como un bloque aparte: Celvin acepta
   o rechaza el ticket entero, y confundir dos tickets del mismo cliente es
   justo el error que hay que evitar. */
.ticket { border: 1px solid var(--borde); border-radius: 4px; padding: 0.8rem; margin-bottom: 1rem; }
.ticket h3 { margin: 0 0 0.6rem; }
.ticket-completo { display: flex; flex-wrap: wrap; gap: 0.6rem; margin-bottom: 0.8rem; }
.ticket-completo form { display: flex; gap: 0.3rem; align-items: center; }
/* El subtotal del salario en la boleta: va antes de los viaticos y tiene
   que leerse como un corte, no como un renglon mas de lo que se gano.
   Es el numero contra el que se entienden los descuentos. */
.ticket tr.subtotal td { border-top: 1px solid var(--borde); font-weight: 600; }

/* Los archivos del despacho: un cuadro por ruta, dos por fila. Una tabla
   sola con los dieciocho archivos obliga a leer la columna «Ruta» renglon
   por renglon, y el que viene a bajar los papeles de la Ruta 3 quiere ver
   la Ruta 3 y nada mas. `auto-fit` con minimo hace que en una pantalla
   angosta caigan de a uno sin escribir un @media. */
.cuadros {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(21rem, 1fr));
  gap: 0.8rem;
  margin-top: 0.8rem;
}
.cuadro {
  border: 1px solid var(--borde);
  border-radius: 4px;
  padding: 0.7rem 0.8rem;
}
.cuadro h3 { margin: 0 0 0.5rem; font-size: 1rem; }
.cuadro h3 .tenue { font-weight: normal; }
.cuadro ul { list-style: none; margin: 0; padding: 0; }
.cuadro li {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 0.6rem;
  padding: 0.25rem 0;
  border-top: 1px solid var(--fondo);
}
.cuadro li:first-child { border-top: 0; }
.cuadro .peso { color: var(--tenue); font-variant-numeric: tabular-nums; }

/* Los dias de despacho: DOS por fila y no los que quepan. Es lo que pidio
   Abner —«que quepan dos, uno en cada lado»— y ademas adentro va un
   desplegable con nombres completos («Jose Geovanny Argueta»): con tres
   columnas ese select le come el ancho a la columna del monto. En una
   pantalla angosta caen de a uno. */
.cuadros-dia { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (max-width: 62rem) { .cuadros-dia { grid-template-columns: 1fr; } }
/* El cuadro trae tabla y botones, no una lista: sin esto los `li` de arriba
   no aplican y el pie quedaria pegado al ultimo renglon. */
.cuadros-dia .cuadro th,
.cuadros-dia .cuadro td { padding: 0.3rem 0.4rem; }
.cuadros-dia .cuadro select { max-width: 11rem; }
.cuadros-dia .cuadro form { margin: 0; }

/* Los botones del pie de un cuadro, en una sola fila y que bajen solos si
   no caben. */
.pie-cuadro {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin: 0.7rem 0 0.5rem;
}

/* `hidden` tiene que ganarle a cualquier `display` de mas abajo. Sin
   esto, `.cuadrito { display: grid }` empata en especificidad con el
   `[hidden] { display: none }` del navegador y gana por venir despues:
   el desglose de monedas se veia siempre, con el boton diciendo todavia
   "Desglosar monedas". */
[hidden] { display: none !important; }

/* El cuadrito de efectivo: etiqueta, piezas y subtotal en tres columnas
   fijas. Sin tabla y sin encabezados, porque la etiqueta ya dice todo
   ("Billetes de $20") y lo unico que se teclea es el numero de piezas. */
.cuadrito {
  display: grid;
  grid-template-columns: 1fr 5.5rem 6rem;
  gap: 0 1rem;
  max-width: 28rem;
}
.cuadrito .pieza { display: contents; }
.cuadrito label { padding: 0.35rem 0; }
.cuadrito input {
  width: 100%;
  text-align: right;
  font-size: 1.1rem;
  padding: 0.3rem 0.5rem;
  margin: 0.15rem 0;
}
.cuadrito .subtotal {
  padding: 0.35rem 0;
  text-align: right;
  font-variant-numeric: tabular-nums;
  color: var(--tenue);
}
/* Los billetes y las monedas son dos montones distintos. */
.cuadrito .corte {
  grid-column: 1 / -1;
  border: none;
  border-top: 1px solid var(--borde);
  margin: 0.6rem 0;
  width: 100%;
}

.cuadrito-total {
  max-width: 28rem;
  display: flex;
  justify-content: space-between;
  border-top: 2px solid var(--tinta);
  margin-top: 0.6rem;
  padding-top: 0.5rem;
  font-size: 1.2rem;
}
.cuadrito-total strong { font-variant-numeric: tabular-nums; }

/* El cuadro de abajo de la boleta: los faltantes y el total que de verdad
   se entrega. Tiene que leerse como OTRA hoja pegada abajo y no como la
   continuacion del comprobante -- de eso depende que el de arriba siga
   siendo el voucher que acepta el Ministerio. De ahi el marco propio, el
   aire de por medio y la raya cortada. */
.cuadro-aparte {
  max-width: 28rem;
  margin-top: 1.6rem;
  padding-top: 1rem;
  border-top: 1px dashed var(--tenue);
}
.cuadro-aparte h2 { margin-top: 0; font-size: 1rem; }
/* Que no lo parta la impresora por la mitad: partido, el trabajador ve
   un total sin el renglon que lo explica. */
.cuadro-aparte { break-inside: avoid; }

/* 🔑 Las ventas ANULADAS del reporte de ventas por dia. Van en su propio
   cuadro por lo mismo que el de la boleta -- tiene que leerse como otra
   cosa y no como la continuacion del subtotal, porque esa plata NO entro --
   pero no reusa `.cuadro-aparte`: aquella tiene `max-width: 28rem` porque
   es un comprobante de una columna, y aca adentro va una tabla de cinco.
   Lo que si se le copia es lo que importa: el marco propio y que la
   impresora no lo parta, para que el motivo de una anulacion no quede en
   otra hoja que su monto -- y este papel se pone al lado del libro de
   ventas para cuadrarlo. */
/* El renglon anulado, en cualquier lista. La clase ya se escribia en la
   lista de ventas desde hace tiempo pero no tenia estilo: se veia igual
   que una viva y habia que leer la etiqueta para notarlo. Lo tachado es
   el monto, no la fila entera: el nombre y la fecha hay que poder
   leerlos, que para eso sigue estando el renglon. */
tr.anulada td { color: var(--tenue); }
tr.anulada td.num { text-decoration: line-through; }

.anuladas {
  margin-top: 1.4rem;
  padding-top: 0.8rem;
  border-top: 1px dashed var(--tenue);
  break-inside: avoid;
}
.anuladas h3 { margin-top: 0; font-size: 1rem; }

.cuadre .linea { display: flex; justify-content: space-between; padding: 0.2rem 0; }
.cuadre .total { border-top: 1px solid var(--borde); margin-top: 0.4rem; padding-top: 0.4rem; font-weight: 600; }
.cuadre .diferencia { font-size: 1.3rem; font-weight: 700; }
.es-cuadrado { color: var(--exito); }
.es-faltante { color: var(--alerta); }
.es-sobrante { color: var(--aviso); }

/* El pedido que se tecleo a mano, en la lista de Pedidos. Lleva ficha de
   acento y NO de alerta: no hay nada malo en el, solo dice de donde vino.
   Y ademas del color lleva la palabra -- nunca comunicar solo con color. */
.es-a-mano {
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--acento);
  background: var(--acento-piso);
  padding: 0.1rem 0.45rem;
  border-radius: 10px;
  white-space: nowrap;
}

/* La lista de clientes de la recepcion. Una ruta trae decenas, asi que la
   lista tiene su propia barra y no estira la pantalla: la referencia es
   un alto fijo, con la busqueda pegada arriba. */
.buscador { max-width: 32rem; margin-bottom: 1.2rem; }
.buscador label { display: block; margin-bottom: 0.3rem; }
.buscador input[type="search"] { width: 100%; padding: 0.45rem 0.6rem; }

.lista-clientes {
  list-style: none;
  margin: 0.4rem 0 0;
  padding: 0;
  max-height: 16rem;
  overflow-y: auto;
  border: 1px solid var(--borde);
  border-radius: 4px;
}
.lista-clientes li { border-bottom: 1px solid var(--borde); }
.lista-clientes li:last-child { border-bottom: none; }
.lista-clientes a {
  display: block;
  padding: 0.45rem 0.6rem;
  text-decoration: none;
}
.lista-clientes a:hover { background: var(--realce); }
/* El cliente en el que se esta trabajando se reconoce de un vistazo al
   volver de una devolucion. */
.lista-clientes .es-elegido a { font-weight: 600; }
.lista-clientes .es-elegido { background: var(--realce); }

/* --- Pagina de instalacion ------------------------------------------
   La abren Gerson y el jefe, que no conocen el sistema: los pasos van
   grandes y con harto aire. */
.instalar { max-width: 46rem; }
.instalar h1 { margin-bottom: .4rem; }
.instalar-intro { color: var(--tenue); font-size: 1.05rem; margin-top: 0; }
.boton-grande {
  display: inline-block;
  padding: .85rem 2.2rem;
  font-size: 1.15rem;
  margin: .6rem 0 1.4rem;
}
.instalar-pasos { line-height: 1.9; padding-left: 1.2rem; }
.instalar-pasos li { margin-bottom: .3rem; }
.instalar-nota {
  color: var(--tenue);
  font-size: .92rem;
  border-top: 1px solid var(--borde);
  padding-top: .8rem;
  margin-top: 1.6rem;
}
.instalar-nota code { word-break: break-all; }

/* --- Planilla y asistencia -------------------------------------------
   La casilla de un si/no va en linea con su texto: `label` normal deja el
   texto debajo del cuadrito, que en un formulario de fichas se lee como
   si fuera el rotulo del campo siguiente. */
.casilla {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  margin: 0.3rem 0;
}
.casilla input { margin: 0; }

/* Elegir mes y quincena: los dos campos y el boton en una sola fila, que
   es como se lee "agosto, segunda". */
.filtros {
  display: flex;
  align-items: flex-end;
  gap: 0.8rem;
  margin: 0.8rem 0;
}

/* Las faltas dentro de la celda de un empleado. Sin viñetas: son dos o
   tres renglones, y la viñeta las haria parecer una lista de tareas. */
.lista-suelta { list-style: none; margin: 0; padding: 0; }
.lista-suelta li { padding: 0.15rem 0; }

/* Un formulario de un solo boton que tiene que quedar donde va el texto
   -el "borrar" de cada falta-, y no en su propio renglon. */
.en-linea { display: inline; }

/* La ficha de un empleado: doce campos que en una sola pila se leian como
   una lista de cosas que llenar. Agrupados por la pregunta que contestan
   -quien es, como cobra, cuanto se le paga, para pagarle- se leen como
   cuatro preguntas, y cada grupo cabe de un vistazo.

   La rejilla es `auto-fit` y no un numero fijo de columnas: en la pantalla
   ancha de la oficina caben tres o cuatro campos por fila y en una angosta
   se apilan solos, sin un salto brusco a la mitad. */
/* El corte entre dos cosas distintas de la misma pantalla: mirar la lista
   y dar de alta, guardar la ficha y sacar a alguien de la planilla. Sin
   aire, el titulo de abajo se lee como parte de lo de arriba. */
.aparte { margin-top: 1.6rem; }

.ficha { max-width: 62rem; }
.ficha fieldset {
  border: 1px solid var(--borde);
  border-radius: 4px;
  padding: 0.8rem 1rem 1rem;
  margin: 0 0 1rem;
}
.ficha legend {
  font-weight: 600;
  color: var(--tenue);
  padding: 0 0.4rem;
}
.ficha .campos {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: 0.9rem 1.2rem;
}
/* El nombre legal es el campo largo de la ficha: "Jose Geovanny Argueta
   Diaz" no entra en una columna angosta. */
.ficha .campos .ancho { grid-column: 1 / -1; }
.ficha label:not(.casilla) { display: block; }
.ficha label:not(.casilla) input,
.ficha label:not(.casilla) select {
  display: block;
  width: 100%;
  margin-top: 0.15rem;
}
/* Los montos a la derecha, como en la tabla de arriba y como en cualquier
   papel donde haya que compararlos de un vistazo. */
.ficha input[inputmode="decimal"] { text-align: right; }
/* Las dos casillas de ley van juntas y debajo de los montos, porque lo que
   contestan es sobre esos montos. */
.ficha .casillas {
  display: flex;
  gap: 1.5rem;
  flex-wrap: wrap;
  margin-top: 0.9rem;
  padding-top: 0.7rem;
  border-top: 1px solid var(--borde);
}

/* Marcar la falta. Los rotulos van sobre su campo y no al lado: son cuatro
   seguidos, y en linea se leian como una sola frase larga donde no quedaba
   claro cual campo iba con cual palabra. La casilla se queda en linea, que
   ahi el texto ES la pregunta. */
.marcar-falta { margin-top: 1.4rem; }
.marcar-falta label:not(.casilla) {
  display: block;
  margin-bottom: 0.7rem;
  max-width: 22rem;
}
.marcar-falta label:not(.casilla) select,
.marcar-falta label:not(.casilla) input {
  display: block;
  width: 100%;
  margin-top: 0.15rem;
}

/* Boton que se lee como enlace. Es para la accion secundaria que no debe
   competir con el boton de guardar, pero que tiene que ser un POST y no
   un <a>: borrar por GET lo dispara cualquier cosa que precargue enlaces. */
.enlace {
  font: inherit;
  font-size: 0.8rem;
  padding: 0;
  border: none;
  background: none;
  color: var(--acento);
  text-decoration: underline;
  cursor: pointer;
}

/* La eleccion de si se cierran las cuentas en Handy, en la pantalla de Hojas
   de Carga. Va en un recuadro y no como una casilla suelta porque decide si
   los vendedores pueden seguir trabajando: tiene que verse antes de apretar
   "Generar", no despues. Cada opcion ocupa su renglon completo para que se
   lea la explicacion entera y no solo el titulo. */
.opciones {
  border: 1px solid var(--borde);
  border-radius: 4px;
  padding: 0.8rem 1rem 1rem;
  margin: 1.2rem 0;
}
.opciones legend {
  font-weight: 600;
  color: var(--tenue);
  padding: 0 0.4rem;
}
.opciones label {
  display: block;
  margin: 0 0 0.7rem;
  padding-left: 1.6rem;
  text-indent: -1.6rem;
  line-height: 1.45;
}
.opciones label:last-child { margin-bottom: 0; }
.opciones input[type="radio"] { margin-right: 0.5rem; }

/* --- Inventario -------------------------------------------------------
   Abner dijo de la primera pantalla de ventas que se veia «poco
   profesional», y tenia razon: era un formulario web con todo espaciado y
   en columna. Lo que el usa todo el dia es SIGA, una aplicacion de
   escritorio DENSA -- muchos datos por pantalla, poco aire, numeros
   alineados. De ahi sale todo lo que hay aca abajo.

   La barra de trabajo de una tabla: buscar, filtrar y el boton de alta, en
   una sola fila. Va pegada arriba de la tabla porque es lo primero que se
   toca al entrar. */
.barra-tabla {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
  margin-bottom: 0.8rem;
}
/* El buscador se come el espacio sobrante y empuja el boton de alta al
   otro extremo: son dos cosas distintas y no tienen que verse como una
   fila de botones iguales. */
.barra-tabla-buscar {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex: 1;
  flex-wrap: wrap;
}
/* El buscador tiene tope: estirado a toda la pantalla se lee como una
   barra de direcciones y no como un campo. 26rem es mas de lo que mide el
   nombre de producto mas largo del catalogo. */
.barra-tabla-buscar input[type="search"] { min-width: 18rem; max-width: 26rem; flex: 1; }
.barra-tabla .boton { white-space: nowrap; }

/* La tabla densa. La diferencia entre «tabla de sistema» y «tabla de
   pagina web» son tres cosas, y estan todas aca: renglones bajos, la
   cabecera fija arriba al bajar con la vista, y el renglon bajo el cursor
   marcado -- con 369 productos, seguir un renglon a lo ancho sin eso es
   justo donde se lee el precio del de arriba. */
.tabla-densa th, .tabla-densa td { padding: 0.28rem 0.6rem; }
.tabla-densa tbody tr:hover { background: var(--realce); }
.tabla-densa thead th {
  position: sticky;
  top: 0;
  background: var(--papel);
  box-shadow: inset 0 -1px 0 var(--borde);
  z-index: 1;
}
.tabla-densa a { color: var(--tinta); text-decoration: none; }
.tabla-densa a:hover { text-decoration: underline; }
/* El precio es el dato que se viene a buscar: pesa mas que los de al lado. */
.tabla-densa .fuerte { font-weight: 600; }
.vacio { color: var(--tenue); padding: 1.2rem 0.6rem; text-align: center; }

/* Los codigos van en tipografia de ancho fijo. No es decoracion: '300006'
   y '300008' se distinguen de un vistazo solo si las cifras se alinean. */
.mono {
  font-family: "Consolas", "Cascadia Mono", ui-monospace, monospace;
  font-size: 0.92em;
}

/* Un dato secundario DENTRO de una celda. `.tenue` es `display: block` y
   en una tabla eso rompe la fila (ya paso con la planilla), asi que la
   version en linea es otra clase y no un parche sobre aquella. */
.tenue-inline { color: var(--tenue); }

/* La marquita de un subcodigo al lado del nombre: sin ella, «BOLSON
   MUSLO» y «MUSLO PIERNA» se leen como dos productos sin relacion. */
.etiqueta {
  display: inline-block;
  margin-left: 0.4rem;
  padding: 0.05rem 0.4rem;
  border: 1px solid var(--borde);
  border-radius: 999px;
  font-size: 0.75rem;
  color: var(--tenue);
  white-space: nowrap;
}

/* Los numeros que se miran y no se teclean: la ganancia, el margen, la
   existencia. Grandes, con el rotulo debajo diciendo QUE PREGUNTA
   contestan -- «52.7 %» solo no significa nada, y el margen sobre la
   venta y el margen sobre el costo se confunden justamente por salir sin
   rotulo. */
.tarjetas-dato {
  display: flex;
  flex-wrap: wrap;
  gap: 0.8rem;
  margin-top: 0.9rem;
  padding-top: 0.8rem;
  border-top: 1px solid var(--borde);
}
.dato {
  flex: 1;
  min-width: 9rem;
  padding: 0.5rem 0.7rem;
  background: var(--fondo);
  border-radius: 4px;
}
.dato-valor {
  display: block;
  font-size: 1.35rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  line-height: 1.2;
}
.dato-rotulo {
  display: block;
  font-size: 0.78rem;
  color: var(--tenue);
  margin-top: 0.1rem;
}

/* El titulo de una ficha con su codigo al lado, en la misma linea. */
.titulo-ficha { display: flex; align-items: baseline; gap: 0.7rem; }
.titulo-ficha h1 { margin-bottom: 0.5rem; }

/* La vuelta a la lista, arriba de una ficha. */
.migaja { margin: 0 0 0.6rem; }
.migaja a { color: var(--tenue); text-decoration: none; }
.migaja a:hover { color: var(--acento); }

/* Un enlace que acompana a un boton sin competirle -- «Limpiar» al lado de
   «Buscar». */
.enlace-tenue { color: var(--tenue); font-size: 0.9rem; }

/* El renglon para agregar algo sin cambiar de pantalla: el subcodigo desde
   la ficha de su producto. Todo en una fila, con el boton al final. Lo que
   lo hace util es que se ve que es UN renglon y no un formulario: mandar
   esto a otra pantalla es lo que hace que uno deje de hacerlo. */
.renglon-alta {
  display: flex;
  align-items: flex-end;
  gap: 0.6rem;
  flex-wrap: wrap;
  margin-top: 0.9rem;
  padding-top: 0.9rem;
  border-top: 1px solid var(--borde);
}
.renglon-alta label { display: block; font-size: 0.85rem; color: var(--tenue); }
.renglon-alta label input { display: block; margin-top: 0.15rem; }
/* El campo largo del renglon tiene tope: estirado a toda la pantalla se
   lee como una barra y no como un campo, y ademas separa tanto los
   demas que dejan de leerse como una sola fila. */
.renglon-alta .ancho { flex: 1; min-width: 14rem; max-width: 24rem; }
.renglon-alta .ancho input { width: 100%; }
.renglon-alta input[inputmode="decimal"] { text-align: right; width: 5rem; }

/* La unidad pegada al numero: «10 [LBS]». Sin esto hay que adivinar en que
   se mide el factor de un subcodigo. */
.con-sufijo { display: flex; align-items: stretch; }
.con-sufijo input { border-radius: 3px 0 0 3px; }
.con-sufijo .sufijo {
  display: flex;
  align-items: center;
  padding: 0 0.5rem;
  border: 1px solid var(--borde);
  border-left: none;
  border-radius: 0 3px 3px 0;
  background: var(--fondo);
  color: var(--tenue);
  font-size: 0.85rem;
}

/* La equivalencia de un subcodigo, arriba de su ficha: cambia lo que
   significan el precio y la existencia de esa pantalla. */
.equivalencia { font-size: 1.1rem; margin: 0.2rem 0 0.4rem; }

/* Una existencia en negativo se marca y no se esconde. En el catalogo real
   ya hay varias -SIGA trae "SACO MIXTO PIEZAS DE POLLO" en -2.00-, y son
   justamente las que hay que ir a contar: pintarlas igual que las demas
   las vuelve invisibles en una lista de 369 renglones. */
.en-negativo { color: var(--alerta); }

/* --- La pantalla de teclear una venta ---------------------------------
   Rehecha el 12-08-2026. La primera version era un formulario web con
   todos los campos del mismo tamano y en columna; Abner dijo que se veia
   "poco profesional" y tenia razon. Lo que el usa es SIGA, y lo que hace
   que SIGA se vea como una aplicacion son tres cosas que estan todas aca:
   el encabezado COMPRIMIDO arriba, la tabla ocupando el resto, y la franja
   de atajos al pie.

   El encabezado: dos filas apretadas. Lo que casi siempre viene
   contestado -fecha, caja, contado, factura- no puede ocupar lo mismo que
   el cliente, que es lo unico que de verdad se teclea en cada venta. */
.encabezado-venta { padding: 0.7rem 0.9rem; }
.fila-campos {
  display: flex;
  align-items: flex-end;
  gap: 0.7rem;
  flex-wrap: wrap;
}
.fila-campos + .fila-campos { margin-top: 0.6rem; }
.fila-campos label {
  display: block;
  font-size: 0.8rem;
  color: var(--tenue);
}
.fila-campos label input,
.fila-campos label select { display: block; margin-top: 0.1rem; }
.fila-campos .campo-ancho { flex: 1; min-width: 15rem; }
.fila-campos .campo-ancho input { width: 100%; }

/* El buscador de producto. Es el campo donde se pasa el tiempo, asi que es
   el mas grande de la pantalla -- al reves que en la version vieja, donde
   pesaba lo mismo que "Nota". */
.buscador-producto { position: relative; margin-bottom: 0.7rem; }
.buscador-producto label {
  display: block;
  font-size: 0.8rem;
  color: var(--tenue);
  margin-bottom: 0.15rem;
}
.buscador-producto input {
  width: 100%;
  max-width: 34rem;
  font-size: 1.1rem;
  padding: 0.4rem 0.6rem;
}

/* La lista de candidatos. Va ABSOLUTA y flotando sobre la tabla: si
   empujara el contenido, la tabla de lineas saltaria hacia abajo en cada
   tecla y se perderia de vista lo que se lleva agregado. */
#resultados {
  position: absolute;
  z-index: 10;
  list-style: none;
  margin: 0.1rem 0 0;
  padding: 0;
  width: 100%;
  max-width: 34rem;
  background: var(--papel);
  border: 1px solid var(--borde);
  border-radius: 3px;
  box-shadow: 0 4px 10px var(--sombra);
}
.opcion {
  display: grid;
  grid-template-columns: 1fr 7rem 7rem 5rem;
  gap: 0.5rem;
  align-items: baseline;
  padding: 0.3rem 0.6rem;
  cursor: pointer;
}
/* La opcion activa se marca con FONDO y no solo con el texto: se elige a
   ciegas con Enter, asi que tiene que verse de reojo. */
.opcion.activa { background: var(--acento); color: var(--acento-tinta); }
.opcion.activa .opcion-codigo,
.opcion.activa .opcion-existencia { color: var(--sobre-acento-tenue); }
.opcion-codigo, .opcion-existencia {
  color: var(--tenue);
  font-size: 0.85rem;
  text-align: right;
}
.opcion-precio {
  text-align: right;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}

/* Lo que se va a agregar al apretar Enter, escrito con todas las letras.
   Es lo que compensa que la primera opcion se active sola: la tecla se
   ahorra, pero antes de apretarla se ve QUE y CUANTO va a caer. */
.vista-previa {
  margin: 0.3rem 0 0;
  font-size: 0.9rem;
  color: var(--exito);
}

.tabla-lineas { margin-top: 0.5rem; }
.tabla-lineas input { width: 5.5rem; text-align: right; }
/* La fila elegida -la que se borra con Supr-. */
.tabla-lineas tr.elegida { background: var(--acento-piso); }
/* La linea que se acaba de sumar a una que ya estaba: es lo unico que
   parpadea en toda la pantalla, porque comunica algo que si no, no se
   veria -- que la cantidad cambio en un renglon de mas arriba. */
@keyframes destello { from { background: var(--aviso-piso); } to { background: transparent; } }
.tabla-lineas tr.destello { animation: destello 0.7s ease-out; }
@media (prefers-reduced-motion: reduce) {
  .tabla-lineas tr.destello { animation: none; background: var(--aviso-piso); }
}

.quitar-linea {
  font: inherit;
  border: none;
  background: none;
  color: var(--tenue);
  cursor: pointer;
  padding: 0 0.3rem;
}
.quitar-linea:hover { color: var(--alerta); }

/* El pie: cuantas lineas, el total grande, y guardar. El total tiene que
   estar SIEMPRE a la vista -- se mira antes de apretar. */
.pie-venta {
  display: flex;
  align-items: center;
  gap: 1rem;
  margin-top: 0.8rem;
  padding-top: 0.7rem;
  border-top: 2px solid var(--tinta);
}
.total-venta { margin-left: auto; font-size: 1.1rem; }
.total-venta strong {
  font-size: 1.5rem;
  font-variant-numeric: tabular-nums;
  margin-left: 0.4rem;
}

/* La franja de atajos, como la barra de estado de un ERP de escritorio. Un
   atajo que nadie ve no existe; el experto la mira una vez y no la vuelve
   a necesitar. */
.franja-atajos {
  margin: 0.2rem 0 0;
  font-size: 0.8rem;
  color: var(--tenue);
}
kbd {
  display: inline-block;
  padding: 0.05rem 0.3rem;
  border: 1px solid var(--borde);
  border-bottom-width: 2px;
  border-radius: 3px;
  background: var(--papel);
  font-family: "Consolas", ui-monospace, monospace;
  font-size: 0.85em;
}

/* El aviso de "linea borrada, Ctrl+Z para recuperarla". Reemplaza al
   dialogo de confirmacion: el dialogo interrumpe SIEMPRE y el que teclea
   rapido aprende a descartarlo sin leer, con lo cual deja de prevenir
   nada. Este solo cuesta cuando de verdad hubo un error.

   Fijo abajo y no empujando el contenido: un aviso que mueve el layout
   mientras se teclea es peor que no avisar. */
.franja-aviso {
  position: fixed;
  left: 1.2rem;
  bottom: 1rem;
  z-index: 20;
  margin: 0;
  padding: 0.5rem 0.9rem;
  border-radius: 3px;
  background: var(--tinta);
  color: var(--papel);
  font-size: 0.9rem;
}

/* Para lectores de pantalla y nada mas: cuantos resultados hay. */
.solo-lectores {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

/* La planilla de la quincena tiene veinte columnas porque el jefe pidio
   ver de un vistazo todo lo que va a pagar, en el orden de su Excel. Con
   diecisiete filas no cabe en una pantalla, y quien scrollea la pagina
   entera pierde de vista el encabezado. Por eso la barra es de la tabla y
   no del documento. */
.tabla-ancha { overflow-x: auto; }
.tabla-ancha table { min-width: 100%; width: max-content; }
.tabla-ancha th, .tabla-ancha td { white-space: nowrap; }

/* ------------------------------------------------------------------
   El cuadro de «lo que se le cobra a cada quien», en cajones

   Abner, 15-08-2026: «es muy molesto tener que ir uno por uno». Con once
   personas y veinte renglones el cuadro medía varias pantallas, y decidir
   lo del ultimo era bajar hasta el fondo -- justo lo que este cuadro
   existe para evitar.

   `<details>` es del navegador: sin JavaScript, y lo de adentro se manda
   igual con el cajon cerrado, asi que el boton de guardar sigue siendo
   uno solo. Al imprimir se abren todos por la regla de `imprimir.css`.
   ------------------------------------------------------------------ */
.grupo-persona {
  border: 1px solid var(--borde);
  border-radius: 4px;
  margin-bottom: 0.4rem;
  background: var(--papel);
}
.grupo-persona > summary {
  cursor: pointer;
  padding: 0.5rem 0.7rem;
  display: flex;
  align-items: baseline;
  gap: 0.7rem;
  flex-wrap: wrap;
}
.grupo-persona > summary:hover { background: var(--fondo); }
.grupo-persona[open] > summary { border-bottom: 1px solid var(--borde); }
.grupo-quien { font-weight: 600; }
/* La plata a la derecha: es lo que se compara de un cajon a otro.

   Desde el 16-08-2026 son TRES numeros y no uno o dos: deuda, planilla y
   pospuesto, siempre los tres aunque valgan cero, porque lo que hay que
   ver de un vistazo es que planilla + pospuesto = deuda.

   `white-space: nowrap` se fue del contenedor y bajo a cada par
   rotulo-numero: con tres pares y un nombre largo, un nowrap sobre todo
   el bloque empujaba el renglon hasta sacar la barra horizontal de la
   pagina. Ahora el que no cabe se pasa abajo entero -- lo que nunca se
   parte es «planilla 12.00», que cortado a la mitad no se entiende.
   `text-align: right` es para cuando se pasan: quedan alineados contra el
   borde derecho, en columna, y se siguen leyendo como un cuadrito. */
.grupo-plata {
  margin-left: auto;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 0 0.5rem;
  text-align: right;
}
.grupo-plata > * { white-space: nowrap; }
.grupo-persona > table { margin: 0; }

/* Las tres decisiones en una linea. Antes iban apiladas con el rotulo
   entero y la celda medía seis renglones de alto. El rotulo largo vive
   ahora en la leyenda de arriba, dicho UNA vez, y en el `title`. */
.decisiones { display: flex; flex-wrap: wrap; gap: 0.15rem 0.8rem; }
.decisiones label { white-space: nowrap; font-size: 0.9rem; }
.leyenda-decisiones { margin-top: -0.3rem; }

/* La marca corta que reemplazo a las frases repetidas. Se ve que esta,
   se lee de un vistazo cual, y el porque esta en el `title`. */
.marca {
  font-size: 0.8rem;
  color: var(--tenue);
  border-bottom: 1px dotted var(--tenue);
  cursor: help;
  white-space: nowrap;
}
a.marca { color: var(--acento); border-bottom-color: var(--acento); }

/* Las cajas de la planilla, angostas.

   Abner, 15-08-2026: «hacer las cajas de texto mas pequeñas para que no se
   tenga que hacer scroll para la derecha para ver toda la planilla». Son
   veinte columnas y la mitad son casillas; con el ancho por defecto la
   tabla no cabia y habia que arrastrarla para ver «Se le entrega», que es
   la columna que se va a mirar.

   4.5rem alcanza para «1000.00», que es el numero mas largo que se teclea
   ahi. Las que no llevan decimales caben en menos todavia. */
.tabla-ancha input[inputmode="decimal"] {
  width: 4.5rem;
  text-align: right;
  padding: 0.25rem 0.3rem;
}
.tabla-ancha th, .tabla-ancha td { padding: 0.3rem 0.35rem; }
/* El «+ extra» del viatico dice mas de lo que mide: se deja mas angosto
   porque casi siempre va vacio, y su rotulo vive en el `placeholder`. */
.tabla-ancha input[placeholder="+ extra"] { width: 3.8rem; }

/* EL RANGO DE FECHAS: el cuadro que dice que periodo se esta mirando.

   Cerrado ocupa un renglon y se lee «15/08/2026»; abierto baja un panel
   con las dos fechas y los atajos. Es un `<details>` y no un menu de
   JavaScript a proposito -ver el comentario de `templates/_rango.html`-,
   asi que todo esto es aspecto: si el CSS no cargara, el control seguiria
   abriendo y filtrando igual. */
.rango { position: relative; display: inline-block; }

.rango > summary {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  padding: 0.35rem 0.7rem;
  border: 1px solid var(--borde);
  border-radius: 3px;
  background: var(--papel);
  cursor: pointer;
  list-style: none;          /* saca el triangulito del navegador... */
  user-select: none;
}
.rango > summary::-webkit-details-marker { display: none; }
.rango > summary::after {    /* ...y pone el caret a la derecha, como en SIGA */
  content: "\25BE";
  color: var(--tenue);
  margin-left: auto;
}
.rango > summary:hover { border-color: var(--acento); }
.rango[open] > summary { border-color: var(--acento); }

.rango-fechas { font-variant-numeric: tabular-nums; }

/* El panel flota: si empujara el contenido, abrir el control movaria la
   tabla entera hacia abajo y se perderia el renglon que se estaba
   mirando. */
.rango-caja {
  position: absolute;
  z-index: 20;
  top: calc(100% + 0.25rem);
  left: 0;
  min-width: 15rem;
  padding: 0.7rem;
  border: 1px solid var(--borde);
  border-radius: 3px;
  background: var(--papel);
  box-shadow: 0 2px 8px var(--sombra);
}
.rango-caja label { display: block; margin-bottom: 0.5rem; }
.rango-caja input[type="date"] { width: 100%; }

.rango-atajos {
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem;
  margin: 0.6rem 0;
  padding-top: 0.6rem;
  border-top: 1px solid var(--borde);
}
.rango-atajos .boton { padding: 0.2rem 0.5rem; }

/* La rejilla de comparacion del cuadrito del jefe (21-08-2026).
   🔑 La columna de Celvin es LO QUE YA ESTA y la de al lado es lo que el
   jefe va a teclear: iban tan pegadas que se leian como un solo numero,
   asi que llevan separacion de verdad y una linea que las divide.

   Las fichas son las que ya define el bloque de arriba: `--borde` para la
   linea, `--alerta` / `--alerta-piso` para la fila que no coincide -es el
   mismo rojo que ya significa «esto no cuadra» en el resto del sistema- y
   `--acento` / `--acento-piso` para el total que manda. Ningun hex suelto
   (GUIA-INTERFAZ §4). */
.comparacion { width: 100%; border-collapse: collapse; }
.comparacion .col-celvin {
  padding-right: 20px;
  border-right: 1px solid var(--borde);
}
.comparacion td, .comparacion th { padding: 0.35rem 0; }
.comparacion td:not(.col-celvin) + td { padding-left: 16px; }
/* Va sobre el `td` y no sobre el `tr`: el `tbody tr:hover > td` de la tabla
   base pinta la celda y le taparia el fondo a la fila que no coincide. */
.comparacion tr.desigual > td { background: var(--alerta-piso); }
.comparacion tr.desigual > td:first-child {
  box-shadow: inset 3px 0 0 var(--alerta);
}
.comparacion .dif { font-variant-numeric: tabular-nums; }
.comparacion input.piezas { width: 100%; text-align: right; }
.comparacion .suma { color: var(--tenue); }

/* El total que teclea el jefe: es el que manda, y se ve. */
.comparacion input.total-jefe {
  width: 100%;
  text-align: right;
  font-weight: 600;
  font-family: "IBM Plex Mono", "Consolas", monospace;
  font-variant-numeric: tabular-nums;
  border: 1.5px solid var(--acento);
  background: var(--acento-piso);
}
.nota-manda {
  margin: 0.5rem 0 0;
  padding: 0.5rem 0.7rem;
  border-left: 3px solid var(--acento);
  background: var(--realce);
  font-size: 0.85rem;
}
.monedas-caja {
  margin-top: 0.9rem;
  padding: 0.75rem;
  background: var(--realce);
  border-radius: 8px;
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  align-items: center;
}
.monedas-caja label { font-weight: 600; }
.monedas-caja input {
  margin-left: auto;
  max-width: 9rem;
  text-align: right;
  font-family: "IBM Plex Mono", "Consolas", monospace;
  font-variant-numeric: tabular-nums;
}

/* 🔑 A 390 px la columna de Celvin NO se esconde: es justo la que se vino
   a ver. Se achica la separacion, no la informacion. */
@media (max-width: 480px) {
  .comparacion .col-celvin { padding-right: 12px; }
  .comparacion td:not(.col-celvin) + td { padding-left: 10px; }
  .monedas-caja input { margin-left: 0; max-width: none; flex: 1; }
}


/* ═══ La ventanita de salir sin guardar (22-08-2026) ═══════════════════
   «Que sea una ventana chiquita en medio de la pantalla, que no este
   molesta pero que cumpla su proposito» (Abner). Maqueta aprobada:
   https://claude.ai/code/artifact/8e3a2b68-77ea-45d3-bbf1-84b083200f28 */
.velo {
    position: fixed; inset: 0; z-index: 60;
    background: var(--velo);
    display: grid; place-items: center; padding: 1rem;
}
.velo[hidden] { display: none; }

.aviso-guardar {
    width: 100%; max-width: 23rem;
    background: var(--papel); color: var(--tinta);
    border: 1px solid var(--borde); border-radius: 0.7rem;
    box-shadow: 0 18px 44px var(--sombra);
    padding: 1.15rem 1.15rem 1rem;
    animation: aviso-entra 0.16s ease-out;
}
@keyframes aviso-entra { from { opacity: 0; transform: translateY(0.4rem); } }
@media (prefers-reduced-motion: reduce) { .aviso-guardar { animation: none; } }

.aviso-guardar h3 { margin: 0 0 0.35rem; font-size: 1.02rem; }
.aviso-guardar p { margin: 0; color: var(--tinta-2); font-size: 0.9rem; }

/* Dice CUANTO se lleva contado: un aviso que solo dice «hay cambios sin
   guardar» obliga a acordarse de que se estaba haciendo. */
.aviso-cuanto {
    margin-top: 0.7rem; padding: 0.5rem 0.7rem;
    background: var(--realce); border-radius: 0.4rem;
    display: flex; justify-content: space-between;
    align-items: baseline; gap: 0.8rem;
    font-size: 0.85rem;
}
.aviso-cuanto strong { font-size: 1rem; }

.aviso-acciones { display: flex; gap: 0.5rem; margin-top: 1rem; }
.aviso-acciones .boton { flex: 1; }

/* La que descarta va SOLA, abajo y con su linea: una accion destructiva
   no comparte fila con una normal (Abner, 11-08-2026). */
.aviso-guardar .descartar {
    display: block; width: 100%; margin-top: 0.75rem;
    padding: 0.7rem 0 0; border: 0; border-top: 1px solid var(--borde);
    background: none; color: var(--alerta);
    font: inherit; font-size: 0.85rem; cursor: pointer; text-align: center;
}
.aviso-guardar .descartar:hover { text-decoration: underline; }

/* ── Escoger la paleta, en «Mi cuenta» ─────────────────────────────────
   Ni un color a mano: cada `.muestra` lleva `data-paleta` encima y se
   pinta con sus PROPIAS fichas. Corregir un color en los bloques de
   arriba corrige tambien lo que se ve al escoger. */
.paletas {
  display: grid;
  gap: 0.6rem;
  grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
  margin-bottom: 1rem;
}

.paleta {
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-areas:
    "radio muestra"
    "radio nombre"
    "radio desc";
  align-items: center;
  column-gap: 0.55rem;
  background: var(--papel);
  border: 1px solid var(--borde);
  border-radius: 8px;
  padding: 0.6rem;
  cursor: pointer;
}

.paleta input { grid-area: radio; margin: 0; }
.paleta .muestra { grid-area: muestra; margin-bottom: 0.4rem; }
.paleta-nombre { grid-area: nombre; font-weight: 600; }
.paleta-desc {
  grid-area: desc;
  color: var(--tenue);
  font-size: 0.82rem;
  line-height: 1.35;
}

/* `:has` para que la tarjeta entera se marque cuando su radio esta
   elegido, sin una linea de JavaScript. Donde no haya `:has` la pantalla
   igual funciona: se pierde el marco, no la eleccion -el radio se sigue
   viendo marcado-. */
.paleta:has(input:checked) {
  border-color: var(--acento);
  box-shadow: 0 0 0 2px var(--acento);
}
.paleta:has(input:focus-visible) { outline: 2px solid var(--acento); }

.muestra {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  height: 2.4rem;
  border: 1px solid var(--borde);
  border-radius: 5px;
  overflow: hidden;
}
.muestra > span { display: block; }
.muestra .m-fondo  { background: var(--fondo); }
.muestra .m-papel  { background: var(--papel); }
.muestra .m-acento { background: var(--acento); }
.muestra .m-exito  { background: var(--exito); }
.muestra .m-tinta  { background: var(--tinta); }

/* La de «seguir a Windows» se parte en dos: clara de un lado y oscura del
   otro. Ensena que no es una paleta, sino las dos segun la hora. */
.muestra-sistema { grid-template-columns: repeat(2, 1fr); }
.muestra-sistema .mitad { background: var(--fondo); }

@media (max-width: 30rem) {
  .paletas { grid-template-columns: 1fr; }
}

/* ══════════════════════════════════════════════════════════════════════
   EL CALENDARIO DEL PERIODO (23-08-2026)

   Abner: «si yo selecciono el dia de hoy, que las dos fechas se pongan en
   el dia de hoy. En el caso de que yo quiera coger un rango especifico,
   con un clic se marca, y yo pueda seleccionar otra fecha y se marque el
   rango que yo escogi, y le pueda dar Aplicar».

   🔑 TODO ESTO ES ASPECTO. La rejilla la dibuja `static/js/calendario.js`,
   y lo unico que ese archivo escribe son los dos `<input type="date">` que
   ya estaban. Si el CSS no cargara -o el JS no corriera- el control
   seguiria abriendo y filtrando: es la misma garantia que tenia `.rango`.
   ══════════════════════════════════════════════════════════════════════ */

/* El panel del rango es angosto porque solo tenia dos campos. Con el
   calendario adentro necesita el ancho de siete columnas, y las dos partes
   -calendario y campos- van una al lado de la otra en PC. */
/* 🔑 `width: max-content` es lo que hace que sea un CUADRO. El panel es
   `position: absolute` dentro de un `.rango` angosto, y sin esto el ancho
   se calcula «encogiendo hasta caber» en ese padre: el calendario y los
   campos no cabian lado a lado, se envolvian, y el panel salia como una
   columna larga que bajaba -«muy alargada», Abner 24-08-2026-.

   El `max-width` es el freno para el telefono: sin el, `max-content` se
   sale de la pantalla. */
.rango-con-calendario .rango-caja {
  width: max-content;
  max-width: min(90vw, 32rem);
  display: grid;
  grid-template-columns: auto minmax(9rem, auto);
  gap: 0.5rem 1rem;
  align-items: start;
}
.rango-con-calendario .rango-campos {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}
.rango-con-calendario .rango-campos label { display: block; margin: 0; }
.rango-con-calendario .rango-campos input[type="date"] { width: 100%; }
/* «Aplicar» abajo de las dos fechas y pegado a ellas: es lo que se aprieta
   despues de escogerlas. */
.rango-con-calendario .rango-campos .boton { margin-top: auto; }

/* Los atajos cruzan las dos columnas, en un renglon. En la columna angosta
   ocupaban cuatro y eran la mitad de lo alto del panel. */
.rango-con-calendario .rango-atajos {
  grid-column: 1 / -1;
  margin: 0;
}

/* El rotulo del control. Dice QUE es el numero que sigue: sin el, el
   cuadro cerrado es una fecha suelta sin explicacion. */
.rango-rotulo {
  font-size: 0.72rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--tenue);
}

.calendario { width: 15rem; flex: 0 0 auto; }

.cal-cabeza {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.3rem;
  margin-bottom: 0.4rem;
}
.cal-mes { font-weight: 600; }

.cal-mover {
  width: 1.8rem;
  height: 1.8rem;
  padding: 0;
  line-height: 1;
  border: 1px solid var(--borde);
  border-radius: 3px;
  background: var(--piso);
  color: var(--tinta-2);
  cursor: pointer;
}
.cal-mover:hover { background: var(--realce); border-color: var(--acento); }

.cal-rejilla { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }

.cal-dow {
  font-size: 0.62rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--tenue);
  text-align: center;
  padding-bottom: 0.2rem;
}
.cal-hueco { display: block; }

.cal-dia {
  height: 2rem;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 3px;
  background: transparent;
  color: var(--tinta);
  font: inherit;
  font-variant-numeric: tabular-nums;
  cursor: pointer;
}
.cal-dia:hover { background: var(--realce); }

/* Los dos extremos van con el acento lleno y el medio con su piso: el
   rango se lee como un bloque y no como dos dias sueltos. */
.cal-dia[data-en-rango="si"] {
  background: var(--acento-piso);
  border-color: var(--sobre-acento-tenue);
}
.cal-dia[data-punta="si"] {
  background: var(--acento);
  border-color: var(--acento);
  color: var(--acento-tinta);
  font-weight: 600;
}

.cal-pie { margin: 0.4rem 0 0; font-size: 0.76rem; color: var(--tenue); }

/* ══════════════════════════════════════════════════════════════════════
   EL APARTADO DE FILTROS (23-08-2026)

   Abner, despues de ver la maqueta con pestanas: «esos yo los queria un
   filtro, no quiero que aparezcan como ventanas independientes, sino que
   un apartado que diga filtros donde yo pueda seleccionar, porque muy
   probablemente mas adelante agreguemos mas filtros».

   🔑 Por eso la rejilla es `auto-fit` y no columnas fijas: el filtro que
   se agregue manana cae solo en su lugar, sin tocar esta hoja. Y por eso
   el apartado es un `<details>` con `<select>` adentro -HTML puro-: el
   filtro funciona con el JavaScript apagado.
   ══════════════════════════════════════════════════════════════════════ */
.filtros-caja {
  display: block;
  margin: 0.6rem 0;
  border: 1px solid var(--borde);
  border-radius: 3px;
  background: var(--papel);
}

.filtros-caja > summary {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.5rem;
  padding: 0.4rem 0.7rem;
  cursor: pointer;
  list-style: none;
  user-select: none;
}
.filtros-caja > summary::-webkit-details-marker { display: none; }
.filtros-caja > summary::after {
  content: "\25BE";
  color: var(--tenue);
  margin-left: auto;
}
.filtros-caja > summary:hover { border-color: var(--acento); }

.filtros-rotulo {
  font-size: 0.72rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--tenue);
}

/* 🔑 LO QUE ESTA PUESTO SE VE CON EL APARTADO CERRADO. Un filtro que no se
   ve es un filtro que explica un listado vacio y que nadie encuentra: se
   busca el error en los datos y estaba en la pantalla. */
.filtros-puestos { display: flex; flex-wrap: wrap; gap: 0.3rem; }

.puesto {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  padding: 0.05rem 0.5rem;
  border: 1px solid var(--sobre-acento-tenue);
  border-radius: 999px;
  background: var(--acento-piso);
  color: var(--acento);
  font-size: 0.76rem;
  font-weight: 600;
  white-space: nowrap;
}
/* La cuenta viaja pegada al estado: es la informacion que daban las
   pestanas, y al volverse un desplegable no se podia perder. */
.puesto-cuenta { font-variant-numeric: tabular-nums; font-weight: 400; }

.filtros-cuerpo {
  padding: 0.7rem;
  border-top: 1px solid var(--borde);
}

.filtros-rejilla {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
  gap: 0.5rem 0.7rem;
  align-items: end;
}
.filtros-rejilla label { display: flex; flex-direction: column; gap: 0.15rem; }
/* El ancho es cosa de la hoja de estilo: un `size=` en el input fija un
   ancho INTRINSECO que `max-width: 100%` no doma, y eso ya empujo la
   pagina entera de lado en el telefono -y se llevo la barra de arriba-. */
.filtros-rejilla select,
.filtros-rejilla input { width: 100%; min-width: 0; }

.filtros-pie {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  align-items: center;
  margin-top: 0.7rem;
  padding-top: 0.6rem;
  border-top: 1px solid var(--borde);
}

/* En telefono el calendario ocupa el ancho y los dias crecen: 44 px es el
   objetivo tactil, y un dia de 32 px se le pega al de al lado. */
@media (max-width: 30rem) {
  /* En el telefono el panel deja de flotar y deja de ser cuadro: no hay
     ancho para dos columnas, y forzarlas dejaria los dias de 20 px. */
  .rango-con-calendario .rango-caja {
    position: static;
    box-shadow: none;
    width: auto;
    max-width: none;
    grid-template-columns: 1fr;
  }
  .calendario { width: 100%; }
  /* 44 px es el objetivo tactil: un dia de 26 px se le pega al de al lado. */
  .cal-dia { height: 2.75rem; }
}

/* ══════════════════════════════════════════════════════════════════════
   EL AVISO DEL CAMBIO DE DIA (24-08-2026)

   Abner: «una alerta en la esquina superior derecha que te diga para
   cambiar de fecha, y que solo aparezca cuando ya suenen las 12 del
   siguiente dia. De esa forma no obligas a hacerlo: simplemente que la
   persona actualice».

   🔑 AVISA, NO ECHA A NADIE. Por eso es un ENLACE en la barra y no una
   ventanita que tape la pantalla: se puede seguir trabajando y arreglarlo
   cuando convenga.

   Lleva el signo Y la fecha vieja, no solo el signo: un icono suelto
   obliga a adivinar que pasa. Y va en ambar -el color de «revisar»- y no
   en rojo: no esta roto nada, cambio el dia.
   ══════════════════════════════════════════════════════════════════════ */
.aviso-fecha {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  margin-left: auto;
  padding: 0.15rem 0.6rem;
  border: 1px solid var(--aviso);
  border-radius: 999px;
  background: var(--aviso-piso);
  color: var(--aviso);
  font-size: 0.8rem;
  font-weight: 600;
  text-decoration: none;
  white-space: nowrap;
}
.aviso-fecha:hover { filter: brightness(1.06); text-decoration: none; }
.aviso-fecha:focus-visible { outline: 2px solid var(--aviso); outline-offset: 2px; }

/* El signo va en un circulo lleno: es lo que se ve de reojo desde el otro
   lado del escritorio, que es como se va a notar a las 8 de la manana. */
.aviso-fecha-signo {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.05rem;
  height: 1.05rem;
  border-radius: 50%;
  background: var(--aviso);
  color: var(--papel);
  font-size: 0.72rem;
  line-height: 1;
}

/* Cuando el aviso esta, la cuenta pierde su `margin-left: auto` -si no,
   los dos empujarian y quedaria un hueco en medio-. */
.aviso-fecha + .quien { margin-left: 0.6rem; }

/* En el telefono la barra ya va justa: se queda el signo y la fecha se va.
   El `title` sigue contandolo entero, y el texto para lectores tambien. */
@media (max-width: 30rem) {
  .aviso-fecha-texto { display: none; }
  .aviso-fecha { padding: 0.15rem 0.3rem; }
}

/* ═══════════════════════════════════════════════════════════════════════
   ESCOGER DE UNA LISTA LARGA (`js/escoger.js`, 25-08-2026).

   El reemplazo del <datalist>, que el navegador no deja agrandar ni pintar
   y que casa solo desde el principio del nombre. Lemuel: "tecleé 'tienda
   any' y hasta que no puse el nombre completo no apareció".

   ⚠️ El panel va `fixed` y NO `absolute`: el buscador de producto vive
   dentro de `.tabla-ancha`, que lleva `overflow-x: auto`, y esa caja
   recorta a un hijo absoluto a media fila. Donde se coloca lo decide el
   script midiendo -- ver el comentario largo en `escoger.js`.
   ═══════════════════════════════════════════════════════════════════════ */
[data-escoger] { position: relative; }

.escoger-resultados {
  position: fixed;
  z-index: 60;
  left: 0;
  top: 0;
  display: none;
  overflow-y: auto;
  padding: 0.25rem;
  background: var(--papel);
  border: 1px solid var(--borde);
  border-radius: 8px;
  box-shadow: 0 10px 26px var(--sombra-desliz);
}

/* Lo que decide QUE SE VE va con su propia regla y despues de la de
   arriba: con la misma especificidad manda el orden. */
.escogiendo .escoger-resultados { display: block; }

.escoger-resultados ul { margin: 0; padding: 0; }

.escoger-resultados li {
  list-style: none;
  display: grid;
  grid-template-columns: 6rem 1fr auto;
  gap: 0.6rem;
  align-items: baseline;
  padding: 0.45rem 0.5rem;
  border-radius: 6px;
  cursor: pointer;
  /* 44 px de objetivo tactil: en el telefono esto se toca con el dedo. */
  min-height: 2.75rem;
}

.escoger-resultados li:hover,
.escoger-resultados li.marcado { background: var(--acento-piso); }

.escoger-codigo {
  font-family: "IBM Plex Mono", Consolas, monospace;
  font-size: 0.8rem;
  color: var(--acento);
}

.escoger-nombre { color: var(--tinta); }

/* Lo que casó, marcado. Ficha propia y no `mark` del navegador, que sale
   amarillo chillon y con la paleta oscura queda ilegible. */
.escoger-nombre mark {
  background: var(--sobre-acento-tenue);
  color: var(--tinta);
  border-radius: 3px;
  padding: 0 1px;
}

.escoger-apunte {
  font-size: 0.75rem;
  color: var(--tenue);
  white-space: nowrap;
}

.escoger-cuenta {
  margin: 0;
  padding: 0.35rem 0.5rem 0.2rem;
  font-family: "Archivo", "Segoe UI", system-ui, sans-serif;
  font-size: 0.7rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--tenue);
}

.escoger-vacio {
  display: block;
  padding: 0.7rem 0.5rem;
  color: var(--tenue);
  cursor: default;
}

.escoger-vacio:hover { background: transparent; }

/* En el telefono no cabe la columna del apunte al lado: baja debajo del
   nombre. Va al FINAL, que es donde van las reglas que deciden que se ve
   (GUIA-INTERFAZ §4 y §7). */
@media (max-width: 30rem) {
  .escoger-resultados li { grid-template-columns: 5rem 1fr; }
  .escoger-apunte { grid-column: 2; }
}

/* ═══════════════════════════════════════════════════════════════════════
   LO QUE SOLO SE VE EN PC. Va AL FINAL de la hoja, y no es cosmetico:
   con la misma especificidad manda el ORDEN, y una media query no suma
   especificidad. Puesta antes, cualquier `display` declarado despues le
   gana y la columna sigue saliendo en el telefono. Ya paso dos veces en
   Ordenes (GUIA-INTERFAZ §4 y §7).

   La columna «Inventario» de pasar a venta es el primer uso: en el
   telefono esta pantalla se CONSULTA, y pasar a venta es cosa de
   computadora.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width: 30rem) {
  .solo-pc { display: none; }
}

/* El resumen de «Ingresar pedido»: lineas, unidades y total. Va DEBAJO del
   contenido y no en un carril al lado, donde le quitaria ancho a lo que hay
   que leer (GUIA-INTERFAZ §3). */
.resumen-pedido {
  display: flex;
  gap: 1.4rem;
  flex-wrap: wrap;
  margin-top: 0.9rem;
  padding-top: 0.8rem;
  border-top: 1px solid var(--borde);
}

.resumen-pedido > div { display: flex; flex-direction: column; }

.resumen-pedido span {
  font-family: "Archivo", "Segoe UI", system-ui, sans-serif;
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--tenue);
}

.resumen-pedido b {
  font-family: "IBM Plex Mono", Consolas, monospace;
  font-size: 1.05rem;
  font-variant-numeric: tabular-nums;
}

/* Fondo tintado SOLO en la columna del total: con todo resaltado no se
   distingue nada. */
.resumen-pedido .fuerte b { color: var(--acento); }

/* ═══════════════════════════════════════════════════════════════════════
   LOS ENLACES. Se descubrio mirando las pantallas el 25-08-2026: no habia
   NINGUNA regla base para `a`, asi que todo enlace suelto -el cliente de
   la lista de Pedidos, el "‹ volver", "Ver la venta"- salia con el AZUL
   DEL NAVEGADOR. Con la paleta clara pasa por normal; con la oscura queda
   azul marino sobre fondo casi negro y no se lee.

   Nadie lo habia visto porque las paletas arrancan en "Seguir a Windows"
   y hay que escogerlas para verlas. Es exactamente el defecto que
   GUIA-INTERFAZ §5 dice que solo se agarra mirando.

   Va aca abajo y no arriba: cualquier regla mas especifica -el menu, las
   pestanas, la tabla densa- sigue mandando sobre esta.
   ═══════════════════════════════════════════════════════════════════════ */
a { color: var(--acento); }

/* `visited` con el MISMO color: distinguir lo visitado tiene sentido en la
   web, no en un sistema donde se entra al mismo ticket veinte veces al
   dia. Sin esto el navegador lo pinta morado y no es el morado nuestro. */
a:visited { color: var(--acento); }

a:hover { text-decoration: underline; }

/* Que se vea DONDE esta el foco: quien teclea rapido se mueve con Tab. */
a:focus-visible {
  outline: 2px solid var(--acento);
  outline-offset: 2px;
  border-radius: 3px;
}

/* El campo del cliente en «Ingresar pedido» y el buscador de producto de
   su tabla: el que se teclea tiene que ocupar lo que hay. */
.tabla-ancha input[name="producto"] { width: 100%; min-width: 14rem; }

/* ======================================================================
   EL REPORTE DEL DÍA — rediseño del 27-08-2026 (maqueta aprobada por Abner)
   ======================================================================

   ⚠️ **Nada se corre en horizontal.** Es la regla que salió de acá:

       «No me gusta que sea un desplegable de derecha a izquierda, es muy
       molesto. Quiero que busquen una manera que quepa todo sin ningún
       desplegable. Y te permito es de arriba para abajo.» (Abner)

   La primera maqueta ponía «Por ruta» como una tabla de 15 columnas. La
   que se aprobó hace de cada ruta un bloque de tres columnas cortas que
   en pantalla angosta **se apilan solas**, y los siete conceptos que
   restan son siete renglones y no siete columnas.

   No hay `overflow-x` en ninguna regla de acá, y no lo puede haber. */

.reporte .recorta { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.reporte .marca-dif { font-weight: 600; }

.pastilla {
  display: inline-block; font-size: .68rem; letter-spacing: .07em;
  text-transform: uppercase; padding: .12rem .5rem; border-radius: 99px;
  white-space: nowrap; font-weight: 600;
}
.p-ok     { background: var(--exito-piso);  color: var(--exito); }
.p-falta  { background: var(--alerta-piso); color: var(--alerta); }
.p-avisa  { background: var(--aviso-piso);  color: var(--aviso); }
.p-neutro { background: var(--realce);      color: var(--tinta-2); }

/* --- De un vistazo: cinco números por ruta ---------------------------
   En pantalla angosta se esconde UNA sola columna, la menos urgente. Es
   lo único que se pierde al haber matado la tabla ancha. */
.vistazo td:first-child, .vistazo th:first-child { width: 26%; }
.vistazo tfoot td, .vistazo tfoot th {
  border-top: 2px solid var(--borde); border-bottom: 0;
  background: var(--piso); font-weight: 600;
}
.vistazo .quien { color: var(--tenue); font-size: .82rem; }

/* --- El bloque de una ruta ------------------------------------------ */
.ruta-bloque {
  border: 1px solid var(--borde); border-radius: .55rem;
  margin-bottom: .75rem; overflow: hidden;
}
.ruta-bloque.es-el-total { border-color: var(--acento); border-width: 2px; }
.ruta-bloque > header {
  background: var(--acento-piso); padding: .55rem .8rem;
  display: flex; justify-content: space-between; align-items: baseline;
  gap: .6rem; flex-wrap: wrap;
}
.ruta-bloque > header b { font-size: 1rem; }
.ruta-bloque > header .quien { color: var(--tenue); font-size: .84rem; font-weight: 400; }

.tres { display: grid; gap: 0; grid-template-columns: repeat(3, 1fr); }
.tres > div { padding: .6rem .8rem; border-left: 1px solid var(--borde-2); }
.tres > div:first-child { border-left: 0; }
.tres h4 {
  font-size: .65rem; letter-spacing: .13em; text-transform: uppercase;
  color: var(--acento); margin: 0 0 .35rem;
}
.tres table { font-size: .87rem; width: 100%; }
.tres td { padding: .18rem 0; border-bottom: 0; }
.tres td.num { width: 38%; }
.tres tr.suma td {
  border-top: 1px solid var(--borde); padding-top: .3rem; font-weight: 600;
}
.tres tr.grande td { font-size: .97rem; }
.col-caja { background: var(--piso); }

/* --- El desplegable: sólo hacia abajo -------------------------------- */
details.detalle { border-top: 1px solid var(--borde-2); }
details.detalle > summary {
  cursor: pointer; list-style: none; font-size: .84rem; color: var(--acento);
  padding: .42rem .8rem; display: flex; gap: .45rem; align-items: center;
}
details.detalle > summary::-webkit-details-marker { display: none; }
details.detalle > summary::before { content: "▸"; font-size: .7rem; }
details.detalle[open] > summary::before { content: "▾"; }
details.detalle > summary:hover { background: var(--acento-piso); }
details.detalle > summary:focus-visible { outline: 2px solid var(--acento); outline-offset: -2px; }
.cuenta { color: var(--tenue); font-size: .78rem; }

.cajones, .rejilla {
  display: grid; gap: .7rem;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
}
.cajones { padding: .25rem .8rem .8rem; }
.cajon {
  background: var(--piso); border: 1px solid var(--borde-2);
  border-radius: .5rem; padding: .55rem .7rem;
}
.cajon h4 {
  font-size: .7rem; letter-spacing: .09em; text-transform: uppercase;
  color: var(--tinta-2); margin: 0 0 .35rem;
  display: flex; justify-content: space-between; gap: .5rem; align-items: baseline;
}
.cajon h4 .num { font-size: .82rem; color: var(--tinta); }
.cajon table { font-size: .82rem; width: 100%; }
.cajon td { padding: .18rem .25rem; border-bottom: 1px solid var(--borde-2); }
.cajon td.num { width: 30%; }
.cajon td.cuenta { width: 34%; text-align: right; }
.cajon tr:last-child td { border-bottom: 0; }

/* --- El cierre ------------------------------------------------------- */
.cierre { background: var(--acento-piso); border-color: var(--sobre-acento-tenue); }
.cierre td, .cierre th { border-bottom-color: var(--sobre-acento-tenue); }
.cierre tfoot td, .cierre tfoot th {
  border-top: 2px solid var(--acento); border-bottom: 0;
  font-size: 1.02rem; padding-top: .55rem; font-weight: 600;
}

.nota-reporte {
  font-size: .84rem; color: var(--tinta-2); background: var(--piso);
  border-left: 3px solid var(--borde); padding: .55rem .75rem;
  border-radius: 0 .45rem .45rem 0; margin-top: .75rem;
}

.firma { display: flex; gap: 2.2rem; margin-top: 1.6rem; flex-wrap: wrap; }
.firma div {
  flex: 1; min-width: 10.5rem; border-top: 1px solid var(--tinta-2);
  padding-top: .35rem; font-size: .78rem; color: var(--tenue);
}

/* --- Angosto: TODO en una sola columna, nunca de lado ---------------- */
@media (max-width: 40rem) {
  .tres { grid-template-columns: 1fr; }
  .tres > div { border-left: 0; border-top: 1px solid var(--borde-2); }
  .tres > div:first-child { border-top: 0; }
  .cajones, .rejilla { grid-template-columns: 1fr; }
  .vistazo .col-opcional { display: none; }
}

/* ═══════════════════════════════════════════════════════════════════════
   La casilla «¿me mostró el comprobante?» de la pestaña Banco (28-08-2026).

   Va AL FINAL de la hoja por lo mismo que `.solo-pc`: con la misma
   especificidad manda el ORDEN, y una media query no suma especificidad.
   Esa trampa ya mordió tres veces.

   Sin `accent-color` acá: el color con que se marcan los casilleros ya
   está resuelto en el bloque de fichas de arriba, y un color literal
   fuera de ese bloque es justo lo que vigila `test_estilos`.
   ═══════════════════════════════════════════════════════════════════════ */
.casilla-comprobante {
  display: flex; align-items: center; gap: 0.4rem; cursor: pointer;
}
.casilla-comprobante input[type="checkbox"] {
  width: 1.1rem; height: 1.1rem; margin: 0;
}

@media (max-width: 30rem) {
  /* 44 px de alto para todo lo que se toca en el teléfono. */
  .casilla-comprobante { min-height: 44px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   LA LISTA APILADA DEL TELEFONO. Va AL FINAL, igual que `.solo-pc`: lo
   que decide QUE SE VE manda por orden, no por especificidad, y una media
   query no suma especificidad. Puesta antes, la lista del telefono sale
   tambien en la pantalla grande. Ya paso dos veces (GUIA-INTERFAZ §4 y §7).

   `.solo-tel` nace ESCONDIDA: en PC manda la tabla.
   ═══════════════════════════════════════════════════════════════════════ */
.solo-tel { display: none; }

.pagos-tel { gap: 0.7rem; }
.pago-tel {
  border: 1px solid var(--borde);
  border-radius: 9px;
  padding: 0.75rem 0.85rem;
  background: var(--papel);
}
.pago-tel-cabeza {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 0.6rem; margin-bottom: 0.5rem;
}
.pago-tel-cabeza .quien { font-weight: 600; font-size: 1.02rem; }
.pago-tel-cabeza .num {
  font-family: "IBM Plex Mono", "Consolas", monospace;
  font-variant-numeric: tabular-nums; font-weight: 600; font-size: 1.05rem;
  white-space: nowrap;
}
.pago-tel dl {
  display: grid; grid-template-columns: auto 1fr;
  gap: 0.2rem 0.8rem; margin: 0 0 0.6rem; font-size: 0.9rem;
}
.pago-tel dt { color: var(--tenue); }
.pago-tel dd { margin: 0; text-align: right; }
/* La destructiva va sola, abajo y con su linea: no comparte fila con una
   normal (Abner, 11-08-2026). */
.pago-tel-pie {
  margin: 0.7rem 0 0; padding-top: 0.7rem;
  border-top: 1px solid var(--borde);
}

@media (max-width: 30rem) {
  /* 🔑 El `display` de las listas apiladas vive SOLO aca. Declarado en la
     regla base queda ANTES de otras reglas de una clase y les gana por
     orden -- o al reves, se lo comen a `.solo-tel { display: none }` -- y
     la lista del telefono aparece tambien en PC. Paso el 28-08-2026,
     tercera vez que esta trampa muerde en este proyecto. */
  .solo-tel { display: block; }
  .pagos-tel, .papeles-tel { display: grid; }
}

/* ═══════════════════════════════════════════════════════════════════════
   CONFIRMAR LAS TRANSFERENCIAS (28-08-2026)

   El panel «Además del efectivo, esta ruta trajo» del cuadre de la ruta,
   el buzon `Cuadre > Transferencias` y la ventanita que comparten.

   Ni un color a mano: todo sale de las fichas de arriba, que es la regla
   que se paga con la paleta oscura y ya publicada (GUIA-INTERFAZ §4).
   ═══════════════════════════════════════════════════════════════════════ */

/* --- La cuenta pegada al rotulo de la pestana ----------------------- */
/* Sin el numero, una transferencia colgada de hace dos semanas no se ve
   desde ninguna parte: hay que entrar a la pestana para enterarse. Va
   PEGADA al rotulo y no en otra fila, que es como se pidio. */
.pestanas .cuenta {
  margin-left: 0.35rem;
  padding: 0.05rem 0.4rem;
  border-radius: 99px;
  background: var(--aviso-piso);
  color: var(--aviso);
  font-size: 0.72rem;
  font-weight: 700;
}

/* --- Lo que Celvin afirma haber visto -------------------------------- */
/* Es su palabra, no la captura: por eso se lee, y no es un enlace. */
.visto { color: var(--exito); font-size: 0.82rem; font-weight: 600; }

/* --- El unico boton de la fila --------------------------------------- */
/* Uno solo. Los dos que deciden viven en la ventanita: la que le nace una
   deuda a un vendedor no va suelta dentro de una lista (Abner, 11-08). */
.boton-fila { padding: 0.3rem 0.6rem; font-size: 0.82rem; white-space: nowrap; }

/* --- Los papeles de la ruta ------------------------------------------ */
.papeles-ruta td, .papeles-ruta th { vertical-align: middle; }
.papeles-ruta .pastilla + a { margin-left: 0.35rem; font-size: 0.78rem; }

/* --- Los datos dentro de la ventanita -------------------------------- */
/* Rotulo y dato en dos columnas: es lo que el jefe compara contra su
   estado de cuenta antes de decir que si. */
.datos-pago {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.2rem 0.8rem;
  margin: 0.8rem 0 0;
  padding: 0.55rem 0.7rem;
  background: var(--realce);
  border-radius: 0.4rem;
  font-size: 0.85rem;
}
.datos-pago dt { color: var(--tinta-2); }
.datos-pago dd { margin: 0; font-weight: 600; }

/* El «Si, ya cayo» es un POST y va en su propio formulario; sin esto el
   formulario no estira y el boton queda a la mitad del ancho del otro. */
.aviso-acciones form { flex: 1; display: flex; margin: 0; }
.aviso-acciones form .boton { flex: 1; }
.aviso-guardar form { margin: 0; }

/* Todo boton necesita su regla `:disabled`: uno apagado que se ve igual
   que el que sirve se toca y no pasa nada, sin ninguna explicacion. */
.aviso-guardar .descartar:disabled {
  color: var(--tenue); cursor: not-allowed; text-decoration: none;
}
.aviso-guardar .descartar:disabled:hover { text-decoration: none; }

/* --- El buzon --------------------------------------------------------- */
.pie-cajon { margin: 0.5rem 0 0; }
.cajon .pie-cajon .boton { width: 100%; text-align: center; }
.cajon p { margin: 0.15rem 0; font-size: 0.84rem; }

/* --- En el telefono ---------------------------------------------------
   Nada se corre en horizontal. La tabla de los papeles aprieta la celda
   -antes que esconder una columna, GUIA-INTERFAZ §3- y lo que se toca
   llega a 44 px. Va AL FINAL de la hoja, como todo lo que decide como se
   ve: con la misma especificidad manda el orden. */
@media (max-width: 30rem) {
  .papeles-ruta { font-size: 0.82rem; }
  .papeles-ruta td, .papeles-ruta th { padding-left: 4px; padding-right: 4px; }
  .boton-fila, .cajon .pie-cajon .boton, .aviso-acciones .boton {
    min-height: 44px; display: inline-flex; align-items: center;
    justify-content: center;
  }
  .aviso-guardar .descartar { min-height: 44px; }
}

/* --- Los papeles de la ruta, partidos para el telefono --------------- */
/* Mismo criterio y misma forma que `.pago-tel` de la pestana Banco: una
   tarjeta por papel, con TODOS los datos. Medido a 390 px, la tabla
   mandaba la pantalla a 476 px. */
.papeles-tel { gap: 0.6rem; }
.papel-tel {
  border: 1px solid var(--borde); border-radius: 9px;
  padding: 0.7rem 0.8rem; background: var(--papel);
}
.papel-tel-cabeza {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 0.6rem; margin-bottom: 0.4rem;
}
.papel-tel-cabeza .quien { font-weight: 600; font-size: 1rem; }
.papel-tel-cabeza .num {
  font-family: "IBM Plex Mono", "Consolas", monospace;
  font-variant-numeric: tabular-nums; font-weight: 600; white-space: nowrap;
}
.papel-tel dl {
  display: grid; grid-template-columns: auto 1fr;
  gap: 0.2rem 0.8rem; margin: 0; font-size: 0.88rem;
}
.papel-tel dt { color: var(--tenue); }
.papel-tel dd { margin: 0; text-align: right; }
.papel-tel-pie { margin: 0.7rem 0 0; }
.papel-tel-pie .boton { width: 100%; min-height: 44px; }

/* Las dos maneras de mandar el DTE, en la pantalla del Emisor. La casilla
   se ve —no se esconde tras la bolita dibujada— porque es lo que el
   lector de pantalla y el alto contraste saben leer. */
.maneras {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  margin-bottom: 0.6rem;
  max-width: 34rem;
}
.manera {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  padding: 0.6rem 0.7rem;
  border: 1px solid var(--borde);
  border-radius: 9px;
  background: var(--papel);
  cursor: pointer;
}
.manera:hover { background: var(--piso); }
.manera.elegida { border-color: var(--acento); background: var(--acento-piso); }
.manera input { margin-top: 0.25rem; }
.manera .texto { display: flex; flex-direction: column; }

/* --- El documento de la venta: los cuatro estados --------------------
   Va AL FINAL de la hoja por lo mismo que `.solo-pc`: con la misma
   especificidad manda el orden.

   🔑 CADA ESTADO LLEVA SU FORMA, no solo su color. Circulo el sellado,
   triangulo el que no cayo, rombo el rechazado, punto gris el que
   espera. Impreso o en alto contraste el color no llega, y estos cuatro
   estados hay que poder distinguirlos en los dos casos.

   Ni un hex suelto: todo sale de las fichas de la paleta, o al cambiar
   de paleta esto se queda igual y se ve mal justo en la oscura. */
.pastilla.sellado    { background: var(--exito-piso);  color: var(--exito); }
.pastilla.no_cayo    { background: var(--aviso-piso);  color: var(--aviso); }
.pastilla.rechazado  { background: var(--alerta-piso); color: var(--alerta); }
.pastilla.espera,
.pastilla.invalidado { background: var(--realce);      color: var(--tinta-2); }

.pastilla.sellado::before,
.pastilla.no_cayo::before,
.pastilla.rechazado::before,
.pastilla.espera::before,
.pastilla.invalidado::before {
  content: ""; display: inline-block; width: .45rem; height: .45rem;
  margin-right: .35rem; vertical-align: baseline;
}
.pastilla.sellado::before { background: var(--exito); border-radius: 99px; }
.pastilla.no_cayo::before {
  background: var(--aviso);
  clip-path: polygon(50% 0, 100% 100%, 0 100%);
}
.pastilla.rechazado::before {
  background: var(--alerta); transform: rotate(45deg);
}
.pastilla.espera::before,
.pastilla.invalidado::before { background: var(--tenue); border-radius: 99px; }

.doc {
  border: 1px solid var(--borde); border-radius: .55rem;
  padding: .7rem .8rem; display: flex; flex-direction: column; gap: .5rem;
  /* Acotado a proposito. En un panel de 1300 px el motivo -una frase
     corta- quedaba estirado de lado a lado y se leia peor. «El problema
     casi nunca es que sobre espacio: es que el contenido se estira»
     (GUIA-INTERFAZ). */
  max-width: 52rem;
}
.doc.sellado   { background: var(--exito-piso); }
.doc.no_cayo   { background: var(--aviso-piso); }
.doc.rechazado { background: var(--alerta-piso); }
.doc .titulo {
  margin: 0; display: flex; align-items: center; gap: .5rem;
  flex-wrap: wrap; font-weight: 600;
}
.doc .frase { margin: 0; }
/* El motivo va sobre papel y no sobre el tinte: es lo que hay que LEER, y
   el texto que hay que leer no se pone encima de un fondo de color. */
.doc .motivo {
  margin: 0; background: var(--papel); border: 1px solid var(--borde);
  border-radius: .45rem; padding: .45rem .6rem;
}
.doc dl {
  margin: 0; display: grid; grid-template-columns: auto 1fr; gap: .1rem .8rem;
  font-size: .88rem;
}
.doc dt { color: var(--tinta-2); font-weight: 600; }
/* El sello y el codigo de generacion son largos y no llevan espacios: sin
   esto se salen del marco y empujan la pagina de lado en el telefono. */
.doc dd { margin: 0; font-variant-numeric: tabular-nums; word-break: break-all; }
.doc form { margin: 0; }

/* --- La lista de ventas en el telefono -------------------------------
   Siete columnas no caben en 390 px. Con barra de deslizar, a la segunda
   columna ya no se sabe de quien es la fila; asi que la tabla se parte en
   una tarjeta por venta. Nada se corre en horizontal.

   Va AL FINAL de la hoja, y `.tarjetas-venta` nace ESCONDIDA: en PC manda
   la tabla. Con la misma especificidad gana el orden, y una media query
   no suma especificidad. */
.tarjetas-venta { display: none; }

@media (max-width: 30rem) {
  .tarjetas-venta { display: flex; flex-direction: column; gap: .45rem; }
}

.tarjeta-venta {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: .15rem .6rem;
  padding: .6rem .7rem;
  border: 1px solid var(--borde); border-radius: .55rem;
  background: var(--papel); color: inherit; text-decoration: none;
  /* 44 px de objetivo tactil. Lo que se toca en un telefono tiene que
     poder tocarse con el pulgar. */
  min-height: 2.75rem;
}
.tarjeta-venta:hover { background: var(--piso); }
.tarjeta-venta .quien { font-weight: 600; }
.tarjeta-venta .cuanto {
  text-align: right; font-weight: 600; font-variant-numeric: tabular-nums;
}
.tarjeta-venta .cuando { color: var(--tenue); font-size: .85rem; }
.tarjeta-venta .doc-estado { grid-column: 1 / -1; margin-top: .2rem; }
.tarjeta-venta.anulada { opacity: .7; }

/* El aviso plegado de los documentos que hay que revisar. */
.aviso-documentos summary { cursor: pointer; }
.aviso-documentos ul { margin: .5rem 0 0; padding-left: 1.1rem; }
.aviso-documentos li { margin-bottom: .25rem; }


/* ═══════════════════════════════════════════════════════════════════════
   LAS LINEAS DE LA VENTA, APILADAS EN EL TELEFONO (02-09-2026)

   Ocho columnas no caben en 390 px. Medido: la tabla ocupaba 443 px
   dentro de una pantalla de 390, empujaba la pagina entera de lado -y con
   ella la barra de arriba- y la columna del IVA quedaba cortada sin
   ninguna senal de que estaba ahi. Nada se corre en horizontal: se parte.

   Va AL FINAL de la hoja, y `.lineas-tel` nace ESCONDIDA: en PC manda la
   tabla. Con la misma especificidad gana el orden, y una media query no
   suma especificidad. Lo vigila
   `test_las_listas_apiladas_no_declaran_display_fuera_de_su_media_query`.

   Quien la esconde es `.solo-tel`, que va en el mismo elemento: aca NO se
   declara `display` fuera de la media query, ni siquiera `none`. La regla
   base va antes que otras reglas de una clase y les gana por orden.
   ═══════════════════════════════════════════════════════════════════════ */
.linea-tel {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: .15rem .6rem;
  padding: .55rem .7rem;
  border: 1px solid var(--borde);
  border-radius: .55rem;
  background: var(--papel);
}
.linea-tel .que { font-weight: 600; }
/* El total, en la misma tipografia de numeros del resto del sistema: es
   lo que se compara de un vistazo bajando la lista. */
.linea-tel .cuanto {
  font-family: "IBM Plex Mono", "Consolas", monospace;
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  text-align: right;
  white-space: nowrap;
}
/* Lo que EXPLICA el total va debajo, cruzando las dos columnas y en un
   solo renglon corrido: son cinco datos cortos y en columna propia cada
   uno volveria a estrujar la tarjeta. */
.linea-tel .detalle {
  grid-column: 1 / -1;
  color: var(--tenue);
  font-size: .85rem;
}

@media (max-width: 30rem) {
  .lineas-tel { display: flex; flex-direction: column; gap: .45rem; }
}

/* El boton de entregarle el documento al cliente, con su explicacion al
   lado. En el telefono la explicacion cae DEBAJO: al lado quedaba en una
   columna de tres palabras. Va al final de la hoja por la regla de
   siempre. */
.entregar {
  display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
  margin-top: .6rem;
}
@media (max-width: 30rem) {
  .entregar { flex-direction: column; align-items: stretch; gap: .35rem; }
}
