/* ═══════════════════════════════════════════════════════════════════════════
   Multi X · identidad corporativa
   ───────────────────────────────────────────────────────────────────────────
   Aprobada el 17-08-2026 y aplicada a TODOS los usuarios. Antes fue un piloto
   acotado al rol Admin: de ahí vienen dos rasgos que conviene entender antes de
   tocar este archivo, porque ya no son necesarios pero sí son útiles.

   ⚠ Todo sigue acotado a `html[data-diseno]`, y las reservas
   `var(--mx-token, #elHexDeSiempre)` siguen en su lugar. Hoy el atributo lo pone
   siempre el `<head>` de `index.html`, así que las reservas no se usan nunca.
   NO son código muerto: son lo que permite volver atrás quitando una línea del
   `<head>`. Quitarlas es una decisión aparte, no una limpieza.

   El interruptor del tema está en `componentes/switch-tema.js` y lo ve cualquiera:
   los dos ejes son una preferencia personal, no un permiso.

   ── La tesis ───────────────────────────────────────────────────────────────
   El login ya estableció el lenguaje: la página es un DOCUMENTO, y la
   referencia es el horizonte de un fiordo — agua profunda, cielo pálido, una
   línea dura entre los dos.

   La aplicación extiende ese mismo gesto en vez de inventar otro:

       el marco (topbar + sidebar)  =  el agua        → azul #003A70
       la superficie de trabajo     =  el cielo       → papel #F4F6F9
       la regla de 3px entre ambos  =  el horizonte   → coral #FF5959

   ── La regla que hereda del login, y que no se rompe ───────────────────────
   El coral aparece UNA sola vez en toda la pantalla: la línea bajo el topbar.
   No vive en botones, ni en estados, ni en el ítem activo del menú. El motivo
   está escrito en login.html y sigue vigente: en este dashboard el rojo
   significa error —tanda fallida, divergencia— así que el acento de marca no
   puede aparecer en un control sin leerse como alerta.

   Por eso el ítem activo del menú se marca en BLANCO PAPEL, no en coral.

   ── Alcance, y por qué es seguro ───────────────────────────────────────────
   · El marco cambia en toda la app: es un cambio de tono sobre algo que ya era
     oscuro, así que las 11 vistas no incluidas en el piloto siguen legibles.
   · La superficie clara y el rediseño de contenido se aplican SOLO a las dos
     vistas del piloto, acotados por `body:has(.us-container)` y
     `body:has(.rp-container)` — o sea, por el contenedor que cada vista pinta.
     Gestión de Usuarios
     y Gestión de Roles son las únicas del proyecto con el 100% de sus clases
     CSS exclusivas (38/38 y 48/48): nada de lo que se toque acá puede
     alcanzar a otra pantalla.
   · Los estilos de esas dos vistas se INYECTAN desde su propio JS, así que este
     archivo gana por especificidad (`body:has(.us-container) .us-table` pesa
     más que `.us-table`) sin depender del orden de carga.

   ⚠ Y por eso NO hay una sola línea de JavaScript acá. El primer intento marcaba
     la vista con `body[data-vista]` desde `showView`, y no funcionó: SIETE
     módulos de vista (usuarios, roles-permisos, payment-confirm,
     purchase-invoices, sales-invoices, deuda-financiera y flujo-caja) reemplazan
     `window.showView` encadenándose uno sobre otro, y el de `usuarios` atiende
     su propia vista y retorna SIN delegar. Cualquier envoltura que se instale
     antes que ellos queda enterrada; cualquiera que se instale después es
     frágil. Preguntarle al DOM qué se está mostrando no depende de esa pila.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ⚠ Va en `html[data-diseno]`, NO en `:root`, y el motivo apareció tarde:
   `deuda-financiera.js` ahora escribe sus colores como `var(--mx-error,#ff8585)`
   —el token si el piloto está puesto, el hex de siempre si no—. Con estas
   variables definidas en `:root` existirían SIEMPRE, así que la reserva no se
   usaría nunca y el CFO vería colores de estado distintos sin que nadie haya
   activado nada. Acotarlas es lo que hace verdadera la promesa de que apagar el
   piloto deja la pantalla exactamente como estaba. */
html[data-diseno] {
  /* Medidos sobre el logotipo oficial. Son los mismos ocho del login: este
     archivo no introduce ni un color nuevo. */
  --mx-navy:       #003A70;
  --mx-navy-deep:  #002A52;
  --mx-navy-soft:  #0A4A85;   /* hover sobre el agua, sin salirse del azul */
  --mx-coral:      #FF5959;

  --mx-paper:      #FFFFFF;
  --mx-paper-2:    #F4F6F9;
  --mx-ink:        #0E1A26;
  --mx-ink-2:      #5C6E7E;
  --mx-rule:       #DCE3EA;

  --mx-error:      #B3261E;   /* rojo de ESTADO, deliberadamente ≠ coral */
  --mx-error-bg:   #FDECEA;
  --mx-ok:         #0F7A5A;   /* verde de estado, no de marca */
  --mx-ok-bg:      #E7F4EF;

  --mx-rule-w:     3px;       /* el grosor del login, sin cambiar */
}

/* ═══════════════════════════════════════════════════════════════════════════
   LAS DOS PALETAS DEL CONTENIDO — `data-tema`
   ───────────────────────────────────────────────────────────────────────────
   Los ocho tokens de arriba son la MARCA: fijos, medidos sobre el logotipo, no
   cambian nunca. Los de acá abajo son los ROLES que el contenido usa —
   superficie, tinta, línea, acento— y son los que el tema da vuelta.

   La distinción no es cosmética. `--mx-navy` cumplía los dos papeles a la vez:
   el fondo del topbar marino y el acento de los títulos. Con un solo nombre,
   oscurecer el contenido arrastraba el marco, y era imposible tener el marco
   azul con las tarjetas oscuras — que es justamente una de las combinaciones
   que se quieren comparar.

   ⚠ Esto vale para Gestión de Usuarios y Gestión de Roles. El resto de la app
   la cambia `tema-claro.css`, que da vuelta los 20 tokens de `styles.css`. Son
   dos archivos porque son dos capas distintas, y el tema tiene que mover las
   dos a la vez: si moviera solo una, la vista rediseñada quedaría clara sobre
   una app oscura, o al revés.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ⚠ El claro va en `html[data-diseno]` a secas, SIN pedir `data-tema`, y eso es
   deliberado: es la red de seguridad. Si alguna vez el atributo del tema falta
   —un valor raro en `localStorage`, una variante nueva sin tema natural—, estas
   variables igual tienen valor. Sin esa red, las declaraciones que las usan se
   descartan por inválidas y la vista sale a medio pintar, sin un solo error en
   consola: exactamente la clase de falla muda que este proyecto ya conoce. */
html[data-diseno] {
  --mx-sup:           var(--mx-paper);
  --mx-sup-2:         var(--mx-paper-2);
  --mx-tinta:         var(--mx-ink);
  --mx-tinta-2:       var(--mx-ink-2);
  --mx-linea:         var(--mx-rule);
  --mx-acento:        var(--mx-navy);
  --mx-acento-hondo:  var(--mx-navy-deep);
  --mx-acento-suave:  var(--mx-navy-soft);

  --mx-avi:           #8A5A00;   /* aviso: el ámbar de "sin guardar" */
  --mx-avi-bg:        #FDF4E3;
  --mx-avi-linea:     #E4C88A;

  /* ── El acento SÓLIDO es otro token, y tiene que serlo ────────────────────
     `--mx-acento` es para TEXTO y BORDES: se elige para leerse SOBRE la
     superficie. Rellenar un botón con él y poner texto blanco encima es la
     operación inversa, y en tema oscuro sale mal: ahí el acento es un azul
     claro (#6FB2E8) y el blanco encima da 2,28:1.
     Medido en el botón "Ver + Autorizar" de la matriz de permisos, HABILITADO.
     ⚠ No lo encontró ninguna de las verificaciones anteriores porque el
     barrido no incluía la vista de Roles —la única del piloto con un control
     relleno— y porque en el rol que se abre primero, Admin, los 35 botones
     están deshabilitados: ahí un contraste bajo es correcto y esperable. */
  --mx-acento-solido: var(--mx-navy);
  --mx-sobre-acento:  #FFFFFF;
  --mx-acento-tenue:  rgba(0, 58, 112, .07);

  /* ── Niveles que Deuda Financiera necesita y las dos primeras no ──────────
     Su hoja distingue tres profundidades de superficie —tarjeta, campo hundido
     y encabezado realzado— y tres niveles de texto. Con dos de cada uno había
     que aplastar distinciones que la vista usa para separar la tabla de sus
     encabezados y de sus campos editables. */
  --mx-sup-hund:      #F7F9FB;   /* campos, pistas de barra, pie de tabla */
  --mx-sup-alza:      #EEF2F7;   /* encabezado de tabla, hover, pestanas */
  --mx-linea-2:       #C4D0DC;   /* borde de control, mas firme que el de bloque */
  /* ⚠ Era #6E8093 y este comentario afirmaba "4,9:1 sobre papel". Cierto sobre
     el papel blanco puro, FALSO donde el token se usa de verdad: los rotulos
     viven sobre --mx-sup-alza (#EEF2F7), y ahi daba 3,58:1. Medir contra el
     fondo que el token va a tener, no contra el mas claro de la paleta. */
  --mx-tinta-3:       #586A7E;   /* rotulos y unidades; 4,90:1 sobre --mx-sup-alza */
  --mx-teal:          #0E6E64;   /* la serie de alimento: dato, no marca */
}

html[data-diseno][data-tema="oscuro"] {
  /* Las superficies NO son el claro invertido: son azules desaturados, para
     que el marco azul y el contenido se lean como la misma familia. Un gris
     neutro acá hace que el topbar parezca pegado de otra aplicación. */
  --mx-sup:           #10233A;   /* tarjetas, modales */
  --mx-sup-2:         #0A1828;   /* fondo de la vista */
  --mx-tinta:         #E8EEF4;
  --mx-tinta-2:       #94A8BC;   /* 5,9:1 sobre --mx-sup */
  --mx-linea:         #1E3450;

  /* ⚠ El azul de marca #003A70 sobre un fondo oscuro da 1,4:1: como acento es
     invisible. Se sube en luminancia conservando el matiz — sigue siendo el
     mismo azul, no otro color. El de marca queda para el marco, donde va sobre
     blanco y sí se lee. */
  --mx-acento:        #6FB2E8;
  --mx-acento-hondo:  #0A1828;
  --mx-acento-suave:  #1B4A78;

  --mx-avi:           #E5B25C;
  --mx-avi-bg:        rgba(229, 178, 92, .12);
  --mx-avi-linea:     rgba(229, 178, 92, .34);

  /* El sólido va al lado OPUESTO que el acento: mientras el de texto sube en
     luminancia para leerse sobre el fondo, este baja para que el blanco se lea
     sobre él. Blanco sobre #1B4A78 da 9,1:1. */
  --mx-acento-solido: #1B4A78;
  --mx-sobre-acento:  #FFFFFF;
  --mx-acento-tenue:  rgba(111, 178, 232, .12);

  --mx-sup-hund:      #071220;
  --mx-sup-alza:      #16304C;
  --mx-linea-2:       #2A4463;
  --mx-tinta-3:       #7D93AB;
  --mx-teal:          #5FD6C4;

  /* Los estados también suben: los de arriba están calculados sobre papel. */
  --mx-error:         #FF8A80;
  --mx-error-bg:      rgba(255, 138, 128, .12);
  --mx-ok:            #5FD3A6;
  --mx-ok-bg:         rgba(95, 211, 166, .12);
}

/* ═══════════════════════════════════════════════════════════════════════════
   EL MARCO — el agua
   ───────────────────────────────────────────────────────────────────────────
   Escrito en DOS capas, y la separación es el punto:

     · el GESTO  — la línea coral, el trazo de 3px del ítem activo, las
                   versalitas del rótulo. Es lo que hace corporativo al marco,
                   y es IGUAL en las tres variantes.
     · el COLOR  — sale de siete variables que cada variante redefine. Las
                   reglas de abajo no saben en qué variante están.

   Las dos variantes, y en qué se diferencian de verdad:

     papel   — membrete y menú en papel. La más cercana a multi-xsalmon.com,
               y la elegida como diseño por defecto.
     marino  — el agua ocupa el marco entero. La más rotunda.

   Hubo una tercera, `contraste` (banda de marca arriba, menú en papel). Se
   descartó al elegir: dejar tres marcos vivos significaba tres combinaciones
   más que mantener y verificar, y ninguna aportaba algo que estas dos no den.

   ⚠ El marco es INDEPENDIENTE del tema. Se puede tener el marco marino con el
   contenido claro, o el marco papel con el contenido oscuro: son dos ejes, y
   la gracia de tenerlos separados es poder comparar las combinaciones. Lo
   único que el tema le impone al marco es que `marino` mantiene su banda azul
   en los dos temas — esa banda ES la variante.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── El marco: el azul de marca ocupa el membrete y el menú ──────────────── */
/*
   Hubo dos variantes en evaluación —`papel`, con el membrete claro— y se eligió
   ésta el 17-08-2026. Con `papel` se fue lo único que dependía de ella: el
   cambio del logotipo. El del topbar es la versión BLANCA, y acá el membrete es
   azul en los dos temas, así que se lee siempre.

   ⚠ El marco NO sigue al tema, y es deliberado: el azul es la marca. El tema
   cambia la superficie de trabajo, no el membrete. Por eso `--mx-marco-*` no
   tiene una variante por tema.

   El atributo `data-diseno="marino"` se conserva aunque hoy tenga un solo valor:
   es lo que acota toda esta hoja, y quitarlo obligaría a reescribir 125 reglas.
*/
html[data-diseno="marino"] {
  --mx-marco-tinta:  #FFFFFF;
  --mx-marco-suave:  rgba(255, 255, 255, .72);
  --mx-marco-tenue:  rgba(255, 255, 255, .42);
  --mx-marco-hueco:  rgba(255, 255, 255, .10);
  --mx-marco-fondo:  var(--mx-navy);
  --mx-marco-menu:   var(--mx-navy-deep);
  --mx-marco-hover:  var(--mx-navy-soft);
  --mx-marco-activo: var(--mx-navy);
}

/* ── El bloque del usuario y el botón de salir ─────────────────────────────
   Traen su color propio de `styles.css` (`var(--text)`), y un color propio le
   gana a lo que hereden del `.topbar`. Como `--text` lo mueve el TEMA y el
   fondo del membrete lo fija la VARIANTE, quedan desacoplados: cada
   combinación donde apuntan en direcciones opuestas produce texto invisible.

   Pasó en las dos direcciones, y ninguna existe en un solo eje:
     papel + oscuro  → nombre casi blanco sobre membrete blanco   1,1:1
     marino + claro  → nombre oscuro sobre membrete azul          1,54:1
                       "Salir"                                    1,51:1

   Por eso se resuelven contra `--mx-marco-*`, que cada variante ya define
   según el color de SU membrete: la regla no necesita saber en qué variante ni
   en qué tema está.

   ⚠ Los dos bugs los encontró un barrido de TODO el texto visible, no una
   lista de selectores. Las cuatro verificaciones anteriores daban verde porque
   este texto no estaba en la lista — y una lista escrita a mano solo encuentra
   lo que uno ya sospecha. */
/* ⚠ El círculo del avatar queda AFUERA: tiene fondo propio (`var(--blue)`) y su
   letra es blanca. La primera versión de esta regla decía `#userInfo div` a
   secas y le pintó la inicial del mismo color que su círculo — 1:1, la letra
   desapareció dentro del disco. Arreglar un texto invisible creando otro. */
html[data-diseno] #userInfo,
html[data-diseno] #userInfo div:not([style*="border-radius"]) {
  color: var(--mx-marco-tinta) !important;
}
/* La segunda línea (el rol) se distingue por su tamaño, que `auth.js` fija en
   línea. Un `div + div` acá agarraba el contenedor de las dos líneas, no la
   segunda línea. */
html[data-diseno] #userInfo div[style*="font-size:11px"] {
  color: var(--mx-marco-suave) !important;
}
html[data-diseno] .topbar button,
html[data-diseno] .topbar .btn-logout { color: var(--mx-marco-tinta) !important; }
/* El switch del tema se pinta solo: no debe recibir la tinta del marco.
 *
 * ⚠ La regla de arriba alcanza a TODO `button` del membrete con `!important`, y el
 * switch es un `<button>`. Sin esta línea, sus iconos reciben `#FFFFFF !important`
 * y el que queda sobre el pomo blanco desaparece.
 *
 * Apunta a `.mxst`, el switch. Antes decía `.mxsd-op`, que eran los dos botones
 * del control anterior — cuando ese control se reemplazó (17-08-2026), la regla
 * quedó apuntando a una clase que ya no existe: sin efecto, y sin ningún error. */
html[data-diseno] .topbar .mxst { color: inherit !important; }

/* ── El círculo con la inicial del usuario ─────────────────────────────────
   ⚠ `auth.js` lo pinta con `background: var(--blue)`. En tema claro ese token
   vale #003A70 — el MISMO azul del membrete— así que el círculo desaparecía por
   completo y la letra quedaba flotando sola. Medido: distancia 0 sobre 255.

   Es una colisión que apareció al elegir marino + claro como defecto: con el
   marco claro el azul contrastaba, y con el tema oscuro `--blue` es otro azul.
   Solo se da en la combinación que ahora es la de todos.

   Se resuelve como el resto de lo que va sobre el marco: relleno translúcido
   sobre el azul, del mismo modo que la insignia del menú. Así no depende de qué
   valga `--blue` en cada tema. */
html[data-diseno] #userInfo div[style*="border-radius:50%"],
html[data-diseno] #userInfo div[style*="border-radius: 50%"] {
  background: rgba(255, 255, 255, .18) !important;
  color: var(--mx-marco-tinta) !important;
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .28);
}

/* La línea coral. Es EL gesto, y es horizontal como en el login: separa el
   membrete de marca de la superficie donde se trabaja.
   ⚠ El `color` va junto con el `background`, siempre. Al aclarar solo el fondo,
   el texto del topbar —que el diseño base pinta casi blanco— quedó blanco
   sobre blanco: 1,06:1, invisible. Lo detectó medir el contraste, no mirarlo. */
html[data-diseno] .topbar{
  background: var(--mx-marco-fondo) !important;
  color: var(--mx-marco-tinta) !important;
  border-bottom: var(--mx-rule-w) solid var(--mx-coral) !important;
}
html[data-diseno] .topbar-date{ color: var(--mx-marco-suave) !important; }
html[data-diseno] .logo-sub{
  color: var(--mx-marco-suave) !important;
  border-left-color: var(--mx-marco-hueco) !important;
}

html[data-diseno] .sidebar{
  background: var(--mx-marco-menu) !important;
  border-right: 1px solid var(--mx-marco-hueco) !important;
}

/* Rótulos de sección del menú: versalitas finas, casi un susurro. El menú es
   estructura, no contenido. */
html[data-diseno] .sidebar .nav-label{
  color: var(--mx-marco-tenue) !important;
  letter-spacing: .10em; font-size: 10px; font-weight: 600;
}

html[data-diseno] .sidebar .nav-item{ color: var(--mx-marco-suave) !important; }
html[data-diseno] .sidebar .nav-item:hover{
  color: var(--mx-marco-tinta) !important;
  background: var(--mx-marco-hover) !important;
}

/* ⚠ Activo en la tinta del marco, NO en coral — ver la regla del encabezado. La
   regla de 3px a la izquierda es el mismo trazo del login puesto de canto:
   marca dónde estás parado, que es información, no adorno. */
html[data-diseno] .sidebar .nav-item.active{
  color: var(--mx-marco-tinta) !important;
  background: var(--mx-marco-activo) !important;
  border-left-color: var(--mx-marco-tinta) !important;
}
html[data-diseno] .sidebar .nav-item.active .nav-icon{ opacity: 1; }
html[data-diseno] .sidebar .nav-icon{ opacity: .85; }

html[data-diseno] .sidebar .badge{
  background: var(--mx-marco-hueco) !important;
  color: var(--mx-marco-tinta) !important; font-weight: 600;
}
html[data-tema="claro"][data-diseno] .sidebar .badge{
  background: var(--mx-navy) !important; color: #fff !important;
}
html[data-diseno] .sidebar-toggle{ color: var(--mx-marco-suave) !important; }
html[data-diseno] .sidebar-toggle:hover{
  color: var(--mx-marco-tinta) !important; background: var(--mx-marco-hover) !important;
}

/* El chip "NEW" del menú era un degradado cian→azul de Tailwind, ajeno a la
   marca. Es el único lugar donde el coral vuelve a aparecer, y se justifica:
   señala una novedad, que es exactamente para lo que sirve un acento. */
/* El distintivo "NEW" del menú.
 *
 * ⚠ El texto es la tinta corporativa, NO blanco. Con blanco quedaba en 3,08:1
 * sobre el coral —debajo del mínimo AA de 4,5 para texto normal, y esto son 9 px—
 * y aparecía en las 13 vistas porque vive en el menú. Con la tinta da 5,76:1 y el
 * coral de marca queda intacto, que era la otra salida posible: oscurecer el
 * coral habría cumplido el contraste rompiendo el color. */
html[data-diseno] .sidebar .chip-open{
  background: var(--mx-coral) !important; color: var(--mx-ink, #0E1A26) !important;
  border-radius: 2px; letter-spacing: .04em; font-weight: 700;
}

/* ═══════════════════════════════════════════════════════════════════════════
   LA SUPERFICIE DE TRABAJO — el cielo
   Solo en las dos vistas del piloto.
   ═══════════════════════════════════════════════════════════════════════════ */

/* El fondo lo tiene BODY, no .main — .main es transparente. Se pintan los dos:
   body para que el color llegue hasta los bordes, y .main por si alguna vista
   futura le pone fondo propio. */
html[data-diseno] body:has(.us-container),
html[data-diseno] body:has(.rp-container){ background: var(--mx-sup-2); color: var(--mx-tinta); }

html[data-diseno] body:has(.us-container) .main,
html[data-diseno] body:has(.rp-container)    .main{
  background: var(--mx-sup-2);
  color: var(--mx-tinta);
}

/* Encabezado de página: el título con el peso, el subtítulo con el aire.
   Sin caja, sin fondo: es un membrete sobre papel. */
html[data-diseno] body:has(.us-container) .us-header,
html[data-diseno] body:has(.rp-container)    .rp-header{
  background: transparent; border: 0; padding: 0 0 18px;
  border-bottom: 1px solid var(--mx-linea);
  margin-bottom: 22px;
}
html[data-diseno] body:has(.us-container) .us-header h1,
html[data-diseno] body:has(.us-container) .us-header h2,
html[data-diseno] body:has(.rp-container)    .rp-header h1,
html[data-diseno] body:has(.rp-container)    .rp-header h2{
  color: var(--mx-acento); font-weight: 700; letter-spacing: -.01em;
}
html[data-diseno] body:has(.us-container) .us-header p,
html[data-diseno] body:has(.rp-container)    .rp-header p{ color: var(--mx-tinta-2); }

/* ── Superficies ─────────────────────────────────────────────────────────── */
html[data-diseno] body:has(.us-container) .us-container,
html[data-diseno] body:has(.us-container) .us-table-wrap,
html[data-diseno] body:has(.rp-container)    .rp-container,
html[data-diseno] body:has(.rp-container)    .rp-body,
html[data-diseno] body:has(.rp-container)    .rp-section{
  background: var(--mx-sup);
  border-color: var(--mx-linea);
  color: var(--mx-tinta);
}

/* ── Tabla de usuarios ───────────────────────────────────────────────────── */
html[data-diseno] body:has(.us-container) .us-table{ color: var(--mx-tinta); }
html[data-diseno] body:has(.us-container) .us-table thead th{
  background: var(--mx-sup-2);
  color: var(--mx-tinta-2);
  border-bottom: 1px solid var(--mx-linea);
  font-size: 10.5px; font-weight: 700; letter-spacing: .09em;
  text-transform: uppercase;
}
html[data-diseno] body:has(.us-container) .us-table tbody tr{ border-bottom: 1px solid var(--mx-linea); }
html[data-diseno] body:has(.us-container) .us-table tbody tr:hover{ background: var(--mx-sup-2); }
html[data-diseno] body:has(.us-container) .us-table td{ color: var(--mx-tinta); }

/* El correo y la fecha en monoespaciada: son datos que se COMPARAN de una fila
   a otra, y alinear sus caracteres es lo que hace posible barrer la columna con
   la vista. El resto del texto se lee, no se compara. */
html[data-diseno] body:has(.us-container) .us-td-email,
html[data-diseno] body:has(.us-container) .us-td-fecha{
  font-family: var(--mono); font-size: 12px; color: var(--mx-tinta-2);
}

/* ── Estado del usuario ──────────────────────────────────────────────────── */
html[data-diseno] body:has(.us-container) .us-badge{
  border-radius: 2px; font-weight: 600; letter-spacing: .04em;
  text-transform: uppercase; font-size: 10px; padding: 3px 8px;
}
html[data-diseno] body:has(.us-container) .us-badge-activo{
  background: var(--mx-ok-bg); color: var(--mx-ok); border: 1px solid rgba(15,122,90,.24);
}
html[data-diseno] body:has(.us-container) .us-badge-inactivo{
  background: transparent; color: var(--mx-tinta-2); border: 1px solid var(--mx-linea);
}

/* ── Botones ─────────────────────────────────────────────────────────────── */
html[data-diseno] body:has(.us-container) .us-btn,
html[data-diseno] body:has(.rp-container)    .rp-btn{
  border-radius: 2px; font-weight: 600; letter-spacing: .01em;
  border: 1px solid var(--mx-linea); background: var(--mx-sup); color: var(--mx-tinta);
  transition: background .13s, border-color .13s, color .13s;
}
html[data-diseno] body:has(.us-container) .us-btn:hover,
html[data-diseno] body:has(.rp-container)    .rp-btn:hover{ background: var(--mx-sup-2); }

/* La acción principal es azul sólido, como el botón de acceso del login. */
html[data-diseno] body:has(.us-container) .us-btn-primary,
html[data-diseno] body:has(.rp-container)    .rp-btn-primary,
html[data-diseno] body:has(.rp-container)    .rp-btn-new{
  background: var(--mx-acento-solido); border-color: var(--mx-acento-solido);
  color: var(--mx-sobre-acento);
}
html[data-diseno] body:has(.us-container) .us-btn-primary:hover,
html[data-diseno] body:has(.rp-container)    .rp-btn-primary:hover,
html[data-diseno] body:has(.rp-container)    .rp-btn-new:hover{
  background: var(--mx-acento-hondo); border-color: var(--mx-acento-hondo);
}

html[data-diseno] body:has(.us-container) .us-btn-ghost,
html[data-diseno] body:has(.rp-container)    .rp-btn-ghost{ background: transparent; color: var(--mx-tinta-2); }

/* Destructivo en el rojo de ESTADO, nunca en el coral de marca. */
html[data-diseno] body:has(.us-container) .us-btn-danger,
html[data-diseno] body:has(.rp-container)    .rp-btn-danger{
  background: transparent; color: var(--mx-error); border-color: rgba(179,38,30,.34);
}
html[data-diseno] body:has(.us-container) .us-btn-danger:hover,
html[data-diseno] body:has(.rp-container)    .rp-btn-danger:hover{ background: var(--mx-error-bg); }

html[data-diseno] body:has(.us-container) .us-btn-success{ background: var(--mx-ok); border-color: var(--mx-ok); color: #fff; }
html[data-diseno] body:has(.us-container) .us-btn-warning{ background: transparent; color: var(--mx-avi); border-color: var(--mx-avi-linea); }

/* ── Campos ──────────────────────────────────────────────────────────────── */
html[data-diseno] body:has(.us-container) .us-input-inline,
html[data-diseno] body:has(.us-container) .us-select-inline,
html[data-diseno] body:has(.us-container) .us-field input,
html[data-diseno] body:has(.us-container) .us-field select,
html[data-diseno] body:has(.rp-container)    .rp-field input,
html[data-diseno] body:has(.rp-container)    .rp-field select{
  background: var(--mx-sup); border: 1px solid var(--mx-linea);
  color: var(--mx-tinta); border-radius: 2px;
}
html[data-diseno] body:has(.us-container) .us-field input:focus,
html[data-diseno] body:has(.us-container) .us-field select:focus,
html[data-diseno] body:has(.rp-container)    .rp-field input:focus,
html[data-diseno] body:has(.rp-container)    .rp-field select:focus{
  border-color: var(--mx-acento); outline: 2px solid rgba(0,58,112,.16); outline-offset: 0;
}
html[data-diseno] body:has(.us-container) .us-field label,
html[data-diseno] body:has(.rp-container)    .rp-field label{
  color: var(--mx-tinta-2); font-size: 10.5px; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase;
}

/* ── Modal ───────────────────────────────────────────────────────────────── */
html[data-diseno] body:has(.us-container) .us-modal-overlay{ background: rgba(14,26,38,.46); }
html[data-diseno] body:has(.us-container) .us-modal{
  background: var(--mx-sup); border: 1px solid var(--mx-linea);
  border-radius: 2px; box-shadow: 0 18px 48px rgba(14,26,38,.20);
}
html[data-diseno] body:has(.us-container) .us-modal-header{
  background: var(--mx-sup); border-bottom: 1px solid var(--mx-linea); color: var(--mx-acento);
}
html[data-diseno] body:has(.us-container) .us-modal-header h3{ color: var(--mx-acento); font-weight: 700; }
html[data-diseno] body:has(.us-container) .us-modal-footer{ background: var(--mx-sup-2); border-top: 1px solid var(--mx-linea); }
html[data-diseno] body:has(.us-container) .us-modal-close{ color: var(--mx-tinta-2); }
html[data-diseno] body:has(.us-container) .us-modal-hint{ color: var(--mx-tinta-2); }

/* ── Pestañas ────────────────────────────────────────────────────────────── */
html[data-diseno] body:has(.us-container) .us-tabs{ border-bottom: 1px solid var(--mx-linea); }
html[data-diseno] body:has(.us-container) .us-tabs button{ color: var(--mx-tinta-2); background: transparent; border: 0; }
html[data-diseno] body:has(.us-container) .us-tabs button.active{
  color: var(--mx-acento); font-weight: 700;
  box-shadow: inset 0 -2px 0 var(--mx-acento);
}

/* ── Vacío y error ───────────────────────────────────────────────────────── */
html[data-diseno] body:has(.us-container) .us-empty-title,
html[data-diseno] body:has(.rp-container)    .rp-empty{ color: var(--mx-tinta); }
html[data-diseno] body:has(.us-container) .us-empty-text{ color: var(--mx-tinta-2); }
html[data-diseno] body:has(.us-container) .us-loading,
html[data-diseno] body:has(.rp-container)    .rp-loading{ color: var(--mx-tinta-2); }
html[data-diseno] body:has(.us-container) .us-error,
html[data-diseno] body:has(.rp-container)    .rp-error,
html[data-diseno] body:has(.rp-container)    .rp-error-inline{
  background: var(--mx-error-bg); color: var(--mx-error);
  border: 1px solid rgba(179,38,30,.24); border-radius: 2px;
}

/* ═══════════════════════════════════════════════════════════════════════════
   GESTIÓN DE ROLES — donde vive el gesto principal
   ═══════════════════════════════════════════════════════════════════════════ */

/* La lista de roles es un índice: se elige uno y se trabaja sobre él. */
html[data-diseno] body:has(.rp-container) .rp-sidebar{
  background: var(--mx-sup); border-right: 1px solid var(--mx-linea);
}
html[data-diseno] body:has(.rp-container) .rp-sidebar-header{
  color: var(--mx-tinta-2); border-bottom: 1px solid var(--mx-linea);
  font-size: 10.5px; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
}
html[data-diseno] body:has(.rp-container) .rp-rol-item{
  color: var(--mx-tinta); border-bottom: 1px solid var(--mx-linea);
  border-left: var(--mx-rule-w) solid transparent;
}
html[data-diseno] body:has(.rp-container) .rp-rol-item:hover{ background: var(--mx-sup-2); }
/* Mismo trazo de 3px que el menú, misma idea: dónde estás parado. */
html[data-diseno] body:has(.rp-container) .rp-rol-item.rp-rol-active{
  background: var(--mx-sup-2);
  border-left-color: var(--mx-acento);
  color: var(--mx-acento);
}
html[data-diseno] body:has(.rp-container) .rp-rol-name{ color: inherit; font-weight: 600; }
html[data-diseno] body:has(.rp-container) .rp-rol-meta{ color: var(--mx-tinta-2); font-family: var(--mono); font-size: 11px; }

html[data-diseno] body:has(.rp-container) .rp-apartado-row{ border-bottom: 1px solid var(--mx-linea); }
html[data-diseno] body:has(.rp-container) .rp-apartado-row:hover{ background: var(--mx-sup-2); }
html[data-diseno] body:has(.rp-container) .rp-apartado-name{ color: var(--mx-tinta); }
html[data-diseno] body:has(.rp-container) .rp-hint,
html[data-diseno] body:has(.rp-container) .rp-cb-desc{ color: var(--mx-tinta-2); }
html[data-diseno] body:has(.rp-container) .rp-cb-name{ color: var(--mx-tinta); }

/* ── LA MATRIZ DE PERMISOS ──────────────────────────────────────────────────
   Acá va el riesgo del diseño, y conviene dejarlo escrito.

   Lo esperable en una grilla de permisos es un semáforo: verde / ámbar / rojo.
   Acá NO, por una razón concreta del producto: esos tres colores YA significan
   otra cosa en esta aplicación —SI PAGAR, REVISAR, divergencia— y reusarlos
   para permisos haría que los mismos colores digan dos cosas distintas en el
   mismo sistema.

   En su lugar, DENSIDAD DE TINTA sobre un solo azul:

       sin acceso   ·  vacío, apenas un filete      ░
       ver          ·  contorno azul                ▒
       ver + editar ·  azul sólido                  █

   Más tinta = más poder. Se lee de un vistazo en una grilla de 13×4 sin tener
   que recordar qué significa cada color, y no gasta ningún color nuevo. */
html[data-diseno] body:has(.rp-container) .rp-segmented{
  background: transparent; border: 1px solid var(--mx-linea);
  border-radius: 2px; padding: 2px; gap: 2px;
}
html[data-diseno] body:has(.rp-container) .rp-seg-btn{
  color: var(--mx-tinta-2); border-radius: 2px;
  border: 1px solid transparent; font-weight: 600;
}
html[data-diseno] body:has(.rp-container) .rp-seg-btn:hover:not(:disabled){
  background: var(--mx-sup-2); color: var(--mx-tinta);
}

/* ⚠ Los tres llevan `!important` porque la regla inyectada por
   roles-permisos.js también lo lleva (`.rp-seg-ver { background: var(--blue)
   !important }`), y contra `!important` la especificidad no sirve de nada. En un
   rediseño de verdad esto se arregla editando ese archivo, no peleándole desde
   afuera: acá se hace así porque el piloto no debe tocar el JS de las vistas. */

/* sin acceso — la ausencia se ve como ausencia */
html[data-diseno] body:has(.rp-container) .rp-seg-btn.rp-seg-sin_acceso.rp-seg-active{
  background: transparent !important; color: var(--mx-tinta-2) !important;
  border-color: var(--mx-linea); box-shadow: none;
}
/* ver — contorno */
html[data-diseno] body:has(.rp-container) .rp-seg-btn.rp-seg-ver.rp-seg-active{
  background: var(--mx-acento-tenue) !important; color: var(--mx-acento) !important;
  border-color: var(--mx-acento);
}
/* editar — sólido */
html[data-diseno] body:has(.rp-container) .rp-seg-btn.rp-seg-editar.rp-seg-active{
  background: var(--mx-acento-solido) !important; color: var(--mx-sobre-acento) !important;
  border-color: var(--mx-acento-solido);
}

/* El panel del formulario: era --navy-2, o sea un bloque negro sobre el papel. */
html[data-diseno] body:has(.rp-container) .rp-form,
html[data-diseno] body:has(.rp-container) .rp-form-inner{
  background: var(--mx-sup); border-color: var(--mx-linea); color: var(--mx-tinta);
}
html[data-diseno] body:has(.rp-container) .rp-fields-row,
html[data-diseno] body:has(.rp-container) .rp-actions-row{ border-color: var(--mx-linea); }
html[data-diseno] body:has(.rp-container) .rp-field input:disabled,
html[data-diseno] body:has(.rp-container) .rp-field select:disabled{
  background: var(--mx-sup-2); color: var(--mx-tinta-2); border-color: var(--mx-linea);
}

/* Las capacidades son sí/no: una casilla, no una escala.
 *
 * ⚠ Esta regla describe la casilla VACÍA, pero su selector le ganaba también a la
 * MARCADA: `.rp-cb-checked .rp-cb-box` vive en `estilos/roles-permisos.css` con
 * especificidad (0,2,0) y esta tiene (0,3,3), así que le pisaba el `background`.
 * La casilla marcada perdía su verde y se quedaba con `--mx-sup` — que en tema
 * CLARO es blanco puro — mientras su ✓ es `#fff`. Blanco sobre blanco: la
 * palomilla desaparecía en claro y se veía en oscuro, donde `--mx-sup` es azul
 * profundo. Es el mismo defecto de siempre —un valor que sirve a un tema y no al
 * otro— pero por CASCADA, no por un literal: acá los dos colores eran correctos y
 * lo que estaba mal era CUÁL de las dos reglas ganaba.
 *
 * Se acota con `:not(.rp-cb-checked)` y la marcada recibe el par sólido /
 * sobre-sólido, que existe exactamente para "letra blanca sobre acento pleno" y
 * está medido en los dos temas (10:1 en claro, 9,1:1 en oscuro). */
html[data-diseno] body:has(.rp-container) .rp-checkbox:not(.rp-cb-checked) .rp-cb-box{
  border: 1px solid var(--mx-linea); background: var(--mx-sup); border-radius: 2px;
}
html[data-diseno] body:has(.rp-container) .rp-cb-checked .rp-cb-box{
  border: 1px solid var(--mx-acento-solido); background: var(--mx-acento-solido);
  border-radius: 2px;
}
html[data-diseno] body:has(.rp-container) .rp-cb-checked .rp-cb-box::after{
  color: var(--mx-sobre-acento);
}
html[data-diseno] body:has(.rp-container) input[type="checkbox"]{ accent-color: var(--mx-acento); }

/* Cambios sin guardar: ámbar de estado, y NUNCA coral. */
html[data-diseno] body:has(.rp-container) .rp-dirty-label,
html[data-diseno] body:has(.rp-container) .rp-rol-dirty{
  color: var(--mx-avi); background: var(--mx-avi-bg); border: 1px solid var(--mx-avi-linea);
  border-radius: 2px; font-weight: 600;
}
html[data-diseno] body:has(.rp-container) .rp-locked-banner{
  background: var(--mx-sup-2); border: 1px solid var(--mx-linea);
  color: var(--mx-tinta-2); border-left: var(--mx-rule-w) solid var(--mx-acento);
  border-radius: 0 2px 2px 0;
}
html[data-diseno] body:has(.rp-container) .rp-rol-lock{ color: var(--mx-tinta-2); }

/* El selector de vista de inicio, sobre papel. */
html[data-diseno] body:has(.rp-container) .rp-vsel-panel{
  background: var(--mx-sup); border: 1px solid var(--mx-linea);
  box-shadow: 0 12px 32px rgba(14,26,38,.16); border-radius: 2px;
}
html[data-diseno] body:has(.rp-container) .rp-vsel-val{ color: var(--mx-tinta); }
html[data-diseno] body:has(.rp-container) .rp-vsel-val:hover{ background: var(--mx-sup-2); }
html[data-diseno] body:has(.rp-container) .rp-vsel-check{ color: var(--mx-acento); }

/* ── Piso de calidad ─────────────────────────────────────────────────────── */
html[data-diseno] body:has(.us-container) :focus-visible,
html[data-diseno] body:has(.rp-container)    :focus-visible{
  outline: 2px solid var(--mx-acento); outline-offset: 2px;
}
/* ⚠ Acotadas como todo lo demás. Quedaron sin acotar al separar la hoja: el
   recorrido que prefijó las reglas saltaba las at-rules y también, sin querer,
   lo que tenían adentro. Sin el prefijo, estas cuatro se aplicaban con el
   piloto APAGADO a quien tenga reducción de movimiento activada — y eso no da
   ningún error: se ve casi igual y nadie lo relaciona con el piloto. */
@media (prefers-reduced-motion: reduce) {
  html[data-diseno] .nav-item, html[data-diseno] .sidebar-toggle,
  html[data-diseno] body:has(.us-container) .us-btn,
  html[data-diseno] body:has(.rp-container) .rp-btn { transition: none !important; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   AIRE Y ESQUINAS — corregido contra el sitio oficial
   ───────────────────────────────────────────────────────────────────────────
   Dos cosas que la primera pasada tenía mal, y que se vieron al mirar
   multi-xsalmon.com en vez de trabajar de memoria:

   · Las esquinas del sitio son RECTAS. La primera versión usaba radios de 4 y
     6px, que es el reflejo automático de cualquier panel de administración y
     no tiene nada que ver con esta marca. Bajados a 2px: lo justo para que un
     borde no se vea astillado, sin volverse una pastilla.
   · El sitio respira. Los márgenes son amplios y las secciones están separadas.
     Una tabla de administración nunca va a ser tan aireada como una portada,
     pero la diferencia entre 8px y 14px de padding en una celda es exactamente
     la diferencia entre "formulario" y "documento".
   ═══════════════════════════════════════════════════════════════════════════ */

html[data-diseno] body:has(.us-container) .us-container,
html[data-diseno] body:has(.rp-container)    .rp-container{ padding: 26px 28px; }

html[data-diseno] body:has(.us-container) .us-table th{ padding: 12px 16px; }
html[data-diseno] body:has(.us-container) .us-table td{ padding: 14px 16px; }

html[data-diseno] body:has(.us-container) .us-toolbar{ padding: 0 0 18px; gap: 12px; }
html[data-diseno] body:has(.us-container) .us-modal-body,
html[data-diseno] body:has(.us-container) .us-modal-header,
html[data-diseno] body:has(.us-container) .us-modal-footer{ padding: 20px 24px; }

html[data-diseno] body:has(.rp-container) .rp-section{ padding: 22px 24px; margin-bottom: 18px; }
html[data-diseno] body:has(.rp-container) .rp-apartado-row{ padding: 12px 4px; }
html[data-diseno] body:has(.rp-container) .rp-rol-item{ padding: 13px 16px; }
html[data-diseno] body:has(.rp-container) .rp-seg-btn{ padding: 6px 14px; }

/* ═══════════════════════════════════════════════════════════════════════════
   LO QUE SE ESCAPÓ EN LA PRIMERA PASADA
   ───────────────────────────────────────────────────────────────────────────
   Cuatro controles quedaron con el tema oscuro sobre papel blanco: cajas negras
   ilegibles y botones invisibles. No se vieron leyendo el CSS —se vieron en la
   captura— y por eso van con su nombre propio en vez de un selector genérico:
   estas vistas inyectan sus estilos desde su JS, así que barrer con `*` acá
   pisaría cosas que todavía no se miraron.
   ═══════════════════════════════════════════════════════════════════════════ */

/* El rol, cuando es de solo lectura. Estaba en --navy-3: una caja negra. */
html[data-diseno] body:has(.us-container) .us-rol-tag{
  background: var(--mx-sup-2); border: 1px solid var(--mx-linea);
  color: var(--mx-tinta); border-radius: 2px; font-weight: 600;
}

/* Las pestañas Solo activos / Todos. */
html[data-diseno] body:has(.us-container) .us-tabs{
  background: var(--mx-sup-2); border: 1px solid var(--mx-linea); border-radius: 2px;
}
html[data-diseno] body:has(.us-container) .us-tab{
  color: var(--mx-tinta-2); border-radius: 1px; font-weight: 600;
}
html[data-diseno] body:has(.us-container) .us-tab:hover{ color: var(--mx-tinta); }
html[data-diseno] body:has(.us-container) .us-tab.active{
  background: var(--mx-acento); color: #fff;
}

/* Los botones de la columna Acciones: eran texto casi blanco sobre papel. */
html[data-diseno] body:has(.us-container) .us-btn-action{
  border: 1px solid var(--mx-linea); color: var(--mx-tinta-2);
  background: var(--mx-sup); border-radius: 2px;
}
html[data-diseno] body:has(.us-container) .us-btn-action:hover{
  color: var(--mx-acento); border-color: var(--mx-acento); background: var(--mx-sup-2);
}
html[data-diseno] body:has(.us-container) .us-btn-action.us-btn-warning:hover{
  color: var(--mx-avi); border-color: var(--mx-avi-linea); background: var(--mx-avi-bg);
}
html[data-diseno] body:has(.us-container) .us-btn-action.us-btn-success:hover{
  color: var(--mx-ok); border-color: rgba(15,122,90,.4); background: var(--mx-ok-bg);
}
html[data-diseno] body:has(.us-container) .us-btn-action.us-btn-danger:hover{
  color: var(--mx-error); border-color: rgba(179,38,30,.4); background: var(--mx-error-bg);
}

/* El nombre editable en línea: su color era --text (casi blanco). */
html[data-diseno] body:has(.us-container) .us-input-inline{
  color: var(--mx-tinta); background: transparent; border-color: transparent;
}
html[data-diseno] body:has(.us-container) .us-input-inline:hover{ border-color: var(--mx-linea); }
html[data-diseno] body:has(.us-container) .us-input-inline:focus{
  background: var(--mx-sup); border-color: var(--mx-acento);
}
html[data-diseno] body:has(.us-container) .us-select-inline{ color: var(--mx-tinta); }
html[data-diseno] body:has(.us-container) .us-text-readonly{ color: var(--mx-tinta-2); }

/* La fila de un usuario inactivo: se atenúa, no se esconde. */
html[data-diseno] body:has(.us-container) .us-row-inactivo{ opacity: .55; }
html[data-diseno] body:has(.us-container) .us-row-inactivo:hover{ opacity: .85; }
