/* =============================================================================
   COMERCIALES — identidad visual. Scope .cm-ui, colgado de core/tokens.css.
   =============================================================================
   El módulo del vendedor de calle (rol 9). Nace en identidad nueva —regla 11
   del runbook: cero confirm/alert/prompt, la espera por .gs-spin/.gs-sk.

   EL TRATAMIENTO — «CAPAS CON ACENTO», elegido por Hernán el 06/08/2026
   (ronda 3 de mockups de la etapa 3, opción B). Son DOS apartamientos sobre
   core/tokens.css, y están abajo con su porqué. El resto del módulo se alineó
   al mismo dialecto cuando se construyó la etapa 3: Mis Pedidos nació plano en
   la etapa 2 y dos dialectos adentro del mismo módulo no pueden convivir.

   El acento NO es semántico: azure nunca significa «bien» ni «mal». El color
   que SÍ significa —la mora, el estado de cada parte de un pedido— sigue siendo
   el de los tokens (ok / warn / crit / navy).

   TODO selector de este archivo va bajo `.cm-ui`. Una regla suelta llamada
   `.card` o `.risk` rompería los módulos que siguen en Tailwind.

   La base tipográfica, `.hidden` y `.tnum` NO se declaran acá: viven en las
   tres listas agrupadas de core/tokens.css, donde `.cm-ui` está nombrado junto
   a los otros scopes. Si una pantalla de este módulo sale con la Inter del
   <body> en vez de Segoe UI, lo primero que hay que mirar es esas listas.

   RESPONSIVE DE VERDAD (§3.2 del runbook): el mismo HTML se monta en
   `#page-cm-*` (escritorio) y en `#mobile-data-container` (celular). Por eso
   acá no hay anchos fijos ni media queries de estructura: la columna se acota
   con max-width y respira sola en cualquier contenedor.
   ========================================================================== */

/* ── LOS DOS APARTAMIENTOS ────────────────────────────────────────────────────
   Todo lo demás sale de core/tokens.css. Agregar un token acá es declarar que
   este módulo se ve distinto en eso: si no hay un motivo, va a tokens.css. */
.cm-ui {
    /* 1. Acento interactivo. Navy queda para la ESTRUCTURA (la franja de
       estado, los títulos, la cabecera de la ficha); azure para lo que se
       TOCA: la pestaña activa, el chip activo, el foco, la fila del
       desplegable. Es el mismo azure del ABM, a propósito: el comercial no
       ve el ABM, pero quien mantiene los dos archivos sí. */
    --azure: #1668c4;
    --azure-700: #1259ab;
    --azure-050: #eaf2fd;

    /* 2. Lienzo más oscuro que el de los otros módulos (#f1f2f5). El
       tratamiento apoya la jerarquía en la ELEVACIÓN —la cabecera del pedido
       en el plano 1, el buscador y el carrito en el 2— y una tarjeta blanca no
       despega de un fondo casi blanco. */
    --canvas: #e6ebf3;
}

/* LA MISMA TRAMPA DEL §7 DEL MANUAL, PERO CON EL ATRIBUTO. `.hidden` (la clase)
   ya está resuelta en core/tokens.css para los cuatro scopes. `hidden` (el
   atributo) NO: el navegador lo declara en su hoja de USUARIO-AGENTE, y
   cualquier `display` escrito por nosotros le gana sin pelear. O sea que
   `<div class="cm-acciones" hidden>` —que es `display:flex`— se veía igual.
   Ya pasaba en la etapa 2 con `.cm-resumen`, que es `display:flex` y arrancaba
   con `hidden`: la tira vacía se dibujaba mientras cargaba. */
.cm-ui [hidden] { display: none !important; }

/* El armazón del módulo. SIN ESPACIO entre las dos clases: el div es
   `class="cm-ui cm-shell"`, UN elemento con las dos. Escrito con espacio
   (`.cm-ui .cm-shell`) no matchearía nada — la trampa que le costó seis etapas
   al ABM y que el Hub volvió a pagar. */
.cm-ui.cm-shell {
    display: flex; flex-direction: column;
    height: 100%; min-height: 0;
    background: var(--canvas);
}

/* El scroll es del módulo (los `#page-cm-*` llevan `data-shell="full"`), no del
   wrapper: así el lienzo llega hasta los bordes en vez de salir como un
   rectángulo de color adentro de otro fondo. */
.cm-ui .cm-scroll {
    flex: 1 1 auto; min-height: 0; overflow-y: auto;
    padding: 20px 22px 34px;
}

/* La columna de una pantalla. Sin anchos fijos ni media queries de estructura:
   el mismo HTML se monta en `#page-cm-*` y en `#mobile-data-container`.

   EL TOPE SUBIO DE 860 A 1280 px el 27/08/2026, y lo pidió Hernán mirando la
   pantalla: «que el ancho se adapte, no una medida FIJA». Los 860 venían de
   cuando las cinco pantallas eran TARJETAS —una columna angosta se lee mejor y
   860 es una medida clásica de texto—, pero desde la ronda 11 tres de ellas son
   MESAS de cuatro columnas con dos renglones por celda, y ahí 860 no es una
   columna legible: es un corsé. En su monitor sobraban 300 px de lienzo vacío a
   la derecha mientras «Compañía Argentina de Levadura…» se cortaba adentro de
   la celda.

   POR QUÉ UN TOPE Y NO `none`: una fila de tabla más ancha que ~1300 px pierde
   el renglón al barrerla con el ojo — se llega al final de «Último cobro» sin
   saber de qué cliente era. El tope no es el ancho de un texto: es lo que un
   barrido horizontal puede seguir. Abajo de 1280 la columna usa TODO lo que
   haya, que es lo que se pidió. */
.cm-ui .cm-pantalla {
    max-width: 1280px;
    margin: 0 auto;
}

/* Quién sos — el renglón chico bajo el que se firma la sesión del comercial.
   Es información, no cabecera: va en gris y sin competir con el contenido. */
.cm-ui .cm-quien {
    margin: 10px 2px 0;
    font-size: .74rem;
    color: var(--faint);
}
.cm-ui .cm-quien b { color: var(--muted); font-weight: 700; }

/* =============================================================================
   EL CARTEL DE OBRA — qué va a haber acá y en qué etapa llega
   =============================================================================
   Mismo dibujo que .cx-obra de ComEx, con su misma regla: el párrafo va
   alineado a la izquierda aunque el cartel esté centrado (cuatro renglones
   centrados obligan a buscar dónde empieza cada uno; se centra el BLOQUE,
   no el texto). */
.cm-ui .cm-obra {
    margin: 13px 0 0; padding: 30px 26px;
    background: var(--surface); border-radius: var(--r-card);
    border: 1px dashed var(--hair-strong); box-shadow: var(--e1);
    text-align: center; color: var(--muted);
}
.cm-ui .cm-obra .material-symbols-outlined {
    font-size: 30px; color: var(--hair-strong); vertical-align: middle;
}
.cm-ui .cm-obra h4 {
    margin: 8px 0 0; font-size: .95rem; font-weight: 700; color: var(--ink);
}
.cm-ui .cm-obra p {
    margin: 8px auto 0; font-size: .78rem; max-width: 58ch;
    line-height: 1.6; text-align: left;
}
.cm-ui .cm-obra p.et {
    margin-top: 14px; font-size: .68rem; font-weight: 700; color: var(--faint);
    text-transform: uppercase; letter-spacing: .07em; text-align: center;
}

/* =============================================================================
   EL AVISO — un renglón con borde de estado (familia de .cfg-risk / .cx-risk)
   ========================================================================== */
.cm-ui .cm-risk {
    display: flex; gap: 9px; align-items: flex-start;
    margin: 13px 0 0; padding: 9px 13px; border-radius: 10px;
    border: 1px solid var(--hair-strong); border-left: 3px solid var(--navy-500);
    background: var(--surface); box-shadow: var(--e1);
    font-size: .76rem; color: var(--ink); line-height: 1.55;
}
.cm-ui .cm-risk p { margin: 0; }
.cm-ui .cm-risk b { font-weight: 700; }
.cm-ui .cm-risk .material-symbols-outlined {
    flex: 0 0 auto; margin-top: 1px; font-size: 18px; color: var(--faint);
}
.cm-ui .cm-risk.alerta {
    border-left-color: var(--warn); border-color: var(--warn-hair);
    background: var(--warn-050);
}
.cm-ui .cm-risk.alerta .material-symbols-outlined { color: var(--warn); }
/* Crítico: la parte que volvió RECHAZADA. Es el único aviso del módulo que le
   pide algo al comercial, y por eso es el único en rojo. */
.cm-ui .cm-risk.critico {
    border-left-color: var(--crit); border-color: var(--crit-hair);
    background: var(--crit-050);
}
.cm-ui .cm-risk.critico .material-symbols-outlined { color: var(--crit); }
.cm-ui .cm-motivos > .cm-risk:first-child { margin-top: 0; }

/* =============================================================================
   ETAPA 2 · MIS PEDIDOS — la cartera por cliente (mockup B, 06/08/2026)
   =============================================================================
   El color de acá abajo significa ESTADO y nada más (manual §1.1): la franja
   de 3 px de cada renglón — ok despachado, navy programado, gris esperando.
   La unidad (azúcar/polvos/jugos) es una etiqueta en versalitas, sin color:
   un color por categoría es exactamente lo que la regla prohíbe. */

/* --- La tira de resumen — semánticos a tamaño ABM, sin números gigantes ---- */
.cm-ui .cm-resumen {
    display: flex; gap: 7px 18px; flex-wrap: wrap; align-items: baseline;
    margin: 13px 0 0; padding: 10px 14px;
    background: var(--surface); border: 1px solid var(--hair);
    border-radius: 10px; box-shadow: var(--e1);
    font-size: .78rem; color: var(--muted);
}
.cm-ui .cm-resumen b { font-weight: 700; }
.cm-ui .cm-resumen i { font-style: normal; color: var(--faint); }
.cm-ui .cm-resumen .mut b { color: var(--ink); }
.cm-ui .cm-resumen .nav b { color: var(--navy-500); }
.cm-ui .cm-resumen .ok b { color: var(--ok); }
.cm-ui .cm-resumen .crit b { color: var(--crit); }

/* --- El buscador y los chips ---------------------------------------------- */
.cm-ui .cm-barra {
    display: flex; gap: 9px; flex-wrap: wrap; align-items: center;
    margin: 13px 0 0;
}
/* La receta del campo es una sola para todo el módulo. El `flex` que lo hacía
   estirarse era de la BARRA de Mis Pedidos, no del campo: escrito acá, un
   campo dentro de una celda del formulario heredaba un `min-width: 170px` que
   le impedía angostarse en el celular. */
.cm-ui .cm-in {
    width: 100%; padding: 7px 11px;
    font: inherit; font-size: .8rem; color: var(--ink);
    background: var(--surface); border: 1px solid var(--hair-strong);
    border-radius: 9px;
}
.cm-ui .cm-barra .cm-in { flex: 1 1 220px; min-width: 170px; width: auto; }
.cm-ui .cm-in::placeholder { color: var(--faint); }
/* El foco sigue al acento del módulo (§ el tratamiento elegido). */
.cm-ui .cm-in:focus {
    outline: none; border-color: var(--azure);
    box-shadow: 0 0 0 3px var(--azure-050);
}
.cm-ui select.cm-in { cursor: pointer; }
.cm-ui select.cm-in:disabled { background: var(--canvas); color: var(--faint); cursor: default; }
.cm-ui .cm-chips { display: flex; gap: 7px; flex-wrap: wrap; }
/* El chip activo va con TRAZO, no con relleno navy (manual §1.2): borde navy
   más la barra interior de 3 px. Y sube 2 px al apuntarlo, con foco de teclado
   tratado igual que el mouse (§5). */
.cm-ui .cm-chip {
    padding: 5px 12px; font: inherit; font-size: .74rem; font-weight: 600;
    color: var(--muted); background: var(--surface); cursor: pointer;
    border: 1px solid var(--hair-strong); border-radius: 999px;
    transition: transform .15s var(--curva), box-shadow .15s var(--curva);
}
.cm-ui .cm-chip:hover, .cm-ui .cm-chip:focus-visible {
    transform: translateY(-2px); box-shadow: var(--e1);
    outline: none; color: var(--azure);
}
.cm-ui .cm-chip.on {
    color: var(--azure); border-color: var(--azure);
    box-shadow: inset 3px 0 0 var(--azure);
}

/* --- La tarjeta de un cliente --------------------------------------------- */
/* Plano 2: sobre el lienzo oscuro las tarjetas despegan con la sombra, no con
   el borde (que pasa a ser un hilo casi invisible). Es el tratamiento elegido. */
.cm-ui .cm-cli {
    margin: 13px 0 0; background: var(--surface);
    border: 1px solid rgba(16, 32, 64, .05); border-radius: var(--r-card);
    box-shadow: var(--e2); overflow: hidden;
}
.cm-ui .cm-cli-h {
    display: flex; gap: 6px 14px; align-items: baseline; flex-wrap: wrap;
    padding: 9px 15px; border-bottom: 1px solid var(--hair);
}
.cm-ui .cm-cli-h .nom { font-weight: 700; font-size: .86rem; color: var(--ink); }
.cm-ui .cm-cli-h .det { font-size: .73rem; color: var(--muted); }
.cm-ui .cm-cli-h .ult { margin-left: auto; font-size: .7rem; color: var(--faint); }

/* --- Un renglón de pedido — es un <button>: se navega también con Tab ------ */
.cm-ui .cm-rows { display: flex; flex-direction: column; }
.cm-ui .cm-row {
    display: block; width: 100%; text-align: left; cursor: pointer;
    font: inherit; color: var(--ink); background: none;
    border: none; border-top: 1px solid var(--hair);
    padding: 8px 13px 8px 16px; position: relative;
    transition: background-color .15s var(--curva);
}
.cm-ui .cm-row:first-child { border-top: none; }
.cm-ui .cm-row:hover, .cm-ui .cm-row:focus-visible {
    background: var(--azure-050); outline: none;
}
.cm-ui .cm-row::before {
    content: ''; position: absolute; left: 6px; top: 8px; bottom: 8px;
    width: 3px; border-radius: 2px;
}
.cm-ui .cm-row.e-ok::before { background: var(--ok); }
.cm-ui .cm-row.e-nav::before { background: var(--navy-500); }
.cm-ui .cm-row.e-mut::before { background: var(--hair-strong); }
.cm-ui .cm-row.e-crit::before { background: var(--crit); }
.cm-ui .cm-row .l1, .cm-ui .cm-row .l2 {
    display: flex; gap: 4px 14px; align-items: baseline; flex-wrap: wrap;
}
.cm-ui .cm-row .num { font-weight: 700; font-size: .8rem; color: var(--navy-500); }
.cm-ui .cm-row .suc { font-size: .74rem; color: var(--muted); }
.cm-ui .cm-row .uni {
    font-size: .64rem; font-weight: 700; letter-spacing: .07em;
    text-transform: uppercase; color: var(--faint);
    border: 1px solid var(--hair-strong); border-radius: 5px; padding: 1px 6px;
}
.cm-ui .cm-row .cant { margin-left: auto; font-weight: 700; font-size: .82rem; white-space: nowrap; }
.cm-ui .cm-row .l2 { margin-top: 3px; font-size: .74rem; color: var(--muted); }
.cm-ui .cm-row .l2 .est { font-weight: 700; }
.cm-ui .cm-row.e-ok .l2 .est { color: var(--ok); }
.cm-ui .cm-row.e-nav .l2 .est { color: var(--navy-500); }
.cm-ui .cm-row.e-mut .l2 .est { color: var(--muted); }
.cm-ui .cm-row.e-crit .l2 .est { color: var(--crit); }
.cm-ui .cm-row .l2 .fec { margin-left: auto; color: var(--faint); }
/* Una pre-carga NO es un pedido: el número va en cursiva mientras no exista y
   la fila lleva un fondo apenas teñido, para que se lea como otra especie. */
.cm-ui .cm-row.pre { background: rgba(22, 104, 196, .028); }
.cm-ui .cm-row.pre:hover, .cm-ui .cm-row.pre:focus-visible { background: var(--azure-050); }
.cm-ui .cm-row.pre .num { color: var(--azure); }

/* En columnas angostas (el celular) la cantidad baja de renglón sola:
   sin media query de estructura, es el flex-wrap el que decide. */

/* --- El dato ausente — gris e itálica, con palabras (manual §1.4) ---------- */
.cm-ui .cm-vacio { color: var(--faint); font-style: italic; }

/* --- La lista vacía — que la nada diga por qué ----------------------------- */
.cm-ui .cm-nada {
    margin: 13px 0 0; padding: 26px 24px; text-align: center;
    background: var(--surface); border: 1px solid var(--hair);
    border-radius: var(--r-card); box-shadow: var(--e1); color: var(--muted);
}
.cm-ui .cm-nada h4 { margin: 0; font-size: .9rem; font-weight: 700; color: var(--ink); }
.cm-ui .cm-nada p {
    margin: 8px auto 0; font-size: .78rem; max-width: 58ch;
    line-height: 1.6; text-align: left;
}
.cm-ui .cm-nada.chica { padding: 16px 20px; }
.cm-ui .cm-nada.chica p { margin: 0; text-align: center; }

/* --- Los dos botones del estado de cuenta, en la ficha (papeles, etapa 4) ---
   Una tira, no una barra: son DOS acciones sobre el cliente que está abierto, y
   viven adentro de su ficha. El motivo de que el PDF esté apagado va en la misma
   tira y ESCRITO —`.cm-pp-pdf-no`, la misma clase que usa el pie del diálogo del
   papel—: una señal que sólo existe al apuntar no existe. */
.cm-ui .cm-papeles {
    display: flex; gap: 8px; flex-wrap: wrap; align-items: center;
    margin: 13px 0 0;
}

/* --- La ficha del pedido — modal, tercer plano (--e3) ---------------------- */
.cm-ui .cm-velo {
    position: fixed; inset: 0; z-index: 60;
    background: rgba(10, 25, 60, .45);
    display: flex; align-items: center; justify-content: center;
    padding: 18px;
}
.cm-ui .cm-ficha {
    width: min(640px, 100%); max-height: 92vh; overflow: auto;
    background: var(--surface); border-radius: var(--r-card);
    box-shadow: var(--e3);
}
.cm-ui .cm-ficha-h {
    position: sticky; top: 0;
    display: flex; gap: 6px 12px; align-items: baseline; flex-wrap: wrap;
    background: var(--navy); color: #fff; padding: 11px 17px;
}
.cm-ui .cm-ficha-h .num { font-weight: 700; font-size: .92rem; }
.cm-ui .cm-ficha-h .cli { font-size: .8rem; opacity: .85; }
.cm-ui .cm-ficha-h .est {
    margin-left: auto; font-size: .68rem; font-weight: 700;
    letter-spacing: .06em; text-transform: uppercase;
    border: 1px solid rgba(255, 255, 255, .5); border-radius: 6px; padding: 2px 8px;
}
.cm-ui .cm-x {
    flex: 0 0 auto; align-self: center; cursor: pointer;
    background: none; border: none; color: #fff; padding: 2px;
    border-radius: 7px; line-height: 0;
    transition: transform .15s var(--curva);
}
.cm-ui .cm-x .material-symbols-outlined { font-size: 19px; }
.cm-ui .cm-x:hover, .cm-ui .cm-x:focus-visible {
    transform: scale(1.18); outline: none; background: rgba(255, 255, 255, .14);
}
.cm-ui .cm-ficha-b { padding: 13px 17px 17px; }
/* LA FICHA ANCHA (etapa 2 de los listados). La de un pedido son 640 px y le
   alcanzan: es una lista de renglones. La de un CLIENTE lleva la cuenta
   corriente entera, y su columna derecha necesita 460 px de ancho útil para no
   partir «Debe» — con 640 quedaba en 400, que es la trampa que esta pantalla ya
   pagó una vez a 1280. */
.cm-ui .cm-ficha.ancha { width: min(1040px, 100%); }
/* El detalle se mudó ENTERO adentro del modal, con su `.cm-cuerpo`, que ya trae
   sus propios 16 px laterales en cada bloque. Sin esto se suman a los 17 del
   cuerpo de la ficha y la tabla pierde 34 px de ancho útil. */
.cm-ui .cm-ficha-b > .cm-cuerpo { margin: -13px -17px -17px; }
/* La cabecera del detalle: el saldo a la derecha y qué le pasa a este cliente
   abajo. Es lo que decía el renglón de la lista cuando el grupo se abría en el
   lugar; viaja con el detalle para no perderse. */
.cm-ui .cm-cli-cab {
    display: flex; gap: 4px 12px; align-items: baseline; flex-wrap: wrap;
    padding: 13px 16px 0;
}
.cm-ui .cm-cli-cab .l2 {
    display: flex; gap: 4px 12px; align-items: baseline; flex-wrap: wrap;
    /* Comparte renglón con el importe mientras entre, y recién ahí baja: con
       `width: 100%` bajaba siempre y la cabecera quedaba con el saldo solo,
       flotando arriba a la derecha. */
    flex: 1 1 300px; min-width: 0; font-size: .74rem; color: var(--muted);
}
/* El importe va PRIMERO en el HTML —es el dato— pero se dibuja a la derecha. */
.cm-ui .cm-cli-cab .cm-plata { order: 2; }
.cm-ui .cm-dl {
    display: grid; grid-template-columns: auto 1fr; gap: 4px 16px;
    margin: 0; font-size: .78rem;
}
.cm-ui .cm-dl dt {
    color: var(--faint); font-size: .68rem; font-weight: 700;
    letter-spacing: .06em; text-transform: uppercase; align-self: baseline;
}
.cm-ui .cm-dl dd { margin: 0; color: var(--ink); }

/* La grilla de renglones: encabezado BLANCO con regla abajo, nunca una franja
   navy de ancho completo (manual §1.2, la tabla que se mira 20 minutos). */
.cm-ui table.cm-g { width: 100%; border-collapse: collapse; font-size: .78rem; margin: 12px 0 0; }
.cm-ui table.cm-g th {
    text-align: left; font-size: .66rem; font-weight: 700;
    letter-spacing: .06em; text-transform: uppercase; color: var(--faint);
    padding: 5px 8px; border-bottom: 2px solid var(--hair-strong);
}
.cm-ui table.cm-g td { padding: 6px 8px; border-bottom: 1px solid var(--hair); color: var(--ink); }
.cm-ui table.cm-g .n { text-align: right; }
.cm-ui table.cm-g tfoot td { border-bottom: none; padding: 4px 8px; }
.cm-ui table.cm-g tfoot tr.sec td { color: var(--muted); }
.cm-ui table.cm-g tfoot tr:last-child td { font-weight: 700; }

/* El bloque de despacho de la ficha: fondo teñido navy — informativo, previsto */
.cm-ui .cm-desp {
    margin: 13px 0 0; padding: 9px 13px; border-radius: 10px;
    background: var(--navy-050); border: 1px solid var(--hair-strong);
    border-left: 3px solid var(--navy-500);
    font-size: .76rem; line-height: 1.6; color: var(--ink);
}
.cm-ui .cm-desp b { color: var(--navy-500); }

/* =============================================================================
   ETAPA 3 · LA PRE-CARGA — el formulario (mockup B ajustado, 06/08/2026)
   =============================================================================
   Tres tarjetas en dos planos: la cabecera del pedido en el plano 1 (--e1), el
   buscador y el carrito en el 2 (--e2). El acento azure marca lo que se toca;
   el color semántico sigue siendo el de los tokens. */

/* --- Los botones del módulo — SÓLO se dibujan en el celular ----------------
   En escritorio las acciones viven en la barra superior del armazón
   (shellSetAcciones), que es donde el mockup las pone. En el celular no hay
   barra: los mismos descriptores se dibujan acá adentro. */
.cm-ui .cm-acciones {
    display: flex; gap: 8px; flex-wrap: wrap; margin: 0 0 4px;
}
.cm-ui .cm-btn {
    display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
    border-radius: 9px; padding: 8px 14px;
    font: inherit; font-size: .8rem; font-weight: 700; cursor: pointer;
    border: 1px solid var(--azure); background: var(--azure); color: #fff;
    box-shadow: 0 2px 8px rgba(22, 104, 196, .24);
    transition: background .14s ease, border-color .14s ease, color .14s ease,
                box-shadow .18s var(--curva), transform .18s var(--curva);
}
.cm-ui .cm-btn .material-symbols-outlined { font-size: 17px; }
.cm-ui .cm-btn:hover { background: var(--azure-700); border-color: var(--azure-700);
    transform: translateY(-1px); }
.cm-ui .cm-btn:active { transform: translateY(0); }
.cm-ui .cm-btn.secundario {
    background: var(--surface); color: var(--muted);
    border-color: var(--hair-strong); box-shadow: var(--e1);
}
.cm-ui .cm-btn.secundario:hover {
    background: var(--azure-050); border-color: var(--azure); color: var(--azure);
}
.cm-ui .cm-btn.fantasma {
    background: none; border-color: transparent; color: var(--muted); box-shadow: none;
}
.cm-ui .cm-btn.fantasma:hover { background: var(--azure-050); color: var(--azure); }

/* --- La tarjeta de una sección del formulario ------------------------------ */
.cm-ui .cm-card {
    margin: 13px 0 0; background: var(--surface);
    border: 1px solid rgba(16, 32, 64, .05); border-radius: var(--r-card);
    box-shadow: var(--e2); overflow: hidden;
}
/* La cabecera del pedido va un plano MÁS ABAJO que el buscador y el carrito:
   es el «sobre qué», no el «qué se hace». */
.cm-ui .cm-card.cm-cab { box-shadow: var(--e1); }

/* EL DESPLEGABLE QUE SE CORTABA (etapa 9). `.cm-card` lleva `overflow:hidden`
   para que la banda de `.cm-card-h` no se salga por las esquinas redondeadas,
   y eso RECORTABA el desplegable del cliente —que es `position:absolute` y
   vive adentro de esta tarjeta—: al escribir, la tercera opción quedaba
   partida al medio. No se arregla con `z-index`: un elemento recortado por el
   `overflow` de un ancestro se recorta ANTES de apilarse.

   La salida es que suelte el recorte SÓLO la tarjeta que tiene un flotante
   adentro —ésta— y que las esquinas se las redondee la cabecera por su cuenta,
   que es lo que el `overflow` estaba haciendo por ella. Las otras tarjetas
   (el carrito, las de Inicio, `.cm-cli`) quedan como estaban.

   El `z-index` NO reemplaza al `overflow`: hace falta igual para que el
   desplegable se apoye ENCIMA de la tarjeta siguiente, que es hermana. */
.cm-ui .cm-card.cm-cab { overflow: visible; position: relative; z-index: 2; }
.cm-ui .cm-card.cm-cab > .cm-card-h {
    border-radius: calc(var(--r-card) - 1px) calc(var(--r-card) - 1px) 0 0;
}
.cm-ui .cm-card-h {
    display: flex; align-items: baseline; gap: 6px 10px; flex-wrap: wrap;
    padding: 11px 16px; border-bottom: 1px solid var(--hair); background: #fafbfd;
}
.cm-ui .cm-card-h h4 {
    margin: 0; font-size: .68rem; font-weight: 800; text-transform: uppercase;
    letter-spacing: .08em; color: var(--muted);
}
.cm-ui .cm-card-h .s { font-size: .71rem; color: var(--faint); }
.cm-ui .cm-card-h .der { margin-left: auto; font-size: .71rem; color: var(--faint); }

/* --- Los campos — una fila que ENVUELVE, sin grilla de columnas fijas ------
   En el celular los campos bajan de renglón solos: es el flex-wrap el que lo
   decide, no una media query (§3.2 del runbook). */
.cm-ui .cm-campos { display: flex; flex-wrap: wrap; gap: 10px; padding: 13px 16px 3px; }
.cm-ui .cm-campos .f { flex: 1 1 150px; min-width: 0; }
.cm-ui .cm-campos .f.ancho { flex: 2 1 230px; }
.cm-ui .cm-campos .f.corto { flex: 0 1 130px; }
.cm-ui .cm-lbl {
    display: block; font-size: .62rem; text-transform: uppercase;
    letter-spacing: .08em; font-weight: 800; color: var(--muted); margin-bottom: 4px;
}
.cm-ui .cm-lbl .req { color: var(--crit); }
.cm-ui .cm-cab-pie:not(:empty) { padding: 0 16px 14px; }
.cm-ui .cm-cab-pie .cm-risk { margin-top: 11px; }

/* --- El buscador: la lupa adentro del campo, el desplegable debajo --------- */
.cm-ui .cm-smart, .cm-ui .cm-buscar { position: relative; }
.cm-ui .cm-smart .material-symbols-outlined,
.cm-ui .cm-buscar .material-symbols-outlined {
    position: absolute; left: 9px; top: 7px; font-size: 17px;
    color: var(--faint); pointer-events: none;
}
.cm-ui .cm-smart .cm-in, .cm-ui .cm-buscar .cm-in { padding-left: 32px; }
.cm-ui .cm-buscar-caja { padding: 12px 16px 14px; max-width: 470px; }
.cm-ui .cm-buscar-caja .cm-buscar { max-width: none; }

/* El desplegable. `position: static` en la caja del formulario (empuja) y
   ABSOLUTO en el campo de cliente, que está adentro de una fila de campos: ahí
   flotar es lo único que no le corre los campos de al lado a mitad de carga. */
.cm-ui .cm-drop {
    margin: 6px 0 0; padding: 4px; list-style: none;
    background: var(--surface); border: 1px solid var(--hair-strong);
    border-radius: 10px; box-shadow: var(--e2);
    max-height: 320px; overflow-y: auto;
}
.cm-ui .cm-smart .cm-drop {
    position: absolute; left: 0; right: 0; top: 100%; z-index: 30;
}
.cm-ui .cm-opt {
    display: flex; align-items: center; gap: 10px; width: 100%;
    padding: 6px 9px; border: none; background: none; font: inherit;
    text-align: left; border-radius: 7px; cursor: pointer;
}
.cm-ui .cm-opt:hover, .cm-ui .cm-opt:focus-visible { background: var(--azure-050); outline: none; }
.cm-ui .cm-opt .nom { min-width: 0; }
.cm-ui .cm-opt .nom b { display: block; font-size: .78rem; color: var(--ink); }
.cm-ui .cm-opt .nom small { display: block; font-size: .7rem; color: var(--muted); }
.cm-ui .cm-opt .cod {
    margin-left: auto; font-size: .68rem; color: var(--faint); white-space: nowrap;
}
.cm-ui .cm-opt-nada { padding: 8px 10px; font-size: .74rem; color: var(--faint); font-style: italic; }

/* --- Las pestañas de unidad — SUBRAYADO, nunca píldora rellena (§1.2) ------ */
.cm-ui .cm-tabs {
    display: flex; gap: 2px; padding: 4px 10px 0;
    border-bottom: 1px solid var(--hair); overflow-x: auto;
}
.cm-ui .cm-tab {
    position: relative; padding: 9px 13px 8px; font: inherit; font-size: .8rem;
    font-weight: 700; color: var(--muted); background: none; border: none;
    cursor: pointer; display: flex; align-items: baseline; gap: 7px; white-space: nowrap;
}
.cm-ui .cm-tab .n {
    font-style: normal; font-size: .66rem; font-weight: 700; color: var(--faint);
    border: 1px solid var(--hair-strong); border-radius: 999px; padding: 0 6px;
}
.cm-ui .cm-tab:hover { color: var(--azure); }
.cm-ui .cm-tab.on { color: var(--azure); }
.cm-ui .cm-tab.on .n { color: var(--azure); border-color: var(--azure); }
/* El subrayado va en `bottom: 0`, no en `-1px`. Con −1 px asomaba un píxel
   fuera de `.cm-tabs`, que es `overflow-x: auto` —y el CSS obliga entonces a
   `overflow-y: auto`—, así que Chrome le dibujaba una barra de scroll VERTICAL
   al costado de las tres pestañas. Lo agarró la foto de la ronda 9; ninguna
   aserción sobre el HTML lo podía ver. */
.cm-ui .cm-tab.on::after {
    content: ''; position: absolute; left: 10px; right: 10px; bottom: 0;
    height: 2.5px; border-radius: 2px; background: var(--azure);
}

/* --- La miniatura del artículo — la ilustración por presentación, CHICA ---- */
.cm-ui .cm-mini {
    flex: 0 0 auto; width: 30px; height: 30px; border-radius: 6px;
    background: var(--azure-050); display: grid; place-items: center;
    color: var(--navy-500);
}
.cm-ui .cm-mini .material-symbols-outlined { font-size: 19px; }
.cm-ui .cm-art { display: flex; align-items: center; gap: 9px; }
.cm-ui .cm-art .nom b { display: block; font-size: .78rem; font-weight: 600; color: var(--ink); }
.cm-ui .cm-art .nom .cods { display: block; font-size: .64rem; color: var(--faint); margin-top: 1px; }

/* --- El carrito: una parte por unidad -------------------------------------- */
.cm-ui .cm-parte { border-top: 1px solid var(--hair); }
.cm-ui .cm-parte:first-child { border-top: none; }
.cm-ui .cm-parte-h {
    display: flex; align-items: baseline; gap: 6px 10px; flex-wrap: wrap;
    padding: 11px 16px 0;
}
.cm-ui .cm-parte-h .uni {
    font-size: .64rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
    color: var(--faint); border: 1px solid var(--hair-strong); border-radius: 5px; padding: 1px 6px;
}
.cm-ui .cm-parte-h .quien { font-size: .72rem; color: var(--faint); }
.cm-ui .cm-parte-h .sub { margin-left: auto; font-size: .78rem; font-weight: 700; }
.cm-ui .cm-tbl { padding: 0 16px; overflow-x: auto; }
/* Con `min-width` la tabla scrollea ENTERA en vez de aplastar la columna del
   artículo hasta partir el nombre en cuatro renglones. */
.cm-ui .cm-tbl table.cm-g { margin: 6px 0 0; min-width: 460px; }

/* El pie de la parte — AFUERA de la caja que scrollea (ver parteHTML). */
.cm-ui .cm-parte-pie {
    display: flex; align-items: baseline; gap: 6px 16px; flex-wrap: wrap;
    padding: 9px 16px 13px; font-size: .78rem; color: var(--muted);
}
.cm-ui .cm-parte-pie b { font-weight: 700; color: var(--ink); }
.cm-ui .cm-parte-pie .tot { margin-left: auto; font-weight: 700; color: var(--ink); }

/* El campo numérico de una celda. Es `type="text"`: el nativo `number` RECHAZA
   la coma con el teclado castellano (memoria `feedback_input_number_rechaza_la_coma`). */
.cm-ui .cm-num {
    width: 86px; padding: 4px 8px; font: inherit; font-size: .78rem;
    text-align: right; color: var(--ink); background: var(--surface);
    border: 1px solid var(--hair-strong); border-radius: 7px;
}
.cm-ui .cm-num:focus {
    outline: none; border-color: var(--azure); box-shadow: 0 0 0 3px var(--azure-050);
}
.cm-ui .cm-quitar {
    background: none; border: 1px solid transparent; border-radius: 7px;
    padding: 3px 4px; cursor: pointer; color: var(--faint); line-height: 0;
    transition: background-color .14s ease, color .14s ease;
}
.cm-ui .cm-quitar .material-symbols-outlined { font-size: 16px; }
.cm-ui .cm-quitar:hover, .cm-ui .cm-quitar:focus-visible {
    background: var(--crit-050); color: var(--crit); border-color: var(--crit-hair); outline: none;
}

/* El total del pedido — las dos partes juntas. Regla dura arriba: es la única
   cifra del formulario que cierra todo, y no compite con nada por tamaño
   (memoria `feedback_evitar_numeros_gigantes`). */
.cm-ui .cm-total {
    display: flex; align-items: baseline; gap: 12px; padding: 11px 20px;
    border-top: 2px solid var(--ink);
}
.cm-ui .cm-total .t {
    font-size: .68rem; font-weight: 800; text-transform: uppercase;
    letter-spacing: .08em; color: var(--muted);
}
.cm-ui .cm-total .v { margin-left: auto; font-size: .95rem; font-weight: 800; }
.cm-ui .cm-pc .cm-desp { margin: 13px 16px 16px; }
.cm-ui .cm-desp.crit {
    background: var(--crit-050); border-color: var(--crit-hair);
    border-left-color: var(--crit);
}
.cm-ui .cm-desp.crit b { color: var(--crit); }

/* La parte dentro de la ficha de una pre-carga enviada (sólo lectura). */
.cm-ui .cm-parte-ficha { margin-top: 14px; }
.cm-ui .cm-parte-ficha .cm-parte-h { padding: 0; }
.cm-ui .cm-parte-ficha table.cm-g { margin-top: 6px; }

/* =============================================================================
   ETAPA 4 · LA BANDEJA DE AUTORIZACIÓN (mockup B, elegido el 07/08/2026)
   =============================================================================
   «El expediente en la fila»: una columna de tarjetas, cada parte se abre donde
   está y se resuelve ahí mismo. Es la ÚNICA pantalla del módulo que no vive en
   el armazón del rol 9: se monta adentro de Pedidos & Ventas y de Endulzantes,
   que siguen en Tailwind. De ahí dos cosas:

     · TODO cuelga de `.cm-ui`, como el resto del archivo, y por eso convive sin
       repintar un píxel de los módulos viejos (regla 11 del runbook);
     · la pantalla se dibuja su propia CABECERA. En el rail del comercial eso lo
       hace `shellSetContexto()`; en estas dos casas no hay barra superior donde
       publicar nada.

   El color sigue significando estado y nada más: ámbar cuando le falta un dato
   al ABM, rojo sólo en el rechazo —la única acción que le devuelve trabajo a
   alguien—, y azure para lo que se toca. */

.cm-ui .cm-bnd-h {
    display: flex; align-items: baseline; gap: 5px 14px; flex-wrap: wrap;
    padding: 13px 22px 12px;
    background: var(--surface); border-bottom: 1px solid var(--hair);
    box-shadow: var(--e1);
}
.cm-ui .cm-bnd-h h3 { margin: 0; font-size: .95rem; font-weight: 800; color: var(--ink); }
.cm-ui .cm-bnd-h .s { font-size: .75rem; color: var(--muted); }
.cm-ui .cm-bnd-h .der { margin-left: auto; font-size: .72rem; color: var(--faint); }

/* Las marcas: lo que el autorizante tiene que saber ANTES de abrir la tarjeta.
   Ámbar = falta un dato del ABM y el remito no va a poder salir. Navy = hay
   otra unidad mirando el mismo pedido. Ninguna de las dos dice «malo». */
.cm-ui .cm-marca {
    display: inline-flex; align-items: center; gap: 4px;
    font-size: .63rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
    border: 1px solid var(--hair-strong); border-radius: 5px; padding: 1px 6px;
    color: var(--faint); background: var(--surface);
}
.cm-ui .cm-marca .material-symbols-outlined { font-size: 13px; }
.cm-ui .cm-marca.alerta { color: var(--warn); border-color: var(--warn-hair); background: var(--warn-050); }
.cm-ui .cm-marca.nav { color: var(--navy-500); border-color: #cfdcf0; background: var(--navy-050); }
.cm-ui .cm-marca.ok { color: var(--ok); border-color: var(--ok-hair); background: var(--ok-050); }
.cm-ui .cm-marca.crit { color: var(--crit); border-color: var(--crit-hair); background: var(--crit-050); }

/* La antigüedad es el único número de esta pantalla que empeora solo: a partir
   del umbral se pinta, y hasta ahí va en gris como cualquier otro dato. */
.cm-ui .cm-edad { font-size: .72rem; color: var(--faint); }
.cm-ui .cm-edad.vieja { color: var(--warn); font-weight: 700; }

/* --- La tarjeta que se abre en el lugar ------------------------------------ */
.cm-ui .cm-abre {
    display: block; width: 100%; text-align: left; cursor: pointer;
    font: inherit; color: var(--ink); background: none; border: none;
    /* La canaleta derecha es del chevron: sin ella queda debajo del importe,
       que también va a la derecha, y los dos se leen como un choque. */
    padding: 11px 38px 11px 18px; position: relative;
    transition: background-color .15s var(--curva);
}
.cm-ui .cm-abre:hover, .cm-ui .cm-abre:focus-visible { background: var(--azure-050); outline: none; }
.cm-ui .cm-abre::before {
    content: ''; position: absolute; left: 6px; top: 11px; bottom: 11px;
    width: 3px; border-radius: 2px; background: var(--hair-strong);
}
.cm-ui .cm-abre.avisa::before { background: var(--warn); }
.cm-ui .cm-tar.abierta .cm-abre { border-bottom: 1px solid var(--hair); background: #fafbfd; }
.cm-ui .cm-tar.abierta .cm-abre::before { background: var(--azure); }
.cm-ui .cm-abre .l1, .cm-ui .cm-abre .l2 {
    display: flex; gap: 4px 12px; align-items: baseline; flex-wrap: wrap;
}
.cm-ui .cm-abre .cli { font-weight: 700; font-size: .84rem; color: var(--ink); }
.cm-ui .cm-abre .num { font-size: .74rem; font-weight: 700; color: var(--azure); }
.cm-ui .cm-abre .imp { margin-left: auto; font-weight: 700; font-size: .84rem; white-space: nowrap; }
.cm-ui .cm-abre .l2 { margin-top: 3px; font-size: .74rem; color: var(--muted); }
/* A la altura del PRIMER renglón, no al medio: con dos o tres líneas de
   cabecera, centrado se lee como un signo suelto en el aire. */
.cm-ui .cm-abre .chev {
    position: absolute; right: 11px; top: 13px; width: 20px; text-align: center;
    color: var(--faint); line-height: 0;
}
.cm-ui .cm-abre .chev .material-symbols-outlined { font-size: 20px; }
.cm-ui .cm-tar.abierta .cm-abre .chev { color: var(--azure); transform: rotate(180deg); }
.cm-ui .cm-cuerpo { padding: 0 0 2px; }
.cm-ui .cm-cuerpo .cm-dl { padding: 13px 16px 0; }
.cm-ui .cm-cuerpo .cm-risk, .cm-ui .cm-cuerpo .cm-desp { margin: 12px 16px 0; }

/* --- El pie de acciones ----------------------------------------------------- */
.cm-ui .cm-pie {
    display: flex; gap: 9px; flex-wrap: wrap; align-items: center;
    padding: 12px 16px; border-top: 1px solid var(--hair); background: #fafbfd;
}
.cm-ui .cm-pie .nota { margin-left: auto; font-size: .72rem; color: var(--faint); text-align: right; }
.cm-ui .cm-btn.rechazo {
    background: var(--surface); color: var(--crit);
    border-color: var(--crit-hair); box-shadow: var(--e1);
}
.cm-ui .cm-btn.rechazo:hover { background: var(--crit-050); border-color: var(--crit); color: var(--crit); }
.cm-ui .cm-btn.confirma {
    background: var(--crit); border-color: var(--crit); color: #fff;
    box-shadow: 0 2px 8px rgba(198, 40, 40, .24);
}
.cm-ui .cm-btn.confirma:hover { background: #a81f1f; border-color: #a81f1f; }
/* Un botón apagado no se levanta al pasarle por encima: prometer una acción que
   no está disponible es peor que no dibujarla. */
.cm-ui .cm-btn[disabled] { opacity: .5; cursor: not-allowed; box-shadow: none; }
.cm-ui .cm-btn[disabled]:hover { transform: none; }

/* El motivo del rechazo se abre EN EL PIE, no en un modal: es un campo, no un
   cartel (memoria `feedback_no_todo_cartel_es_un_modal`), y el autorizante
   necesita seguir viendo los renglones mientras escribe por qué los rechaza. */
.cm-ui .cm-motivo {
    padding: 12px 16px; border-top: 1px solid var(--crit-hair); background: var(--crit-050);
}
.cm-ui .cm-motivo .cm-lbl { color: var(--crit); }
.cm-ui .cm-motivo textarea.cm-in {
    min-height: 52px; resize: vertical; border-color: var(--crit-hair);
}
.cm-ui .cm-motivo textarea.cm-in:focus {
    border-color: var(--crit); box-shadow: 0 0 0 3px rgba(198, 40, 40, .12);
}
.cm-ui .cm-motivo .fila { display: flex; gap: 9px; align-items: center; margin-top: 9px; flex-wrap: wrap; }
.cm-ui .cm-motivo .fila .ay { font-size: .72rem; color: var(--crit); }

/* Un renglón corregido se marca MIENTRAS se decide, con el valor que traía
   abajo: lo que cambió queda registrado y el comercial lo va a ver, así que el
   autorizante tiene que poder verlo antes de apretar. */
.cm-ui .cm-num.tocado { border-color: var(--azure); background: var(--azure-050); font-weight: 700; }
.cm-ui .cm-antes { display: block; font-size: .63rem; color: var(--faint); margin-top: 2px; text-align: right; }

/* =============================================================================
   ETAPA 6 · MIS CLIENTES — la cuenta corriente (mockup B, 08/08/2026)
   =============================================================================
   «La cobranza»: la unidad de la pantalla es el COMPROBANTE. Reusa entera la
   tarjeta que se abre en el lugar de la bandeja de autorización (`.cm-tar` /
   `.cm-abre` / `.cm-cuerpo`) — es la misma forma resolviendo el mismo problema,
   así que no se dibuja de nuevo—; lo que agrega es lo que esta pantalla tiene y
   ninguna otra: la FOTO, el importe con rótulo, las cinco cajas y el
   vencimiento en palabras.

   El color sigue significando estado, y acá el estado es **lo vencido**: ámbar
   de 1 a 60 días, rojo a partir de 61, gris si no hay nada vencido. El signo del
   saldo NO es un estado — un cliente puede estar a favor y tener una nota de
   débito de hace dos meses—, así que «a favor» se dice con el RÓTULO y con navy,
   nunca con verde. */

/* El campo del buscador va ENVUELTO en `.cm-buscar` (la lupa adentro), así que
   el flex de la barra le pega al envoltorio y no al campo: sin esta regla el
   buscador no se estira y queda un cuadradito al lado de los chips. */
.cm-ui .cm-barra .cm-buscar { flex: 1 1 220px; min-width: 170px; }

/* --- LA FOTO: dice que es una foto, y arriba de cualquier cifra (§3.5) ------ */
.cm-ui .cm-foto {
    display: flex; align-items: baseline; gap: 5px 10px; flex-wrap: wrap;
    margin: 13px 0 0; padding: 7px 13px; border-radius: 9px;
    background: var(--navy-050); border: 1px solid #cfdcf0;
    font-size: .73rem; color: var(--navy-500); line-height: 1.55;
}
.cm-ui .cm-foto .material-symbols-outlined { font-size: 15px; align-self: center; }
.cm-ui .cm-foto b { font-weight: 700; }
.cm-ui .cm-foto .der { margin-left: auto; }
/* Una foto vieja es un problema operativo, no decorativo: la pantalla no promete
   «se actualiza a las 09:00» —la tarea diaria todavía no está registrada, §9.17
   del runbook— así que cuando la foto envejece lo dice. */
.cm-ui .cm-foto.alerta {
    background: var(--warn-050); border-color: var(--warn-hair); color: var(--warn);
}
.cm-ui .cm-foto .der.avisa { font-weight: 700; }

/* --- EL IMPORTE de una cabecera: el rótulo cambia con el signo -------------
   «Debe −894.633,81» no es una frase que alguien diga: el número va SIEMPRE en
   positivo y lo que cambia es el rótulo. 13 de los 143 clientes reales están a
   favor, así que no es un caso de borde. */
.cm-ui .cm-plata { margin-left: auto; text-align: right; white-space: nowrap; }
.cm-ui .cm-plata .r {
    display: block; font-size: .6rem; font-weight: 700; letter-spacing: .07em;
    text-transform: uppercase; color: var(--faint);
}
.cm-ui .cm-plata .v {
    display: block; font-size: .88rem; font-weight: 700; color: var(--ink);
    font-variant-numeric: tabular-nums;
}
.cm-ui .cm-plata.favor .v { color: var(--navy-500); }
/* El saldo que no se sabe NO es un cero (§3.6): va en palabras y en itálica. */
.cm-ui .cm-plata.nulo .v {
    color: var(--faint); font-style: italic; font-weight: 400; font-size: .76rem;
}

/* --- LAS CINCO CAJAS DE ANTIGÜEDAD -----------------------------------------
   CELDAS, no barras, y no es una preferencia: **21 de los 143 clientes reales
   tienen alguna caja en NEGATIVO** —LODISER SA trae 0-30 en 152.219.992,20,
   31-60 en −60.419.992,92 y 61-90 en −91.799.999,28, con saldo final CERO—.
   Una barra de largo negativo no se puede dibujar; una celda con el signo a la
   vista, sí. */
.cm-ui .cm-ant {
    display: grid; grid-template-columns: repeat(5, 1fr);
    border: 1px solid var(--hair); border-radius: 10px; overflow: hidden;
    background: var(--surface); margin: 12px 16px 0;
}
.cm-ui .cm-ant .c { padding: 7px 9px; border-left: 1px solid var(--hair); text-align: right; }
.cm-ui .cm-ant .c:first-child { border-left: none; }
.cm-ui .cm-ant .c .r {
    display: block; font-size: .58rem; font-weight: 700; letter-spacing: .06em;
    text-transform: uppercase; color: var(--faint); white-space: nowrap;
}
.cm-ui .cm-ant .c .v {
    display: block; font-size: .76rem; font-weight: 700; color: var(--ink); margin-top: 1px;
}
.cm-ui .cm-ant .c.cero .v { color: var(--faint); font-weight: 400; }
.cm-ui .cm-ant .c.neg .v { color: var(--navy-500); }
.cm-ui .cm-ant .c.avencer { background: #fafbfd; }
.cm-ui .cm-ant .c.w1 .v { color: var(--warn); }
.cm-ui .cm-ant .c.w2 .v { color: var(--crit); }
.cm-ui .cm-ant-pie {
    margin: 5px 18px 0; font-size: .69rem; color: var(--faint); line-height: 1.5;
}
.cm-ui .cm-ant-pie b { color: var(--muted); font-weight: 700; }

/* La fecha de emisión, escrita DOS veces en el HTML: en su columna (escritorio)
   y bajo el número (celular). No es duplicar un dato: es el mismo dato en el
   único lugar donde entra, y lo decide el CSS y no una rama de JS. */
.cm-ui table.cm-g small.fec { display: none; }

/* LA ÚNICA MEDIA QUERY DEL MÓDULO, y es de CONTENIDO, no de estructura: son
   importes de nueve dígitos, que ocupan lo que ocupan. Abajo de 560 px:
     · las cinco cajas pasan a DOS columnas (con tres, «−$ 14.256.362,92» se
       partía en dos renglones);
     · la tabla de comprobantes suelta la columna Fecha y la muestra abajo del
       número, y deja de tener min-width. Con las cuatro columnas la tabla
       scrolleaba de costado y la que se iba de pantalla era «Debe» — el número
       por el que se abre esta pantalla. Se vio sacándole la foto al celular,
       no leyendo el código. */
@media (max-width: 560px) {
    .cm-ui .cm-ant { grid-template-columns: repeat(2, 1fr); }
    .cm-ui .cm-ant .c:nth-child(odd) { border-left: none; }
    .cm-ui .cm-ant .c:nth-child(n+3) { border-top: 1px solid var(--hair); }
    .cm-ui .cm-ant .c .v { white-space: nowrap; }

    .cm-ui .cm-tbl table.cm-g.cm-comp { min-width: 0; }
    .cm-ui table.cm-g.cm-comp .fecha { display: none; }
    .cm-ui table.cm-g.cm-comp small.fec { display: block; color: var(--faint); font-size: .66rem; }
    .cm-ui table.cm-g.cm-comp th, .cm-ui table.cm-g.cm-comp td { padding: 6px 5px; }
    /* Un importe partido en dos renglones («−$» arriba y las cifras abajo) no se
       lee como una cifra. Que entre entero lo comprueba el banco MIDIENDO la
       tabla a 390 px: si algún día no entra, se pone rojo ahí y no acá. */
    .cm-ui table.cm-g.cm-comp td.n { white-space: nowrap; }
}

/* --- EL VENCIMIENTO EN PALABRAS -------------------------------------------
   `diasAtraso: −32` es «vence en 32 días», no «atraso −32». La fecha arriba y
   qué significa abajo: el vendedor lee la segunda línea, no resta fechas. */
.cm-ui .cm-vto { display: block; white-space: nowrap; }
.cm-ui .cm-vto small { display: block; font-size: .68rem; color: var(--faint); }
.cm-ui .cm-vto.atras small { color: var(--warn); font-weight: 700; }
.cm-ui .cm-vto.atras.mucho small { color: var(--crit); }

/* Un comprobante en negativo es un crédito sin aplicar: navy, que en este módulo
   es estructura e información — nunca verde, que diría «está bien». */
.cm-ui table.cm-g td.favor { color: var(--navy-500); }
.cm-ui table.cm-g small.par {
    display: block; font-size: .66rem; color: var(--faint); font-style: italic;
}

/* --- EL GRUPO DE UN CLIENTE ------------------------------------------------ */
/* La franja de la cabecera: rojo a partir de 61 días. `.avisa` (ámbar) ya lo
   trae la bandeja y significa lo mismo — algo que mirar antes de seguir. */
.cm-ui .cm-abre.debe::before { background: var(--crit); }
/* El cliente sin comprobantes no se abre: no hay nada abajo. Un chevron que no
   lleva a ninguna parte es peor que no dibujarlo, así que tampoco va. */
.cm-ui .cm-abre[disabled] { cursor: default; }
.cm-ui .cm-abre[disabled]:hover { background: none; }
.cm-ui .cm-cuerpo-nota {
    margin: 11px 16px 0; font-size: .72rem; color: var(--faint); font-style: italic;
}
.cm-ui .cm-grp .cm-desp { margin: 12px 16px 14px; }
.cm-ui .cm-grp .cm-tbl { padding: 12px 16px 0; }

/* =============================================================================
   ETAPA 7 · FACTURAS — la carpeta del cliente (mockup B, 08/08/2026)
   =============================================================================
   Reusa ENTERA la tarjeta que se abre en el lugar (`.cm-tar` / `.cm-abre` /
   `.cm-cuerpo`) y la tira de la foto de la etapa 6: es la tercera pantalla del
   módulo con la misma forma, y eso es lo que la hace aprendible. Lo único propio
   es lo que esta pantalla tiene y ninguna otra: la tabla de comprobantes con su
   columna de COPIA, el comprobante anulado, y la segunda barra de chips —la del
   período—, que es un eje distinto del filtro y por eso va en su propia fila. */

/* La barra del período. Va pegada a la de filtros: son dos ejes de la misma
   pregunta («cuáles» y «de cuándo»), no dos secciones. */
.cm-ui .cm-vent { margin-top: 9px; }

/* Un comprobante ANULADO va tachado, en el número y en el importe. Son cuatro en
   toda la base y son de 34 millones cada uno: sin esto, un vendedor los lee como
   deuda del cliente y sale a reclamar algo que no existe. */
.cm-ui .cf-anul, .cm-ui .cb-anul { text-decoration: line-through; color: var(--crit); }
.cm-ui table.cm-g td.n.cf-anul, .cm-ui table.cm-g td.n.cb-anul { color: var(--faint); }

/* La tabla de comprobantes. El `min-width` NO es decorativo: sin él, en una
   columna angosta el navegador aprieta la celda del importe hasta partir
   «$ 27.404.000,00» en dos renglones —el «$» arriba y las cifras abajo— y deja de
   leerse como una cifra. Con min-width la tabla scrollea de costado y el número
   queda entero. Es exactamente lo que la etapa 6 dejó escrito acá arriba para
   `.cm-comp`, y volvió a hacer falta. */
.cm-ui .cm-tbl table.cm-g.cm-fx { min-width: 490px; }
.cm-ui table.cm-g.cm-fx th.n, .cm-ui table.cm-g.cm-fx td.n { white-space: nowrap; }
/* La columna de la copia no se estira: el botón mide lo que mide. */
.cm-ui table.cm-g.cm-fx td.n:last-child { width: 1%; }
.cm-ui table.cm-g.cm-fx .cm-marca { white-space: nowrap; }

/* El anillo del botón mientras busca la copia: la reimpresión abre una pestaña,
   y sin esto el vendedor aprieta dos veces creyendo que no pasó nada. */
.cm-ui .cm-btn .gs-spin { width: 14px; height: 14px; border-width: 2px; }

/* ABAJO DE 560 px LA TABLA DEJA DE SER UNA TABLA, y no es una preferencia: se
   MIDIÓ. Esta pantalla tiene una columna más que la de Mis Clientes —la de la
   copia, que lleva un botón— y con las cuatro no entra en 390 px ni apagando la
   Fecha: quedan 314 px útiles contra 345 que piden las columnas, así que la caja
   scrollea de costado y lo que se va es el importe o el botón. La salida no es
   achicar el botón hasta un ícono suelto (la acción por la que se abre esta
   pantalla no puede quedar sin nombre): es que cada comprobante pase a ser un
   BLOQUE, con el número arriba, el importe debajo y la acción al pie.

   Es la tercera vez que este módulo paga la misma trampa —los totales del
   carrito en la etapa 3, la columna «Debe» en la 6— y las tres las agarró la
   medición a 390 px, nunca una aserción sobre el HTML. */
@media (max-width: 560px) {
    .cm-ui .cm-tbl table.cm-g.cm-fx { min-width: 0; }
    .cm-ui table.cm-g.cm-fx thead { display: none; }
    .cm-ui table.cm-g.cm-fx,
    .cm-ui table.cm-g.cm-fx tbody,
    .cm-ui table.cm-g.cm-fx tr,
    .cm-ui table.cm-g.cm-fx td { display: block; width: auto; }
    .cm-ui table.cm-g.cm-fx tr {
        padding: 8px 0; border-bottom: 1px solid var(--hair);
    }

    .cm-ui table.cm-g.cm-fx tr:last-child { border-bottom: none; }
    .cm-ui table.cm-g.cm-fx td { border-bottom: none; padding: 1px 0; }
    /* La columna Fecha se apaga: la MISMA fecha ya está escrita bajo el número
       (`small.fec`), que es donde entra. No es duplicar un dato — es el mismo
       dato en el único lugar donde cabe, y lo decide el CSS, no una rama de JS. */
    .cm-ui table.cm-g.cm-fx td.fecha { display: none; }
    .cm-ui table.cm-g.cm-fx small.fec { display: block; color: var(--faint); font-size: .66rem; }
    /* El importe suelta la alineación a la derecha —en un bloque no hay contra
       qué alinearlo— y crece: es lo que identifica el papel. */
    .cm-ui table.cm-g.cm-fx td.n {
        text-align: left; white-space: nowrap; font-size: .84rem; font-weight: 700;
        margin-top: 3px;
    }
    .cm-ui table.cm-g.cm-fx td.n:last-child {
        margin-top: 6px; font-size: inherit; font-weight: inherit;
    }
}

/* El botón chico de una celda de tabla. */
.cm-ui .cm-btn.chico {
    padding: 5px 10px; font-size: .72rem; border-radius: 8px;
}
.cm-ui .cm-btn.chico .material-symbols-outlined { font-size: 15px; }

/* =============================================================================
   ETAPA 8 · EL TABLERO DE INICIO — «el resumen» (mockup A, 08/08/2026)
   =============================================================================
   Cinco cajas por tema, cada una `.cm-card` con `.cm-card-h`: la tarjeta que el
   módulo ya usa en las otras tres pantallas. Lo único propio es la TIRA DE KPI
   (`.cm-kpi`), su nota al pie (`.cm-kpi-pie`) y el botón que dice a qué pantalla
   se va (`.cm-ir`). Los renglones de respaldo son `.cm-row`, los mismos de Mis
   Pedidos, y el caso vacío es `.cm-nada chica`: nada de eso se dibuja de nuevo.

   NADA DE NÚMEROS GIGANTES (memoria `feedback_evitar_numeros_gigantes`): la cifra
   es `1.02rem` — un escalón sobre el `.76rem` de `.cm-ant`, muy por debajo del
   techo de `1.42rem` de `.abm-stat .v`. Este tablero lo mira un vendedor en el
   celular a las siete de la mañana: que grite el COLOR, no el cuerpo. */

/* La tira de KPI. Es la celda de las cinco cajas de antigüedad (`.cm-ant`) con
   el dialecto del ABM —rótulo arriba, cifra, y una línea chica que la explica— y
   `auto-fit` en vez de cinco columnas fijas: una caja lleva dos cifras y otra
   tres, y una grilla fija dejaría un hueco en la de dos. */
.cm-ui .cm-kpi {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));
    border-bottom: 1px solid var(--hair); background: var(--surface);
}
.cm-ui .cm-kpi .c { padding: 10px 15px; border-left: 1px solid var(--hair); min-width: 0; }
.cm-ui .cm-kpi .c:first-child { border-left: none; }
.cm-ui .cm-kpi .c .r {
    display: block; font-size: .58rem; font-weight: 800; letter-spacing: .07em;
    text-transform: uppercase; color: var(--faint);
}
.cm-ui .cm-kpi .c .v {
    display: block; font-size: 1.02rem; font-weight: 800; line-height: 1.25;
    color: var(--ink); margin-top: 2px;
}
.cm-ui .cm-kpi .c .n {
    display: block; font-size: .66rem; color: var(--faint); margin-top: 2px;
    line-height: 1.4;
}
/* UN CERO CONTADO VA CON RAYA Y PALABRA, NUNCA FORMATEADO. Un `$ 0,00` al lado
   de una cifra de nueve dígitos se lee como una cifra (memoria
   `feedback_cero_que_nadie_conto`), y en esta pantalla lo encontró la FOTO del
   mockup — el banco lo daba por bueno. La raya no se pinta con el color de la
   caja: no hay nada que avisar. */
.cm-ui .cm-kpi .c.cero .v { color: var(--faint); font-weight: 400; }
.cm-ui .cm-kpi .c.w1 .v { color: var(--warn); }
.cm-ui .cm-kpi .c.w2 .v { color: var(--crit); }
.cm-ui .cm-kpi .c.nav .v { color: var(--navy-500); }
.cm-ui .cm-kpi .c.ok .v { color: var(--ok); }

/* La nota que explica una cifra. Es donde vive lo que la ronda destapó y no
   entra en un rótulo: que el vencido se cuenta comprobante por comprobante y
   cuánto daría el campo neteado, que un DI no está en Facturas, y cuántos
   clientes no se pueden mirar. */
.cm-ui .cm-kpi-pie {
    margin: 9px 16px 0; font-size: .69rem; color: var(--faint); line-height: 1.55;
}
.cm-ui .cm-kpi-pie b { color: var(--muted); font-weight: 700; }
.cm-ui .cm-kpi-pie:last-child { margin-bottom: 13px; }

/* El pie que lleva a la pantalla de la caja. Va a la izquierda y en fantasma: es
   una salida, no la acción principal — el tablero INFORMA (el eje de la ronda),
   así que el botón acompaña y no empuja. */
.cm-ui .cm-ir {
    display: flex; align-items: center; gap: 3px; width: 100%;
    padding: 9px 15px; margin-top: 0;
    font: inherit; font-size: .74rem; font-weight: 700; color: var(--azure);
    background: none; border: none; border-top: 1px solid var(--hair);
    text-align: left; cursor: pointer;
    transition: background-color .15s var(--curva);
}
.cm-ui .cm-ir:hover, .cm-ui .cm-ir:focus-visible { background: var(--azure-050); outline: none; }
.cm-ui .cm-ir .material-symbols-outlined { font-size: 17px; }
/* Pegado a los renglones, la raya del pie y la del ultimo renglon eran DOS, con
   una banda vacia en el medio (se vio en la foto de la caja «Por vencer», donde
   el pie va justo despues de las filas). Detras de una nota o de un aviso, en
   cambio, el aire hace falta: ahi el pie no cierra una lista, empieza otra cosa. */
.cm-ui .cm-rows + .cm-ir { border-top: none; }
.cm-ui .cm-kpi-pie + .cm-ir,
.cm-ui .cm-risk + .cm-ir,
.cm-ui .cm-nada + .cm-ir { margin-top: 11px; }

/* Los renglones de respaldo van pegados al KPI, sin el margen de tarjeta. */
.cm-ui .cm-tablero .cm-rows { border-bottom: 1px solid var(--hair); }
.cm-ui .cm-tablero .cm-rows:last-child { border-bottom: none; }
.cm-ui .cm-tablero .cm-nada.chica {
    margin: 0; border: none; border-radius: 0; box-shadow: none; text-align: left;
}
.cm-ui .cm-tablero .cm-nada.chica p { text-align: left; }
.cm-ui .cm-tablero .cm-risk { margin: 11px 16px 0; }

/* EL ÁMBAR LE FALTABA A `.cm-row`: la etapa 2 tenía tres niveles de estado de
   pedido y ninguno era «hay que mirarlo pero todavía no es grave». La mora sí lo
   necesita — es la MISMA regla de la etapa 6: `e-crit` a partir de 61 días,
   `e-warn` de 1 a 60 — y habla de lo VENCIDO, nunca del signo del saldo. */
.cm-ui .cm-row.e-warn::before { background: var(--warn); }
.cm-ui .cm-row.e-warn .l2 .est { color: var(--warn); }

/* LA CUARTA VEZ QUE ESTE MÓDULO PAGA LOS 390 px, y la cuarta que la agarra la
   FOTO y no una aserción (carrito en la 3, «Debe» en la 6, el importe en la 7).
   Acá el importe se PEGABA al nombre cuando el nombre era corto y bajaba de
   renglón cuando era largo: «MAYCAR SA $ 2.035.128,98» en una línea y DELIVERY
   HERO en dos. Un número que cambia de lugar según el largo del texto de al lado
   no se puede comparar de arriba abajo.

   NO ALCANZA con `display:block` en `.cant`: adentro de un flex no corta línea.
   Va el `.l1` entero a bloque y `.suc` a bloque, y ahí `.cant` arranca solo. */
@media (max-width: 560px) {
    .cm-ui .cm-tablero .cm-row .l1 { display: block; }
    .cm-ui .cm-tablero .cm-row .l1 .suc { display: block; }
    .cm-ui .cm-tablero .cm-row .l1 .cant { display: block; margin-left: 0; margin-top: 2px; }

    /* Dos columnas, y LA CELDA IMPAR SOBRANTE OCUPA EL ANCHO ENTERO: con tres
       cifras, la tercera quedaba sola en media pantalla y con medio renglón de
       aire al lado. */
    .cm-ui .cm-kpi { grid-template-columns: repeat(2, 1fr); }
    .cm-ui .cm-kpi .c:nth-child(odd) { border-left: none; }
    .cm-ui .cm-kpi .c:nth-child(n+3) { border-top: 1px solid var(--hair); }
    .cm-ui .cm-kpi .c:last-child:nth-child(odd) { grid-column: 1 / -1; }
}

/* =============================================================================
   ETAPA 9 · «LOS PLANOS» — la jerarquía sale del PESO (mockup B, 15/08/2026)
   =============================================================================
   El eje de la ronda era **¿la jerarquía la da la SECUENCIA o el PESO?** y ganó
   el peso: se descartó la A («los pasos», un bloque abierto por vez con los
   resueltos plegados a un renglón). La consecuencia hay que respetarla al leer
   esto: **NADA SE PLIEGA Y NADA CAMBIA DE LUGAR**. Si alguna vez una pantalla
   de este módulo esconde un bloque detrás de un resumen, es otra decisión.

   Son TRES PESOS Y NO CUATRO, y la cuenta importa:
     · navy    — el bloque que CONTIENE el pedido (la cabecera, lo armado)
     · `.suave` — la herramienta que opera sobre él (el buscador de artículos)
     · blanco  — todo lo de adentro
   Con las tres cabeceras en navy deja de ser jerarquía y pasa a ser una cebra.

   El scope es `.cm-pantalla.plano`, no `.cm-ui` a secas: Mis Clientes y
   Facturas siguen con la tarjeta plana de sus etapas y esta ronda no las toca.
   ========================================================================== */

.cm-ui .plano .cm-card { margin-top: 20px; }
.cm-ui .plano .cm-card:first-child { margin-top: 13px; }
.cm-ui .plano .cm-card-h {
    background: var(--navy); border-bottom: none;
    padding: 10px 16px; align-items: center;
}
.cm-ui .plano .cm-card-h h4 { color: #fff; font-size: .72rem; letter-spacing: .09em; }
.cm-ui .plano .cm-card-h .s,
.cm-ui .plano .cm-card-h .der { color: rgba(255, 255, 255, .72); }
.cm-ui .plano .cm-card.cm-cab > .cm-card-h {
    border-radius: calc(var(--r-card) - 1px) calc(var(--r-card) - 1px) 0 0;
}
.cm-ui .plano .cm-card-h .material-symbols-outlined {
    flex: 0 0 auto; font-size: 17px; color: #fff; opacity: .9; align-self: center;
}
/* El bloque secundario: gris azulado, con el título en navy. */
.cm-ui .plano .cm-card.suave .cm-card-h {
    background: #eef2f8; border-bottom: 1px solid var(--hair);
}
.cm-ui .plano .cm-card.suave .cm-card-h h4 { color: var(--navy-500); }
.cm-ui .plano .cm-card.suave .cm-card-h .s,
.cm-ui .plano .cm-card.suave .cm-card-h .der { color: var(--faint); }
.cm-ui .plano .cm-card.suave .cm-card-h .material-symbols-outlined { color: var(--navy-500); }

/* --- LA CABECERA DE UN CLIENTE en Mis Pedidos ------------------------------
   La agrupación por cliente de la etapa 2 NO se toca —era el eje de aquella
   ronda—: lo que cambia es que su cabecera pasa a pesar como las del dialecto.
   Se restila `.cm-cli-h` en vez de cambiar el marcado a `.cm-card-h` a
   propósito: `.cm-card-h h4` va en VERSALITAS, y el nombre de un cliente no es
   un rótulo de sección — «cliente fuera del maestro» en mayúsculas se leería
   como un grito.

   El color sale del pedido más urgente que tiene adentro —la misma regla que
   ya pinta la franja de 3 px de cada renglón, subida un nivel—, así que sigue
   sin haber un color por categoría: rojo sólo si algo volvió RECHAZADO, que es
   lo único de esta pantalla que le pide algo al comercial. */
.cm-ui .plano .cm-cli { border: none; }
.cm-ui .plano .cm-cli-h {
    background: var(--navy); border-bottom: none; padding: 10px 16px; align-items: center;
}
.cm-ui .plano .cm-cli-h .nom { color: #fff; font-size: .88rem; }
.cm-ui .plano .cm-cli-h .det,
.cm-ui .plano .cm-cli-h .ult { color: rgba(255, 255, 255, .72); }
.cm-ui .plano .cm-cli-h .cm-vacio { color: rgba(255, 255, 255, .8); }
.cm-ui .plano .cm-cli-h .material-symbols-outlined {
    flex: 0 0 auto; font-size: 17px; color: #fff; opacity: .9; align-self: center;
}
.cm-ui .plano .cm-cli.urge .cm-cli-h { background: var(--crit); }

/* --- LA GRILLA DE INICIO ---------------------------------------------------
   La cartera ocupa el ancho entero: es la única caja de la que cuelgan las
   otras cuatro. En el celular vuelve a una columna SIN cambiar el orden — las
   cinco cajas y su orden son la decisión de la etapa 8 y esta ronda no los
   toca, sólo los acomoda. */
.cm-ui .cm-grid { display: grid; gap: 13px; grid-template-columns: 1fr; align-items: start; }
.cm-ui .cm-grid > .cm-card { margin-top: 0; }
/* Lo que NO es una caja —el anillo de espera y el aviso de error— ocupa el
   ancho entero. Sin esto, «No se pudo armar el tablero» quedaba en media
   pantalla con la otra mitad vacía al lado. */
.cm-ui .cm-grid > :not(.cm-card) { grid-column: 1 / -1; }
@media (min-width: 760px) {
    .cm-ui .cm-grid { grid-template-columns: 1fr 1fr; }
    .cm-ui .cm-grid > .cm-card.ancha { grid-column: 1 / -1; }
}

/* La barra del día: el rótulo, la fecha y la ÚNICA acción que el módulo crea.
   No reordena nada ni opina sobre urgencias — el tablero sigue informando
   (etapa 8) —: agrega la salida que un tablero sin un solo botón no tenía. */
.cm-ui .cm-hoy {
    display: flex; align-items: baseline; gap: 8px 14px; flex-wrap: wrap; margin: 13px 0 0;
}
.cm-ui .cm-hoy .t { font-size: .95rem; font-weight: 800; color: var(--ink); }
.cm-ui .cm-hoy .f { font-size: .75rem; color: var(--faint); }
.cm-ui .cm-hoy .der { margin-left: auto; }

/* La regla de estado de una caja: 3 px arriba, del color que la caja YA usa
   adentro. No agrega un color nuevo; nombra el que ya está. */
.cm-ui .cm-tablero .cm-card { border-top: 3px solid var(--hair-strong); }
.cm-ui .cm-tablero .cm-card.t-crit  { border-top-color: var(--crit); }
.cm-ui .cm-tablero .cm-card.t-warn  { border-top-color: var(--warn); }
.cm-ui .cm-tablero .cm-card.t-nav   { border-top-color: var(--navy-500); }
.cm-ui .cm-tablero .cm-card.t-azure { border-top-color: var(--azure); }

/* =============================================================================
   ETAPA 9 · CÓMO SE COBRA — el bloque de los tres tiempos
   =============================================================================
   Los tres campos estaban sueltos entre la OC y la fecha, y el de entrega de
   valores APARECÍA Y DESAPARECÍA según el tipo de pago: el formulario cambiaba
   de forma mientras se lo miraba. Ahora son un bloque propio y **los tres
   siempre visibles**; el tercero arranca apagado y DICE POR QUÉ.

   Los ordinales no son adorno: los tres se habilitan en ese orden y el tercero
   depende del primero. Sin el número, «deshabilitado» se lee como «roto». */
.cm-ui .cm-pago {
    margin: 11px 16px 0; padding: 11px 13px 12px; border-radius: 11px;
    background: #f7f9fc; border: 1px solid var(--hair);
}
.cm-ui .cm-pago > .h {
    display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin: 0 0 9px;
}
.cm-ui .cm-pago > .h b {
    font-size: .66rem; font-weight: 800; text-transform: uppercase;
    letter-spacing: .08em; color: var(--muted);
}
.cm-ui .cm-pago > .h span { font-size: .71rem; color: var(--faint); }
.cm-ui .cm-tiempos { display: flex; align-items: stretch; gap: 8px; flex-wrap: wrap; }
.cm-ui .cm-t { flex: 1 1 165px; min-width: 0; }
.cm-ui .cm-t.ancho { flex: 1.6 1 235px; }
.cm-ui .cm-t > .lbl { display: flex; align-items: center; gap: 6px; margin-bottom: 5px; }
.cm-ui .cm-t .ord {
    flex: 0 0 auto; width: 16px; height: 16px; border-radius: 50%;
    display: grid; place-items: center; font-style: normal;
    font-size: .58rem; font-weight: 800; color: #fff; background: var(--navy-500);
}
.cm-ui .cm-t.esperando .ord { background: var(--hair-strong); color: var(--faint); }
.cm-ui .cm-t .lbl b {
    font-size: .62rem; text-transform: uppercase; letter-spacing: .08em;
    font-weight: 800; color: var(--muted);
}
.cm-ui .cm-t .lbl .req { color: var(--crit); }
.cm-ui .cm-t .por {
    display: block; margin-top: 4px; font-size: .68rem; color: var(--faint); line-height: 1.45;
}
/* Un campo apagado dice por qué con palabras, y en itálica como cualquier otro
   hueco del módulo (§3.6): «sólo con valores diferidos» no es lo mismo que un
   campo que no anda. */
.cm-ui .cm-t.esperando .por { font-style: italic; }

/* El tipo de pago va SEGMENTADO y no en un `<select>`: son dos opciones y son
   la decisión que manda sobre las otras dos. Esconder la mitad del enunciado
   adentro de un desplegable es lo contrario de la jerarquía que se pidió. */
.cm-ui .cm-seg {
    display: flex; border: 1px solid var(--hair-strong); border-radius: 9px;
    overflow: hidden; background: var(--surface);
}
.cm-ui .cm-seg button {
    flex: 1 1 0; min-width: 0; padding: 7px 9px; font: inherit; font-size: .74rem;
    font-weight: 700; color: var(--muted); background: var(--surface); border: none;
    border-left: 1px solid var(--hair); cursor: pointer;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    transition: background-color .14s ease, color .14s ease;
}
.cm-ui .cm-seg button:first-child { border-left: none; }
.cm-ui .cm-seg button:hover, .cm-ui .cm-seg button:focus-visible {
    background: var(--azure-050); color: var(--azure); outline: none;
}
.cm-ui .cm-seg button.on { color: #fff; background: var(--azure); }
.cm-ui .cm-seg button.on:hover { background: var(--azure-700); color: #fff; }

/* La frase que cierra: traduce los tres campos a algo que alguien diría. La
   regla «la entrega de valores tiene que ser MENOR al plazo» sólo se enteraba
   al apretar Enviar, con un cartel; escrita acá se ve mientras se tipea. */
.cm-ui .cm-pago .cierre {
    margin: 10px 0 0; padding: 7px 11px; border-radius: 9px; background: var(--navy-050);
    border-left: 3px solid var(--navy-500); font-size: .74rem; color: var(--ink); line-height: 1.55;
}
.cm-ui .cm-pago .cierre b { color: var(--navy-500); font-weight: 700; }
.cm-ui .cm-pago .cierre.espera {
    background: var(--surface); border-left-color: var(--hair-strong);
    color: var(--faint); font-style: italic;
}
.cm-ui .cm-pago .cierre.mal {
    background: var(--crit-050); border-left-color: var(--crit); color: var(--ink);
}
.cm-ui .cm-pago .cierre.mal b { color: var(--crit); }

/* =============================================================================
   ETAPA 9 · LA FOTO DEL ARTÍCULO Y EL PALLETIZADO
   =============================================================================
   `imageUrl` existe en los DOS maestros y `cmCatalogo()` no lo leía: por eso la
   pre-carga dibujaba siempre el ícono. Sólo 3 de cada 10 artículos activos la
   tienen cargada, así que el dibujo por presentación NO se va — es el respaldo,
   y se distingue por el fondo (blanco con hilo la foto, azul claro el dibujo). */
.cm-ui .cm-mini img {
    width: 100%; height: 100%; object-fit: contain; display: block; border-radius: 4px;
}
.cm-ui .cm-mini.conFoto { background: var(--surface); border: 1px solid var(--hair); padding: 2px; }
.cm-ui .cm-mini.grande { width: 42px; height: 42px; border-radius: 8px; }
.cm-ui .cm-mini.grande .material-symbols-outlined { font-size: 24px; }

/* El palletizado, bajo el nombre del artículo: elegirlo ya es elegir su
   formato, y quien lo elige tiene que saber en qué múltiplo va a pensar. */
.cm-ui .cm-pallet {
    display: block; margin-top: 3px; font-size: .66rem; color: var(--muted); line-height: 1.45;
}
.cm-ui .cm-pallet b { color: var(--navy-500); font-weight: 700; }
.cm-ui .cm-pallet.sin { color: var(--faint); font-style: italic; }

/* LA CUENTA DEL RENGLÓN. Se acota A PROPÓSITO con `max-width`: sin él el texto
   del pallet ensancha la columna de cantidad, le come el lugar al nombre del
   artículo y el importe de nueve dígitos se parte en dos renglones — la trampa
   que este módulo ya pagó CUATRO veces. Acotada, envuelve dentro de su ancho y
   la tabla no se mueve. */
.cm-ui .cm-cuenta {
    display: block; margin: 4px 0 0 auto; max-width: 158px;
    font-size: .68rem; line-height: 1.4; text-align: right; color: var(--muted);
}
.cm-ui .cm-cuenta b { font-weight: 700; color: var(--ink); }
.cm-ui .cm-cuenta.cierra { color: var(--ok); }  .cm-ui .cm-cuenta.cierra b { color: var(--ok); }
.cm-ui .cm-cuenta.suelta { color: var(--warn); } .cm-ui .cm-cuenta.suelta b { color: var(--warn); }
.cm-ui .cm-cuenta.rota   { color: var(--crit); } .cm-ui .cm-cuenta.rota b   { color: var(--crit); }
.cm-ui .cm-num.rota { border-color: var(--crit); background: var(--crit-050); }

/* El paso de a un pallet, y la corrección al bulto entero. Es la ergonomía
   real: el vendedor piensa en pallets y el pedido se guarda en kilos. */
.cm-ui .cm-paso-pallet { display: flex; gap: 4px; justify-content: flex-end; margin-top: 5px; flex-wrap: wrap; }
.cm-ui .cm-paso-pallet button {
    font: inherit; font-size: .66rem; font-weight: 700; color: var(--muted);
    background: var(--surface); border: 1px solid var(--hair-strong); border-radius: 7px;
    padding: 2px 7px; cursor: pointer; white-space: nowrap;
    transition: background-color .14s ease, color .14s ease, border-color .14s ease;
}
.cm-ui .cm-paso-pallet button:hover, .cm-ui .cm-paso-pallet button:focus-visible {
    color: var(--azure); border-color: var(--azure); background: var(--azure-050); outline: none;
}

/* EL IMPORTE Y LAS UNIDADES NUNCA SE PARTEN. Son las celdas `n tnum`, y con la
   cuenta del pallet abajo del campo la columna quedó más angosta: sin esto,
   «$ 36.140.000,00» se lee «$» arriba y las cifras abajo. Es la quinta vez que
   este módulo paga los mismos 390 px, y la primera que se paga en ESCRITORIO. */
.cm-ui table.cm-g td.n.tnum { white-space: nowrap; }

/* El rótulo de un grupo del desplegable — cuántas opciones hay y de quién. */
.cm-ui .cm-drop .cm-drop-cab {
    padding: 5px 9px 4px; font-size: .6rem; font-weight: 800; letter-spacing: .09em;
    text-transform: uppercase; color: var(--faint);
}
/* La marca de la fila del desplegable (el faltante de entrega) va donde el
   buscador de artículos pone el EAN: a la derecha y sin estirarse. */
.cm-ui .cm-opt .cod .cm-marca { white-space: nowrap; }

@media (max-width: 560px) {
    /* Los tres tiempos bajan de renglón y CONSERVAN el ordinal, que es lo que
       sostiene el orden cuando ya no están uno al lado del otro. */
    .cm-ui .cm-tiempos { flex-direction: column; }
    .cm-ui .cm-t, .cm-ui .cm-t.ancho { flex: 1 1 auto; }
    /* La cuenta del pallet se acorta: en el celular la tabla ya scrollea de
       costado, y 158 px de cuenta le comen a la columna del ARTÍCULO —que
       terminaba partiendo «Azucar Comun Tipo A x50» en cuatro renglones—. */
    .cm-ui .cm-cuenta { max-width: 116px; }
}

/* =============================================================================
   ETAPA 9 · LA FICHA DEL CLIENTE — la forma de CashFlow (15/08/2026)
   =============================================================================
   Lo que se abre al desplegar un cliente en Mis Clientes deja de ser una tabla
   con dos avisos y pasa a ser una FICHA: los cuatro KPI arriba y dos columnas
   debajo —izquierda lo que hace falta saber ANTES de llamar, derecha la cuenta
   corriente—. Es la ficha de `Cta Cte Clientes` de CashFlow, que Hernán señaló
   como la mejor lograda.

   DOS COSAS NO SE COPIARON, y las dos por el mismo motivo —no mentir—:
     · sin teléfono ni límite de crédito: esos campos no existen en `destinos`;
     · la antigüedad va en CELDAS (`.cm-ant`, etapa 6) y no en la barra apilada
       de CashFlow, porque 21 de los 143 clientes traen alguna caja NEGATIVA y
       una barra de largo negativo no se puede dibujar.
   ========================================================================== */

.cm-ui .cm-ficha-cli {
    display: grid; gap: 12px; grid-template-columns: 1fr;
    align-items: start; padding: 12px 16px 4px;
}
.cm-ui .cm-ficha-cli > .col { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
/* DOS COLUMNAS RECIÉN A 1024 px, y el número subió de 720 con la etapa 2 de los
   listados: la ficha dejó de ocupar el ancho de la pantalla y pasó a vivir
   adentro de un modal de 1040 px como mucho. A 720 de viewport el modal mide
   ~684, la columna derecha 8/12 queda en 456 y la tabla vuelve a partir «Debe».
   A 1024 el modal llega a ~988 y la derecha mide 636, que es holgado. */
@media (min-width: 1024px) {
    /* 4/8 Y NO 5/7, Y ES MEDIDO: la columna derecha lleva la tabla de
       comprobantes, que pide 460 px de ancho útil para no partir «Debe». Con
       5/7 quedaban 454 y la tabla scrolleaba de costado dejando afuera —otra
       vez— el único número por el que se abre esta pantalla. La izquierda son
       rótulos cortos y no necesita más. */
    .cm-ui .cm-ficha-cli { grid-template-columns: minmax(0, 4fr) minmax(0, 8fr); }
}

/* --- Un panel ------------------------------------------------------------- */
.cm-ui .cm-panel {
    background: var(--surface); border: 1px solid var(--hair);
    border-radius: 11px; padding: 11px 13px 12px; min-width: 0;
}
.cm-ui .cm-panel > h5 {
    margin: 0 0 8px; font-size: .62rem; font-weight: 800; letter-spacing: .09em;
    text-transform: uppercase; color: var(--faint);
}
.cm-ui .cm-panel-nada { margin: 0; font-size: .76rem; color: var(--muted); line-height: 1.6; }
.cm-ui .cm-panel-nada b { color: var(--ink); font-weight: 700; }
.cm-ui .cm-panel-pie {
    margin: 8px 0 0; font-size: .69rem; color: var(--faint); line-height: 1.55;
}
.cm-ui .cm-panel-pie b { color: var(--muted); font-weight: 700; }

/* Los hijos que vienen de otras partes de la pantalla pierden SU margen: acá
   el aire lo pone el panel. Sin esto la antigüedad entra con 12/16 px propios y
   queda descentrada adentro de su caja. */
/* LA ANTIGÜEDAD ADENTRO DE UN PANEL VA EN DOS COLUMNAS, no en cinco. Es la
   misma regla que la pantalla ya aplica en el celular, y por el mismo motivo:
   son importes de nueve dígitos y en un quinto de 500 px «−$ 14.256.362,92» se
   parte en dos renglones —el «−$» arriba y las cifras abajo— y deja de leerse
   como una cifra. Lo agarró la FOTO, con el banco en verde. */
.cm-ui .cm-panel .cm-ant { margin: 0; grid-template-columns: repeat(2, 1fr); }
.cm-ui .cm-panel .cm-ant .c:nth-child(odd) { border-left: none; }
.cm-ui .cm-panel .cm-ant .c:nth-child(n+3) { border-top: 1px solid var(--hair); }
.cm-ui .cm-panel .cm-ant .c:last-child:nth-child(odd) { grid-column: 1 / -1; }
.cm-ui .cm-panel .cm-ant .c .v { white-space: nowrap; }
.cm-ui .cm-panel .cm-ant-pie { margin: 6px 2px 0; }
.cm-ui .cm-panel .cm-tbl { padding: 0; }
.cm-ui .cm-panel table.cm-g { margin-top: 0; }

/* --- Un renglón dato / valor ---------------------------------------------- */
.cm-ui .cm-dato {
    display: flex; align-items: baseline; gap: 10px; justify-content: space-between;
    padding: 5px 0; border-top: 1px solid var(--hair); font-size: .76rem;
}
.cm-ui .cm-dato:first-of-type { border-top: none; padding-top: 0; }
.cm-ui .cm-dato dt { color: var(--muted); flex: 0 0 auto; }
.cm-ui .cm-dato dd {
    margin: 0; color: var(--ink); font-weight: 700; text-align: right;
    min-width: 0; overflow-wrap: anywhere;
}
/* Un mail largo no puede empujar la columna: rompe donde haga falta y se
   achica, que es preferible a que el panel scrollee de costado. */
.cm-ui .cm-dato dd .mail { font-weight: 400; font-size: .72rem; }

/* --- CÓMO PAGA — la cifra y la barra -------------------------------------- */
.cm-ui .cm-paga { display: flex; align-items: baseline; gap: 9px; flex-wrap: wrap; }
/* La cifra más grande de la ficha, y sigue por debajo del techo del sistema
   (`.abm-stat .v`, 1.42rem): nada de números gigantes (§3.8). */
.cm-ui .cm-paga .big { font-size: 1.18rem; font-weight: 800; color: var(--ink); line-height: 1.2; }
.cm-ui .cm-paga .sm { font-size: .72rem; color: var(--muted); }
.cm-ui .cm-paga .sm b { color: var(--ink); font-weight: 700; }
/* La desviación contra lo pactado es lo único que se pinta: ok hasta la
   tolerancia, ámbar arriba. Nunca verde por «pagar rápido» — pagar antes no es
   un logro que el sistema tenga que celebrar; es no llegar tarde. */
.cm-ui .cm-paga .dif.ok { color: var(--ok); }
.cm-ui .cm-paga .dif.lento { color: var(--warn); }

.cm-ui .cm-gauge { margin-top: 8px; }
.cm-ui .cm-gauge .track {
    position: relative; height: 7px; border-radius: 999px;
    background: var(--hair); overflow: visible;
}
.cm-ui .cm-gauge .fill {
    height: 100%; border-radius: 999px; background: var(--navy-300);
    transition: width .25s var(--curva);
}
.cm-ui .cm-gauge .fill.ok { background: var(--ok); }
.cm-ui .cm-gauge .fill.lento { background: var(--warn); }
/* La marca del plazo PACTADO: una línea vertical, no un color de fondo. Es una
   referencia, no un tramo — el pactado es un punto exacto. */
.cm-ui .cm-gauge .mark {
    position: absolute; top: -3px; bottom: -3px; width: 2px;
    background: var(--ink); border-radius: 2px;
}
.cm-ui .cm-gauge .lbls {
    display: flex; justify-content: space-between; gap: 8px; margin-top: 4px;
    font-size: .63rem; color: var(--faint);
}
.cm-ui .cm-gauge .lbls span:nth-child(2) { text-align: center; }

/* --- El último pago ------------------------------------------------------- */
.cm-ui .cm-pago-ult { display: flex; align-items: baseline; gap: 6px 12px; flex-wrap: wrap; }
.cm-ui .cm-pago-ult .f { font-size: .8rem; font-weight: 700; color: var(--ink); }
.cm-ui .cm-pago-ult .m { font-size: .88rem; font-weight: 800; color: var(--ok); }
.cm-ui .cm-pago-ult .r { font-size: .7rem; color: var(--faint); margin-left: auto; }

/* Los KPI de la ficha son los mismos de Inicio (`.cm-kpi`), con la regla de
   abajo para separarlos del cuerpo. */
.cm-ui .cm-cuerpo > .cm-kpi { border-top: 1px solid var(--hair); }
.cm-ui .cm-cuerpo > .cm-risk { margin: 12px 16px 0; }

@media (max-width: 560px) {
    /* EL ANCHO ÚTIL DE LA TABLA NO PUEDE ACHICARSE, y es medido: la ficha
       agrega DOS cajas alrededor de la tabla de comprobantes (la columna y el
       panel) y con el padding de escritorio se comía 18 px, justo los que
       hacían que «Debe» se saliera de la pantalla a 390 px. Los dos paddings
       bajan a 8 px para devolver los 32 px de canaleta que la tabla tenía en la
       etapa 6. Lo agarró la medición del banco, no una aserción sobre el HTML:
       es la quinta vez que esta pantalla paga los mismos 390 px. */
    .cm-ui .cm-ficha-cli { padding: 12px 8px 4px; gap: 10px; }
    .cm-ui .cm-ficha-cli > .col { gap: 10px; }
    .cm-ui .cm-panel { padding: 10px 8px 11px; }
    /* El dato y su valor dejan de compartir renglón: con «Forma de pago» y
       «Transferencia / cheque corriente» al lado, el valor entra en tres
       líneas pegado al borde derecho y deja de leerse como un valor. */
    .cm-ui .cm-dato { display: block; }
    .cm-ui .cm-dato dd { text-align: left; margin-top: 2px; }
}

/* =============================================================================
   ETAPA 9 · LA FICHA DEL ARTÍCULO, al costado del buscador
   =============================================================================
   Muestra el resumen del ABM del artículo APUNTADO —el que está bajo el mouse o
   con el foco—, que es lo que hace falta para decidir cuál elegir. Al costado y
   no debajo: debajo empujaría el desplegable fuera de la pantalla justo cuando
   se lo está mirando.
   ========================================================================== */
.cm-ui .cm-buscar-zona {
    display: flex; gap: 14px; align-items: flex-start; padding: 12px 16px 14px;
}
/* `max-width: none` no es de mas: la caja trae 470 px de la etapa 3 —cuando
   el buscador vivia solo— y con la ficha al lado el desplegable quedaba mas
   angosto que su propio campo. */
.cm-ui .cm-buscar-zona .cm-buscar-caja {
    flex: 1 1 300px; min-width: 0; padding: 0; max-width: none;
}
.cm-ui .cm-art-ficha {
    flex: 0 1 290px; min-width: 0; align-self: stretch;
    background: #fafbfd; border: 1px solid var(--hair); border-radius: 11px;
    padding: 11px 13px 12px;
}
.cm-ui .cm-art-ficha .cab { display: flex; align-items: center; gap: 10px; }
.cm-ui .cm-art-ficha .cab .nom { min-width: 0; }
.cm-ui .cm-art-ficha .cab .nom b {
    display: block; font-size: .78rem; font-weight: 700; color: var(--ink); line-height: 1.35;
}
.cm-ui .cm-art-ficha .cab .nom small { display: block; font-size: .68rem; color: var(--muted); }
.cm-ui .cm-art-ficha .marcas { display: flex; gap: 5px; flex-wrap: wrap; margin: 9px 0 0; }
.cm-ui .cm-art-ficha .datos { margin: 10px 0 0; }
.cm-ui .cm-art-ficha .datos .f {
    display: flex; align-items: baseline; gap: 8px; justify-content: space-between;
    padding: 4px 0; border-top: 1px solid var(--hair); font-size: .72rem;
}
.cm-ui .cm-art-ficha .datos .f:first-child { border-top: none; padding-top: 0; }
.cm-ui .cm-art-ficha .datos dt { color: var(--muted); flex: 0 0 auto; }
.cm-ui .cm-art-ficha .datos dd {
    margin: 0; color: var(--ink); text-align: right; min-width: 0; overflow-wrap: anywhere;
}
.cm-ui .cm-art-ficha .pie {
    margin: 9px 0 0; font-size: .66rem; color: var(--faint); line-height: 1.5;
}

/* ABAJO DE 860 px LA FICHA SE VA. No se apila debajo del buscador: ahí empuja
   el desplegable —que es absoluto sólo en el campo de cliente, no acá— y el
   vendedor tendría que scrollear para ver las opciones que está eligiendo. En
   el celular el renglón del carrito ya lleva el pallet y los códigos, que es lo
   que la ficha aporta. */
@media (max-width: 860px) {
    .cm-ui .cm-art-ficha { display: none; }
    .cm-ui .cm-buscar-zona .cm-buscar-caja { flex: 1 1 auto; max-width: 470px; }
}

/* =============================================================================
   ETAPA 7 DE LOS PAPELES · COBRANZAS — la carpeta del cliente (mockup B, 17/08/2026)
   =============================================================================
   Reusa ENTERA la tarjeta que se abre en el lugar y la tabla de Facturas
   (`.cm-fx`, con su conversión a bloques abajo de 560 px, ya medida). Lo propio
   es lo que esta pantalla tiene y ninguna otra: el renglón que NO es un cobro, y
   el detalle de un recibo — las dos columnas de la cuenta, que es la única parte
   que no se puede plegar en un renglón. */

/* LA TABLA DE RECIBOS TIENE LAS MISMAS CINCO COLUMNAS QUE LA DE FACTURAS desde
   la etapa 8, que trajo el botón «Papel»: la última celda volvió a ser un botón,
   así que las dos reglas de `.cm-fx` que lo suponen —el `width: 1%` de la
   columna del botón y el destaque del importe en el celular— vuelven a valer
   tal cual, y las dos correcciones que la etapa 7 escribió acá se fueron con
   ellas. Es la primera vez en este módulo que un `@media` de más abajo deja de
   hacer falta en vez de ganar: si el botón alguna vez se saca, hay que
   reponerlas (están en el commit de la etapa 7). */

/* El número de recibo es un BOTÓN: abre el detalle donde está. Parece texto
   —no es una acción que compita con nada— pero se puede tabular y tiene foco. */
.cm-ui .cb-ver {
    background: none; border: 0; padding: 0; margin: 0; font: inherit; color: inherit;
    text-align: left; cursor: pointer; display: block; width: 100%;
    border-radius: 6px;
}
.cm-ui .cb-ver:hover .tnum { color: var(--navy); text-decoration: underline; }
/* EL NÚMERO DE RECIBO NO SE PARTE. Con la columna de los dos botones al lado, el
   navegador apretaba la primera celda hasta cortar «0002-00009968» en dos
   renglones por el guion — y un número de comprobante partido deja de leerse
   como un número. La tabla ya scrollea de costado si hace falta. */
.cm-ui .cb-ver .tnum { white-space: nowrap; }
.cm-ui .cb-ver:focus-visible { outline: 2px solid var(--navy-300); outline-offset: 2px; }
.cm-ui .cb-fila.abierta > td { background: var(--navy-050); }

/* EL RENGLÓN QUE NO ES UN COBRO. Ámbar, que en este sistema significa «mirá
   esto», nunca «error»: un descuento de cheques en el MAV está perfectamente
   bien, sólo que no es plata que entró del cliente. */
.cm-ui table.cm-g.cb-t tr.cb-int > td { background: var(--warn-050); }
.cm-ui table.cm-g.cb-t tr.cb-int td.n { color: var(--warn); font-weight: 600; }

/* EL DETALLE — los dos lados de la cuenta, uno al lado del otro. Con `auto-fit`
   se apilan solos en el celular sin una media query propia. */
.cm-ui table.cm-g.cb-t tr.cb-det > td { background: var(--navy-050); padding: 10px 12px; }
.cm-ui .cb-cajas {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 10px;
}
/* EL `min-width: 0` NO ES DECORATIVO, y es lo que encontró la foto a 390 px: un
   item de grid mide por defecto su MIN-CONTENT, y el número de un cheque
   —«02706686036949614», diecisiete dígitos que no se parten por ningún lado—
   hacía que la caja creciera más que la columna. La cuenta salía cortada por la
   derecha («Entregó $ 3») y el banco daba verde, porque la caja medía
   exactamente lo que tenía que medir. */
.cm-ui .cb-caja {
    background: var(--surface); border: 1px solid var(--hair); border-radius: 9px;
    padding: 9px 11px; min-width: 0;
}
.cm-ui .cb-caja h5 {
    margin: 0 0 6px; font-size: .64rem; letter-spacing: .07em; text-transform: uppercase;
    color: var(--faint); font-weight: 700;
}
.cm-ui .cb-ln {
    display: flex; justify-content: space-between; gap: 10px; align-items: baseline;
    padding: 4px 0; border-bottom: 1px solid var(--hair); font-size: .78rem;
}
.cm-ui .cb-ln:last-of-type { border-bottom: 0; }
.cm-ui .cb-ln .d { min-width: 0; }
/* …y el número largo se parte donde sea. Sin esto, `min-width: 0` sólo mueve el
   desborde adentro de la caja en vez de sacarlo de la pantalla. */
.cm-ui .cb-ln .d small {
    display: block; color: var(--faint); font-size: .68rem; overflow-wrap: anywhere;
}
.cm-ui .cb-ln .m { white-space: nowrap; }
.cm-ui .cb-ln .m.favor { color: var(--navy-500); }
/* El total con la raya navy, igual que el del papel: es la misma suma. */
.cm-ui .cb-tot {
    display: flex; justify-content: space-between; gap: 10px; margin-top: 6px;
    padding-top: 6px; border-top: 1.5px solid var(--navy);
    font-weight: 700; font-size: .8rem;
}
/* La plata a cuenta NO es un aviso: es plata del cliente que todavía no se
   aplicó a nada. Navy, nunca ámbar. */
.cm-ui .cb-acuenta {
    margin: 6px 0 0; font-size: .72rem; color: var(--navy-500); line-height: 1.45;
}
/* LOS DOS BOTONES DEL RECIBO —«Ver» y «PDF»— van juntos: son una sola decisión
   («quiero este recibo») ofrecida de dos maneras, y separarlos con el ancho de
   la celda los leería como dos columnas. */
.cm-ui .cb-acciones {
    display: inline-flex; gap: 6px; flex-wrap: nowrap; justify-content: flex-end;
}
/* EL `nowrap` NO ES ESTÉTICO: `.cm-fx` le da `width: 1%` a la última celda —la
   pensó para UN botón— y con `wrap` los dos se apilaban uno debajo del otro en
   el escritorio, leyéndose como dos filas. Sin envolver, el `width: 1%` mide el
   par entero y la columna crece lo justo. Lo encontró la foto a 1280. */

/* El descuadre SÍ es un aviso: significa que el sistema no pudo leer un valor
   del recibo, y el que lo ve primero es el comercial. */
.cm-ui .cb-aviso {
    margin: 9px 0 0; padding: 7px 10px; font-size: .73rem; line-height: 1.45;
    color: var(--warn); background: var(--warn-050);
    border: 1px solid var(--warn-hair); border-radius: 8px;
}

/* ABAJO DE 560 px, LO QUE COBRANZAS AGREGA A LA TABLA-BLOQUE DE FACTURAS.
   VA ACÁ Y NO EN LA MEDIA QUERY DE FACTURAS, y no es prolijidad: las dos
   reglas tienen la MISMA especificidad, así que gana la que está más abajo en
   la hoja — y este bloque entero está más abajo. Puesto allá arriba, el
   `min-width: 430px` de acá le ganaba a su propio apagado, la tabla seguía
   midiendo 430 px adentro de un scroller de 314 y el detalle salía CORTADO por
   la derecha: «Entregó $ 3». Dos fotos a 390 px para encontrarlo, y el banco en
   verde las dos veces. */
@media (max-width: 560px) {
    /* La marca («no es un cobro», «se compensa») deja de ser una sola línea: en
       un bloque de 314 px, `nowrap` la empuja fuera de la pantalla junto con el
       renglón entero. */
    .cm-ui table.cm-g.cb-t .cm-marca { white-space: normal; }
    /* El detalle NO es una fila más: es el cuerpo de la de arriba, así que no
       lleva el separador que separa un recibo del siguiente. */
    .cm-ui table.cm-g.cb-t tr.cb-det { padding: 0 0 8px; border-bottom: 0; }
    .cm-ui table.cm-g.cb-t tr.cb-det > td { padding: 8px 0; }
    /* En el celular los dos botones arrancan a la IZQUIERDA, como el resto del
       bloque: alineados a la derecha quedaban colgados contra un borde que en
       modo bloque ya no existe. */
    /* En el celular arrancan a la IZQUIERDA —alineados a la derecha quedaban
       colgados contra un borde que en modo bloque ya no existe— y ahí SÍ
       envuelven: en 314 px, dos botones en una línea sacan al segundo de la
       pantalla. */
    .cm-ui .cb-acciones {
        justify-content: flex-start; margin-top: 6px; flex-wrap: wrap;
    }
}

/* --- Movimiento reducido: el destaque queda, el desplazamiento no (§5) ----- */
@media (prefers-reduced-motion: reduce) {
    .cm-ui .cm-chip, .cm-ui .cm-row, .cm-ui .cm-x, .cm-ui .cm-btn, .cm-ui .cm-quitar,
    .cm-ui .cm-abre, .cm-ui .cm-ir,
    .cm-ui .cm-seg button, .cm-ui .cm-paso-pallet button { transition: none; }
    .cm-ui .cm-gauge .fill { transition: none; }
    .cm-ui .cm-chip:hover, .cm-ui .cm-chip:focus-visible { transform: none; }
    .cm-ui .cm-x:hover, .cm-ui .cm-x:focus-visible { transform: none; }
    .cm-ui .cm-btn:hover { transform: none; }
}

/* =============================================================================
   RONDA 11 · MIS PEDIDOS — LA MESA, calcada de Pedidos & Ventas
   =============================================================================
   La ronda 10 trajo las tres pestañas y la paginación, pero dibujó la lista como
   OCHO columnas de un renglón, todas del mismo tamaño y del mismo color. Hernán,
   27/08/2026: «las pantallas de pedidos están algo desalineadas, repliquemos la
   estética de la versión que vemos nosotros como usuario interno… acá quedó muy
   chata». Tenía razón, y se puede contar: con ocho celdas iguales
   «AUTOSERVICIO MAYORISTA DIARCO SA» y «22/08» pesan lo mismo, así que nada se
   lee primero.

   Lo de acá abajo son los valores de `ventas-ui.css` copiados uno por uno —el
   alto de 48 px, el subrenglón de 11 px con alto fijo, la franja al margen, el
   chip, la píldora—, con UNA diferencia deliberada: el acento. Ventas usa navy
   para lo que se toca; Comerciales usa azure, y esa diferencia está escrita
   arriba en este mismo archivo. Se copia el DIBUJO, no la paleta.

   Y una cosa que NO se copia del contenido: la mesa interna pone la tarifa del
   flete en la celda de logística («sin tarifa», «Provisoria $120.000»). Acá no
   hay ninguna, y no porque no se dibuje: `cmFormaPedido()` ya no la trae.
   ========================================================================== */

/* --- Las pestañas — PÍLDORAS CON TRAZO, nunca un bloque relleno (§1.2) ------
   `.cm-seg` nació para el tipo de pago del formulario, donde ESTIRA sus dos
   botones hasta llenar el campo y pinta el activo de azure lleno. Unas pestañas
   así se leen como una barra, no como pestañas. Acá se redeclara todo: píldora
   con sombra, y el activo con borde y fondo teñido. */
.cm-ui .cm-pest {
    display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
    margin: 14px 0 0; border: none; border-radius: 0; background: none; overflow: visible;
}
.cm-ui .cm-pest .cm-pest-b {
    display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto;
    border: 1px solid var(--hair-strong); border-left: 1px solid var(--hair-strong);
    background: var(--surface); border-radius: 20px; padding: 6px 13px;
    font: inherit; font-size: 12px; font-weight: 600; color: var(--muted);
    cursor: pointer; white-space: nowrap; box-shadow: var(--e1);
    transition: color .14s ease, background .14s ease, border-color .14s ease,
                box-shadow .18s var(--curva), transform .18s var(--curva);
}
.cm-ui .cm-pest .cm-pest-b:hover, .cm-ui .cm-pest .cm-pest-b:focus-visible {
    color: var(--azure); border-color: var(--azure);
    transform: translateY(-2px); box-shadow: 0 5px 14px rgba(16, 32, 64, .14);
    outline: none; background: var(--surface);
}
.cm-ui .cm-pest .cm-pest-b .n {
    font-size: 11px; font-weight: 600; color: var(--faint);
    font-variant-numeric: tabular-nums; border: none; border-radius: 0; padding: 0;
}
.cm-ui .cm-pest .cm-pest-b.on {
    color: var(--azure); border-color: var(--azure); background: var(--azure-050);
    font-weight: 700;
}
.cm-ui .cm-pest .cm-pest-b.on .n { color: var(--azure); }
/* Una pre-carga rechazada es lo único de esta pantalla que le pide algo al
   comercial: la pestaña lo dice con el color del estado, subido un nivel. */
.cm-ui .cm-pest .cm-pest-b.urge { color: var(--crit); border-color: var(--crit-hair); }
.cm-ui .cm-pest .cm-pest-b.urge .n { color: var(--crit); }
.cm-ui .cm-pest .cm-pest-b.on.urge {
    color: var(--crit); border-color: var(--crit); background: var(--crit-050);
}
.cm-ui .cm-pest .cm-pest-b.on.urge .n { color: var(--crit); }

/* --- El resumen y los verbos del CELULAR ----------------------------------
   En escritorio los dos van en la barra superior del armazón. Acá adentro sólo
   se dibujan cuando no hay barra. */
.cm-ui .cm-res-movil { font-size: .78rem; color: var(--muted); margin-bottom: 9px; }
.cm-ui .cm-verbos { display: flex; gap: 8px; flex-wrap: wrap; }

/* --- El filtro de cliente — el mismo buscador de la pre-carga, con su x ----- */
.cm-ui .cm-barra .cm-fcli { flex: 1 1 220px; min-width: 180px; max-width: 300px; }
.cm-ui .cm-fcli .cm-in { padding-right: 30px; }
.cm-ui .cm-fcli-x {
    position: absolute; right: 5px; top: 5px; display: flex;
    padding: 2px; border: none; background: none; color: var(--faint); cursor: pointer;
    border-radius: 6px;
}
.cm-ui .cm-fcli-x:hover, .cm-ui .cm-fcli-x:focus-visible {
    background: var(--azure-050); color: var(--azure); outline: none;
}
.cm-ui .cm-fcli-x .material-symbols-outlined { font-size: 16px; }

/* --- La caja de la lista --------------------------------------------------- */
.cm-ui .cm-caja {
    margin: 13px 0 0; background: var(--surface);
    border: 1px solid rgba(16, 32, 64, .05); border-radius: var(--r-card);
    box-shadow: var(--e1); overflow: hidden;
}
/* La tabla es ANCHA y se desliza DENTRO de su caja: la página nunca scrollea de
   costado (manual §7). En el celular la media query de abajo apaga el ancho
   mínimo y con eso también este deslizamiento. */
.cm-ui .cm-tbl-desliz { overflow-x: auto; }

/* --- LA MESA -------------------------------------------------------------
   `separate` y no `collapse`: con bordes colapsados el borde de 2 px de la
   cabecera se reparte con la primera fila y esa fila mide 49 en vez de 48.
   `fixed`: con el `<colgroup>` puesto, las columnas dejan de bailar de una fila
   a otra — que es la otra mitad de lo que hace legible una lista larga. */
.cm-ui .cm-plan {
    width: 100%; border-collapse: separate; border-spacing: 0;
    font-size: 12.5px; table-layout: fixed; color: var(--ink); min-width: 700px;
}
.cm-ui .cm-plan thead th {
    text-align: left; font-size: 10.5px; font-weight: 700; letter-spacing: .07em;
    text-transform: uppercase; color: var(--faint); background: var(--surface);
    padding: 11px 10px; border-bottom: 2px solid var(--hair-strong); white-space: nowrap;
}
.cm-ui .cm-plan tbody td {
    padding: 4px 10px; height: 48px; box-sizing: border-box;
    border-bottom: 1px solid var(--hair); vertical-align: middle;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: 1.35;
}
.cm-ui .cm-plan tbody tr:last-child td { border-bottom: 0; }
.cm-ui .cm-plan td.acr { text-align: right; }

/* La fila es una <tr> que se comporta como botón: se enfoca con Tab y se abre
   con Enter o barra (las dos teclas las ata `cmPedidosMontar`). */
.cm-ui .cm-fila { cursor: pointer; transition: background-color .14s ease; }
.cm-ui .cm-fila:hover td, .cm-ui .cm-fila:focus-visible td { background: var(--azure-050); }
.cm-ui .cm-fila:focus-visible { outline: 2px solid var(--azure); outline-offset: -2px; }
/* Una pre-carga NO es un pedido: la fila lleva un fondo apenas teñido y su
   número va en el acento, para que se lea como otra especie. */
.cm-ui .cm-fila.pre td { background: rgba(22, 104, 196, .028); }
.cm-ui .cm-fila.pre .cm-quien .np { color: var(--azure); }

/* LA FRANJA DE ESTADO: 3 px al margen izquierdo de la FILA, no un cuadradito
   adentro del texto. Es lo único que significa estado (§1.1). */
.cm-ui .cm-plan td.fr { position: relative; padding-left: 16px; }
.cm-ui .cm-plan td.fr::before {
    content: ''; position: absolute; left: 6px; top: 6px; bottom: 6px;
    width: 3px; border-radius: 2px; background: var(--hair-strong);
}
.cm-ui .cm-fila.e-nav  td.fr::before { background: var(--navy); }
.cm-ui .cm-fila.e-aut  td.fr::before { background: var(--navy-300); }
.cm-ui .cm-fila.e-mut  td.fr::before { background: var(--hair-strong); }
.cm-ui .cm-fila.e-ok   td.fr::before { background: var(--ok); }
/* `e-warn` la trae Mis Clientes (etapa 2 de los listados): en esa mesa el estado
   es LO VENCIDO, y de 1 a 60 días es ámbar. `cmNivelCliente()` devuelve el
   nivel; el color concreto vive acá (§1.1). */
.cm-ui .cm-fila.e-warn td.fr::before { background: var(--warn); }
.cm-ui .cm-fila.e-crit td.fr::before { background: var(--crit); }
/* La fila del cliente del que NO SE SABE NADA —sin publicar, o sin vincular— no
   se abre: no hay ficha que mostrar. No se apaga con opacidad, que escondería
   justamente el renglón que explica por qué. */
.cm-ui .cm-fila.muda { cursor: default; }
.cm-ui .cm-fila.muda:hover td { background: none; }
/* El subrenglón que AVISA algo. Hoy lo usa un solo caso y es real: el último
   pago en negativo, que no es plata que entró (el par del MAV). */
.cm-ui .cm-plan .cm-sub.avisa { color: var(--warn); font-weight: 600; }

/* LA CELDA DE DOS RENGLONES. Arriba lo fuerte; abajo el subrenglón de 11 px con
   ALTO FIJO: sin él, una celda con dos líneas empuja la fila y se pierde la
   grilla de 48 px que hace que la lista se lea de un barrido. */
.cm-ui .cm-plan .cm-quien { display: flex; align-items: center; gap: 6px; min-width: 0; }
/* El número NO se encoge: si el nombre es largo se corta el NOMBRE —que se lee
   entero en el `title`—, nunca el número, que es con lo que se busca. */
.cm-ui .cm-plan .cm-quien .np {
    flex: none; font-weight: 700; color: var(--navy); font-size: 11.5px;
}
.cm-ui .cm-plan .cm-quien b {
    font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cm-ui .cm-plan .cm-art { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cm-ui .cm-plan .cm-log { font-size: 12px; }
/* LA CELDA DEL VERBO VA CON . Su único hijo es un inline-block,
   y la caja de línea que lo contiene suma el ALTO DE LÍNEA DE LA CELDA además
   del alto del botón: con eso la fila pasaba de 48 a 50 px. Dos píxeles no se
   ven de a uno, pero sí en veinte filas seguidas — la grilla deja de existir.
   Lo agarró la medición, no la lectura. */
.cm-ui .cm-plan td.acr { line-height: 0; }
.cm-ui .cm-plan .cm-log .carga { font-weight: 700; }
.cm-ui .cm-plan .cm-sub {
    display: block; font-size: 11px; line-height: 15px; height: 15px; color: var(--faint);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* LOS KILOS PESAN. Perdieron su columna pero no su peso visual: son el número
   por el que un comercial abre esta pantalla. */
.cm-ui .cm-plan .cm-sub .kg { font-size: 12.5px; font-weight: 700; color: var(--ink); }
/* El dato ausente, con palabras y en itálica (§1.4). `.cm-sin` y no `.sin`: una
   clase de una palabra suelta en un módulo choca con cualquiera. */
.cm-ui .cm-sin { color: var(--faint); font-style: italic; font-weight: 400; }

/* EL CHIP: palabra en versalita, fondo y borde del mismo tono. Es lo que se lee
   sin leer. */
.cm-ui .cm-b {
    display: inline-block; font-size: 10.5px; font-weight: 700; letter-spacing: .03em;
    padding: 2px 8px; border-radius: 5px; border: 1px solid; text-transform: uppercase;
    white-space: nowrap; vertical-align: middle;
}
.cm-ui .cm-b.nav  { background: var(--navy-050); color: var(--navy-500); border-color: #cfdcf1; }
.cm-ui .cm-b.crit { background: var(--crit-050); color: var(--crit); border-color: var(--crit-hair); }
.cm-ui .cm-b.wrn  { background: var(--warn-050); color: var(--warn); border-color: var(--warn-hair); }
.cm-ui .cm-b.ok   { background: var(--ok-050);   color: var(--ok);   border-color: var(--ok-hair); }

/* La unidad es una ETIQUETA en versalitas y SIN color: un color por categoría es
   exactamente lo que la regla §1.1 prohíbe. */
.cm-ui .cm-plan .uni {
    display: inline-block; font-size: 10px; font-weight: 700; letter-spacing: .07em;
    text-transform: uppercase; color: var(--faint); white-space: nowrap;
    border: 1px solid var(--hair-strong); border-radius: 5px; padding: 0 5px;
    vertical-align: middle;
}

/* El verbo de la fila. No es un <button>: la fila ENTERA se abre, y dos zonas
   que hacen lo mismo con dos dibujos distintos enseñan mal
   (`feedback_dos_puertas_al_mismo_acto_no_llevan_lo_mismo`). Es la marca de que
   la fila se puede abrir. */
.cm-ui .cm-ver {
    display: inline-block; font-size: 11px; font-weight: 600; color: var(--azure);
    line-height: 15px; vertical-align: middle;
    border: 1px solid var(--hair-strong); border-radius: 8px; padding: 3px 10px;
    background: var(--surface);
}
.cm-ui .cm-fila:hover .cm-ver, .cm-ui .cm-fila:focus-visible .cm-ver {
    border-color: var(--azure);
}

/* --- El pie de la lista — el conteo, la nota y el «ver más» ---------------- */
.cm-ui .cm-pie-lista {
    display: flex; gap: 8px 16px; flex-wrap: wrap; align-items: center;
    margin: 12px 0 0; padding: 10px 14px;
    background: var(--surface); border: 1px solid var(--hair);
    border-radius: 10px; box-shadow: var(--e1);
    font-size: .76rem; color: var(--muted);
}
.cm-ui .cm-pie-lista b { color: var(--ink); font-weight: 700; }
/* La oración entera es UN ítem del flex. Si cada palabra fuera un hijo suelto,
   el `gap` de 16 px se metería entre medio y la frase se leería partida
   (`feedback_un_flex_parte_la_oracion`). */
.cm-ui .cm-pie-lista .cuenta { min-width: 0; }
/* La nota empuja al botón contra el borde y SE ENCOGE antes que él: sin el
   `min-width: 0` el pie envolvía y «Ver 20 más» caía a un segundo renglón,
   solo, a la izquierda. */
.cm-ui .cm-pie-lista .nota {
    margin-left: auto; color: var(--faint); text-align: right;
    flex: 0 1 auto; min-width: 0;
}

/* =============================================================================
   EL CELULAR — la MISMA tabla, plegada
   =============================================================================
   No hay un segundo render y no hay un segundo HTML: las celdas pasan a
   `display: block` y cada una se ubica con la clase que ya trae. La cabecera se
   va porque cuatro rótulos apilados son más ruido que dato, y lo que decían ya
   está en el texto de cada celda. */
@media (max-width: 560px) {
    .cm-ui .cm-plan { min-width: 0; display: block; }
    .cm-ui .cm-plan thead { display: none; }
    .cm-ui .cm-plan tbody { display: block; }
    .cm-ui .cm-fila {
        display: grid; grid-template-columns: minmax(0, 1fr) auto;
        gap: 2px 10px; align-items: baseline;
        padding: 9px 12px 9px 17px; position: relative;
        border-bottom: 1px solid var(--hair);
    }
    .cm-ui .cm-plan tbody tr:last-child { border-bottom: none; }
    .cm-ui .cm-plan tbody td {
        display: block; padding: 0; border: none; background: none;
        height: auto; white-space: normal; overflow: visible;
    }
    .cm-ui .cm-fila.pre td { background: none; }
    .cm-ui .cm-fila.pre { background: rgba(22, 104, 196, .028); }
    .cm-ui .cm-fila:hover td, .cm-ui .cm-fila:focus-visible td { background: none; }
    .cm-ui .cm-fila:hover, .cm-ui .cm-fila:focus-visible { background: var(--azure-050); }
    /* La celda de quién ocupa el ancho; la de qué sale se parte en dos: el
       artículo abajo y los kilos arriba a la derecha, que es donde el pulgar
       los busca. El verbo se va: en el celular se toca la fila. */
    .cm-ui .cm-plan td.fr     { grid-column: 1 / -1; grid-row: 1; }
    .cm-ui .cm-plan td.que    { grid-column: 1 / -1; grid-row: 2; }
    .cm-ui .cm-plan td.cuando { grid-column: 1 / -1; grid-row: 3; margin-top: 2px; }
    /* Las tres de Mis Clientes, en el mismo orden en que se leen: debe, vencido
       y último pago. Sin esto el grid las auto-coloca y la de la derecha se
       parte en dos columnas de 150 px. */
    .cm-ui .cm-plan td.deb    { grid-column: 1 / -1; grid-row: 2; }
    .cm-ui .cm-plan td.ven    { grid-column: 1 / -1; grid-row: 3; margin-top: 2px; }
    .cm-ui .cm-plan td.pag    { grid-column: 1 / -1; grid-row: 4; margin-top: 2px; }
    .cm-ui .cm-plan td.acr    { display: none; }
    /* PLEGADA, LA CABECERA SE VA Y CON ELLA LOS ROTULOS. En Mis Pedidos no hace
       falta —un artículo, unos kilos y una fecha se explican solos—, pero en Mis
       Clientes quedan TRES IMPORTES SEGUIDOS: el saldo, lo vencido y el último
       pago, y sin rótulo el segundo se lee como el primero. Lo agarró la foto a
       390.

       CADA MESA LLEVA LOS SUYOS, y esto también lo agarró la foto: Cobranzas usó
       la misma clase que Mis Clientes y en el celular sus columnas salieron
       rotuladas «DEBE 3 documentos · VENCIDO 22/08». El rótulo es de la columna,
       no del layout: dos pantallas con las mismas celdas y distintas columnas
       necesitan dos juegos. */
    .cm-ui .cm-plan.cc td.deb .cm-log::before { content: 'Debe '; }
    .cm-ui .cm-plan.cc td.ven .cm-log::before { content: 'Vencido '; }
    .cm-ui .cm-plan.cc td.pag .cm-log::before { content: 'Último pago '; }
    .cm-ui .cm-plan.cb td.deb .cm-log::before { content: 'Guardados '; }
    .cm-ui .cm-plan.cb td.ven .cm-log::before { content: 'Último cobro '; }
    .cm-ui .cm-plan.cb td.pag .cm-log::before { content: 'Qué mirar '; }
    .cm-ui .cm-plan.cc .cm-log::before, .cm-ui .cm-plan.cb .cm-log::before {
        font-size: 10px; font-weight: 700; letter-spacing: .07em;
        text-transform: uppercase; color: var(--faint);
    }
    /* Plegado, el subrenglón deja de tener alto fijo: acá el ancho no aprieta y
       cortar una sucursal con puntos suspensivos sería esconder por gusto. */
    .cm-ui .cm-plan .cm-sub { height: auto; white-space: normal; }
    .cm-ui .cm-plan .cm-art { white-space: normal; }
    .cm-ui .cm-plan .cm-quien b { white-space: normal; }
    /* La franja vuelve a ser la barra al margen de la fila entera. */
    .cm-ui .cm-plan td.fr { padding-left: 0; }
    .cm-ui .cm-plan td.fr::before { display: none; }
    .cm-ui .cm-fila::before {
        content: ''; position: absolute; left: 6px; top: 9px; bottom: 9px;
        width: 3px; border-radius: 2px; background: var(--hair-strong);
    }
    .cm-ui .cm-fila.e-nav::before  { background: var(--navy); }
    .cm-ui .cm-fila.e-aut::before  { background: var(--navy-300); }
    .cm-ui .cm-fila.e-mut::before  { background: var(--hair-strong); }
    .cm-ui .cm-fila.e-ok::before   { background: var(--ok); }
    .cm-ui .cm-fila.e-warn::before { background: var(--warn); }
    .cm-ui .cm-fila.e-crit::before { background: var(--crit); }
    .cm-ui .cm-barra .cm-fcli { max-width: none; }
    .cm-ui .cm-pest { width: 100%; }
    .cm-ui .cm-pest .cm-pest-b { flex: 1 1 0; justify-content: center; }
}

/* --- Movimiento reducido: la fila no se anima (§5) ------------------------- */
@media (prefers-reduced-motion: reduce) {
    .cm-ui .cm-fila { transition: none; }
    .cm-ui .cm-pest .cm-pest-b { transition: none; }
    .cm-ui .cm-pest .cm-pest-b:hover { transform: none; }
}
