* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: 'Inter', sans-serif;
    background: var(--color-fondo);
    color: var(--color-texto);
}

.container {
    width: min(1850px, calc(100% - 42px));
    margin: 26px auto;
}

.page-header {
    /* El fondo, el color y el espacio los pone public/css/ui/base.css, una
       sola vez para las 19 pantallas. Aqui vivia un degradado propio --uno
       distinto por modulo-- que no estaba en la guia visual. */
    color: var(--fia-blanco);
}

/* OPCION B (decision de Luis, 17-09-26): la franja del encabezado es negro
   grafito solido, no un degradado verde. El verde (#14532d -> #22c55e) no
   estaba en la guia visual y chocaba con los botones indigo que vivian
   encima: cuatro familias de color en una pantalla. Sobre el grafito, el
   naranja institucional contrasta mejor que sobre blanco -- que es la razon
   por la que se eligio B y no A. */
/* Titulo (izquierda) + efectivo en caja/folio/botones (derecha), todo en
   un solo renglon para no hacer el header mas alto de lo necesario
   (pedido Luis 26-08-26) -- envuelve en mas de un renglon si no cabe.
   Agrupados en un solo contenedor para ocultarse juntos al salir de la
   vista principal del POS (ver mostrarVistaVentas en ventas.js). */
.panel-header-ventas {
    gap: 12px 24px;
    width: 100%;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    justify-content: space-between;
}

/* display:flex de arriba gana sobre [hidden] del UA stylesheet (misma
   especificidad, la hoja de autor gana) -- hace falta forzarlo aqui para
   que mostrarVistaVentas() pueda ocultar el header al entrar a historial/detalle. */
.panel-header-ventas[hidden] {
    display: none;
}

.panel-titulo-izq {
    display: flex;
    align-items: center;
    gap: 6px;
}

.panel-header-der {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 14px;
}

.module-title {
    /* El tamano, el peso y el interletrado los pone public/css/ui/base.css
       para las 19 pantallas. Esta copia --1.875rem fijos-- le ganaba en el
       telefono, donde base lo baja a --texto-lg. */
}

.floating-actions {
    right: 18px;
    top: 88px;
    z-index: 1200;
    display: flex;
    flex-direction: column;
    gap: 12px;
    align-items: flex-end;
}

.renglon-input {
    width: stretch;
    border: 1px solid transparent;
    border-radius: var(--radio-control);
    background: transparent;
    font: inherit;
    color: inherit;
}

/* Los inputs numericos (cantidad, precio, importe, alto/ancho) necesitan un
   width explicito en % -- "stretch" de .renglon-input no tiene soporte
   parejo entre navegadores y, sin el, un <input type=number> cae a su ancho
   intrinseco (~170px), mucho mas ancho que la celda de la tabla (76-128px):
   eso es lo que se ve como texto/lineas encimadas o cortadas en la tabla de
   ventas. Restaurado tras una fusion que lo habia eliminado por accidente. */
.renglon-input-num {
    width: 100%;
    min-width: 0;
    text-align: right;
}

/* Precio unitario e importe son dinero -- llevan un "$" fijo al lado del
   input (el input en si es type=number, no puede traer el simbolo dentro
   del valor). */
.renglon-money {
    display: flex;
    align-items: center;
    gap: 2px;
    min-width: 0;
}

.renglon-money-sign {
    color: var(--color-texto-tenue);
    font-weight: 600;
    font-size: 0.85em;
    flex-shrink: 0;
}

td[style*="font-weight: 800"] .renglon-money-sign {
    color: inherit;
}

/* Excepcion: el par alto/ancho (unidades con dimensiones, ej. m2) va uno
   junto al otro dentro de un flex -- ahi width:100% haria que cada input
   quisiera todo el ancho para si solo; se reparten a la mitad en su lugar.
   Piezas + el resultado en m2 van en su propia fila debajo (peticion Luis
   26-08-26: antes los 3 campos competian por el mismo ancho en una sola
   fila y las flechitas nativas del <input type=number> se comian el
   espacio, dejando los numeros cortados/ilegibles). */
.renglon-dim-pair {
    display: flex;
    gap: 4px;
}

.renglon-dim-pair .renglon-input-num {
    flex: 1 1 0;
    width: auto;
    min-width: 0;
    text-align: center;
    border: 1px solid var(--color-linea);
    padding: 3px 4px;
}

.renglon-dim-piezas-row {
    display: flex;
    align-items: center;
    gap: 5px;
    margin-top: 3px;
}

.renglon-dim-piezas {
    flex: 0 0 auto;
    width: 34px !important;
    border: 1px solid var(--color-linea);
    padding: 3px 4px;
    text-align: center;
}

.renglon-dim-resultado {
    color: var(--color-texto-tenue);
    font-size: 0.72rem;
    white-space: nowrap;
}

/* El spinner nativo de <input type=number> es lo que truncaba los valores
   de alto/ancho/piezas en columnas angostas -- estos campos ya muestran su
   propio control (+/- no hace falta, se captura con teclado). */
#tabla-ventas-principal input[type="number"]::-webkit-inner-spin-button,
#tabla-ventas-principal input[type="number"]::-webkit-outer-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

#tabla-ventas-principal input[type="number"] {
    -moz-appearance: textfield;
}

.renglon-input:hover {
    border-color: var(--fia-borde-control);
}

.renglon-input:focus {
    outline: none;
    border-color: var(--color-accion);
    background: var(--color-superficie);
}

.btn-icon {
    background: var(--fia-peligro-tenue);
    /* --fia-peligro (#D92D20) sobre el fondo tenue da 4.44:1 y este glifo
       mide 9.6 px: le faltaba un pelo para el 4.5:1. El tono de texto da
       6.6:1. Medido en la pantalla real, no estimado. */
    color: var(--fia-peligro-texto);
    border: 1px solid var(--fia-peligro);
    padding: 0.5rem;
    border-radius: var(--radio-pildora);
    font-size: 0.6rem;
    font-weight: 800;
    cursor: pointer;
    box-shadow: 0 4px 10px -2px rgba(15, 23, 42, 0.08);
    transition: all 0.16s ease;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    line-height: 1;
}

.btn-icon:hover {
    background: var(--fia-peligro-tenue);
    color: var(--fia-peligro-texto);
    box-shadow: 0 8px 16px -4px rgba(15, 23, 42, 0.12);
}

.btn-history {
    background: var(--color-accion);
    color: var(--color-accion-texto);
    border: none;
    padding: 0.8rem 1.2rem;
    border-radius: var(--radio-control);
    font-weight: 700;
    cursor: pointer;
    box-shadow: var(--sombra-reposo);
    transition: transform 0.16s ease, box-shadow 0.16s ease, background 0.16s ease;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--esp-2);
}

/* Botones laterales flotantes para vistas de ventas */
.btn-history-floating {
    display: none;
    text-decoration: none;
}

.btn-history-floating.day-sales {
    background: var(--fia-grafito-medio);
    margin-bottom: var(--esp-4);
}

.btn-history-floating:hover {
    box-shadow: 0 18px 34px rgba(15, 23, 42, 0.28);
    filter: saturate(1.08);
}

.btn-history-floating:focus-visible {
    outline: 3px solid rgba(79, 70, 229, 0.24);
    outline-offset: 3px;
}

.btn-req-producto {
    padding: 0.42rem 0.9rem;
    border-radius: var(--radio-pildora);
    font-weight: 700;
    line-height: 1;
    border: 1px solid transparent;
    cursor: pointer;
    transition: all 0.16s ease;
    letter-spacing: -0.02em;
}

.btn-req-producto {
    background: var(--fia-aviso-texto);
    color: white;
    border-color: var(--fia-aviso);
    box-shadow: var(--sombra-reposo);
}

.btn-req-producto:hover {
    box-shadow: var(--sombra-reposo);
}

/* Mismo caso, relleno en vez de letra: era azul marino con borde lila. El
   blanco sobre grafito da 18.59:1 contra los 9.03 que daba el azul, y sobre
   todo deja de haber un cuarto color de marca en la pantalla de Ventas. */
.req-plus {
    background: var(--fia-grafito);
    color: var(--fia-sobre-oscuro);
    border-color: var(--fia-grafito);
}

/* Layout principal mobile-first (BRIEF P1 07-08-26 punto 3): grid-template-
   areas nombradas por seccion -- cliente arriba, productos al centro, total
   del dia como badge secundario en la esquina. Los breakpoints de tablet/
   desktop expanden el mismo grid a 2/3 columnas re-mapeando las areas, sin
   tocar el HTML (los IDs/estructura interna de cada seccion no cambian). */
.sales-layout {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.sales-main {
    display: flex;
    flex-direction: column;
    gap: var(--esp-2);
    min-width: 0;
}

.sales-sidebar {
    display: flex;
    flex-direction: column;
    gap: 12px;
    min-width: 0;
}

.top-sales {
    display: flex;
    flex-direction: column;
}

.card-top-sl {
    display: flex;
    flex-direction: row;
    gap: var(--esp-4);
}

.card-top-sl>div {
    flex: 1;
}

.card-top-sl>input {
    padding: 4px;
}

/* Barra de acciones: ahora vive dentro del header verde, junto al titulo
   en el mismo renglon (pedido Luis 26-08-26), no en su propia franja
   blanca ni en un segundo renglon debajo. Todos los botones sueltos y
   siempre visibles, sin un menu "Opciones" que los esconda. */
.sl-toolbar-header {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 10px;
}

.quick-folio {
    font-size: 0.75rem;
    color: rgba(255, 255, 255, 0.75);
}

.quick-folio strong {
    color: var(--fia-blanco);
}

.toolbar-actions {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
}

.toolbar-btn {
    /* 44 px: lo que apoya un dedo (~9 mm). Antes el alto lo decidia el
       padding mas el icono, que estaba en 1.8vh: entre 31.5 y 35.4 px
       segun el monitor. */
    min-height: var(--toque-min);
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: var(--color-accion);
    color: var(--color-accion-texto);
    border: none;
    padding: 8px 14px;
    border-radius: var(--radio-control);
    font-weight: 700;
    font-size: 0.8rem;
    cursor: pointer;
    box-shadow: var(--sombra-reposo);
    transition: transform 0.16s ease, box-shadow 0.16s ease, background 0.16s ease;
    white-space: nowrap;
    font-family: inherit;
}

.toolbar-btn:hover {
    background: var(--color-accion-hover);
}

/* Botones secundarios de la barra de acciones (Autorizaciones/Historial/
   Caja/Retiro): sueltos y siempre visibles, tambien en movil -- antes
   vivian plegados en un menu "⋮ Opciones". Estilo tipo "chip" translucido
   para leerse bien sobre el fondo verde del header (pedido Luis 26-08-26:
   la barra de acciones ahora vive dentro del header, no en su propia
   franja blanca). */
.toolbar-btn-sec {
    /* 44 px: lo que apoya un dedo (~9 mm). Antes el alto lo decidia el
       padding mas el icono, que estaba en 1.8vh: entre 31.5 y 35.4 px
       segun el monitor. */
    min-height: var(--toque-min);
    display: inline-flex;
    align-items: center;
    gap: 4px;
    background: rgba(255, 255, 255, 0.14);
    color: var(--fia-blanco);
    border: 1px solid rgba(255, 255, 255, 0.35);
    padding: 8px 12px;
    border-radius: var(--radio-control);
    font-weight: 800;
    font-size: 0.8rem;
    cursor: pointer;
    font-family: inherit;
    white-space: nowrap;
}

.toolbar-btn-sec:hover {
    background: rgba(255, 255, 255, 0.24);
}

.sl-cliente {
    /* sin grid-area propio: el orden en el DOM decide su lugar dentro de
       .sales-sidebar (mobile) o vía grid-area en el breakpoint de escritorio. */
}

.sl-productos {
    /* idem: posicionado por su contenedor (.sales-main), no por grid-area propio. */
}

.sl-totales,
.sl-pago {
    /* combinados en una sola tarjeta (total + botón cobrar), ver .sl-total-sticky. */
}

/* Total del dia (acumulado): baja prioridad visual respecto a la venta
   actual -- badge chico en la esquina, no la tarjeta protagonista. */
.sl-total-dia {
    grid-area: total-dia;
    justify-self: end;
    display: flex;
    align-items: baseline;
    gap: 6px;
    font-size: 0.75rem;
    font-weight: 700;
    text-transform: uppercase;
    padding: 0 4px;
}

.sl-total-dia strong {
    font-size: 1rem;
    font-weight: 800;
    text-transform: none;
}

.sl-card {
    width: 100%;
    background: white;
    border: 1px solid rgba(148, 163, 184, 0.18);
    border-radius: var(--radio-tarjeta);
    padding: 16px;
    box-shadow: var(--sombra-reposo);
}

/* ================================
CLIENTE (SIDEBAR) -- chip compacto + telefono/razon social + icono de
saldo a favor. Reemplaza al bloque "Registrar saldo a favor" de ancho
completo que vivia siempre visible debajo del chip.
================================ */
.sl-cliente-card {
    padding: 16px;
}

.quick-cliente-row {
    display: flex;
    align-items: stretch;
    gap: 8px;
}

.quick-cliente-row .quick-cliente-chip {
    margin-bottom: 0;
    flex: 1;
    min-width: 0;
}

.quick-cliente-chip-razon {
    display: block;
}

.btn-icon-saldo-favor {
    flex: 0 0 auto;
    width: 40px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--color-superficie-2);
    border: 1.5px solid var(--fia-borde-control);
    border-radius: var(--radio-control);
    font-size: 1.1rem;
    cursor: pointer;
    transition: border-color 0.16s ease, background 0.16s ease;
}

.btn-icon-saldo-favor:hover {
    background: var(--fia-aviso-tenue);
    border-color: var(--fia-aviso);
}

/* ================================
INFO DE CAJA (SIDEBAR) -- antes vivia dentro de la barra de acciones grande,
ahora es una tarjeta chica y propia en el sidebar.
================================ */
.sl-caja-info {
    display: flex;
    flex-direction: row;
    gap: 16px;
    padding: 14px 16px;
}

.sl-caja-info-item {
    display: flex;
    flex-direction: column;
    gap: 4px;
    flex: 1;
}

.sl-caja-info-label {
    font-size: 0.72rem;
    font-weight: 800;
    color: var(--color-texto-tenue);
}

.sl-caja-info-value {
    font-size: 0.95rem;
    font-weight: 800;
    color: var(--color-texto);
}

/* ================================
TOTAL + COBRAR -- siempre visible sin scrollear. Sidebar sticky en
escritorio, barra fija al fondo del viewport en movil (ver breakpoint
max-width:700px).
================================ */
.sl-total-sticky {
    padding: 16px;
}

.sl-total-sticky .quick-total {
    margin: 0 0 4px;
}

/* Tablet/escritorio angosto: sidebar aparte, ya con ancho fijo razonable. */
@media (min-width: 900px) {
    .sales-layout {
        display: grid;
        grid-template-columns: minmax(0, 1fr) 340px;
        align-items: start;
        gap: 16px;
    }

    /* El orden -1/1/2 de movil (cliente arriba) no aplica en escritorio --
       aqui vuelve al orden natural del grid de 2 columnas. */
    .sales-main {
        order: initial;
    }

    .sales-sidebar {
        position: sticky;
        top: 24px;
        order: initial;
    }
}

/* Widget "Ultimas ventas": reubicado dentro de la columna lateral, debajo
   de "Cobrar e imprimir" (pedido Luis 26-08-26) -- antes era una tercera
   columna de grid que solo aparecia en escritorio muy ancho (>=1200px);
   ahora vive siempre en el mismo flujo que el resto de la barra lateral
   (la separacion respecto a las demas tarjetas ya la da el gap de
   .sales-sidebar, sin necesidad de margin propio). */
.sl-ultimas-ventas-header {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin-bottom: 10px;
}

.sl-ultimas-ventas-header h3 {
    margin: 0;
    font-size: 0.9rem;
}

.sl-ultimas-ventas-acciones {
    display: flex;
    gap: 6px;
}

.sl-ultimas-ventas-acciones .btn-secondary {
    flex: 1;
    font-size: 0.72rem;
    padding: 6px 4px;
}

.uv-fila {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 4px;
    border-bottom: 1px solid var(--color-linea-suave);
    font-size: 0.78rem;
    cursor: pointer;
}

.uv-folio {
    font-weight: 700;
    flex: 0 0 auto;
}

.uv-cliente {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--color-texto-tenue);
}

.uv-total {
    font-weight: 700;
    flex: 0 0 auto;
}

/* Escritorio: la tabla de productos ocupa el espacio restante de la
   columna principal. */
@media (min-width: 1200px) {
    .sl-tabla-card {
        flex: 1;
    }

    .sales-main {
        min-height: 0;
    }
}

.tabs-header {
    display: flex;
    border-bottom: 1px solid var(--color-linea);
    background: var(--color-superficie-2);
}

.tab-btn {
    flex: 1;
    background: none;
    border: none;
    padding: 18px 10px;
    font-weight: 700;
    font-size: 0.9rem;
    cursor: pointer;
    color: var(--color-texto-tenue);
    transition: color 0.18s ease, background 0.18s ease;
}

.tab-btn.active {
    color: var(--color-accion-legible);
    border-bottom: 3px solid var(--color-accion);
    background: var(--color-superficie);
}

.tab-btn:hover {
    color: var(--fia-naranja-texto);
    background: var(--color-superficie-2);
}

.tab-content {
    display: none;
    padding: 24px 22px;
    max-height: calc(100vh - 120px);
    overflow-y: auto;
}

.tab-content.active {
    display: block;
}

/* Estilos para formularios (igual que antes) */
.step-section {
    background: var(--color-superficie);
    border-radius: var(--radio-tarjeta);
    padding: 1.1rem;
    margin-bottom: 1.5rem;
    border: 1px solid var(--color-linea);
    box-shadow: 0 10px 24px rgba(15, 23, 42, 0.04);
}

.step-title {
    font-weight: 800;
    font-size: 0.9rem;
    margin-bottom: 1rem;
    display: flex;
    align-items: center;
    gap: 8px;
    color: var(--color-texto);
}

.step-number {
    background: var(--fia-naranja-tenue);
    color: var(--color-texto);
    width: 26px;
    height: 26px;
    border-radius: var(--radio-pildora);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.75rem;
    font-weight: 900;
}

.form-group {
    margin-bottom: 1rem;
}

.form-group label {
    display: block;
    font-size: 0.7rem;
    font-weight: 800;
    text-transform: uppercase;
    color: var(--color-texto-suave);
    margin-bottom: 0.45rem;
    letter-spacing: 0.02em;
}

/* Notas + Requiere factura comparten renglon (pedido Luis 26-08-26: ahorrar
   una fila completa que antes usaba solo el checkbox). El checkbox se
   alinea con el input de notas, no con su label. */
.notas-factura-row {
    display: flex;
    align-items: flex-end;
    gap: 12px;
}

.filters-container {
    justify-content: space-between;
    align-items: center;
    display: flex;
    gap: 12px;
    flex: 1;
}

.form-group input,
.form-group select,
.form-group textarea,
.filters-bar input,
.filters-bar select,
.product-item input,
.quick-input {
    width: 100%;
    padding: 0.78rem 0.95rem;
    border: 1px solid var(--fia-borde-control);
    border-radius: var(--radio-control);
    background: var(--color-superficie);
    color: var(--color-texto);
    font-size: 0.9rem;
    font-family: inherit;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
    transition: border-color 0.16s ease, box-shadow 0.16s ease, background 0.16s ease;
}

.form-group input:hover,
.form-group select:hover,
.form-group textarea:hover,
.filters-bar input:hover,
.filters-bar select:hover,
.product-item input:hover,
/* Campo de solo lectura que SI muestra un dato (no es un campo vacio
   deshabilitado): el fondo inicial de una caja de acopio, que lo calcula el
   servidor desde el corte anterior y nadie teclea. Se ve distinto para que
   quede claro que no es editable, sin esconder el monto. */
.quick-input.input-bloqueado {
    background: var(--color-superficie-2);
    color: var(--color-texto-suave);
    font-weight: 700;
    cursor: default;
}

.quick-input:hover {
    border-color: var(--fia-borde-control);
}

.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus,
.filters-bar input:focus,
.filters-bar select:focus,
.product-item input:focus,
.quick-input:focus {
    outline: none;
    border-color: var(--color-accion);
    background: var(--color-superficie);
    box-shadow: 0 0 0 3px rgba(242, 106, 26, 0.22);
}

.form-group textarea {
    min-height: 120px;
    line-height: 1.45;
    resize: vertical;
}

.form-hint {
    margin-top: 0.45rem;
    color: var(--color-texto-tenue);
    font-size: 0.75rem;
    line-height: 1.35;
}

/* Decision resguardo/transferencia al cerrar caja (BRIEF_DIEGO_RESGUARDO_CORTES_20260818 §2) */
.caja-radio-group {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    margin-top: 0.4rem;
}

.caja-radio-opcion {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.85rem;
    color: var(--color-texto);
    cursor: pointer;
}

.caja-radio-opcion input[type="radio"] {
    width: auto;
    margin: 0;
}

.form-error {
    display: none;
    margin-top: 0.55rem;
    color: var(--fia-peligro-texto);
    font-size: 0.78rem;
    font-weight: 800;
}

/* Aviso dentro del modal (retiro de seguridad, egreso): sustituye a alert().
   Un alert bloqueado por el navegador dejaba los botones "muertos" sin
   explicacion; esto siempre se ve, junto al boton que se acaba de tocar. */
.aviso-inline {
    margin: 0.6rem 0 0.8rem;
    padding: 0.7rem 0.9rem;
    border-radius: var(--radio-control);
    font-size: 0.85rem;
    font-weight: 700;
    line-height: 1.35;
    border: 1px solid var(--fia-peligro);
    background: var(--fia-peligro-tenue);
    color: var(--fia-peligro-texto);
}
.aviso-inline.ok {
    border-color: var(--fia-exito);
    background: var(--fia-exito-tenue);
    color: var(--fia-exito-texto);
}
.aviso-inline.info {
    border-color: var(--color-linea);
    background: var(--color-superficie-2);
    color: var(--color-texto);
}

/* Botones para poner la foto del recibo (camara / archivo / quitar). */
.foto-acciones {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: 6px;
}
.foto-acciones .btn-secondary {
    padding: 0.55rem 0.9rem;
    font-size: 0.82rem;
}
.foto-hint {
    font-size: 0.78rem;
    color: var(--color-texto-tenue);
}
.foto-hint.lista {
    color: var(--fia-exito-texto);
    font-weight: 700;
}

.modal-footer {
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    gap: 10px;
    border-top: 1px solid var(--color-linea-suave);
}

.btn-secondary {
    min-height: var(--toque-min);
    background: var(--color-fondo);
    color: var(--color-texto-suave);
    border: 1px solid var(--fia-borde-control);
    padding: 0.8rem 1.2rem;
    border-radius: var(--radio-control);
    font-weight: 800;
    cursor: pointer;
    transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease;
}

.btn-secondary:hover {
    background: var(--color-linea);
    border-color: var(--fia-borde-control);
    color: var(--color-texto);
}

.form-group input:disabled,
.quick-input:disabled {
    background: var(--color-fondo);
    color: var(--color-texto-tenue);
    cursor: not-allowed;
}

/* Una casilla no es un campo de texto: no puede medir el 100%. La regla de
   arriba esta pensada para los campos, pero `.form-group input` tambien
   alcanza a las casillas, y la fila de notas es `form-group`. */
input[type="checkbox"],
input[type="radio"] {
    width: auto;
    flex: 0 0 auto;
}

input::placeholder {
    color: var(--color-texto-tenue);
}

.suggestions {
    position: absolute;
    background: white;
    border-radius: var(--radio-tarjeta);
    box-shadow: 0 10px 25px -5px rgba(15, 23, 42, 0.12);
    max-height: 210px;
    overflow-y: auto;
    z-index: 3000;
    width: calc(100% - 2px);
    border: 1px solid var(--color-linea-suave);
    left: 0;
    top: calc(100% + 4px);
}

.suggestion-item {
    padding: 0.7rem 1rem;
    cursor: pointer;
    border-bottom: 1px solid var(--color-linea-suave);
}

.suggestion-item:hover {
    background: var(--color-superficie-2);
}

.suggestion-empty {
    padding: 0.7rem 1rem;
    cursor: pointer;
    border-bottom: 1px solid var(--color-linea-suave);
    color: var(--color-texto-tenue);
    font-size: 0.75rem;
    font-weight: 800;
    text-transform: uppercase;
}

.btn-link {
    background: var(--fia-naranja-tenue);
    border: 1px solid var(--fia-naranja-borde);
    border-radius: var(--radio-pildora);
    color: var(--color-accion-legible);
    font-weight: 800;
    font-size: 0.75rem;
    cursor: pointer;
    margin-top: 0.5rem;
    padding: 0.55rem 0.85rem;
}

.product-item {
    display: flex;
    gap: 8px;
    margin-bottom: 1rem;
    flex-wrap: wrap;
}

.product-item input {
    flex: 1;
    min-width: 100px;
}

.product-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.8rem;
}

.product-table th,
.product-table td {
    padding: 0.6rem;
    text-align: left;
    border-bottom: 1px solid var(--color-linea-suave);
}

.total-row {
    text-align: right;
    font-weight: 800;
    font-size: 1.1rem;
    margin-top: 0.8rem;
}

.line-preview {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    margin: -4px 0 12px;
    color: var(--color-texto-suave);
    font-size: 0.78rem;
    font-weight: 800;
}

.line-preview strong {
    color: var(--color-texto);
}

.btn-primary {
    min-height: var(--toque-min);
    display: flex;
    justify-content: center;
    gap: var(--esp-2);
    align-items: center;
    background: var(--color-accion);
    color: var(--color-accion-texto);
    border: none;
    padding: 0.8rem 1.2rem;
    border-radius: var(--radio-control);
    font-weight: 700;
    cursor: pointer;
    box-shadow: var(--sombra-reposo);
    transition: transform 0.16s ease, box-shadow 0.16s ease, background 0.16s ease;
}

.btn-primary:hover {
    background: var(--color-accion-hover);
    box-shadow: var(--sombra-reposo);
}

.btn-primary.small {
    padding: 0.55rem 0.9rem;
    font-size: 0.7rem;
}

.sales-options {
    font-size: var(--texto-sm);
    display: flex;
    gap: var(--esp-2);
    flex-direction: row;
    flex-wrap: wrap;
}

/* LA TARJETA DE PRODUCTO, COMPACTA (Luis 17-09-26: "mucho espacio vacio").
   Medido antes: 298 px de alto, la tabla empezaba en y=453 y de seis
   renglones se veian cuatro. El aire estaba en los huecos, no en los campos:
   los campos se quedan como estan --se escribe en ellos-- y lo que se aprieta
   es lo que hay entre ellos. */
.sl-productos.sl-card {
    padding: var(--esp-3) var(--esp-4);
}

.sl-productos .quick-qty-price {
    gap: var(--esp-2) !important;
    margin-bottom: 0;
}

.sl-productos .notas-factura-row {
    margin-top: var(--esp-2);
    align-items: flex-end;
}

/* La etiqueta "NOTAS (OPCIONAL)" se va: el campo ya dice de que se trata en
   su propio texto de ejemplo, y el rotulo costaba un renglon entero. */
.sl-productos .notas-factura-row .quick-label {
    display: none;
}

/* NINGUN CAMPO NI BOTON DE 945 PX (defecto 4, 17-09-26).
   La tarjeta de producto ocupa todo el ancho disponible --hasta 1,850 px en
   el monitor del mostrador-- y sus campos crecian con ella: el buscador de
   producto medía 945 px y "Agregar" era una barra del mismo ancho. El ancho
   de la tarjeta se queda; lo que se topa es la medida de lectura de adentro. */
.sl-productos #quick-product-desc,
.sl-productos #quick-product-notas {
    max-width: 760px;
}

.sl-productos .quick-add-product {
    max-width: var(--medida-pareja);
    /* GRAFITO, NO NARANJA, y no es un detalle de gusto: el naranja es el
       color de "la accion que importa" y en esta pantalla esa es
       "Cobrar e imprimir". Agregar un renglon es un paso intermedio que se
       repite; si los dos son naranjas, el boton que cobra deja de destacar.
       En la comparacion que aprobo Luis, Agregar era un boton chico al final
       de una fila, no una barra: aqui se recupera esa jerarquia. */
    background: var(--fia-grafito);
    /* EL TEXTO, TAMBIEN. Sin esta linea el boton heredaba el color de texto
       de .btn-primary --que es --color-accion-texto, grafito, porque su fondo
       normal es naranja-- y quedaba grafito sobre grafito: invisible. No se
       vio en la captura porque Playwright dejaba el boton en :hover, con el
       fondo mas claro; lo encontro la sonda que lee el color calculado. */
    color: var(--fia-blanco);
    box-shadow: var(--sombra-reposo);
}

.sl-productos .quick-add-product:hover {
    background: var(--fia-grafito-medio);
}

/* Estilos venta rápida */
.quick-grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 76px 110px 104px;
    gap: 8px;
    margin-bottom: 12px;
}

.quick-add-product {
    justify-content: center;
    border-radius: var(--radio-control);
    padding: 0.78rem 0.9rem;
    white-space: nowrap;
}

.chip-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin: 12px 0;
}

.quick-chip {
    background: var(--color-superficie-2);
    border: 1px solid var(--fia-borde-control);
    padding: 8px 13px;
    border-radius: var(--radio-pildora);
    font-size: 0.7rem;
    font-weight: 800;
    color: var(--color-texto);
    cursor: pointer;
    transition: border-color 0.16s ease, background 0.16s ease, transform 0.16s ease;
}

.quick-chip:hover {
    background: var(--fia-naranja-tenue);
    border-color: var(--fia-naranja-borde);
}

.quick-products {
    max-height: 240px;
    overflow-y: auto;
    margin-bottom: 12px;
}

.quick-item {
    margin-top: var(--esp-2);
    background: var(--color-superficie);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-control);
    padding: 10px 12px;
    margin-bottom: 8px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.payment-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(72px, 1fr));
    gap: 8px;
    margin: 12px 0;
}

.pay-method {
    border: 1px solid var(--fia-borde-control);
    background: white;
    border-radius: var(--radio-control);
    padding: 11px;
    text-align: center;
    cursor: pointer;
    font-weight: 800;
    color: var(--color-texto);
    transition: border-color 0.16s ease, background 0.16s ease, color 0.16s ease, transform 0.16s ease;
}

.pay-method:hover {
    border-color: var(--fia-borde-control);
}

.pay-method.active {
    border-color: var(--color-accion);
    background: var(--fia-naranja-tenue);
    color: var(--color-accion-legible);
}

.btn-charge {
    min-height: var(--toque-min);
    width: 100%;
    background: var(--color-accion);
    color: var(--color-accion-texto);
    border: none;
    padding: 14px;
    border-radius: var(--radio-tarjeta);
    font-weight: 800;
    cursor: pointer;
    margin-top: 12px;
    box-shadow: var(--sombra-reposo);
    transition: transform 0.16s ease, box-shadow 0.16s ease, background 0.16s ease;
}

.btn-charge:hover {
    background: var(--color-accion-hover);
    box-shadow: var(--sombra-reposo);
}

.quick-total {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin: 12px 0;
}

.quick-total strong {
    font-size: 1.6rem;
}

.quick-change {
    min-width: 130px;
    background: var(--color-superficie-2);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-control);
    padding: 0.65rem 0.8rem;
    font-weight: 800;
    color: var(--color-texto);
}

.quick-change small {
    display: block;
    color: var(--color-texto-tenue);
    font-size: 0.65rem;
    text-transform: uppercase;
    margin-bottom: 2px;
}

.confirmation-mark {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 72px;
    min-height: 42px;
    margin-bottom: 20px;
    border-radius: var(--radio-pildora);
    background: var(--fia-naranja-tenue);
    color: var(--fia-exito-texto);
    font-weight: 900;
    font-size: 0.78rem;
    letter-spacing: 0.04em;
}

/* ================================
CHIP CLIENTE RÁPIDO
================================ */
.quick-cliente-chip {
    display: flex;
    align-items: center;
    gap: 10px;
    background: var(--color-superficie-2);
    border: 1.5px solid var(--fia-borde-control);
    border-radius: var(--radio-tarjeta);
    padding: 10px 14px;
    cursor: pointer;
    transition: border-color 0.16s ease, background 0.16s ease, box-shadow 0.16s ease;
    width: 100%;
    text-align: left;
    margin-bottom: 8px;
    font-family: inherit;
}

.quick-cliente-chip:hover {
    border-color: var(--color-accion);
    background: var(--fia-naranja-tenue);
    box-shadow: 0 0 0 3px rgba(242, 106, 26, 0.22);
}

.quick-cliente-chip.has-client {
    background: var(--fia-naranja-tenue);
    border-color: var(--color-accion);
}

.quick-cliente-chip-avatar {
    width: 34px;
    height: 34px;
    border-radius: var(--radio-pildora);
    background: var(--fia-grafito);
    color: var(--fia-blanco);
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 900;
    font-size: 0.8rem;
    flex-shrink: 0;
}

.quick-cliente-chip-avatar.general {
    background: var(--fia-gris-medio);
}

.quick-cliente-chip-info {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 1px;
}

.quick-cliente-chip-name {
    font-weight: 800;
    font-size: 0.82rem;
    color: var(--color-texto);
    white-space: normal;
    word-break: break-word;
    line-height: 1.25;
}

.quick-cliente-chip-sub {
    font-size: 0.68rem;
    color: var(--color-texto-tenue);
    font-weight: 600;
    margin-top: 1px;
}

.quick-cliente-chip-arrow {
    color: var(--color-texto-tenue);
    font-size: 0.9rem;
    flex-shrink: 0;
}

/* ================================
MODAL BUSCAR CLIENTE
================================ */
.modal-buscar-cliente .modal-card {
    max-width: 560px;
}

.cliente-search-wrap {
    display: flex;
    gap: 10px;
    margin-bottom: 14px;
}

.cliente-search-wrap input {
    flex: 1;
}

#modal-buscar-cliente-lista {
    max-height: 320px;
    overflow-y: auto;
}

.cliente-lista-item {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 12px;
    border-radius: var(--radio-control);
    cursor: pointer;
    transition: background 0.14s ease;
    border-bottom: 1px solid var(--color-linea-suave);
}

.cliente-lista-item:last-child {
    border-bottom: none;
}

.cliente-lista-item:hover {
    background: var(--color-fondo);
}

.cliente-lista-avatar {
    width: 36px;
    height: 36px;
    border-radius: var(--radio-pildora);
    background: var(--fia-grafito);
    color: var(--fia-blanco);
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 900;
    font-size: 0.78rem;
    flex-shrink: 0;
}

.cliente-lista-info strong {
    display: block;
    font-size: 0.85rem;
    color: var(--color-texto);
}

.cliente-lista-info small {
    color: var(--color-texto-tenue);
    font-size: 0.72rem;
}

.cliente-lista-empty {
    padding: 28px;
    text-align: center;
    color: var(--color-texto-tenue);
    font-size: 0.82rem;
}

/* Vistas de pantalla completa (historial de ventas / detalle de venta):
   secciones hermanas de .sales-layout dentro de .container, mismo patron
   que <section class="view-section"> en seguimiento.js -- swap con
   classList('active') en vez de un overlay con backdrop. */
.view-section {
    display: none;
    animation: fadeIn 0.4s ease;
}

.view-section.active {
    display: block;
}

@keyframes fadeIn {
    from {
        opacity: 0;
        transform: translateY(10px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.view-page-header {
    padding: 0 0 16px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
}

.view-page-actions {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}

.view-back-btn {
    border: 1px solid var(--fia-borde-control);
    background: var(--color-superficie);
    color: var(--color-texto);
    border-radius: var(--radio-control);
    padding: 10px 16px;
    font-family: inherit;
    font-weight: 800;
    font-size: 0.85rem;
    cursor: pointer;
}

.view-back-btn:hover {
    background: var(--color-superficie-2);
}

.view-card {
    background: var(--color-superficie);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-tarjeta);
    box-shadow: 0 10px 25px -5px rgba(15, 23, 42, 0.06);
    overflow: hidden;
}

.view-card-header {
    padding: 28px 32px;
    border-bottom: 1px solid var(--color-linea);
    display: flex;
    justify-content: space-between;
    gap: 20px;
    flex-wrap: wrap;
}

.view-card-left {
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.view-card-title {
    font-size: 1.7rem;
    font-weight: 900;
    color: var(--color-texto);
    margin: 0;
    line-height: 1;
}

.view-card-subtitle {
    color: var(--color-texto-tenue);
    font-size: 0.9rem;
}

.view-card-body {
    padding: 28px 32px;
    display: flex;
    flex-direction: column;
    gap: 16px;
}

@media (max-width: 720px) {

    .view-card-header,
    .view-card-body {
        padding: 20px 16px;
    }

    .view-card-title {
        font-size: 1.4rem;
    }
}

.modal {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, 0.6);
    backdrop-filter: blur(4px);
    justify-content: center;
    align-items: center;
    z-index: 2000;
}

.modal-card {
    background: white;
    border: 1px solid rgba(226, 232, 240, 0.9);
    border-radius: var(--radio-tarjeta);
    width: 90%;
    max-width: 1300px;
    max-height: 85vh;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    box-shadow: 0 28px 80px rgba(15, 23, 42, 0.28);
}

.modal-header {
    padding: 1.2rem 1.5rem;
    border-bottom: 1px solid var(--color-linea-suave);
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.modal-header h3 {
    font-weight: 800;
}

.close-modal {
    background: none;
    border: none;
    font-size: 1.8rem;
    cursor: pointer;
    color: var(--color-texto-tenue);
    line-height: 1;
    transition: color 0.16s ease, transform 0.16s ease;
}

.close-modal:hover {
    color: var(--color-texto);
    transform: scale(1.05);
}

.modal-body {
    padding: 1.2rem 1.5rem;
    overflow-y: auto;
    flex: 1;
}

.filters-bar {
    display: flex;
    gap: 12px;
    margin-bottom: 20px;
}

.filters-bar input {
    flex: 1 1 260px;
}

.filters-bar button {
    flex: 0 0 auto;
}

.table-wrapper {
    overflow-x: auto;
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-tarjeta);
}

table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.85rem;
}

th,
td {
    padding: 9px 12px;
    text-align: left;
    border-bottom: 1px solid var(--color-linea-suave);
}

/* EL DINERO SE LEE A LA DERECHA, CON CIFRAS TABULARES.
   `th, td { text-align: left }` regia para toda la tabla sin excepcion para
   los importes, y sin `tabular-nums`: en Inter el 1 es mas angosto que el 0,
   asi que los puntos decimales de una columna no se alinean y hay que LEER
   cada cifra en vez de verlas. Ya se usaba en siete modulos; faltaba justo en
   Ventas, que es donde se cobra.

   Se apunta por POSICION de columna porque los <td> los escribe ventas.js sin
   clase. Cada bloque dice cuales son sus columnas: si cambia el orden, hay
   que venir aqui. */

/* #tabla-ventas-principal: Producto | Cantidad | Unidad | Precio unit. | Importe | (quitar) */
#tabla-ventas-principal th:nth-child(2),
#tabla-ventas-principal td:nth-child(2),
#tabla-ventas-principal th:nth-child(4),
#tabla-ventas-principal td:nth-child(4),
#tabla-ventas-principal th:nth-child(5),
#tabla-ventas-principal td:nth-child(5) {
    text-align: right;
    font-variant-numeric: var(--cifras);
    white-space: nowrap;
}

/* EL ANCHO SOBRANTE SE LO LLEVA EL CLIENTE, NO LOS HUECOS (Luis 17-09-26:
   "hay espacios entre columnas").
   Una tabla de nueve columnas con contenido corto dentro de un contenedor de
   1,850 px reparte el sobrante entre TODAS las columnas, y lo que queda es
   aire entre dato y dato. Con `width: 99%` en una sola columna, esa se lleva
   todo lo que sobra y las demas se encogen a su contenido: los datos quedan
   juntos y legibles. Se elige Cliente porque es la que de verdad puede ser
   larga. */
#tabla-historial td,
#tabla-historial th {
    white-space: nowrap;
}

#tabla-historial td:nth-child(3),
#tabla-historial th:nth-child(3) {
    width: 99%;
    white-space: normal;
}

/* Y EL MENU "ACCIONES" DEJA DE BAJARSE A UN SEGUNDO RENGLON (Luis 17-09-26:
   "aca tambien un tercer boton se baja a otro renglon").
   Medido: los tres controles viven en un `.acciones-fila` con `flex-wrap:
   wrap` de 127 px de ancho, y entre los tres piden 330. El renglon entero
   medía 124 px de alto por eso. Se le quita el wrap y se le deja pedir su
   ancho: la columna del cliente, que arriba se lleva el sobrante, cede lo que
   haga falta. */
#tabla-historial td:last-child,
#tabla-historial th:last-child {
    width: 1%;
    white-space: nowrap;
}

/* #tabla-historial: Folio | Cliente | Razon social | Total | Anticipo | Saldo | Estado | ... */
#tabla-historial th:nth-child(4),
#tabla-historial td:nth-child(4),
#tabla-historial th:nth-child(5),
#tabla-historial td:nth-child(5),
#tabla-historial th:nth-child(6),
#tabla-historial td:nth-child(6) {
    text-align: right;
    font-variant-numeric: var(--cifras);
    white-space: nowrap;
}

/* Las cifras del panel tambien se comparan entre si. */
.quick-total strong,
#quick-breakdown span,
.sl-total-dia strong,
.sl-caja-info-value,
.caja-diferencia-row span {
    font-variant-numeric: var(--cifras);
}

th {
    padding-top: 6px;
    padding-bottom: 6px;
    background: var(--color-superficie-2);
    color: var(--color-texto-suave);
    font-size: 0.72rem;
    font-weight: 900;
    text-transform: uppercase;
}

tbody tr:hover {
    background: var(--color-superficie-2);
}

tbody tr:last-child td {
    border-bottom: none;
}

/* ================================
HISTORIAL DE VENTAS -- vista densa tipo hoja de calculo (mas ventas visibles
por pantalla, sin scroll excesivo). Escritorio: tabla compacta con zebra.
Movil: cada <tr> se convierte en una tarjeta-renglon de 2 lineas (nombre +
estado arriba, folio/fecha + restante + acciones abajo) en vez de una tabla
de 9 columnas imposible de leer sin scroll horizontal. Toda la fila sigue
siendo clickeable a detalle (ver listener en tabla-historial-body,
ventas.js) -- esto solo cambia como se ve, no el comportamiento. */
#tabla-historial {
    font-size: 0.78rem;
}

#tabla-historial th,
#tabla-historial td {
    padding: 0.5rem 0.65rem;
}

#tabla-historial tbody tr[data-venta-id],
#tabla-historial tbody tr[data-abono-venta-id] {
    cursor: pointer;
}

#tabla-historial tbody tr[data-venta-id]:nth-child(even),
#tabla-historial tbody tr[data-abono-venta-id]:nth-child(even) {
    background: var(--color-superficie-2);
}

#tabla-historial tbody tr[data-venta-id]:hover,
#tabla-historial tbody tr[data-abono-venta-id]:hover {
    background: var(--fia-naranja-tenue);
}

.historial-tipo {
    display: inline-block;
    margin-left: 4px;
    padding: 2px 5px;
    border-radius: var(--radio-pildora);
    font-size: 0.62rem;
    font-weight: 800;
    line-height: 1;
}

.historial-tipo.venta {
    background: var(--fia-naranja-tenue);
    color: var(--color-texto);
}

.historial-tipo.abono {
    background: var(--fia-exito-tenue);
    color: var(--fia-exito-texto);
}

@media (max-width: 700px) {

    /* La tabla completa se convierte en una lista de tarjetas: se pierde la
       semantica visual de tabla (thead oculto) pero cada <td> sigue siendo
       el mismo elemento, solo reposicionado por grid-area. */
    .historial-table-wrapper {
        border: none;
        overflow-x: visible;
    }

    #tabla-historial {
        font-size: 0.8rem;
    }

    #tabla-historial thead {
        display: none;
    }

    #tabla-historial,
    #tabla-historial tbody {
        display: block;
    }

    #tabla-historial tbody tr[data-venta-id],
    #tabla-historial tbody tr[data-abono-venta-id] {
        display: grid;
        grid-template-columns: 1fr auto;
        grid-template-areas:
            "cliente estado"
            "folio restante"
            "acciones acciones";
        row-gap: 3px;
        padding: 10px 12px;
        border-bottom: 1px solid var(--color-linea-suave);
        border-radius: var(--radio-control);
        margin-bottom: 6px;
        background: var(--color-superficie);
        border: 1px solid var(--color-linea);
    }

    /* Fila de VENTA: renglon propio para los tres montos (peticion Luis
       27-08-26). Antes solo cabia uno y se mostraba el saldo restante, asi
       que toda venta pagada aparecia como $0.00 -- sin el total, que es
       justo lo que permite reconocer la venta de un vistazo. La tarjeta
       tiene espacio de sobra, asi que ahora van los tres juntos y se leen
       como un mini estado de cuenta: cuanto fue, cuanto lleva pagado y
       cuanto debe. Las filas de abono conservan el grid de arriba: no
       tienen total ni saldo propios. */
    #tabla-historial tbody tr[data-venta-id] {
        grid-template-columns: 1fr 1fr 1fr;
        grid-template-areas:
            "cliente  cliente  estado"
            "folio    folio    folio"
            "total    abonado  restante"
            "acciones acciones acciones";
    }

    #tabla-historial tbody tr[data-venta-id]:nth-child(even),
    #tabla-historial tbody tr[data-abono-venta-id]:nth-child(even) {
        background: var(--color-superficie);
    }

    #tabla-historial td {
        padding: 0;
        border-bottom: none;
    }

    /* Columnas ocultas en movil (Total de venta, Abonado, Metodo): caben en
       el detalle de la venta, no hacen falta para ubicar/abonar rapido. */
    #tabla-historial td:nth-child(4),
    #tabla-historial td:nth-child(5),
    #tabla-historial td:nth-child(7) {
        display: none;
    }

    #tabla-historial td:nth-child(1) {
        grid-area: folio;
        color: var(--color-texto-tenue);
        font-size: 0.72rem;
        align-self: end;
    }

    /* La fecha se pega junto al folio en la misma celda visual mediante
       ::before, para no necesitar una tercera columna en el grid. */
    #tabla-historial td:nth-child(2) {
        display: none;
    }

    #tabla-historial td:nth-child(1)::after {
        content: attr(data-fecha-corta);
        color: var(--color-texto-tenue);
        margin-left: 6px;
    }

    #tabla-historial td:nth-child(3) {
        grid-area: cliente;
        font-weight: 800;
        color: var(--color-texto);
        font-size: 0.86rem;
        align-self: start;
    }

    #tabla-historial td:nth-child(6) {
        grid-area: restante;
        font-weight: 900;
        color: var(--color-texto);
        text-align: right;
        align-self: end;
    }

    #tabla-historial tr[data-abono-venta-id] td:nth-child(6)::before {
        content: attr(data-monto) " - ";
    }

    /* Los tres montos de una fila de VENTA (Total / Abonado / Resta). Cada
       uno lleva su etiqueta arriba via ::before, porque sin encabezado de
       tabla en movil tres cifras sueltas no se distinguirian entre si. */
    #tabla-historial tr[data-venta-id] td:nth-child(4),
    #tabla-historial tr[data-venta-id] td:nth-child(5),
    #tabla-historial tr[data-venta-id] td:nth-child(6) {
        display: block;
        margin-top: 4px;
        font-weight: 800;
        font-size: 0.82rem;
        color: var(--color-texto);
        align-self: end;
    }

    #tabla-historial tr[data-venta-id] td:nth-child(4)::before,
    #tabla-historial tr[data-venta-id] td:nth-child(5)::before,
    #tabla-historial tr[data-venta-id] td:nth-child(6)::before {
        display: block;
        font-size: 0.62rem;
        font-weight: 700;
        letter-spacing: 0.04em;
        text-transform: uppercase;
        color: var(--color-texto-tenue);
    }

    #tabla-historial tr[data-venta-id] td:nth-child(4) {
        grid-area: total;
    }

    #tabla-historial tr[data-venta-id] td:nth-child(4)::before {
        content: "Total";
    }

    #tabla-historial tr[data-venta-id] td:nth-child(5) {
        grid-area: abonado;
        text-align: center;
    }

    #tabla-historial tr[data-venta-id] td:nth-child(5)::before {
        content: "Abonado";
    }

    /* El saldo restante se resalta en rojo solo cuando de verdad queda algo
       por cobrar; la clase la pone renderFilaVentaHistorial() en ventas.js. */
    #tabla-historial tr[data-venta-id] td:nth-child(6) {
        grid-area: restante;
        text-align: right;
    }

    #tabla-historial tr[data-venta-id] td:nth-child(6)::before {
        content: "Resta";
    }

    #tabla-historial tr[data-venta-id] td.historial-resta-pendiente {
        color: var(--fia-peligro-texto);
    }

    #tabla-historial td:nth-child(8) {
        grid-area: estado;
        justify-self: end;
        align-self: start;
    }

    #tabla-historial td:nth-child(9) {
        grid-area: acciones;
        margin-top: 4px;
    }

    #tabla-historial td:nth-child(9) .acciones-fila {
        justify-content: flex-end;
    }

    /* Encabezado de grupo (corte de caja): ya no es una fila de tabla
       normal en movil, se convierte en una barra propia de ancho completo. */
    #tabla-historial tr.historial-grupo-header {
        display: block;
        background: var(--color-fondo);
        border-radius: var(--radio-control);
        margin-bottom: 6px;
        border: 1px solid var(--color-linea);
    }

    #tabla-historial tr.historial-grupo-header td {
        display: block;
        padding: 8px 12px;
    }

    .historial-grupo-header-row {
        flex-wrap: wrap;
    }

    .historial-grupo-label {
        font-size: 0.72rem;
    }
}

/* ================================
TABLA DE PRODUCTOS DE LA VENTA ACTUAL -- una sola linea por producto por
defecto (item 4 del mockup): la columna de nombre se lleva el espacio
disponible, las columnas numéricas solo el que necesitan. El detalle
(categoria/descuentos/notas) se pliega detrás del botón ▸ de cada renglón.
================================ */
#tabla-ventas-principal {
    table-layout: fixed;
}

#tabla-ventas-principal th:nth-child(1),
#tabla-ventas-principal td:nth-child(1) {
    width: auto;
}

#tabla-ventas-principal th:nth-child(2),
#tabla-ventas-principal td:nth-child(2) {
    /* Suficientemente ancha para el par Alto/Ancho (cm) cuando la unidad
       es m2 -- antes 78px hacia que esos 2 inputs quedaran ilegibles. */
    width: 128px;
}

#tabla-ventas-principal th:nth-child(3),
#tabla-ventas-principal td:nth-child(3) {
    width: 76px;
}

#tabla-ventas-principal th:nth-child(4),
#tabla-ventas-principal td:nth-child(4) {
    width: 100px;
}

#tabla-ventas-principal th:nth-child(5),
#tabla-ventas-principal td:nth-child(5) {
    width: 100px;
}

#tabla-ventas-principal th:nth-child(6),
#tabla-ventas-principal td:nth-child(6) {
    width: 64px;
}

/* Menos relleno por celda que el resto de las tablas (peticion Luis
   26-08-26): con el padding generico de 0.8rem apenas cabian 2 productos
   en pantalla; con este apretado caben comodamente 4+ junto con su nota. */
#tabla-ventas-principal th,
#tabla-ventas-principal td {
    padding: 0.3rem 0.6rem;
    vertical-align: top;
}

/* Interruptor unico arriba de la tabla para ver/ocultar la nota de TODOS
   los renglones a la vez (reemplaza la flechita que cada renglon tenia
   antes solo para su propia nota). */
/* EL RENGLON DE LA NOTA, APRETADO (Luis 17-09-26: "sin sacrificar la altura
   de los renglones de edicion, si hay mucho espacio vacio entre cada
   renglon"). Cada producto ocupaba 82 px: 43 el renglon donde se escribe
   --que NO se toca, ahi se teclea-- y 39 el de su nota, que se lee. Medido:
   el alto no lo pone el <td> de la fila sino su bloque de adentro. */
.renglon-notas-row>td {
    padding: 0 10px 3px !important;
}

.renglon-notas-block {
    padding: 2px 8px !important;
}

.tabla-ventas-toolbar {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    /* Se parte en dos renglones donde no quepa, en vez de apretar la
       etiqueta a dos lineas contra el interruptor. */
    flex-wrap: wrap;
    gap: var(--esp-2);
    padding: var(--esp-1) var(--esp-3);
    border-bottom: 1px solid var(--color-linea-suave);
}

.tabla-ventas-toolbar-label {
    font-size: 0.75rem;
    font-weight: 700;
    color: var(--color-texto-suave);
}

.toggle-switch {
    position: relative;
    width: 34px;
    height: 19px;
    flex: 0 0 auto;
    cursor: pointer;
}

.toggle-switch input {
    opacity: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    position: absolute;
    cursor: pointer;
}

.toggle-switch-track {
    position: absolute;
    inset: 0;
    background: var(--color-linea);
    border-radius: var(--radio-pildora);
    transition: background 0.15s ease;
}

.toggle-switch input:checked+.toggle-switch-track {
    background: var(--color-accion);
}

.toggle-switch-thumb {
    position: absolute;
    top: 2px;
    left: 2px;
    width: 15px;
    height: 15px;
    background: white;
    border-radius: 50%;
    transition: left 0.15s ease;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
    pointer-events: none;
}

.toggle-switch input:checked~.toggle-switch-thumb {
    left: 17px;
}

/* Fila de nota de un renglon: ya no es plegable individualmente, existe
   siempre (con o sin texto) y su visibilidad la decide el interruptor
   .tabla-ventas-toolbar de arriba, para todos los renglones a la vez. */
.renglon-notas-block {
    background: var(--color-superficie-2);
    border: 1px solid var(--color-linea);
    border-radius: 7px;
    padding: 5px 8px;
    display: flex;
    align-items: center;
    gap: 8px;
}

.renglon-notas-label {
    font-size: 0.72rem;
    font-weight: 700;
    color: var(--color-texto-tenue);
    flex: 0 0 auto;
    text-transform: uppercase;
}

.renglon-notas-texto {
    flex: 1 1 auto;
    min-width: 0;
    font: inherit;
    font-size: 0.78rem;
    color: var(--color-texto-suave);
    border: none;
    background: none;
    resize: none;
    height: 20px;
    overflow: hidden;
}

.renglon-notas-texto::placeholder {
    color: var(--color-texto-tenue);
}

.renglon-notas-texto:focus {
    outline: none;
    background: white;
    border-radius: var(--radio-control);
    height: auto;
    resize: vertical;
}

.renglon-notas-check {
    display: flex;
    align-items: center;
    gap: 5px;
    font-size: 0.72rem;
    color: var(--color-texto-tenue);
    flex: 0 0 auto;
    white-space: nowrap;
}

.renglon-acciones {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 4px;
}

.btn-expandir-renglon {
    position: relative;
    background: var(--color-fondo);
    border: 1px solid var(--color-linea);
    color: var(--color-texto-tenue);
    border-radius: var(--radio-pildora);
    min-width: 32px;
    min-height: 32px;
    font-size: 1.1rem;
    line-height: 1;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 4px;
    transition: transform 0.16s ease, background 0.16s ease, color 0.16s ease;
    flex: 0 0 auto;
}

@media (max-width: 700px) {
    .btn-expandir-renglon {
        min-width: 40px;
        min-height: 40px;
        font-size: 1.3rem;
    }
}

.btn-expandir-renglon:hover {
    background: var(--color-linea);
    color: var(--color-texto);
}

.btn-expandir-renglon.abierto {
    transform: rotate(90deg);
    background: var(--fia-naranja-tenue);
    color: var(--color-accion-legible);
    border-color: var(--fia-naranja-borde);
}

/* Indicador chico de "tiene descuento" cuando el renglón está colapsado,
   para no obligar a abrir cada fila para saber (la nota ya no se colapsa
   por renglón, así que este badge ya solo habla de descuentos). */
.renglon-extra-badge {
    position: absolute;
    top: -2px;
    right: -2px;
    width: 8px;
    height: 8px;
    border-radius: var(--radio-pildora);
    background: var(--fia-aviso);
    border: 1.5px solid #fff;
}

.history-actions {
    display: flex;
    flex-direction: row;
    gap: var(--esp-2);
}

.empty-state {
    padding: 2.5rem 1rem;
    text-align: center;
    color: var(--color-texto-tenue);
    font-size: 0.85rem;
    font-weight: 600;
}

.empty-icon {
    display: flex;
    justify-content: center;
    margin-bottom: 10px;
    color: var(--color-texto-tenue);
}

.btn-icon:focus-visible {
    outline: 2px solid var(--color-accion);
    outline-offset: 2px;
}

/* Modal detalle de venta */
.detalle-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
    gap: 12px 16px;
}

.detalle-item small {
    display: block;
    color: var(--color-texto-tenue);
    font-weight: 800;
    text-transform: uppercase;
    font-size: 0.65rem;
    margin-bottom: 3px;
}

.detalle-item strong {
    color: var(--color-texto);
    font-size: 0.85rem;
    word-break: break-word;
}

/* Un dato del detalle que hay que atender, no solo leer: hoy lo usa la
   mercancía de una sustitución que no pudo entrar a ningún almacén porque
   nadie ha marcado uno que no venda al público (12-09-26). Pintarlo igual
   que los demás sería esconderlo a la vista. */
.detalle-item strong.detalle-valor-aviso {
    color: var(--fia-aviso-texto);
}

.detalle-seccion {
    margin-top: 20px;
}

.detalle-seccion h4 {
    font-weight: 900;
    color: var(--color-texto);
    font-size: 0.75rem;
    text-transform: uppercase;
    margin-bottom: 10px;
}

.detalle-seccion p {
    color: var(--color-texto);
    font-size: 0.85rem;
    background: var(--color-superficie-2);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-control);
    padding: 10px 12px;
}

.vincular-requisicion-item {
    padding: 10px 14px;
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-control);
    margin-bottom: 8px;
    cursor: pointer;
}

.vincular-requisicion-item:hover {
    background: var(--color-superficie-2);
}

.vincular-requisicion-item.selected {
    border-color: var(--color-accion-hover);
    background: var(--fia-naranja-tenue);
}

.badge {
    padding: 0.2rem 0.7rem;
    border-radius: var(--radio-pildora);
    font-size: 0.7rem;
    font-weight: 800;
}

.badge.pendiente {
    background: var(--fia-aviso-tenue);
    color: var(--fia-aviso-texto);
}

.badge.pagado {
    background: var(--fia-exito-tenue);
    color: var(--fia-exito-texto);
}

.badge.devuelto {
    background: var(--fia-naranja-tenue);
    color: #5b21b6;
}

.badge.cancelado {
    background: var(--fia-peligro-tenue);
    color: var(--fia-peligro-texto);
}

.historial-grupo-header td {
    background: var(--color-fondo);
    font-weight: 800;
    font-size: 0.75rem;
    color: var(--color-texto-suave);
    padding: 10px 14px;
    border-bottom: 1px solid var(--color-linea);
}

.historial-grupo-header {
    cursor: pointer;
}

.historial-grupo-header-row {
    display: flex;
    align-items: center;
    gap: 10px;
}

.historial-grupo-chevron {
    font-size: 0.7rem;
    color: var(--color-texto-tenue);
    width: 12px;
    display: inline-block;
}

.btn-reimprimir-corte {
    margin-left: auto;
    background: var(--color-superficie);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-pildora);
    padding: 4px 12px;
    font-size: 0.72rem;
    font-weight: 700;
    color: var(--color-accion-legible);
    cursor: pointer;
    white-space: nowrap;
}

.btn-reimprimir-corte:hover {
    background: var(--fia-naranja-tenue);
}

.btn-action {
    border: none;
    padding: 0.3rem 0.8rem;
    border-radius: 30px;
    font-size: 0.7rem;
    font-weight: 800;
    cursor: pointer;
    margin: 2px;
}

/* GRAFITO, NO MORADO, en toda la fila de acciones de una venta (17-09-26).
   Luis: "no quiero el morado". Eran tres botones morados --Req, Devolver y
   Devolucion-- de un morado de Tailwind que no sale de la Guia Visual §3.
   Y no era solo cuestion de identidad: #8b5cf6 sobre la tarjeta blanca daba
   4.23:1, por debajo del minimo, justo en el boton que abre una devolucion.
   La regla que queda: en esta fila el color marca DINERO QUE ENTRA (verde) y
   DESTRUCTIVO (rojo); todo lo demas va en grafito, que es lo que ya hacia
   .btn-duplicate. Las palabras distinguen el resto. */
.btn-req {
    color: var(--color-texto);
}

.btn-pay {
    color: var(--fia-exito);
}

.btn-cancel {
    color: var(--fia-peligro);
}

.btn-return {
    color: var(--color-texto);
}

/* La puerta de la devolucion (12-09-26). Hereda el color de "Devuelto", que
   es el que la gente ya asociaba con esto; lo que cambia es que ahora es un
   boton visible en el renglon y no el sexto item de un menu. */
.btn-devolucion {
    color: var(--color-texto);
}

.btn-duplicate {
    color: var(--color-texto);
}

.opciones-de-caja {
    width: 620px;
}

/* BRIEF P1 07-08-26 punto 1: "Abonar" se renderiza aparte del resto de
   acciones (ver renderAccionesVenta en tabla-acciones.js), asi que la celda
   puede tener el boton de Abonar + un boton unico/dropdown al mismo tiempo. */
.acciones-fila {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: var(--esp-2);
    /* SIN PARTIRSE (Luis 17-09-26: "un tercer boton se baja a otro renglon").
       Medido: los tres controles piden 330 px y el contenedor daba 127, asi
       que el tercero caia a una segunda linea y el renglon entero medía 124
       px de alto. Su columna ahora pide su ancho (`width: 1%` + nowrap
       arriba) y la del cliente cede el sobrante. */
    flex-wrap: nowrap;
}

.dropdown-actions {
    position: relative;
    display: inline-block;
}

.btn-dropdown {
    background: var(--fia-grafito);
    color: var(--fia-blanco);
    border: none;
    border-radius: var(--radio-control);
    padding: 6px 12px;
    cursor: pointer;
    font-size: .8rem;
}

.btn-dropdown:hover {
    background: var(--fia-grafito);
}

.dropdown-menu {
    position: absolute;
    top: 110%;
    right: 0;
    min-width: 170px;
    background: var(--color-superficie);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-control);
    box-shadow: 0 8px 25px rgba(0, 0, 0, .12);
    display: none;
    overflow: hidden;
    z-index: 1000;
}

.dropdown-actions.active .dropdown-menu {
    display: flex;
    flex-direction: column;
}

.dropdown-item {
    width: 100%;
    border: none;
    background: none;
    padding: 10px 14px;
    text-align: left;
    cursor: pointer;
    font-size: .85rem;
    transition: .15s;
    display: flex;
    align-items: center;
    gap: 5px;
}

.dropdown-item svg {
    width: 20px;
    height: auto;
}

.dropdown-item:hover {
    background: var(--color-superficie-2);
}

.dropdown-item.danger {
    color: var(--fia-peligro);
}

.dropdown-item.danger:hover {
    background: var(--fia-peligro-tenue);
}

/* Acción única renderizada directo en la celda (sin menú desplegable) */
.btn-accion-tabla {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    background: var(--color-superficie);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-pildora);
    padding: 6px 12px;
    font-size: 0.75rem;
    font-weight: 700;
    cursor: pointer;
    white-space: nowrap;
}

.btn-accion-tabla svg {
    width: 18px;
    height: auto;
}

.btn-accion-tabla:hover {
    background: var(--color-superficie-2);
}

.btn-accion-tabla[disabled],
.dropdown-item[disabled] {
    opacity: 0.55;
    cursor: not-allowed;
}

/* Autorizaciones de cancelación (supervisor) */
.badge-contador {
    display: none;
    align-items: center;
    justify-content: center;
    min-width: 20px;
    height: 20px;
    padding: 0 6px;
    margin-left: 6px;
    border-radius: var(--radio-pildora);
    background: var(--fia-peligro);
    color: var(--fia-blanco);
    font-size: 0.7rem;
    font-weight: 800;
}

.solicitud-card {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 12px;
    background: var(--color-superficie-2);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-tarjeta);
    padding: 14px;
    margin-bottom: 10px;
}

.solicitud-info {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.solicitud-info small {
    color: var(--color-texto-tenue);
}

.solicitud-notas {
    background: var(--fia-aviso-tenue);
    border: 1px solid var(--fia-aviso);
    border-radius: var(--radio-control);
    padding: 4px 8px;
    margin-top: 4px;
    color: var(--fia-aviso-texto) !important;
}

.solicitud-acciones {
    display: flex;
    flex-direction: column;
    gap: 8px;
    flex-shrink: 0;
}

@media (max-width: 1024px) {
    .opciones-de-caja {
        width: 90%;
    }

    .container {
        padding-bottom: 76px;
    }

}

/* ================================
VISTA MOVIL POS
================================ */

@media (max-width: 700px) {
    body {
        background: var(--color-fondo);
    }

    .container {
        width: calc(100% - 24px);
        margin: 14px auto;
        padding-bottom: 24px;
    }

    /* EL ENCABEZADO DE VENTAS EN EL TELEFONO -- el circulo rojo de Luis
       (17-09-26: "hay mucho espacio, donde te circulo de rojo").

       Medido a 360 px: 221 px de los 800, el 28% de la pantalla, y ni una
       sola venta visible todavia. La razon es que el encabezado se apilaba
       en CUATRO renglones, uno por pieza:

           Ventas                     30 px
           Efectivo en caja $0.00     16 px
           Folio: --                  15 px
           [Abono][Historial]         44 px
           [Caja]                     44 px   <- los botones no cabian

       La barra lateral se lleva 88 px, asi que al encabezado le quedan 240
       de ancho: tres botones de ~85 px no caben en una fila que se parte, y
       partirse era justo lo que hacia. Aqui se arma en tres renglones:

           Ventas
           EFECTIVO EN CAJA $0.00   Folio: --     <- el dinero, en una linea
           [Abono][Historial][Caja] ->            <- se desliza de lado

       El titulo lo dimensiona base.css (--texto-lg); ya no hay una medida
       propia de Ventas. */
    .panel-header-ventas {
        gap: var(--esp-2);
    }

    .panel-header-der {
        flex: 1 0 100%;
        /* Sin esto la fila que se desliza no se desliza: la anchura minima
           de un contenedor flex es la de su contenido, asi que .panel-header-der
           media 402 px dentro de 272 y lo que se movia de lado era la pagina
           entera. Medido 18-09-26. */
        min-width: 0;
        justify-content: flex-start;
        align-items: baseline;
        gap: var(--esp-1) var(--esp-3);
    }

    .title-divider {
        display: none;
    }

    .sl-total-dia {
        flex: 0 1 auto;
        justify-self: auto;
        padding: 0;
        font-size: 0.68rem;
    }

    .sl-total-dia strong {
        font-size: 0.85rem;
    }

    .quick-folio {
        flex: 0 1 auto;
    }

    /* Una fila que se desliza, no una que se parte: tres botones de 85 px
       no caben en 240, y al partirse costaban un renglon entero de 44 px.
       Deslizandose cuestan cero y siguen todos ahi. */
    .toolbar-actions {
        flex: 1 0 100%;
        min-width: 0;
        flex-wrap: nowrap;
        overflow-x: auto;
        scrollbar-width: none;
    }

    .toolbar-actions::-webkit-scrollbar {
        display: none;
    }

    .toolbar-btn,
    .toolbar-btn-sec {
        flex: 0 0 auto;
        font-size: 0.74rem;
        padding: 7px 10px;
    }

    /* Orden solo en movil: sidebar (cliente/caja, el total ya esta fijo
       abajo asi que no importa su lugar en el flujo) -> formulario/tabla
       de productos. En escritorio el grid de 2 columnas no usa este orden
       (se resetea en el breakpoint de 900px). */
    .sales-sidebar {
        order: 1;
    }

    .sales-main {
        order: 2;
    }

    .sl-card {
        padding: 12px 14px;
    }

    /* Tarjeta de cliente y barra de acciones mas bajas: menos padding,
       renglones mas compactos. */
    .sl-cliente-card {
        padding: 8px 10px;
    }

    /* Caja nombre / Fondo inicial: eran 2 lineas (etiqueta arriba, valor
       abajo) -- en movil se compactan a una sola linea de texto por dato,
       "Etiqueta: valor" en vez de apilado. */
    .sl-caja-info {
        padding: 8px 10px;
        gap: 6px 16px;
        flex-wrap: wrap;
    }

    .sl-caja-info-item {
        flex-direction: row;
        align-items: baseline;
        gap: 4px;
        /* Un dato por renglon: de dos en dos, "Caja nombre: Caja Mostrador
           Matriz" se partia en tres lineas. */
        flex: 1 0 100%;
    }

    .sl-caja-info-label {
        font-size: 0.68rem;
    }

    .sl-caja-info-label::after {
        content: ':';
    }

    .sl-caja-info-value {
        font-size: 0.82rem;
    }

    .toolbar-btn,
    .toolbar-btn-sec {
        padding: 6px 10px;
    }

    /* NOTAS Y "REQUIERE FACTURA" DEJAN DE COMPARTIR RENGLON.
       En escritorio comparten fila a proposito, para ahorrar una. Aqui no
       caben: de los 250 px del contenido, la casilla se lleva 149 y al campo
       de notas le quedaban 89 -- menos que su propio placeholder. */
    .notas-factura-row {
        flex-direction: column;
        align-items: stretch;
        gap: var(--esp-2);
    }

    .notas-factura-row>label {
        padding-bottom: 0;
        /* Sin esto la etiqueta se estira a los 250 px de la columna y la
           casilla --su primer hijo flexible-- se come el hueco: medida en
           114 px de ancho en vez de 13. */
        align-self: flex-start;
    }


    /* Campo "Codigo o concepto" y renglon cantidad/unidad/precio: mismo
       campo, solo mas bajo. */
    .quick-input {
        padding: 0.5rem 0.7rem;
        font-size: 0.85rem;
    }

    .quick-qty-price {
        gap: 6px !important;
    }

    /* Barra de filtros del historial: en escritorio es una sola fila (busqueda
       + estado + rango de fechas + Buscar), pero en movil con flex-basis de
       260px c/u no cabian ni de cerca -- se aplastaban a cajas casi
       invisibles. Se reacomoda en 2 filas: busqueda + estado arriba (mitad y
       mitad), fechas + boton abajo. */
    .filters-bar {
        background: transparent !important;
        margin-bottom: 12px !important;
        flex-wrap: wrap;
        gap: 8px !important;
    }

    .filters-bar h3 {
        width: 100%;
        margin: 8px 0 0 !important;
        font-size: 1rem !important;
        color: var(--color-texto-suave) !important;
    }

    .filters-bar>div {
        width: 100%;
        flex: 1 1 100% !important;
        gap: 8px !important;
    }

    #search-venta-historial {
        flex: 1 1 100%;
        min-width: 0;
    }

    #filter-estado-historial {
        flex: 1 1 100%;
        min-width: 0;
    }

    #historial-fecha-inicio,
    #historial-fecha-fin {
        flex: 1 1 calc(50% - 4px);
        min-width: 0;
    }

    #btn-buscar-historial {
        flex: 1 1 100%;
    }

    /*
  Tabla del carrito de la venta en curso. 6 columnas reales:
  1 Producto, 2 Cantidad, 3 Unidad, 4 Precio unit., 5 Importe, 6 acciones
  (expandir + eliminar). En pantallas angostas ya no se intenta forzar una
  tabla de 6 columnas angostas (eso se encimaba) -- en su lugar cada <tr>
  se vuelve una tarjeta de 2x2 con CSS grid, estilo "recibo" del mockup
  aprobado: nombre arriba-izquierda, importe arriba-derecha, cantidad
  chica abajo-izquierda, acciones abajo-derecha. Unidad y Precio unit. se
  ocultan (el Importe ya es editable a mano y compensa).
*/
    #tabla-ventas-principal {
        width: 100%;
    }

    #tabla-ventas-principal thead {
        display: none;
    }

    #tabla-ventas-principal,
    #tabla-ventas-principal tbody {
        display: block;
        width: 100%;
    }

    #tabla-ventas-principal tbody tr {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto;
        column-gap: 8px;
        row-gap: 1px;
        align-items: center;
        padding: 6px 4px;
        border-bottom: 1px solid var(--color-linea-suave);
    }

    #tabla-ventas-principal tbody tr.renglon-extra-row,
    #tabla-ventas-principal tbody tr.renglon-notas-row {
        display: block;
        padding: 0;
        border-bottom: none;
    }

    #tabla-ventas-principal td {
        padding: 0;
        border: none;
        display: block;
        /* Sin esto, una celda de rejilla tampoco baja de su min-content. */
        min-width: 0;
    }

    /* (la regla de la nota compacta vive fuera de este @media) */
    /* EN MOVIL EL RENGLON NO ES UNA FILA DE TABLA: es una tarjeta en
       rejilla donde cada celda ya tiene su sitio (nombre arriba-izquierda,
       importe arriba-derecha, cantidad y acciones abajo). La alineacion a la
       derecha que las columnas de dinero llevan en la tabla de escritorio
       aqui pelea con esa colocacion. Las cifras tabulares SI se quedan:
       alinean decimales sin pedir ancho. */
    #tabla-ventas-principal tbody td:nth-child(2),
    #tabla-ventas-principal tbody td:nth-child(4) {
        text-align: left;
        white-space: normal;
    }

    #tabla-ventas-principal tbody td:nth-child(5) {
        white-space: normal;
    }

    /* Nombre + categoria: fila 1, columna 1 */
    #tabla-ventas-principal tbody td:nth-child(1) {
        grid-column: 1;
        grid-row: 1;
        font-size: 0.85rem;
        white-space: normal;
        word-break: break-word;
        line-height: 1.15;
    }

    #tabla-ventas-principal tbody td:nth-child(1) small {
        font-size: 0.62rem !important;
        line-height: 1.1;
    }

    /* Cantidad: fila 2, columna 1, chica -- reemplaza el input grande por
       una lectura compacta; sigue siendo el mismo input, solo mas chico. */
    #tabla-ventas-principal tbody td:nth-child(2) {
        grid-column: 1;
        grid-row: 2;
        font-size: 0.72rem;
        color: var(--color-texto-tenue);
    }

    /* Solo el input directo (cantidad normal, sin el par alto/ancho de
       dimensiones) se limita a 44px -- el ">" evita que esto le gane por
       especificidad al ancho del par alto/ancho (.renglon-dim-pair), que
       necesita repartirse el espacio entre 2 inputs, no comprimirse a 44px
       cada uno. */
    #tabla-ventas-principal tbody td:nth-child(2)>.renglon-input-num {
        width: 44px;
        text-align: left;
        padding: 2px 4px;
    }

    #tabla-ventas-principal tbody td:nth-child(2) .renglon-dim-pair {
        max-width: 130px;
        flex-wrap: wrap;
    }

    #tabla-ventas-principal tbody td:nth-child(2) .renglon-dim-pair .renglon-input-num {
        text-align: left;
        padding: 2px 4px;
        font-size: 0.72rem;
        min-width: 38px;
    }

    #tabla-ventas-principal tbody td:nth-child(2) .renglon-dim-piezas {
        width: 30px !important;
        font-size: 0.72rem;
        padding: 2px 4px;
    }

    #tabla-ventas-principal tbody td:nth-child(2) .renglon-dim-resultado {
        font-size: 0.68rem;
    }

    /* Unidad y Precio unit. no caben en pantallas angostas */
    #tabla-ventas-principal tbody td:nth-child(3),
    #tabla-ventas-principal tbody td:nth-child(4) {
        display: none;
    }

    /* Importe: fila 1, columna 2, alineado a la derecha */
    #tabla-ventas-principal tbody td:nth-child(5) {
        grid-column: 2;
        grid-row: 1;
        text-align: right;
        font-weight: 800;
    }

    #tabla-ventas-principal tbody td:nth-child(5) .renglon-money {
        justify-content: flex-end;
    }

    #tabla-ventas-principal tbody td:nth-child(5) .renglon-input-num {
        width: 74px;
        font-weight: 800;
        font-size: 0.88rem;
    }

    /* Acciones (expandir + eliminar): fila 2, columna 2 */
    #tabla-ventas-principal tbody td:nth-child(6) {
        grid-column: 2;
        grid-row: 2;
    }

    #tabla-ventas-principal tbody td:nth-child(6) {
        display: flex;
        align-items: center;
        justify-content: flex-end;
        gap: var(--esp-1);
    }

    .quick-qty-price .qty {
        flex: 0 0 70px;
    }

    .quick-qty-price .quick-input-dimensiones {
        flex: 1 1 140px;
    }

    .quick-qty-price .unidad {
        flex: 0 0 84px;
    }

    .quick-add-product {
        flex: 0 0 auto;
        white-space: nowrap;
    }

    /* Total + Cobrar fijo al fondo del viewport (item 7 del mockup): el
       cajero nunca tiene que scrollear la lista de productos para cobrar.
       Compactado: menos padding y renglones de desglose mas chicos, para
       que ocupe menos alto y no se encime con la lista de productos. */
    .sl-total-sticky {
        position: fixed;
        left: 0;
        right: 0;
        bottom: 0;
        z-index: 500;
        border-radius: 18px 18px 0 0;
        box-shadow: 0 -10px 24px rgba(15, 23, 42, 0.14);
        margin: 0;
        padding: 10px 14px 12px;
    }

    #quick-breakdown {
        font-size: 11px !important;
        margin-bottom: 4px !important;
    }

    #quick-breakdown>div {
        margin-bottom: 2px !important;
    }

    .sl-total-sticky .quick-total {
        margin: 2px 0 !important;
    }

    .sl-total-sticky .quick-total strong {
        font-size: 1.2rem;
    }

    .btn-charge {
        padding: 10px;
        margin-top: 4px;
    }

    /* Espacio para que la lista de productos no quede tapada por la barra
       fija de total+cobrar. Antes era un valor fijo (108px) que se quedaba
       corto cuando la barra crecia de alto (desglose mixto, saldo a favor,
       referencia de transferencia); ahora se mide en JS
       (ajustarEspacioParaTotalSticky en ventas.js) y se aplica via variable
       CSS, con un ResizeObserver como red de seguridad. */
    .container {
        padding-bottom: calc(var(--altura-total-sticky, 108px) + 16px);
    }
}

/* ========== SESION DE CAJA (caja-sesion.js) ========== */

.caja-banner {
    display: flex;
    align-items: center;
    gap: 10px;
    background: var(--fia-aviso-tenue);
    border: 1px solid var(--fia-aviso);
    color: var(--fia-aviso-texto);
    font-weight: 800;
    border-radius: var(--radio-tarjeta);
    padding: 12px 18px;
    margin-bottom: 14px;
    cursor: pointer;
}

.caja-sesion-info {
    font-size: 0.8rem;
    font-weight: 800;
    color: var(--color-texto-tenue);
    background: var(--color-superficie-2);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-control);
    padding: 8px 12px;
    margin-bottom: 14px;
}

.caja-tabs {
    display: grid;
    /* Una columna por pestana visible (3, o 4 con Agregar fondo): una cuarta ya no cae sola a otra fila. */
    grid-auto-flow: column;
    grid-auto-columns: minmax(0, 1fr);
    gap: 8px;
    margin-bottom: 16px;
}

.caja-tab-btn {
    border: 1px solid var(--fia-borde-control);
    background: white;
    border-radius: var(--radio-control);
    padding: 10px;
    text-align: center;
    cursor: pointer;
    font-weight: 800;
    color: var(--color-texto);
    transition: border-color 0.16s ease, background 0.16s ease, color 0.16s ease;
}

.caja-tab-btn.active {
    border-color: var(--color-accion);
    background: var(--fia-naranja-tenue);
    color: var(--color-accion-legible);
}

.caja-tabla-wrap {
    background: var(--color-superficie-2);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-tarjeta);
    padding: 6px 12px;
}

.caja-tabla-wrap table {
    width: 100%;
    margin: 0;
}

.caja-tabla-wrap td {
    padding: 7px 4px;
    font-weight: 600;
    color: var(--color-texto-suave);
    border-bottom: 1px solid #eef2f7;
}

.caja-tabla-wrap td:last-child {
    text-align: right;
    font-weight: 800;
    color: var(--color-texto);
}

.caja-tabla-wrap tr.fila-esperado td {
    border-top: 2px solid var(--fia-borde-control);
    border-bottom: none;
    color: var(--color-texto);
}

/* El grito del efectivo negativo (11-09-26). Un cajon no puede tener menos
   de cero pesos: cuando el arqueo lo dice, el aviso tiene que ser imposible
   de pasar por alto y tiene que decir QUE HACER, no solo que algo esta mal
   -- por eso lleva la lista del procedimiento adentro. */
.caja-tabla-wrap tr.fila-efectivo-negativo td {
    border-top: 2px solid var(--fia-peligro);
    border-bottom: none;
    background: var(--fia-peligro-tenue);
    color: var(--fia-peligro-texto);
    padding: 14px 12px;
    text-align: left;
    line-height: 1.5;
}

.caja-tabla-wrap tr.fila-efectivo-negativo strong {
    display: block;
    font-size: 15px;
    margin-bottom: 4px;
}

.caja-tabla-wrap tr.fila-efectivo-negativo p {
    margin: 0 0 8px 0;
    font-size: 13.5px;
}

.caja-tabla-wrap tr.fila-efectivo-negativo ul {
    margin: 0;
    padding-left: 20px;
    font-size: 13.5px;
}

.caja-tabla-wrap tr.fila-efectivo-negativo li + li {
    margin-top: 6px;
}

/* Selector de formato del historial (Por corte / Tabla): mismo lenguaje
   visual que .caja-tab-btn del modal de opciones de caja, con su propia
   clase para no engancharse a los listeners de las pestanas de caja. */
.historial-vista-tabs {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 8px;
    max-width: 360px;
    margin-bottom: 16px;
}

.historial-vista-btn {
    border: 1px solid var(--fia-borde-control);
    background: white;
    border-radius: var(--radio-control);
    padding: 10px;
    text-align: center;
    cursor: pointer;
    font-weight: 800;
    color: var(--color-texto);
    transition: border-color 0.16s ease, background 0.16s ease, color 0.16s ease;
}

.historial-vista-btn.active {
    border-color: var(--color-accion);
    background: var(--fia-naranja-tenue);
    color: var(--color-accion-legible);
}

.historial-tabs {
    display: flex;
    gap: 8px;
    margin-bottom: 16px;
}

.historial-tab-btn {
    border: 1px solid var(--fia-borde-control);
    background: white;
    border-radius: var(--radio-control);
    padding: 10px 18px;
    cursor: pointer;
    font-weight: 800;
    color: var(--color-texto);
    transition: border-color 0.16s ease, background 0.16s ease, color 0.16s ease;
}

.historial-tab-btn.active {
    border-color: var(--color-accion);
    background: var(--fia-naranja-tenue);
    color: var(--color-accion-legible);
}

/* La pareja etiqueta-cifra va JUNTA y topada, no repartida a las orillas:
   `space-between` en un renglon de 945 px deja la cifra a 945 px de su
   etiqueta (defecto 4, 17-09-26). Hasta --medida-pareja se lee de un golpe. */
.caja-diferencia-row {
    display: flex;
    max-width: var(--medida-pareja);
    justify-content: space-between;
    align-items: center;
    font-weight: 800;
    color: var(--color-texto);
    padding: 10px 4px;
}

.caja-diferencia {
    font-size: 1.15rem;
    font-weight: 900;
    color: var(--color-texto-tenue);
}

.caja-diferencia.ok {
    color: var(--fia-exito-texto);
}

.caja-diferencia.sobra {
    color: var(--color-texto);
}

.caja-diferencia.falta {
    color: var(--fia-peligro);
}

.caja-aviso-inmutable {
    background: var(--fia-peligro-tenue);
    border: 1px solid var(--fia-peligro);
    border-radius: var(--radio-control);
    padding: 10px 12px;
    color: var(--fia-peligro-texto);
    font-weight: 700;
    margin: 12px 0px;
}

.btn-danger {
    background: var(--fia-peligro);
    color: white;
    border: none;
    padding: 12px 18px;
    border-radius: var(--radio-control);
    font-weight: 800;
    cursor: pointer;
    transition: background 0.16s ease, transform 0.16s ease;
}

.btn-danger:hover {
    background: var(--fia-peligro-texto);
}

.btn-danger:disabled {
    background: var(--fia-peligro-tenue);
    cursor: not-allowed;
    transform: none;
}

.apertura-caja-nombre {
    font-size: 1.05rem;
    font-weight: 900;
    color: var(--color-texto);
    background: var(--fia-naranja-tenue);
    border: 1px solid var(--fia-naranja-borde);
    border-radius: var(--radio-control);
    padding: 12px 14px;
    margin-bottom: 14px;
}

.desglose-mixto {
    background: var(--color-superficie-2);
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-tarjeta);
    padding: 12px;
    margin-bottom: 12px;
}

.desglose-mixto .quick-label {
    display: block;
    font-size: 0.7rem;
    font-weight: 800;
    text-transform: uppercase;
    color: var(--color-texto-suave);
    margin-bottom: 8px;
}

.desglose-mixto-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
    gap: 8px;
}

.mixto-indicador {
    margin-top: 8px;
    font-weight: 800;
    font-size: 0.85rem;
    color: var(--color-texto-tenue);
    min-height: 1.2em;
}

.mixto-indicador.ok {
    color: var(--fia-exito-texto);
}

.mixto-indicador.falta {
    color: var(--fia-aviso-texto);
}

.mixto-indicador.sobra {
    color: var(--fia-peligro);
}

.btn-charge:disabled {
    background: var(--fia-gris-medio);
    cursor: not-allowed;
    transform: none;
}

/* Origen del dinero en un egreso (03-09-26): caja del turno o resguardo */
.egreso-origen-opciones { display: flex; flex-direction: column; gap: 6px; }
.egreso-origen-opcion { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border: 1px solid var(--color-linea); border-radius: var(--radio-control); cursor: pointer; font-size: 0.9rem; }
.egreso-origen-opcion:has(input:checked) { border-color: var(--fia-exito); background: var(--fia-exito-tenue); }
.egreso-origen-opcion input { margin: 0; }

/* "Facturada · LG-1" en la venta (07-09-26); la marca la escribe la Function al timbrar */
.venta-facturada { display: inline-block; margin-left: 6px; padding: 2px 8px; border-radius: var(--radio-pildora); font-size: .7rem; font-weight: 700; letter-spacing: .02em; white-space: nowrap; vertical-align: middle; }
.venta-facturada-vigente { background: #e0f2f1; color: #0f766e; }
.venta-facturada-cancelada { background: var(--fia-peligro-tenue); color: var(--fia-peligro-texto); }

/* "Regresó · está en el taller" (INV-12): la mercancía de esta venta volvió
   y el caso sigue abierto. Mismo tamaño y forma que el chip de factura para
   que los dos convivan en la misma celda sin brincar el renglón. */
.chip-regreso-venta { display: inline-block; margin-left: 6px; padding: 2px 8px; border-radius: var(--radio-pildora); font-size: .7rem; font-weight: 700; letter-spacing: .02em; white-space: nowrap; vertical-align: middle; background: var(--fia-aviso-tenue); color: var(--fia-aviso-texto); }

/* EL ATRIBUTO `hidden` NO GANA CONTRA UNA CLASE.
   El navegador esconde lo marcado con `hidden` mediante `[hidden]{display:none}`,
   que es una regla de su hoja por omision: cualquier CLASE que declare `display`
   la pisa, y el elemento se queda visible. Asi el chip aparecia en TODAS las
   ventas (hallazgo DIN2-04 de la segunda barrida al dinero, 12-09-26). Cada
   clase que se use junto con `hidden` tiene que decirlo explicitamente. */
.chip-regreso-venta[hidden] { display: none; }


/* Existencia y almacen en el mostrador (lote A2 Inventario, 07-09-26) */
.sl-caja-almacen { display: block; font-size: 0.72rem; font-weight: 600; color: var(--color-texto-tenue); margin-top: 2px; }
.sl-caja-almacen[hidden] { display: none; }
.quick-existencia { font-size: 0.78rem; font-weight: 600; padding: 4px 8px; border-radius: var(--radio-control); margin-bottom: 6px; line-height: 1.3; }
.quick-existencia[hidden] { display: none; }
.quick-existencia.tono-ok { background: var(--fia-exito-tenue); color: var(--fia-exito-texto); }
.quick-existencia.tono-aviso { background: var(--fia-aviso-tenue); color: var(--fia-aviso-texto); }
.quick-existencia.tono-alerta { background: var(--fia-peligro-tenue); color: var(--fia-peligro-texto); }
.quick-existencia.tono-neutro { background: var(--color-fondo); color: var(--color-texto-suave); }
/* Surtir desde otro almacen (lote E, 08-09-26) */
.quick-surtido { margin-bottom: 6px; padding: 6px 8px; border-radius: var(--radio-control); background: var(--fia-naranja-tenue); border: 1px solid var(--fia-naranja-borde); }
.quick-surtido[hidden] { display: none; }
.quick-surtido label { display: block; font-size: 0.74rem; font-weight: 700; color: var(--fia-naranja-texto); margin-bottom: 4px; }
.renglon-surtido { display: block; font-size: 0.72rem; font-weight: 700; color: var(--color-texto-suave); }
.autorizacion-dialogo { border: none; border-radius: var(--radio-tarjeta); padding: 0; max-width: 420px; width: calc(100% - 32px); box-shadow: 0 24px 60px rgba(15, 23, 42, .25); }
.autorizacion-dialogo::backdrop { background: rgba(15, 23, 42, .5); }
.autorizacion-form { padding: 20px; display: flex; flex-direction: column; gap: 10px; }
.autorizacion-form h3 { margin: 0; }
.autorizacion-detalle { margin: 0; font-size: 0.85rem; color: var(--color-texto-suave); }
.autorizacion-form label { display: flex; flex-direction: column; gap: 4px; font-size: 0.8rem; font-weight: 700; color: var(--color-texto); }
.autorizacion-form input { border: 1px solid var(--fia-borde-control); border-radius: var(--radio-control); padding: 8px 10px; font: inherit; }
.autorizacion-error { margin: 0; color: var(--fia-peligro-texto); font-size: 0.82rem; font-weight: 600; }
.autorizacion-acciones { display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px; }

/* ===================================================================
   REINGRESO DE MERCANCIA (INV-12, 11-09-26)
   =================================================================== */
.rei-folio {
    font-weight: 400;
    color: var(--color-texto-tenue);
    font-size: 0.85rem;
}

.rei-causas {
    display: grid;
    gap: 8px;
}

.rei-causa {
    display: flex;
    gap: 10px;
    align-items: flex-start;
    padding: 10px 12px;
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-control);
    cursor: pointer;
}

.rei-causa:hover {
    background: var(--color-superficie-2);
}

.rei-causa input {
    margin-top: 3px;
}

.rei-causa span {
    display: flex;
    flex-direction: column;
}

.rei-causa small {
    color: var(--color-texto-tenue);
    font-size: 0.8rem;
}

.rei-aviso {
    padding: 12px 14px;
    border: 1px solid var(--fia-aviso);
    background: var(--fia-aviso-tenue);
    border-radius: var(--radio-control);
    margin-bottom: 12px;
}

.rei-aviso p {
    margin: 6px 0 0;
    font-size: 0.86rem;
    color: var(--fia-aviso-texto);
}

.rei-aviso button {
    margin-top: 10px;
}

.rei-aviso-devuelto {
    margin-top: 12px;
}

.rei-piezas {
    display: grid;
    gap: 6px;
}

.rei-pieza {
    display: grid;
    grid-template-columns: 1fr auto 90px;
    gap: 10px;
    align-items: center;
    padding: 6px 8px;
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-control);
}

.rei-pieza-desc {
    font-weight: 600;
    font-size: 0.9rem;
}

.rei-pieza small {
    color: var(--color-texto-tenue);
    font-size: 0.78rem;
    white-space: nowrap;
}

.rei-nota {
    font-size: 0.82rem;
    color: var(--color-texto-suave);
    background: var(--color-superficie-2);
    padding: 10px 12px;
    border-radius: var(--radio-control);
}

.rei-motivo-abierto {
    font-size: 0.9rem;
    padding: 10px 12px;
    background: var(--color-superficie-2);
    border-left: 3px solid var(--color-accion);
    border-radius: var(--radio-control);
    margin-bottom: 12px;
}

.rei-motivo-abierto small {
    color: var(--color-texto-tenue);
}

.rei-olvidado {
    color: var(--fia-aviso-texto);
}

.rei-cierre {
    display: grid;
    gap: 10px;
}

.rei-cierre-pieza {
    padding: 10px 12px;
    border: 1px solid var(--color-linea);
    border-radius: var(--radio-control);
    display: grid;
    gap: 8px;
}

.rei-cierre-que {
    display: flex;
    gap: 10px;
    align-items: baseline;
}

.rei-cierre-que small {
    color: var(--color-texto-tenue);
    font-size: 0.8rem;
}

.rei-cierre-campo {
    display: grid;
    gap: 4px;
}

/* Mismo caso que el chip de arriba, y aqui no era cosmetico: la pregunta
   "¿donde quedo la pieza que regreso?" se ensenaba tambien para "se reparo" y
   "no se pudo", donde la pieza esta con el cliente y la pregunta no aplica. */
.rei-cierre-campo[hidden] { display: none; }

.rei-cierre-campo span {
    font-size: 0.82rem;
    color: var(--color-texto-suave);
}

.rei-cierre-resumen {
    margin: 0;
    font-size: 0.82rem;
    color: var(--color-texto);
}

.rei-resumen {
    margin-top: 14px;
    padding: 12px 14px;
    border-radius: var(--radio-control);
    background: var(--fia-naranja-tenue);
    border: 1px solid var(--fia-naranja-borde);
    font-size: 0.88rem;
}

.rei-resumen ul {
    margin: 6px 0 0;
    padding-left: 18px;
}

.rei-resumen-falta {
    background: var(--fia-aviso-tenue);
    border-color: var(--fia-aviso);
}

@media (max-width: 560px) {
    .rei-pieza {
        grid-template-columns: 1fr 80px;
    }

    .rei-pieza small {
        grid-column: 1 / -1;
    }
}

/* ===== UNA CUENTA BANCARIA POR MÉTODO (Luis 12-09-26) =====
   En un pago mixto la tarjeta puede entrar a la terminal y la transferencia a
   otro banco, así que en vez de UN selector aparece uno por método. Con un
   solo método bancario la pantalla no cambia: se sigue viendo el selector de
   siempre y este bloque queda oculto.

   OJO con [hidden] (regresión del 12-09-26, ver scripts/test-hidden-vs-clase.mjs):
   la regla del navegador `[hidden]{display:none}` es de ATRIBUTO y pierde
   contra cualquier CLASE que declare display. Por eso el `display:grid` de
   .cuentas-por-metodo lleva su propio `[hidden]` que lo apaga. */
.cuentas-por-metodo {
    display: grid;
    gap: 8px;
    margin-top: 6px;
}

.cuentas-por-metodo[hidden] {
    display: none;
}

.cuenta-por-metodo {
    display: grid;
    grid-template-columns: 110px 1fr;
    align-items: center;
    gap: 8px;
    font-size: 0.85rem;
    font-weight: 500;
    color: var(--color-texto-suave);
}

.cuenta-por-metodo select {
    width: 100%;
}

@media (max-width: 560px) {
    .cuenta-por-metodo {
        grid-template-columns: 1fr;
        gap: 4px;
    }
}

/* EL CLIENTE DEVOLVIO ALGO (12-09-26). Cinco casos, cada uno con lo que le
   hace al dinero y al inventario. Tarjetas grandes y tocables porque esto se
   usa en el celular, frente al cliente, con prisa. */
.dev-ruta-pregunta {
    margin: 0 0 12px;
    font-weight: 800;
    color: var(--color-texto);
}

.dev-ruta-opciones {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.dev-ruta-opcion {
    display: block;
    width: 100%;
    text-align: left;
    background: var(--color-superficie);
    border: 2px solid var(--color-linea);
    border-radius: var(--radio-control);
    padding: 12px 14px;
    cursor: pointer;
    font: inherit;
    transition: border-color 0.15s, box-shadow 0.15s, background 0.15s;
}

.dev-ruta-opcion:hover:not(:disabled),
.dev-ruta-opcion:focus-visible:not(:disabled) {
    border-color: var(--color-accion);
    box-shadow: var(--sombra-flotante);
}

/* Un camino que no aplica se ve EN GRIS con su motivo, no desaparece: "no veo
   el boton" y "el boton esta en gris y dice por que" son dos experiencias
   distintas, y la segunda ensena como funciona el sistema. */
.dev-ruta-opcion:disabled {
    cursor: not-allowed;
    opacity: 0.55;
    background: var(--color-superficie-2);
}

.dev-ruta-titulo {
    display: block;
    font-weight: 800;
    font-size: 0.95rem;
    color: var(--color-texto);
    margin-bottom: 3px;
}

.dev-ruta-cuando {
    display: block;
    font-size: 0.8rem;
    color: var(--color-texto-tenue);
    margin-bottom: 8px;
}

.dev-ruta-efecto {
    display: block;
    font-size: 0.78rem;
    color: var(--color-texto);
    line-height: 1.4;
}

.dev-ruta-efecto strong {
    color: var(--color-texto);
}

.dev-ruta-bloqueo {
    display: block;
    margin-top: 8px;
    font-size: 0.78rem;
    font-weight: 700;
    color: var(--fia-aviso-texto);
}

/* El ultimo recurso ("solo dejar anotado") se separa y se apaga de color: no
   resuelve nada, y ofrecerlo igual que a los demas es como se llego al
   defecto que estaba escondido en el menu. */
.dev-ruta-opcion.dev-ruta-ultimo-recurso {
    border-style: dashed;
    background: var(--fia-aviso-tenue);
}

.dev-ruta-opcion.dev-ruta-ultimo-recurso .dev-ruta-titulo {
    color: var(--fia-aviso-texto);
}

/* INV-02 (12-09-26): el aviso de que esta venta es de Público General y su
   diferencia solo puede salir del cajón. NO declara `display`: se oculta con
   [hidden] desde el JS (candado scripts/test-hidden-vs-clase.mjs). */
.sustitucion-credito-publico {
    margin: 0 0 10px;
    padding: 8px 10px;
    border-radius: var(--radio-control);
    background: var(--fia-aviso-tenue);
    border: 1px solid var(--fia-aviso);
    color: var(--fia-aviso-texto);
    font-size: 0.88rem;
    line-height: 1.4;
}
