/* =============================================================================
   DISTRIBUIDORES — identidad visual. Scope .dx-ui, colgado de core/tokens.css.
   =============================================================================
   El módulo de la mercadería que está en poder de un distribuidor. UNA SOLA
   PANTALLA —«el mostrador»— para adentro y para afuera: rail a la izquierda con
   los distribuidores y sus tres unidades (azúcar, edulcorantes, jugos), panel a
   la derecha con lo elegido. Mockup B, elegido por Hernán el 18/08/2026.

   EL TRATAMIENTO ES EL DE COMERCIALES — «capas con acento», y a pedido de
   Hernán ese mismo día: la pantalla anterior era CHATA (todo blanco sobre casi
   blanco, sin jerarquía). Se heredan los DOS apartamientos de `.cm-ui`, con el
   mismo porqué, más un tercero propio:

     1. `--azure` para lo que se TOCA (el ítem elegido del rail, el pie que
        lleva a otra pantalla, el foco). Navy queda para la ESTRUCTURA: la
        cinta de arriba y la cabecera del panel. El acento NO es semántico:
        azure nunca significa «bien» ni «mal». El color que SÍ significa —el
        remito anulado, la unidad que no se puede contar— sigue siendo el de
        los tokens (ok / warn / crit).
     2. Lienzo más oscuro que el de los otros módulos (#f1f2f5): la jerarquía
        se apoya en la ELEVACIÓN, y una tarjeta blanca no despega de un fondo
        casi blanco.
     3. LAS DOS SUPERFICIES NAVY LLENAS —la cinta y la cabecera del panel— son
        lo que saca a esta pantalla de lo chato. Son estructura, no adorno:
        dicen DÓNDE estás parado (qué distribuidor, qué unidad) en una banda
        que no se puede confundir con una tarjeta de datos.

   TODO selector va bajo `.dx-ui`. Una regla suelta llamada `.card` o `.rail`
   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 `.dx-ui` está nombrado junto
   a los otros scopes. Si esta pantalla sale con la Inter del <body> en vez de
   Segoe UI, lo primero que hay que mirar es esas listas.

   NADA DE NÚMEROS GIGANTES (memoria `feedback_evitar_numeros_gigantes`): la
   cifra de un KPI es 1.02rem, el mismo escalón que el tablero de Comerciales.
   ========================================================================== */

.dx-ui {
    --azure: #1668c4;
    --azure-700: #1259ab;
    --azure-050: #eaf2fd;
    --canvas: #e6ebf3;
}

/* La misma trampa del §7 del manual: `.hidden` (la clase) ya está resuelta en
   core/tokens.css, pero `hidden` (el ATRIBUTO) lo declara la hoja del
   navegador y cualquier `display` nuestro le gana sin pelear. */
.dx-ui [hidden] { display: none !important; }

/* =============================================================================
   EL ARMAZÓN — cinta arriba, rail y panel abajo, alto completo
   -----------------------------------------------------------------------------
   SIN ESPACIO entre las dos clases: el div es `class="dx-ui dx-shell"`, UN
   elemento con las dos. Escrito con espacio no matchearía nada — la trampa que
   le costó seis etapas al ABM.

   El scroll es de cada columna, no del wrapper (`#page-distribuidores` lleva
   `data-shell="full"`): el rail y el panel se desplazan por separado, así el
   rail no se va de la pantalla mientras se lee una tabla larga.
   ========================================================================== */
.dx-ui.dx-shell {
    display: flex; flex-direction: column;
    height: 100%; min-height: 0;
    background: var(--canvas);
}

/* --- La cinta: dónde estás parado y cuánto hay, en navy lleno -------------- */
.dx-ui .dx-cinta {
    flex: 0 0 auto;
    display: flex; align-items: center; gap: 10px 22px; flex-wrap: wrap;
    padding: 11px 20px;
    background: var(--navy); color: #fff;
}
.dx-ui .dx-cinta .tit {
    display: flex; align-items: baseline; gap: 9px; min-width: 0;
}
.dx-ui .dx-cinta .tit .q { font-size: .95rem; font-weight: 700; letter-spacing: -.01em; }
.dx-ui .dx-cinta .tit .u { font-size: .78rem; opacity: .78; }
.dx-ui .dx-cinta .cif { display: flex; gap: 22px; margin-left: auto; flex-wrap: wrap; }
.dx-ui .dx-cinta .cif .c { display: flex; flex-direction: column; gap: 1px; }
.dx-ui .dx-cinta .cif .r {
    font-size: .58rem; font-weight: 800; letter-spacing: .09em;
    text-transform: uppercase; opacity: .7;
}
.dx-ui .dx-cinta .cif .v { font-size: .92rem; font-weight: 800; line-height: 1.2; }
.dx-ui .dx-cinta .cif .v.nada { font-weight: 400; opacity: .6; }

.dx-ui .dx-body { flex: 1 1 auto; min-height: 0; display: flex; }

/* =============================================================================
   EL RAIL — los distribuidores, sus unidades, y lo que es del circuito
   ========================================================================== */
.dx-ui .dx-rail {
    flex: 0 0 232px; width: 232px; min-height: 0; overflow-y: auto;
    background: var(--surface); border-right: 1px solid var(--hair);
    padding: 10px 0 18px;
}
.dx-ui .dx-grupo {
    padding: 11px 16px 5px; font-size: .58rem; font-weight: 800;
    letter-spacing: .12em; text-transform: uppercase; color: var(--faint);
}
.dx-ui .dx-item {
    /* `box-sizing` EXPLÍCITO: es un <button> de ancho completo con padding, y
       sin esto el ancho se le suma a los 32 px de padding, se pasa del rail y
       la cifra de la derecha queda RECORTADA («86.» en vez de «86.400»). No
       alcanza con que lo declare la hoja global: este scope también se monta en
       el banco, y ahí no está. */
    box-sizing: border-box;
    display: flex; align-items: center; gap: 9px; width: 100%;
    padding: 8px 16px; font: inherit; font-size: .8rem; font-weight: 700;
    color: var(--ink); background: none; border: none;
    border-left: 3px solid transparent; text-align: left; cursor: pointer;
    transition: background-color .15s var(--curva);
}
.dx-ui .dx-item:hover, .dx-ui .dx-item:focus-visible {
    background: var(--azure-050); outline: none;
}
.dx-ui .dx-item .material-symbols-outlined { font-size: 18px; color: var(--faint); }
/* El nombre se acorta y la cifra NO: un «86.» en el rail es peor que un nombre
   con puntos suspensivos — el nombre se reconoce igual, la cifra recortada
   MIENTE. Por eso `flex: 0 0 auto` en la cifra y el encogimiento en el nombre. */
.dx-ui .dx-item .nm {
    flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dx-ui .dx-item .kg {
    flex: 0 0 auto; margin-left: auto; padding-left: 6px;
    font-size: .68rem; font-weight: 700; color: var(--faint);
    font-variant-numeric: tabular-nums; white-space: nowrap;
}
/* La sub-entrada: una unidad de negocio DE un distribuidor. */
.dx-ui .dx-item.sub { padding-left: 32px; font-weight: 500; font-size: .77rem; }
.dx-ui .dx-item.on {
    background: var(--azure-050); border-left-color: var(--azure); color: var(--azure);
}
.dx-ui .dx-item.on .material-symbols-outlined, .dx-ui .dx-item.on .kg { color: var(--azure); }
/* El punto ámbar: acá falta algo. UNA SOLA marca en todo el rail (el mismo
   vocabulario que el rail del Portal Proveedores). */
.dx-ui .dx-item .marca {
    flex: 0 0 auto; width: 6px; height: 6px; border-radius: 999px;
    background: var(--warn); margin-left: 6px;
}
.dx-ui .dx-rail .vacio {
    padding: 10px 16px; font-size: .74rem; color: var(--faint); font-style: italic;
}

/* =============================================================================
   EL PANEL — una sola cosa a la vez, con todo el ancho
   ========================================================================== */
.dx-ui .dx-panel { flex: 1 1 auto; min-width: 0; min-height: 0; overflow-y: auto; }
.dx-ui .dx-panel-in { padding: 16px 22px 34px; max-width: 1180px; }

/* La cabecera del panel: la segunda superficie navy. Dice sobre QUÉ se está
   operando y trae las acciones que actúan sobre eso — al lado del dato, no en
   una fila de botones sueltos al pie (memoria `feedback_la_accion_al_lado_del_dato`). */
.dx-ui .dx-cab {
    display: flex; gap: 12px 18px; align-items: center; flex-wrap: wrap;
    padding: 13px 17px; border-radius: var(--r-card) var(--r-card) 0 0;
    background: var(--navy); color: #fff; box-shadow: var(--e2);
}
.dx-ui .dx-cab h3 { margin: 0; font-size: .95rem; font-weight: 700; letter-spacing: -.01em; }
.dx-ui .dx-cab .sub { font-size: .74rem; opacity: .8; margin-top: 2px; max-width: 74ch; line-height: 1.5; }
.dx-ui .dx-cab .acc { margin-left: auto; display: flex; gap: 8px; flex-wrap: wrap; }
/* La tarjeta que cuelga de la cabecera arranca sin esquinas arriba: son una
   sola pieza, no dos elementos apilados que casualmente se tocan. */
.dx-ui .dx-cab + .dx-blk { border-radius: 0 0 var(--r-card) var(--r-card); border-top: none; }

/* =============================================================================
   LOS BLOQUES Y LAS CIFRAS
   ========================================================================== */
.dx-ui .dx-blk {
    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;
}
.dx-ui .dx-cab + .dx-blk { margin-top: 0; }
.dx-ui .dx-blk-h {
    display: flex; gap: 8px 12px; align-items: baseline; flex-wrap: wrap;
    padding: 11px 16px; border-bottom: 1px solid var(--hair); background: #fafbfd;
}
.dx-ui .dx-blk-h .t {
    font-size: .68rem; font-weight: 800; letter-spacing: .08em;
    text-transform: uppercase; color: var(--muted);
}
.dx-ui .dx-blk-h .h { font-size: .71rem; color: var(--faint); }
.dx-ui .dx-blk-h .der { margin-left: auto; display: flex; gap: 8px; align-items: center; }
.dx-ui .dx-blk-b { padding: 13px 16px; }

/* La tira de KPI — rótulo arriba, cifra, y una línea chica que la explica.
   `auto-fit` y no columnas fijas: una unidad trae tres cifras y otra dos. */
.dx-ui .dx-kpi {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(126px, 1fr));
    border-bottom: 1px solid var(--hair); background: var(--surface);
}
.dx-ui .dx-kpi .c { padding: 11px 16px; border-left: 1px solid var(--hair); min-width: 0; }
.dx-ui .dx-kpi .c:first-child { border-left: none; }
.dx-ui .dx-kpi .c .r {
    display: block; font-size: .58rem; font-weight: 800; letter-spacing: .07em;
    text-transform: uppercase; color: var(--faint);
}
.dx-ui .dx-kpi .c .v {
    display: block; font-size: 1.02rem; font-weight: 800; line-height: 1.25;
    color: var(--ink); margin-top: 2px;
}
.dx-ui .dx-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 kg» al lado de
   una cifra de seis dígitos se lee como una cifra (memoria `feedback_cero_que_nadie_conto`).
   Y una cifra que TODAVÍA NO SE SABE no es un cero (memoria `feedback_todavia_no_lo_se_no_es_no_hay`). */
.dx-ui .dx-kpi .c.cero .v, .dx-ui .dx-kpi .c.mudo .v { color: var(--faint); font-weight: 400; }
.dx-ui .dx-kpi .c.nav .v { color: var(--navy-500); }
.dx-ui .dx-kpi .c.ok  .v { color: var(--ok); }
.dx-ui .dx-kpi .c.w1  .v { color: var(--warn); }
.dx-ui .dx-kpi .c.w2  .v { color: var(--crit); }

/* =============================================================================
   EL AVISO — un renglón con borde de estado (familia de .cm-risk / .cx-risk)
   ========================================================================== */
.dx-ui .dx-risk {
    /* GRID Y NO FLEX: con flex los dos <p> del bloque se acomodaban en dos
       columnas —el segundo flotando al costado del primero, a media altura— y el
       `p + p { margin-top }` de mas abajo no hacia nada, que es la señal de que
       la intencion siempre fue apilarlos. El icono se queda en la columna 1 y
       todo lo demas baja por la 2. */
    display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 9px;
    align-items: start;
    margin: 13px 0 0; padding: 10px 14px; 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.6;
}
.dx-ui .dx-blk-b > .dx-risk:first-child { margin-top: 0; }
.dx-ui .dx-risk > p { grid-column: 2; }
.dx-ui .dx-risk p { margin: 0; max-width: 78ch; }
.dx-ui .dx-risk p + p { margin-top: 7px; }
.dx-ui .dx-risk b { font-weight: 700; }
.dx-ui .dx-risk .material-symbols-outlined {
    flex: 0 0 auto; margin-top: 1px; font-size: 18px; color: var(--faint);
}
.dx-ui .dx-risk.alerta {
    border-left-color: var(--warn); border-color: var(--warn-hair); background: var(--warn-050);
}
.dx-ui .dx-risk.alerta .material-symbols-outlined { color: var(--warn); }
.dx-ui .dx-risk.mal {
    border-left-color: var(--crit); border-color: var(--crit-hair); background: var(--crit-050);
}
.dx-ui .dx-risk.mal .material-symbols-outlined { color: var(--crit); }

/* =============================================================================
   BOTONES
   ========================================================================== */
.dx-ui .dx-btn {
    display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
    padding: 7px 14px; font: inherit; font-size: .78rem; font-weight: 700;
    border-radius: 9px; border: 1px solid transparent;
    transition: transform .15s var(--curva), box-shadow .15s var(--curva),
                background-color .15s var(--curva);
}
.dx-ui .dx-btn .material-symbols-outlined { font-size: 17px; }
.dx-ui .dx-btn:hover, .dx-ui .dx-btn:focus-visible {
    transform: translateY(-2px); box-shadow: var(--e1); outline: none;
}
/* Sobre la cinta navy el botón principal no puede ser navy: es blanco lleno, y
   el secundario, el contorno claro. */
.dx-ui .dx-cab .dx-btn.pri { background: #fff; color: var(--navy); }
.dx-ui .dx-cab .dx-btn.pri:hover { background: #eef3fb; }
.dx-ui .dx-cab .dx-btn.sec {
    background: rgba(255, 255, 255, .12); color: #fff; border-color: rgba(255, 255, 255, .45);
}
.dx-ui .dx-cab .dx-btn.sec:hover { background: rgba(255, 255, 255, .22); }
.dx-ui .dx-btn.pri { background: var(--navy); color: #fff; }
.dx-ui .dx-btn.pri:hover { background: var(--navy-700); }
.dx-ui .dx-btn.sec { background: var(--surface); color: var(--navy); border-color: var(--hair-strong); }
.dx-ui .dx-btn.gho { background: none; color: var(--azure); }
.dx-ui .dx-btn.gho:hover { background: var(--azure-050); }
.dx-ui .dx-btn.chico { padding: 4px 10px; font-size: .72rem; }
.dx-ui .dx-btn.chico .material-symbols-outlined { font-size: 15px; }
.dx-ui .dx-btn:disabled { opacity: .55; cursor: not-allowed; transform: none; box-shadow: none; }

/* =============================================================================
   TABLAS
   ========================================================================== */
.dx-ui .dx-tbl { overflow-x: auto; }
.dx-ui table.dx-g { width: 100%; border-collapse: collapse; font-size: .78rem; }
.dx-ui table.dx-g th {
    text-align: left; font-size: .62rem; font-weight: 800;
    letter-spacing: .08em; text-transform: uppercase; color: var(--faint);
    padding: 8px 16px; border-bottom: 1px solid var(--hair); white-space: nowrap;
}
.dx-ui table.dx-g td {
    padding: 9px 16px; border-bottom: 1px solid var(--hair); color: var(--ink);
    vertical-align: middle;
}
.dx-ui table.dx-g tr:last-child td { border-bottom: none; }
.dx-ui table.dx-g .n { text-align: right; font-variant-numeric: tabular-nums; }
.dx-ui table.dx-g .mono {
    font-family: ui-monospace, Consolas, monospace; font-weight: 700; color: var(--navy-500);
}
.dx-ui table.dx-g .art { font-weight: 600; }

/* La etiqueta de estado. Color = estado, y nada más. */
.dx-ui .dx-pill {
    display: inline-block; padding: 2px 8px; border-radius: 999px;
    font-size: .62rem; font-weight: 800; letter-spacing: .05em;
    text-transform: uppercase; border: 1px solid;
}
.dx-ui .dx-pill.ok  { background: var(--ok-050);   color: var(--ok);       border-color: var(--ok-hair); }
.dx-ui .dx-pill.wrn { background: var(--warn-050); color: var(--warn);     border-color: var(--warn-hair); }
.dx-ui .dx-pill.mal { background: var(--crit-050); color: var(--crit);     border-color: var(--crit-hair); }
.dx-ui .dx-pill.nav { background: var(--navy-050); color: var(--navy-500); border-color: var(--hair-strong); }

/* El dato ausente — gris e itálica, con palabras (manual §1.4). */
.dx-ui .dx-vacio { color: var(--faint); font-style: italic; }

/* La lista vacía — que la nada diga por qué. */
.dx-ui .dx-nada {
    padding: 26px 24px; text-align: center; color: var(--muted);
}
.dx-ui .dx-nada h4 { margin: 0; font-size: .9rem; font-weight: 700; color: var(--ink); }
.dx-ui .dx-nada p {
    margin: 8px auto 0; font-size: .78rem; max-width: 60ch; line-height: 1.6; text-align: left;
}
.dx-ui .dx-nada.chica { padding: 15px 20px; }
.dx-ui .dx-nada.chica p { margin: 0; text-align: center; }

/* --- Movimiento reducido: el destaque queda, el desplazamiento no (§5) ----- */
@media (prefers-reduced-motion: reduce) {
    .dx-ui .dx-btn, .dx-ui .dx-item { transition: none; }
    .dx-ui .dx-btn:hover, .dx-ui .dx-btn:focus-visible { transform: none; }
}

/* --- Angosto: el rail se acuesta arriba y el panel toma el ancho ----------- */
@media (max-width: 860px) {
    .dx-ui .dx-body { flex-direction: column; }
    .dx-ui .dx-rail {
        flex: 0 0 auto; width: auto; max-height: 42vh;
        border-right: none; border-bottom: 1px solid var(--hair);
    }
    .dx-ui .dx-panel-in { padding: 13px 15px 26px; }
}
