/* Fenix — sistema visual (9.21)

   Un solo lugar para los colores, las escalas y los componentes. Los templates
   usan clases de acá y NO colores cableados: un `background:#fff` en un
   template se ve bien en el tema claro y deja el texto a 1,2:1 en el oscuro
   (informe UX, crítico 3). La guarda está en tests/test_sistema_visual.py.

   Orden del archivo:
     1. Tokens por tema (claro, neutro, oscuro)
     2. Base: tipografía, links, foco, controles de formulario
     3. Layout de la app (barra superior, contenedor, pie)
     4. Componentes (botones, avisos, KPI, badges, formularios, tablas…)
     5. Pantallas puntuales que ya vivían acá (EERR/EEP, moneda, export)
     6. Responsive
     7. Impresión y movimiento reducido
   ============================================================ */

/* ============================================================
   1. TOKENS
   El tema se aplica con data-theme en <html> (ver base.html). Los nombres
   viejos (--primary, --muted, --ok, --warn…) se conservan porque los usan
   templates y el JS de algunas pantallas; los nuevos son semánticos.
   Contrastes medidos (WCAG 2.x) contra --surface: texto ≥ 4,5:1, bordes de
   controles ≥ 3:1. --muted-light ya no es un gris decorativo: la clase .muted
   se usa para ayudas y estados vacíos, y en los tres temas quedaba bajo AA.
   ============================================================ */
:root,
:root[data-theme="claro"] {
    color-scheme: light;
    --bg: #f7f8fa;
    --text: #1f2937;
    --text-soft: #374151;
    --muted: #646b78;          /* 5,4:1 sobre blanco, 4,9:1 sobre --surface-alt */
    --muted-light: #646b78;    /* era #9ca3af: 2,5:1 */
    --surface: #ffffff;
    --surface-alt: #f3f4f6;
    --surface-hover: #f9fafb;
    --row-hover: #dbeafe;
    --border: #e5e7eb;
    --border-strong: #d1d5db;
    --primary: #1e40af;
    --primary-strong: #1e3a8a;
    --primary-text: #1e3a8a;
    --on-primary: #ffffff;
    --link-hover-bg: #eff6ff;
    --topbar-from: #1e40af;
    --topbar-to: #1d3a9e;
    --topbar-text: rgba(255, 255, 255, 0.92);
    --shadow: rgba(0, 0, 0, 0.12);
    --ok: #047857;             /* era #059669: 3,8:1 */
    --warn: #b91c1c;           /* rojo de texto: el nombre es histórico */
    --badge-ok-bg: #d1fae5;
    --badge-ok-text: #065f46;
    --badge-info-bg: #dbeafe;
    --badge-info-text: #1e40af;

    /* Links, foco y controles */
    --link: #1d4ed8;
    --link-hover: #1e3a8a;
    --foco: #2563eb;
    --input-bg: #ffffff;
    --input-borde: #868e9a;    /* 3,3:1: el borde del campo tiene que verse */
    --input-texto: #1f2937;
    --input-deshabilitado: #f3f4f6;

    /* Estados: fondo, borde y texto de cada uno */
    --info-bg: #eff6ff;   --info-borde: #bfdbfe;   --info-texto: #1e3a8a;
    --ok-bg: #ecfdf5;     --ok-borde: #a7f3d0;     --ok-texto: #065f46;
    --warn-bg: #fffbeb;   --warn-borde: #fcd34d;   --warn-texto: #92400e;
    --error-bg: #fef2f2;  --error-borde: #fecaca;  --error-texto: #991b1b;
    --neutro-bg: #e5e7eb; --neutro-texto: #374151;

    /* Números y botones sólidos de estado */
    --positivo: #047857;
    --negativo: #b91c1c;
    --atencion: #b45309;
    --ok-solido: #047857;
    --peligro-solido: #b91c1c;
    --on-solido: #ffffff;
    --backdrop: rgba(15, 23, 42, 0.45);
    /* Series de gráficos: azul y naranja, distinguibles sin depender del rojo/verde. */
    --serie-1: #2563eb;
    --serie-2: #ea580c;
}

/* Neutro: grises cálidos, menos brillo que claro. */
:root[data-theme="neutro"] {
    color-scheme: light;
    --bg: #e6e7ea;
    --text: #26282d;
    --text-soft: #3a3d44;
    --muted: #5d6068;
    --muted-light: #5d6068;    /* era #888c95: 3,1:1 */
    --surface: #f4f4f6;
    --surface-alt: #e4e5e9;
    --surface-hover: #ececef;
    --row-hover: #d1dae8;
    --border: #d3d5db;
    --border-strong: #b9bcc4;
    --primary: #3f5170;
    --primary-strong: #2f3e57;
    --primary-text: #2f3e57;
    --on-primary: #ffffff;
    --link-hover-bg: #e1e5ec;
    --topbar-from: #44506a;
    --topbar-to: #3a4458;
    --topbar-text: rgba(255, 255, 255, 0.9);
    --shadow: rgba(0, 0, 0, 0.18);
    --ok: #276749;             /* era #2f855a: 4,1:1 */
    --warn: #a23a2e;
    --badge-ok-bg: #d4e7da;
    --badge-ok-text: #275c41;
    --badge-info-bg: #dbe2ee;
    --badge-info-text: #2f3e57;

    --link: #2f4a73;
    --link-hover: #1f3352;
    --foco: #3f5170;
    --input-bg: #fbfbfc;
    --input-borde: #7b7f88;
    --input-texto: #26282d;
    --input-deshabilitado: #e4e5e9;

    --info-bg: #e3e8f0;   --info-borde: #b8c4d6;   --info-texto: #2f3e57;
    --ok-bg: #dfeee4;     --ok-borde: #a9cdb5;     --ok-texto: #22543d;
    --warn-bg: #f3ead6;   --warn-borde: #d9c089;   --warn-texto: #744210;
    --error-bg: #f3e1df;  --error-borde: #dcaaa5;  --error-texto: #822727;
    --neutro-bg: #dcdde2; --neutro-texto: #3a3d44;

    --positivo: #276749;
    --negativo: #a23a2e;
    --atencion: #8a5a14;
    --ok-solido: #2f6b4a;
    --peligro-solido: #a23a2e;
    --on-solido: #ffffff;
    --backdrop: rgba(20, 22, 28, 0.5);
    --serie-1: #3f5f8f;
    --serie-2: #b8651f;
}

/* Oscuro */
:root[data-theme="oscuro"] {
    color-scheme: dark;        /* los date/month/file nativos también */
    --bg: #0f172a;
    --text: #e2e8f0;
    --text-soft: #cbd5e1;
    --muted: #94a3b8;
    --muted-light: #94a3b8;    /* era #7c8aa0: 4,2:1 */
    --surface: #1e293b;
    --surface-alt: #334155;
    --surface-hover: #273449;
    --row-hover: #1e3a5f;
    --border: #334155;
    --border-strong: #475569;
    --primary: #3b82f6;
    --primary-strong: #60a5fa;
    --primary-text: #93c5fd;
    --on-primary: #0b1220;
    --link-hover-bg: #273449;
    --topbar-from: #1e293b;
    --topbar-to: #16202e;
    --topbar-text: rgba(255, 255, 255, 0.9);
    --shadow: rgba(0, 0, 0, 0.5);
    --ok: #34d399;
    --warn: #fca5a5;
    --badge-ok-bg: #14532d;
    --badge-ok-text: #bbf7d0;
    --badge-info-bg: #1e3a5f;
    --badge-info-text: #bfdbfe;

    /* Sin esto los links quedaban con el azul del navegador: 1,56:1. */
    --link: #93c5fd;
    --link-hover: #bfdbfe;
    --foco: #60a5fa;
    --input-bg: #0f172a;
    --input-borde: #6b7a90;
    --input-texto: #e2e8f0;
    --input-deshabilitado: #1e293b;

    --info-bg: #172554;   --info-borde: #1e40af;   --info-texto: #bfdbfe;
    --ok-bg: #052e22;     --ok-borde: #047857;     --ok-texto: #a7f3d0;
    --warn-bg: #3b2506;   --warn-borde: #a16207;   --warn-texto: #fde68a;
    --error-bg: #450a0a;  --error-borde: #b91c1c;  --error-texto: #fecaca;
    --neutro-bg: #334155; --neutro-texto: #cbd5e1;

    --positivo: #34d399;
    --negativo: #fca5a5;
    --atencion: #fbbf24;
    --ok-solido: #34d399;
    --peligro-solido: #f87171;
    --on-solido: #0b1220;
    --backdrop: rgba(0, 0, 0, 0.6);
    --serie-1: #60a5fa;
    --serie-2: #fb923c;
}

/* Escalas: iguales en los tres temas. */
:root {
    --esp-1: 0.25rem;
    --esp-2: 0.5rem;
    --esp-3: 0.75rem;
    --esp-4: 1rem;
    --esp-5: 1.5rem;
    --esp-6: 2rem;
    --radio-s: 4px;
    --radio-m: 6px;
    --radio-l: 10px;
    --fs-xs: 0.75rem;     /* 12 px */
    --fs-s: 0.8125rem;    /* 13 px */
    --fs-m: 0.875rem;     /* 14 px, el cuerpo */
    --fs-l: 1.05rem;
    --fs-xl: 1.5rem;
    --fuente: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    --fuente-mono: ui-monospace, "Cascadia Mono", "Segoe UI Mono", Consolas, monospace;
}

/* ============================================================
   2. BASE
   ============================================================ */
* { box-sizing: border-box; }
body {
    margin: 0;
    font-family: var(--fuente);
    background: var(--bg);
    color: var(--text);
    font-size: 14px;
    line-height: 1.45;
}
img { max-width: 100%; height: auto; }
code, kbd { font-family: var(--fuente-mono); font-size: 0.92em; }
abbr[title] { text-decoration: underline dotted; cursor: help; }

/* Los links toman el color del tema. Sin esta regla, en el oscuro quedaban
   con el azul por defecto del navegador sobre fondo casi negro. */
a { color: var(--link); text-underline-offset: 2px; }
a:hover { color: var(--link-hover); }

/* Foco visible para quien usa el teclado, en todo. */
:focus-visible {
    outline: 2px solid var(--foco);
    outline-offset: 2px;
}

h1 { font-size: var(--fs-xl); line-height: 1.2; margin: 0 0 0.5rem; font-weight: 650; }
h2 { font-size: 1.2rem; line-height: 1.3; }
h3 { font-size: 1rem; }
.subtitle { color: var(--muted); margin-top: 0; }

/* Controles de formulario. Con :where() la especificidad es cero: cualquier
   clase de una pantalla (la grilla del asiento, los filtros) gana sin pelear.
   Antes solo `.filtros` tenía estilo y el resto dependía del navegador, que
   en tema oscuro pintaba campos blancos con texto claro. */
:where(input:not([type="checkbox"], [type="radio"], [type="range"], [type="color"],
        [type="file"], [type="submit"], [type="button"], [type="reset"], [type="image"]),
       select, textarea) {
    font: inherit;
    color: var(--input-texto);
    background-color: var(--input-bg);
    border: 1px solid var(--input-borde);
    border-radius: var(--radio-s);
    padding: 0.4rem 0.5rem;
}
:where(input, select, textarea):disabled {
    background-color: var(--input-deshabilitado);
    cursor: not-allowed;
}
:where(input, select, textarea)[aria-invalid="true"] {
    border-color: var(--negativo);
    box-shadow: 0 0 0 1px var(--negativo);
}
:where(button) { font: inherit; }
input[type="checkbox"], input[type="radio"] { accent-color: var(--primary); }
::placeholder { color: var(--muted); opacity: 1; }

/* Utilidades de texto. `.muted` mezclaba color + centrado + itálica, que en
   una ayuda al pie de un formulario queda raro: lo nuevo separa las dos
   cosas en .texto-suave (solo color) y .vacio (el estado vacío). */
.texto-suave { color: var(--muted); }
.texto-chico { font-size: var(--fs-s); }
.texto-mono { font-family: var(--fuente-mono); }
.nota {
    color: var(--muted);
    font-size: var(--fs-s);
    line-height: 1.55;
    margin: var(--esp-4) 0 0;
    max-width: 90ch;
}
.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.positivo { color: var(--positivo); }
.negativo { color: var(--negativo); }
.atencion { color: var(--atencion); }
.warn { color: var(--warn); }
.ok { color: var(--ok); }
.sr-only {
    position: absolute !important;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0, 0, 0, 0);
    white-space: nowrap; border: 0;
}

/* «Saltar al contenido»: el primer foco de cada página. */
.saltar-contenido {
    position: absolute;
    left: var(--esp-2);
    top: -3rem;
    z-index: 100;
    padding: 0.5rem 0.9rem;
    background: var(--surface);
    color: var(--link);
    border: 2px solid var(--foco);
    border-radius: var(--radio-m);
    font-weight: 600;
    text-decoration: none;
}
.saltar-contenido:focus { top: var(--esp-2); }

/* ============================================================
   3. LAYOUT DE LA APP
   ============================================================ */
/* ---- Íconos (9.50) ----
   El sprite está en templates/_iconos.html y se usa con ui.icono('nombre').
   Son de trazo: el color es el del texto (currentColor) y el grosor, este. */
.sprite-iconos { position: absolute; width: 0; height: 0; overflow: hidden; }
.icono {
    width: 1.15em;
    height: 1.15em;
    flex: none;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.75;
    stroke-linecap: round;
    stroke-linejoin: round;
    vertical-align: -0.2em;
}

/* ---- Barra superior ----
   Un renglón desde 901 px: a 1366 entran los nueve lugares del menú, el
   buscador, la empresa, la ayuda y el usuario. Para eso los íconos de los
   nueve lugares se muestran recién desde 1530 px (y en el menú de celular,
   donde sobra el ancho): entre 901 y 1529 son 216 px que no hay. El menú no
   se encoge nunca —un ítem cortado no se puede leer—; lo que cede es el
   nombre de la empresa, con puntos suspensivos y el nombre entero en el
   `title`. Debajo de 901, el menú pasa a columna detrás del botón «Menú». */
.topbar {
    background: linear-gradient(180deg, var(--topbar-from) 0%, var(--topbar-to) 100%);
    color: var(--topbar-text);
    padding: 0.45rem 1rem;
    display: flex;
    flex-wrap: nowrap;
    align-items: center;
    gap: 0.3rem;
    box-shadow: 0 2px 6px var(--shadow);
    position: sticky;
    top: 0;
    z-index: 60;
}
.topbar .brand {
    display: inline-flex;
    align-items: center;
    flex: none;
    text-decoration: none;
    margin-right: 0.35rem;
}
.topbar .brand-logo {
    height: 28px;
    width: auto;
    display: block;
}
/* En la barra el foco va en blanco: el azul del tema no se ve sobre el azul. */
.topbar :focus-visible { outline-color: #fff; }

/* ---- Menú con desplegables ---- */
.topbar .menu {
    display: flex;
    flex: 0 0 auto;
    margin-right: auto;
    gap: 0.05rem;
    list-style: none;
    margin: 0;
    padding: 0;
    align-items: center;
}
.topbar .menu > li { position: relative; }
.topbar .menu > li > a,
.topbar .menu > li > .group-label {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    color: var(--topbar-text);
    text-decoration: none;
    padding: 0.4rem 0.45rem;
    border-radius: 6px;
    font-size: 0.88rem;
    font-family: inherit;
    line-height: 1.2;
    white-space: nowrap;
    background: transparent;
    border: 0;
    cursor: pointer;
}
.topbar .menu > li > a:hover,
.topbar .menu > li > .group-label:hover,
.topbar .menu > li > .group-label[aria-expanded="true"] {
    background: rgba(255, 255, 255, 0.16);
    color: #fff;
}
.topbar .menu > li.active > a,
.topbar .menu > li.active > .group-label {
    background: rgba(255, 255, 255, 0.24);
    color: #fff;
    font-weight: 600;
}
.topbar .caret { width: 0.8em; height: 0.8em; opacity: 0.85; margin-left: -0.15rem; }
.topbar .menu > li > a > .icono,
.topbar .menu > li > .group-label > .icono:not(.caret) { display: none; }
@media (min-width: 1530px) {
    .topbar .menu > li > a > .icono,
    .topbar .menu > li > .group-label > .icono:not(.caret) { display: inline-block; }
}
[aria-expanded="true"] > .caret { transform: rotate(180deg); }
/* Una función que el plan no incluye: se ve, apagada (documento 05 §5). */
.topbar .menu-apagado { opacity: 0.72; }
.menu-plan {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    margin-left: auto;
    padding-left: 0.6rem;
    font-size: var(--fs-xs);
    color: var(--muted);
}

.topbar .dropdown {
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    min-width: 214px;
    max-width: calc(100vw - 1.5rem);
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 8px;
    box-shadow: 0 10px 28px var(--shadow);
    padding: 0.35rem;
    margin: 0;
    list-style: none;
    display: none;
    z-index: 70;
}
.topbar .dropdown :focus-visible { outline-color: var(--foco); }
/* Puente invisible que rellena el hueco de 4px entre el botón y el menú,
   para que el mouse no pierda el :hover al bajar y el menú no se cierra. */
.topbar .dropdown::before {
    content: "";
    position: absolute;
    top: -5px;
    left: 0;
    right: 0;
    height: 5px;
}
/* Abierto por click o teclado (ui.js pone aria-expanded)… */
.topbar [aria-expanded="true"] + .dropdown { display: block; }
/* …y por hover, solo donde hay un mouse de verdad y la barra es un renglón. */
@media (hover: hover) and (min-width: 901px) {
    .topbar .menu > li:hover > .dropdown,
    .topbar .user-box:hover > .dropdown { display: block; }
}
.topbar .dropdown li a {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    color: var(--text);
    text-decoration: none;
    padding: 0.45rem 0.7rem;
    border-radius: 6px;
    font-size: 0.88rem;
    white-space: nowrap;
}
.topbar .dropdown li a:hover { background: var(--link-hover-bg); color: var(--primary-text); }
.topbar .dropdown li a[aria-current="page"] {
    background: var(--link-hover-bg);
    color: var(--primary-text);
    font-weight: 600;
}
.topbar .dropdown .icono { color: var(--muted); }
.topbar .dropdown .sep { height: 1px; background: var(--border); margin: 0.3rem 0.25rem; }

/* El botón «Menú» de pantallas chicas (ver 6. Responsive). */
.menu-toggle {
    display: none;
    align-items: center;
    gap: 0.35rem;
    padding: 0.35rem 0.65rem;
    border: 1px solid rgba(255, 255, 255, 0.35);
    border-radius: 6px;
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    font: inherit;
    font-size: 0.88rem;
    cursor: pointer;
}
.menu-toggle:hover,
.menu-toggle[aria-expanded="true"] { background: rgba(255, 255, 255, 0.24); }

/* Buscador de la barra */
.nav-buscar {
    position: relative;
    flex: 0 1 9rem;
    min-width: 6.5rem;
    margin: 0 0 0 0.25rem;
}
.nav-buscar:focus-within { flex-basis: 13rem; }
.nav-buscar__icono {
    position: absolute;
    left: 0.55rem;
    top: 50%;
    transform: translateY(-50%);
    color: var(--muted);
    pointer-events: none;
}
.nav-buscar input {
    width: 100%;
    padding: 0.35rem 0.6rem 0.35rem 1.85rem;
    border: 1px solid var(--border-strong);
    border-radius: 14px;
    font-size: 0.82rem;
    background: var(--surface);
    color: var(--text);
}
.nav-buscar input:focus {
    outline: none;
    border-color: var(--primary);
    box-shadow: 0 0 0 2px #fff;
}

/* La empresa en la que se está trabajando: siempre a la vista. */
.topbar .empresa-switcher {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    min-width: 0;
    flex: 0 1 auto;
    font-size: 0.85rem;
    color: var(--topbar-text);
}
.empresa-switcher__etq { font-size: 0.8rem; white-space: nowrap; }
.empresa-switcher__nombre {
    display: block;
    min-width: 0;
    max-width: 14rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 600;
    color: #fff;
}
.empresa-switcher__boton {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    min-width: 0;
    padding: 0.28rem 0.5rem;
    border: 1px solid rgba(255, 255, 255, 0.35);
    border-radius: 6px;
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    text-decoration: none;
}
.empresa-switcher__boton:hover,
.empresa-switcher.active .empresa-switcher__boton { background: rgba(255, 255, 255, 0.24); color: #fff; }

/* «? Ayuda» */
.nav-ayuda {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    flex: none;
    padding: 0.4rem 0.5rem;
    border-radius: 6px;
    color: var(--topbar-text);
    text-decoration: none;
    font-size: 0.88rem;
    white-space: nowrap;
}
.nav-ayuda__texto { display: inline; }
.nav-ayuda:hover,
.nav-ayuda.active { background: rgba(255, 255, 255, 0.16); color: #fff; }

/* Caja de usuario (derecha de la barra) */
.topbar .user-box { position: relative; flex: none; }
.topbar .user-box > .group-label {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.4rem 0.6rem;
    border: 0;
    border-radius: 6px;
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    font: inherit;
    font-size: 0.85rem;
    white-space: nowrap;
    cursor: pointer;
}
.topbar .user-box > .group-label:hover,
.topbar .user-box > .group-label[aria-expanded="true"],
.topbar .user-box.active > .group-label { background: rgba(255, 255, 255, 0.24); }
.topbar .user-box .dropdown { right: 0; left: auto; min-width: 250px; }
.user-dropdown__quien {
    padding: 0.4rem 0.7rem 0.55rem;
    margin-bottom: 0.25rem;
    border-bottom: 1px solid var(--border);
    color: var(--muted);
    font-size: 0.75rem;
    line-height: 1.5;
}
.user-dropdown__quien strong { color: var(--text-soft); }
.form-salir { margin: 0; }
.logout-btn {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    width: 100%;
    padding: 0.45rem 0.7rem;
    border: 0;
    border-radius: 6px;
    background: none;
    color: var(--negativo);
    font: inherit;
    font-size: 0.88rem;
    text-align: left;
    cursor: pointer;
}
.logout-btn:hover { background: var(--error-bg); }

/* Selector de tema dentro del menú de usuario */
.tema-row {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.4rem 0.7rem;
    font-size: 0.88rem;
    color: var(--text);
}
.tema-row .icono { color: var(--muted); }
.tema-row select {
    flex: 1;
    padding: 0.25rem 0.4rem;
    border: 1px solid var(--input-borde);
    border-radius: 6px;
    background: var(--input-bg);
    color: var(--input-texto);
    font: inherit;
    font-size: 0.82rem;
}

/* Popup (asiento abierto desde un informe): sin barra ni pie. */
html.popup-mode .topbar,
html.popup-mode footer,
html.popup-mode .solo-normal { display: none !important; }

.container {
    max-width: 1280px;
    margin: 2rem auto;
    padding: 0 1.5rem;
}
footer {
    text-align: center;
    color: var(--muted);
    padding: 2rem;
    border-top: 1px solid var(--border);
    margin-top: 3rem;
}

/* ============================================================
   4. COMPONENTES
   Los macros de src/templates/_ui.html dibujan estas clases.
   ============================================================ */

/* ---- Encabezado de página: título, contexto, para qué sirve, ayuda ---- */
.encabezado {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--esp-3) var(--esp-5);
    margin: 0 0 var(--esp-5);
}
.encabezado__texto { flex: 1 1 26rem; min-width: 0; }
.encabezado__titulo {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--esp-2) var(--esp-3);
}
.encabezado h1 { margin: 0; }
.encabezado__contexto {
    color: var(--muted);
    margin: var(--esp-1) 0 0;
    font-size: 0.92rem;
}
.encabezado__desc {
    color: var(--text-soft);
    margin: var(--esp-2) 0 0;
    max-width: 78ch;
    line-height: 1.55;
}
.encabezado__acciones {
    display: flex;
    flex-wrap: wrap;
    gap: var(--esp-2);
    align-items: center;
}
.encabezado__acciones .btn,
.encabezado__acciones .export-bar { margin: 0; }
.ayuda-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.15rem 0.65rem;
    border: 1px solid var(--input-borde);
    border-radius: 999px;
    background: var(--surface);
    color: var(--link);
    font-size: var(--fs-s);
    font-weight: 500;
    line-height: 1.5;
    text-decoration: none;
    white-space: nowrap;
}
.ayuda-btn:hover { background: var(--link-hover-bg); color: var(--link-hover); }
.ayuda-link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.2rem;
    height: 1.2rem;
    padding: 0 0.3rem;
    border-radius: 999px;
    border: 1px solid var(--input-borde);
    color: var(--link);
    font-size: var(--fs-xs);
    font-weight: 600;
    text-decoration: none;
    vertical-align: middle;
}
.ayuda-link:hover { background: var(--link-hover-bg); }

/* ---- Migas de pan ---- */
.migas { margin: 0 0 var(--esp-2); font-size: var(--fs-s); color: var(--muted); }
.migas ol { list-style: none; display: flex; flex-wrap: wrap; gap: var(--esp-1) 0; margin: 0; padding: 0; }
.migas li + li::before { content: "›"; margin: 0 0.45rem; color: var(--muted); }
.migas a { color: var(--link); text-decoration: none; }
.migas a:hover { text-decoration: underline; }
.migas [aria-current="page"] { color: var(--text-soft); }

/* ---- Botones ----
   `.btn` es el primario y conserva su margen derecho histórico; adentro de
   .acciones o del encabezado el espacio lo da el `gap`. */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    padding: 0.5rem 1rem;
    background: var(--primary);
    color: var(--on-primary);
    border: 1px solid transparent;
    border-radius: var(--radio-m);
    font: inherit;
    font-weight: 500;
    line-height: 1.25;
    text-decoration: none;
    cursor: pointer;
    margin-right: 0.5rem;
    box-shadow: 0 1px 2px var(--shadow);
    transition: background .12s ease, transform .12s ease, box-shadow .12s ease;
}
.btn:hover {
    background: var(--primary-strong);
    color: var(--on-primary);
    transform: translateY(-1px);
    box-shadow: 0 4px 10px var(--shadow);
}
.btn--secundario {
    background: var(--surface);
    color: var(--link);
    border-color: var(--input-borde);
    box-shadow: none;
}
.btn--secundario:hover { background: var(--link-hover-bg); color: var(--link-hover); }
.btn--fantasma {
    background: transparent;
    color: var(--link);
    box-shadow: none;
    padding-left: 0.6rem;
    padding-right: 0.6rem;
}
.btn--fantasma:hover { background: var(--link-hover-bg); color: var(--link-hover); box-shadow: none; }
.btn--ok, .btn-success { background: var(--ok-solido); color: var(--on-solido); }
.btn--ok:hover, .btn-success:hover { background: var(--ok-solido); color: var(--on-solido); filter: brightness(0.93); }
.btn--peligro { background: var(--peligro-solido); color: var(--on-solido); }
.btn--peligro:hover { background: var(--peligro-solido); color: var(--on-solido); filter: brightness(0.93); }
/* Peligro sin relleno: para «Eliminar» al lado de otras acciones, que no
   tiene que gritar más que el botón principal. */
.btn--peligro-suave { background: var(--surface); color: var(--negativo); border-color: var(--error-borde); box-shadow: none; }
.btn--peligro-suave:hover { background: var(--error-bg); color: var(--error-texto); }
.btn--chico { padding: 0.28rem 0.65rem; font-size: var(--fs-s); }
.btn:disabled,
.btn[aria-disabled="true"] {
    opacity: 0.55;
    cursor: not-allowed;
    transform: none;
    box-shadow: none;
    pointer-events: none;
}
/* Sin tocar celdas: varias tablas ya tenían una columna `td.acciones`, y un
   display:flex en una celda la saca de la tabla. */
.acciones:not(td, th) {
    display: flex;
    flex-wrap: wrap;
    gap: var(--esp-2);
    align-items: center;
    margin: var(--esp-4) 0;
}
.acciones .btn { margin-right: 0; }
.acciones form { margin: 0; }
/* Un <button> que se ve como un link (acciones de fila, «Limpiar»). */
.link-btn {
    background: none;
    border: 0;
    padding: 0;
    color: var(--link);
    text-decoration: underline;
    cursor: pointer;
    font: inherit;
}
.link-btn:hover { color: var(--link-hover); }
.link-btn--peligro { color: var(--negativo); }

/* ---- Avisos: info, ok, warn, error ----
   Reemplazan ~150 recuadros con colores cableados. Con tokens, el mismo aviso
   se lee en los tres temas. */
.aviso {
    margin: var(--esp-3) 0;
    padding: 0.7rem 1rem;
    border: 1px solid var(--info-borde);
    border-left-width: 4px;
    border-radius: var(--radio-m);
    background: var(--info-bg);
    color: var(--info-texto);
    line-height: 1.5;
}
.aviso > :first-child { margin-top: 0; }
.aviso > :last-child { margin-bottom: 0; }
.aviso a { color: inherit; font-weight: 600; }
.aviso code { background: rgba(127, 127, 127, 0.15); padding: 0 0.25em; border-radius: 3px; }
.aviso__titulo { font-weight: 650; }
.aviso--info { background: var(--info-bg); border-color: var(--info-borde); color: var(--info-texto); }
.aviso--ok { background: var(--ok-bg); border-color: var(--ok-borde); color: var(--ok-texto); }
.aviso--warn { background: var(--warn-bg); border-color: var(--warn-borde); color: var(--warn-texto); }
.aviso--error { background: var(--error-bg); border-color: var(--error-borde); color: var(--error-texto); }
.aviso--chico { padding: 0.45rem 0.75rem; font-size: var(--fs-s); }
.aviso--multilinea { white-space: pre-line; }
/* El mensaje de «listo» de las listas de maestros: se llama .flash porque así
   lo busca un test de la importación de maestros. Es un aviso de éxito. */
.flash {
    margin: var(--esp-3) 0;
    padding: 0.6rem 1rem;
    border: 1px solid var(--ok-borde);
    border-left-width: 4px;
    border-radius: var(--radio-m);
    background: var(--ok-bg);
    color: var(--ok-texto);
}

/* Los nombres viejos, que usaban impuestos, parámetros y organización (y que
   solo existían adentro de asiento_form.html): ahora con tokens. */
.alert {
    padding: 0.6rem 1rem;
    border-radius: var(--radio-m);
    margin: 0.75rem 0;
    border: 1px solid var(--info-borde);
    background: var(--info-bg);
    color: var(--info-texto);
}
.alert-info { background: var(--info-bg); color: var(--info-texto); border-color: var(--info-borde); }
.alert-ok { background: var(--ok-bg); color: var(--ok-texto); border-color: var(--ok-borde); }
.alert-warn { background: var(--warn-bg); color: var(--warn-texto); border-color: var(--warn-borde); }
.alert-danger,
.alert-error { background: var(--error-bg); color: var(--error-texto); border-color: var(--error-borde); }

/* ---- Badges ---- */
.badge,
.badge-ok,
.badge-info {
    display: inline-block;
    padding: 0.1rem 0.5rem;
    border-radius: 10px;
    font-size: var(--fs-xs);
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
    background: var(--neutro-bg);
    color: var(--neutro-texto);
}
.badge-ok, .badge--ok { background: var(--ok-bg); color: var(--ok-texto); }
.badge-info, .badge--info { background: var(--info-bg); color: var(--info-texto); }
.badge--warn { background: var(--warn-bg); color: var(--warn-texto); }
.badge--error { background: var(--error-bg); color: var(--error-texto); }
.badge--neutro { background: var(--neutro-bg); color: var(--neutro-texto); }

/* ---- KPI: recuadros de totales ---- */
.kpis {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
    gap: var(--esp-3);
    margin: var(--esp-4) 0;
}
.kpi {
    background: var(--surface);
    border: 1px solid var(--border);
    border-left: 4px solid var(--border-strong);
    border-radius: var(--radio-l);
    padding: 0.7rem 1rem;
    min-width: 0;
}
.kpi__etiqueta { color: var(--muted); font-size: var(--fs-s); }
.kpi__valor {
    font-size: 1.3rem;
    font-weight: 650;
    font-variant-numeric: tabular-nums;
    margin-top: 0.15rem;
    color: var(--text);
    overflow-wrap: anywhere;
}
.kpi__sub { color: var(--muted); font-size: var(--fs-xs); margin-top: 0.2rem; }
.kpi--info { border-left-color: var(--primary); }
.kpi--info .kpi__valor { color: var(--primary-text); }
.kpi--ok { border-left-color: var(--positivo); }
.kpi--ok .kpi__valor { color: var(--positivo); }
.kpi--error { border-left-color: var(--negativo); }
.kpi--error .kpi__valor { color: var(--negativo); }
.kpi--warn { border-left-color: var(--atencion); }
.kpi--warn .kpi__valor { color: var(--atencion); }

/* ---- Paneles y tarjetas ---- */
.panel {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--radio-l);
    padding: var(--esp-4) 1.25rem;
    margin: var(--esp-4) 0;
}
.panel > :first-child { margin-top: 0; }
.panel > :last-child { margin-bottom: 0; }
.panel__titulo { font-size: var(--fs-l); margin: 0 0 var(--esp-3); }
.cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 1rem;
    margin: 1.5rem 0;
}
.card {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 1rem 1.25rem;
    border-top: 3px solid var(--primary);
    box-shadow: 0 1px 2px var(--shadow);
    transition: transform .12s ease, box-shadow .12s ease;
}
.card:hover {
    transform: translateY(-2px);
    box-shadow: 0 6px 18px var(--shadow);
}
.card-label { color: var(--muted); font-size: 0.85rem; }
.card-value { font-size: 1.6rem; font-weight: 600; margin-top: 0.25rem; color: var(--primary-text); }

/* ---- Estado vacío: qué pasa y qué hacer ---- */
.vacio {
    text-align: center;
    padding: 2rem 1rem;
    margin: var(--esp-4) 0;
    border: 1px dashed var(--border-strong);
    border-radius: var(--radio-l);
    background: var(--surface);
    color: var(--text-soft);
}
.vacio__titulo { font-weight: 600; font-size: 1rem; color: var(--text); margin: 0 0 0.35rem; }
.vacio__texto { margin: 0 auto; max-width: 62ch; color: var(--muted); }
.vacio .acciones { justify-content: center; margin-bottom: 0; }
td.vacio-celda {
    text-align: center;
    color: var(--muted);
    padding: 1.5rem 1rem;
}
.muted { color: var(--muted-light); text-align: center; font-style: italic; }

/* ---- Formularios ---- */
.form-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
    gap: var(--esp-3) 1.25rem;
    max-width: 52rem;
    margin: var(--esp-2) 0;
}
.form-grid--ancho { max-width: none; }
.campo { display: flex; flex-direction: column; gap: 0.3rem; min-width: 0; }
.campo--ancho { grid-column: 1 / -1; }
.campo__etiqueta { font-size: var(--fs-s); font-weight: 500; color: var(--text-soft); }
.campo__requerido { color: var(--negativo); margin-left: 0.15rem; }
.campo input:not([type="checkbox"], [type="radio"]),
.campo select,
.campo textarea { width: 100%; }
.campo__ayuda { font-size: var(--fs-xs); color: var(--muted); line-height: 1.45; }
.campo__error { font-size: var(--fs-xs); color: var(--negativo); font-weight: 500; }
.campo--check { flex-direction: row; align-items: center; gap: 0.45rem; }
.campo--importe input { text-align: right; font-variant-numeric: tabular-nums; }
.form-vert { display: flex; flex-direction: column; gap: 0.75rem; }
.form-vert label { display: flex; flex-direction: column; gap: 0.25rem; font-size: 0.88rem; }
.fieldset {
    border: 1px solid var(--border);
    border-radius: var(--radio-l);
    padding: var(--esp-3) var(--esp-4) var(--esp-4);
    margin: var(--esp-4) 0;
}
.fieldset > legend { padding: 0 0.4rem; font-weight: 600; color: var(--text-soft); }
.seccion-titulo {
    font-size: var(--fs-l);
    color: var(--primary-text);
    margin: var(--esp-5) 0 var(--esp-2);
}

/* ---- Pestañas de una sección (configuración, organización) ----
   Vivían en el <style> de _config_tabs.html; desde 9.53 las usan también
   las pantallas de la organización. */
.pestanas {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    margin: 0 0 1.2rem;
    border-bottom: 2px solid var(--border);
}
.pestanas a {
    padding: 0.5rem 0.95rem;
    margin-bottom: -2px;
    border: 1px solid transparent;
    border-bottom: none;
    border-radius: 7px 7px 0 0;
    color: var(--muted);
    font-weight: 500;
    text-decoration: none;
}
.pestanas a:hover { background: var(--surface-alt); color: var(--text); }
.pestanas a.active {
    background: var(--surface);
    color: var(--text);
    border-color: var(--border);
    border-bottom: 2px solid var(--surface);
    font-weight: 600;
}
.pestanas .falta { color: var(--negativo); }

/* ---- Piezas de las pantallas de personas y accesos (9.51) ---- */
.sin-cortar { white-space: nowrap; }
th.col-check { width: 3.5rem; }
/* Opciones que se leen como tarjetas: el rol en la organización. */
.opciones-tarjeta {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
    gap: var(--esp-2) var(--esp-3);
    margin: 0 0 var(--esp-2);
}
.opcion-tarjeta {
    display: flex;
    gap: 0.55rem;
    align-items: flex-start;
    padding: 0.6rem 0.75rem;
    border: 1px solid var(--border);
    border-radius: var(--radio-l);
    background: var(--surface);
    line-height: 1.4;
    cursor: pointer;
}
.opcion-tarjeta:has(input:checked) { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
.opcion-tarjeta:has(input:disabled) { cursor: default; }
.opcion-tarjeta input { margin-top: 0.2rem; flex: none; }
.opcion-tarjeta__ayuda { display: block; margin-top: 0.15rem; font-size: var(--fs-s); color: var(--muted); }
.acciones-en-linea { display: flex; flex-wrap: wrap; gap: var(--esp-2); align-items: center; }
.form-en-linea { display: flex; flex-wrap: wrap; gap: var(--esp-2); align-items: center; }
/* Las acciones de una fila, separadas por un punto medio. */
.acciones-fila { white-space: nowrap; }
.acciones-fila > * + *::before { content: "·"; margin: 0 0.4rem; color: var(--muted); }
/* Un texto para copiar (el link de un reset de clave sin correo). */
.campo-copiar { display: block; width: 100%; margin-top: var(--esp-2); font-family: var(--fuente-mono); font-size: var(--fs-s); }
/* Un panel plegable (<details class="panel">). */
details.panel > summary { cursor: pointer; }
details.panel[open] > summary { margin-bottom: var(--esp-2); }
details.panel ul { margin: 0 0 var(--esp-2); padding-left: 1.2rem; line-height: 1.55; }
.panel--peligro { border-color: var(--error-borde); }
.columnas {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
    gap: var(--esp-3) var(--esp-5);
}
.columnas > * > :first-child { margin-top: 0; }

/* ---- Piezas de las pantallas migradas en 9.52 ---- */
.form-suelto { display: inline; margin: 0; }
.celda-centro { text-align: center; }
.campo-corto { width: 7rem; }
th.col-cuando { width: 9.5rem; }
th.col-quien { width: 15rem; }
th.col-asiento { width: 8rem; }
th.col-filas { width: 7rem; }
th.col-codigo { width: 8rem; }
th.col-moneda { width: 6rem; }
th.col-tipo { width: 8rem; }
.panel--angosto { max-width: 46rem; }
.columnas--ancha-angosta { grid-template-columns: minmax(0, 2fr) minmax(15rem, 1fr); }
.lista-pasos { margin: 0; padding-left: 1.2rem; line-height: 1.55; }
.lista-pasos li + li { margin-top: 0.3rem; }
.lista-checks {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
    gap: 0.35rem 1rem;
}
.lista-checks label { display: flex; gap: 0.45rem; align-items: center; }
/* Datos sueltos de a pares (clave a la izquierda, valor a la derecha). */
.tabla-datos { width: 100%; border-collapse: collapse; margin: 0 0 var(--esp-3); }
.tabla-datos th { text-align: left; font-weight: 500; color: var(--text-soft); padding: 0.4rem 0.5rem 0.4rem 0; }
.tabla-datos td { text-align: right; padding: 0.4rem 0; }
.tabla-datos tr + tr > * { border-top: 1px solid var(--border); }
/* Lo que incluye y no incluye un plan. */
.lista-funciones { list-style: none; margin: 0; padding: 0; line-height: 1.8; }
.lista-funciones--apagada { color: var(--muted); }
.lista-funciones .icono { color: var(--muted); }
/* La tarjeta de «Acceso total» de un perfil. */
.opcion-tarjeta--destacada { margin: var(--esp-3) 0; border-color: var(--info-borde); background: var(--info-bg); color: var(--info-texto); }
.opcion-tarjeta--destacada .opcion-tarjeta__ayuda { color: inherit; }
/* La matriz de permisos de un perfil. */
.permisos > legend { display: flex; flex-wrap: wrap; gap: 0.2rem 0.7rem; align-items: baseline; }
.permisos__marcar { font-size: var(--fs-xs); font-weight: 400; }
.permisos__tabla { width: 100%; border-collapse: collapse; }
.permisos__tabla th {
    width: 15rem;
    padding: 0.4rem 0.5rem 0.4rem 0;
    text-align: left;
    vertical-align: top;
    font-weight: 500;
    font-size: var(--fs-s);
    color: var(--text-soft);
}
.permisos__tabla td { padding: 0.35rem 0; }
.permisos__tabla tr + tr > * { border-top: 1px solid var(--border); }
.permisos__accion {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    margin: 0.1rem 1rem 0.1rem 0;
    font-size: var(--fs-s);
    white-space: nowrap;
}
.permisos--apagados { opacity: 0.45; }
/* El buscador del selector de empresa. */
.buscador-espacios { position: relative; max-width: 28rem; margin: 0 0 var(--esp-4); }
.buscador-espacios__icono {
    position: absolute;
    left: 0.65rem;
    top: 50%;
    transform: translateY(-50%);
    color: var(--muted);
    pointer-events: none;
}
.buscador-espacios input { width: 100%; padding-left: 2.1rem; }
.boton-favorito {
    background: none;
    border: 0;
    padding: 0.1rem 0.25rem;
    font-size: 1.1rem;
    line-height: 1;
    color: var(--muted);
    cursor: pointer;
}
.boton-favorito--si { color: var(--atencion); }
/* La sangría por nivel del plan sugerido (antes, un style por fila). */
.plan-sugerido .nivel-2 > td:first-child { padding-left: 1.35rem; }
.plan-sugerido .nivel-3 > td:first-child { padding-left: 1.95rem; }
.plan-sugerido .nivel-4 > td:first-child { padding-left: 2.55rem; }
.plan-sugerido .nivel-5 > td:first-child { padding-left: 3.15rem; }
.plan-sugerido .nivel-2 > .plan-sugerido__descripcion { padding-left: 1.65rem; }
.plan-sugerido .nivel-3 > .plan-sugerido__descripcion { padding-left: 2.55rem; }
.plan-sugerido .nivel-4 > .plan-sugerido__descripcion { padding-left: 3.45rem; }
.plan-sugerido .nivel-5 > .plan-sugerido__descripcion { padding-left: 4.35rem; }

/* ---- «Qué hace y qué no» ---- */
.que-hace {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
    gap: var(--esp-3) var(--esp-5);
    margin: var(--esp-4) 0;
}
.que-hace h3 { font-size: 0.95rem; margin: 0 0 var(--esp-2); }
.que-hace ul { margin: 0; padding-left: 1.2rem; line-height: 1.55; }
.que-hace li { margin: 0.2rem 0; }
.que-hace__si h3 { color: var(--positivo); }
.que-hace__no h3 { color: var(--negativo); }

/* ---- Pasos de un asistente ---- */
.pasos { display: flex; flex-wrap: wrap; gap: var(--esp-2); list-style: none; padding: 0; margin: 0 0 var(--esp-4); counter-reset: paso; }
.pasos li { counter-increment: paso; display: flex; align-items: center; gap: 0.4rem; color: var(--muted); font-size: var(--fs-s); }
.pasos li::before {
    content: counter(paso);
    display: inline-grid; place-items: center;
    width: 1.4rem; height: 1.4rem; border-radius: 50%;
    border: 1px solid var(--border-strong); font-weight: 600; font-size: var(--fs-xs);
}
.pasos li + li { margin-left: 0.3rem; }
.pasos li[aria-current="step"] { color: var(--text); font-weight: 600; }
.pasos li[aria-current="step"]::before { background: var(--primary); color: var(--on-primary); border-color: var(--primary); }

/* ---- Tablas ---- */
table.grid {
    width: 100%;
    background: var(--surface);
    border-collapse: collapse;
    border: 1px solid var(--border);
    border-radius: 6px;
    overflow: hidden;
    font-size: 0.88rem;
}
table.grid th {
    background: var(--surface-alt);
    text-align: left;
    padding: 0.5rem 0.75rem;
    border-bottom: 1px solid var(--border);
    font-weight: 600;
    color: var(--text-soft);
    position: relative; /* Necesario para posicionar el manillar de redimensionamiento */
}
table.grid td {
    padding: 0.4rem 0.75rem;
    border-bottom: 1px solid var(--border);
}
table.grid tr:hover { background: var(--row-hover); }
table.grid .num,
table.grid th.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
table.grid .total-row { background: var(--surface-alt); font-weight: 600; }
table.grid tfoot td { background: var(--surface-alt); font-weight: 600; }
/* Una fila resaltada (la actual, la vencida…) sin fondo claro cableado. */
table.grid tr.fila--info td { background: var(--info-bg); }
table.grid tr.fila--warn td { background: var(--warn-bg); }
table.grid tr.fila--error td { background: var(--error-bg); }
table.grid tr.fila--apagada td { color: var(--muted); }

/* Envoltorio con scroll horizontal: una tabla ancha no desborda la página. */
.tabla-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    margin: 0 0 var(--esp-4);
    border-radius: 6px;
}
.tabla-scroll > table.grid { margin: 0; }
/* Primera columna fija en informes: al desplazar se sigue viendo la cuenta. */
.tabla-scroll--fija table.grid tr > :first-child {
    position: sticky;
    left: 0;
    z-index: 1;
    background: var(--surface);
}
.tabla-scroll--fija table.grid tr > th:first-child,
.tabla-scroll--fija table.grid tr.total-row > :first-child,
.tabla-scroll--fija table.grid tr.rubro-row > :first-child { background: var(--surface-alt); }

/* Títulos de rubro (Disponibilidades, Gastos operativos, …) y subtotales por
   rubro en los estados (EERR / EEP / Balance). Ver src/reportes/rubros.py. */
table.grid .rubro-row td {
    background: var(--surface-alt);
    padding-top: .55rem;
    border-top: 2px solid var(--border);
    letter-spacing: .02em;
}
table.grid .subtotal-row td {
    border-bottom: 1px solid var(--border);
    color: var(--muted);
}

/* Soporte para redimensionar columnas */
.col-resizer {
    position: absolute;
    top: 0;
    right: 0;
    width: 6px;
    cursor: col-resize;
    user-select: none;
    height: 100%;
    z-index: 10;
}
.col-resizer:hover,
.col-resizer.resizing {
    border-right: 3px solid var(--primary);
}

.meta-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 0.5rem;
    background: var(--surface);
    padding: 1rem 1.25rem;
    border: 1px solid var(--border);
    border-radius: 6px;
    margin: 1rem 0;
}

.pagination {
    margin: 1rem 0;
    text-align: center;
}
.pagination a { margin: 0 0.5rem; }

/* ---- Filtros de los informes ---- */
.filtros {
    background: var(--surface);
    padding: 0.75rem 1rem;
    border-radius: 6px;
    border: 1px solid var(--border);
    display: flex;
    gap: 1rem;
    align-items: end;
    flex-wrap: wrap;
    margin-bottom: 1rem;
}
.filtros label,
.grupo-campo { display: flex; flex-direction: column; gap: 0.25rem; font-size: 0.85rem; }
/* Adentro del grupo de moneda, las etiquetas son las caras de los botones. */
.filtros .moneda-vista label { display: block; }
.filtros > a { padding-bottom: 0.45rem; }
.filtros > a.btn { padding-bottom: 0.28rem; }
/* Varios formularios en una misma barra (mes / rango del Libro de IVA). */
.filtros > form { display: flex; gap: 1rem; align-items: end; flex-wrap: wrap; margin: 0; }
.filtros input, .filtros select {
    padding: 0.4rem;
    border: 1px solid var(--input-borde);
    border-radius: 4px;
    font-size: 0.9rem;
    background: var(--input-bg);
    color: var(--input-texto);
}
.filtros button {
    padding: 0.5rem 1rem;
    background: var(--primary);
    color: var(--on-primary);
    border: 0;
    border-radius: 4px;
    cursor: pointer;
}
.filtros button.btn--secundario,
.filtros button.link-btn { background: none; color: var(--link); }
.filtros button.btn--secundario { border: 1px solid var(--input-borde); background: var(--surface); }

/* ---- Diálogo de confirmación (ui.form_confirmar) ----
   Reemplaza el confirm() nativo: dice QUÉ pasa y SI SE DESHACE. */
dialog.confirmar {
    border: 1px solid var(--border);
    border-radius: var(--radio-l);
    background: var(--surface);
    color: var(--text);
    width: min(30rem, calc(100vw - 2rem));
    padding: 1.25rem 1.4rem;
    box-shadow: 0 20px 50px var(--shadow);
}
dialog.confirmar::backdrop { background: var(--backdrop); }
dialog.confirmar h2 { font-size: var(--fs-l); margin: 0 0 var(--esp-2); }
dialog.confirmar p { margin: 0 0 var(--esp-3); line-height: 1.55; }
dialog.confirmar .acciones { justify-content: flex-end; margin: var(--esp-4) 0 0; }
.confirmar__deshace { font-size: var(--fs-s); color: var(--muted); }
.form-confirmar { display: inline; margin: 0; }
/* La segunda decisión, adentro del diálogo (form_confirmar(extra=…)): antes
   era un segundo confirm() que aparecía después del primero. */
.confirmar__extra {
    display: flex;
    gap: 0.55rem;
    align-items: flex-start;
    margin: 0 0 var(--esp-3);
    padding: 0.6rem 0.75rem;
    border: 1px solid var(--border);
    border-radius: var(--radio-m);
    background: var(--surface-alt);
    line-height: 1.45;
    cursor: pointer;
}
.confirmar__extra input { margin-top: 0.2rem; flex: none; }
.confirmar__extra-ayuda { display: block; margin-top: 0.15rem; font-size: var(--fs-s); color: var(--muted); }

/* Aviso que solo aparece en pantallas chicas (asiento, carga masiva). */
.aviso-pantalla-chica { display: none; }

/* ---- Pantallas de ingreso (auth_base.html, 9.54) ----
   Login, recuperar la clave, 2FA, confirmar el email, la invitación y la
   entrada desde la portada. El fondo es el azul de la barra de la app (sus
   tokens, así que cambia con el tema) y la tarjeta, una superficie como
   cualquier otra: el texto, los links y los campos toman los colores del
   tema y pasan AA en los tres. */
body.ingreso {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.5rem 1rem;
    background: linear-gradient(160deg, var(--topbar-from) 0%, var(--topbar-to) 100%);
}
.ingreso__caja { width: 100%; max-width: 24rem; }
.ingreso__caja--ancha { max-width: 28rem; }
.ingreso__logo { display: block; height: 40px; width: auto; margin: 0 auto 1.1rem; }
.ingreso__tarjeta {
    background: var(--surface);
    color: var(--text);
    border: 1px solid var(--border);
    border-radius: 14px;
    padding: 1.9rem 1.75rem 1.6rem;
    box-shadow: 0 18px 40px rgba(2, 6, 23, 0.3);
}
.ingreso__tarjeta h1 { font-size: 1.25rem; text-align: center; margin: 0 0 0.4rem; }
.ingreso__sub { text-align: center; color: var(--muted); font-size: var(--fs-s); margin: 0 0 1.1rem; overflow-wrap: anywhere; }
.ingreso__tarjeta .campo { margin-top: 0.85rem; }
.ingreso__tarjeta .campo input { font-size: 0.95rem; padding: 0.55rem 0.7rem; border-radius: var(--radio-m); }
.ingreso__boton { width: 100%; margin: 1.25rem 0 0; padding: 0.65rem; font-size: 1rem; }
.ingreso__links { text-align: center; margin: 0.9rem 0 0; font-size: var(--fs-s); }
.ingreso__links + .ingreso__links { margin-top: 0.4rem; }
.ingreso__pie {
    margin: 1.1rem 0 0;
    text-align: center;
    font-size: var(--fs-s);
    color: var(--topbar-text);
}
.ingreso__pie a { color: #fff; font-weight: 600; }
.ingreso__pie a:hover { color: #fff; }
/* De qué cuenta es esta pantalla (8.23): arriba de las credenciales. */
.auth-cuenta {
    padding: 0.55rem 0.8rem;
    margin: 0 0 0.5rem;
    border: 1px solid var(--border);
    border-radius: var(--radio-m);
    background: var(--surface-alt);
}
/* Los nombres cortos (.rot, .val y el <a> pelado) los leen los tests del login. */
.auth-cuenta .rot { display: block; font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.04em; color: var(--muted); }
.auth-cuenta .val { font-weight: 600; overflow-wrap: anywhere; }
.auth-cuenta a { float: right; font-size: var(--fs-s); margin-top: 0.1rem; }
/* El código del 2FA, grande y espaciado. */
.ingreso__codigo input { font-size: 1.35rem; text-align: center; letter-spacing: 0.3rem; }
.ingreso__qr { display: flex; justify-content: center; margin: 0.8rem 0; }
.ingreso__qr svg { width: 200px; height: 200px; background: #fff; border-radius: var(--radio-m); padding: 4px; }
.ingreso__secreto {
    font-family: var(--fuente-mono);
    background: var(--surface-alt);
    padding: 0.5rem 0.7rem;
    border-radius: var(--radio-m);
    text-align: center;
    font-size: var(--fs-s);
    overflow-wrap: anywhere;
}
.ingreso__codigos {
    list-style: none;
    padding: 0;
    margin: 1rem 0;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.4rem;
}
.ingreso__codigos li {
    font-family: var(--fuente-mono);
    background: var(--surface-alt);
    border: 1px dashed var(--border-strong);
    padding: 0.5rem;
    text-align: center;
    border-radius: var(--radio-m);
    letter-spacing: 0.05rem;
}
/* La cuenta de la entrada única: «tu-cuenta» + «.fenix.uy» pegados. */
.ingreso__conjunto { display: flex; align-items: stretch; }
.ingreso__conjunto input { flex: 1; min-width: 0; border-top-right-radius: 0; border-bottom-right-radius: 0; }
.ingreso__sufijo {
    display: flex;
    align-items: center;
    padding: 0 0.55rem;
    border: 1px solid var(--input-borde);
    border-left: 0;
    border-radius: 0 var(--radio-m) var(--radio-m) 0;
    background: var(--surface-alt);
    color: var(--muted);
    font-size: var(--fs-s);
    white-space: nowrap;
}
.ingreso__resumen {
    background: var(--surface-alt);
    border-radius: var(--radio-m);
    padding: 0.6rem 0.8rem;
    font-size: var(--fs-s);
    line-height: 1.55;
    margin: 0 0 0.4rem;
}
.ingreso__resumen .texto-suave { font-size: inherit; }
/* Un campo que se muestra pero no se manda (el email de una invitación). */
.ingreso__tarjeta input[readonly] { background: var(--surface-alt); color: var(--text-soft); }
/* La casilla «Leí y acepto…» de la invitación (9.80): el texto lleva links y
   parte en dos renglones, así que la casilla va arriba y no centrada. */
.ingreso__tarjeta .campo--check { align-items: flex-start; font-size: var(--fs-s); line-height: 1.45; }
.ingreso__tarjeta .campo--check input { margin-top: 0.15rem; }

/* ---- Los términos (terminos.html, 9.80) ----
   Un texto para leer antes de aceptar: más ancho que un formulario, y el
   resumen en una lista de definiciones que se recorre con la vista. La caja
   ancha la usa también /estado (9.82): las dos son para leer, no para llenar. */
.ingreso__caja--lectura { max-width: 40rem; }
.terminos__textos {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 0.4rem 1.2rem;
    margin: 0 0 0.8rem;
    font-weight: 600;
}
.terminos__titulo { font-size: 1rem; margin: 1.2rem 0 0.15rem; }
.terminos__resumen { margin: 0.4rem 0 0; font-size: var(--fs-s); line-height: 1.55; }
.terminos__resumen dt { font-weight: 650; margin-top: 0.75rem; }
.terminos__resumen dd { margin: 0.15rem 0 0; color: var(--text-soft); }
.terminos__no { text-align: center; margin: 0.5rem 0 0; }
.terminos__no .btn { margin-right: 0; }

/* ---- El estado del servicio (estado.html, 9.82) ----
   La misma tarjeta de las pantallas de ingreso, más ancha, con el semáforo en
   los tokens de estado: se lee en los tres temas y el color nunca es lo único
   que dice cómo está cada cosa (la fila lo dice en palabras). */
.estado-servicio h1 { text-align: left; font-size: 1.35rem; margin: 0 0 0.5rem; }
.estado-servicio__bajada { color: var(--text-soft); margin: 0 0 1.4rem; line-height: 1.5; }
.estado-servicio__punto {
    display: inline-block;
    width: 0.75rem;
    height: 0.75rem;
    border-radius: 50%;
    margin-right: 0.6rem;
    vertical-align: middle;
    background: var(--muted);
}
/* El punto del título sigue al estado general y el de cada fila al suyo. Con
   `.estado-x .punto` a secas el de la tarjeta alcanzaba también a las filas, y
   con el sistema «para revisar» todas salían ámbar, aunque dijeran «normal». */
.estado-ok > h1 > .estado-servicio__punto, tr.estado-ok .estado-servicio__punto { background: var(--positivo); }
.estado-degradado > h1 > .estado-servicio__punto, tr.estado-degradado .estado-servicio__punto { background: var(--atencion); }
.estado-caido > h1 > .estado-servicio__punto, tr.estado-caido .estado-servicio__punto { background: var(--negativo); }
.estado-servicio__tabla { width: 100%; border-collapse: collapse; }
.estado-servicio__tabla td { padding: 0.55rem 0; border-top: 1px solid var(--border); }
.estado-servicio__dice { text-align: right; color: var(--muted); font-size: var(--fs-s); }
.estado-servicio__pie { margin-top: 1.4rem; color: var(--muted); font-size: var(--fs-s); line-height: 1.55; }

/* ---- El sitio público (sitio.html, 9.81) ----
   La portada del dominio pelado. Tenía su propia paleta (--tinta, --azul) y un
   logo de texto que no era el de la app; ahora es la barra de la app con su
   logo, y todo lo demás son los tokens del tema. `.boton` se llama así porque
   los tests de la portada miran ese atributo tal cual (8.25/8.26). */
body.sitio { font-size: 16px; line-height: 1.55; background: var(--bg); }
.sitio-ancho { max-width: 68rem; margin: 0 auto; padding: 0 1.25rem; }
.sitio-ancho--texto { max-width: 50rem; }
.sitio-barra {
    position: sticky;
    top: 0;
    z-index: 20;
    background: linear-gradient(180deg, var(--topbar-from) 0%, var(--topbar-to) 100%);
    color: var(--topbar-text);
    box-shadow: 0 2px 6px var(--shadow);
}
.sitio-barra__fila {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding-top: 0.55rem;
    padding-bottom: 0.55rem;
}
.sitio-barra__marca img { display: block; height: 34px; width: auto; }
.sitio-barra__nav { display: flex; align-items: center; gap: 0.2rem; flex-wrap: wrap; justify-content: flex-end; }
.sitio-barra__seccion {
    color: var(--topbar-text);
    text-decoration: none;
    padding: 0.4rem 0.6rem;
    border-radius: var(--radio-m);
    font-size: 0.92rem;
}
.sitio-barra__seccion:hover { background: rgba(255, 255, 255, 0.16); color: #fff; }
.sitio-barra :focus-visible { outline-color: #fff; }
/* El «Entrar» de la barra va en negativo: sobre el azul, un botón azul no se ve. */
body.sitio .sitio-barra .boton { background: #fff; color: var(--topbar-from); margin-left: 0.4rem; padding: 0.45rem 1rem; }
body.sitio .sitio-barra .boton:hover { background: #fff; color: var(--topbar-to); box-shadow: 0 2px 8px var(--shadow); }

body.sitio .boton {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.65rem 1.25rem;
    background: var(--primary);
    color: var(--on-primary);
    border: 1px solid transparent;
    border-radius: var(--radio-m);
    font-weight: 600;
    text-decoration: none;
    box-shadow: 0 1px 2px var(--shadow);
}
body.sitio .boton:hover { background: var(--primary-strong); color: var(--on-primary); }
body.sitio .boton--secundario { background: var(--surface); color: var(--link); border-color: var(--input-borde); box-shadow: none; }
body.sitio .boton--secundario:hover { background: var(--link-hover-bg); color: var(--link-hover); }

.sitio-hero { background: var(--surface); padding: 3.5rem 0 3.25rem; border-bottom: 1px solid var(--border); }
.sitio-hero__grilla { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 0.8fr); gap: 3rem; align-items: center; }
.sitio-hero h1 { font-size: clamp(2rem, 4.4vw, 3rem); line-height: 1.12; letter-spacing: -0.02em; margin: 0.3rem 0 1rem; }
.sitio-antetitulo {
    margin: 0;
    color: var(--primary-text);
    font-weight: 650;
    font-size: 0.8rem;
    letter-spacing: 0.05em;
    text-transform: uppercase;
}
.sitio-bajada { font-size: 1.12rem; color: var(--text-soft); max-width: 40rem; margin: 0; }
.sitio-acciones { display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem; margin: 1.6rem 0 0; }
.sitio-acciones--centro { justify-content: center; }
.sitio-sellos { display: flex; flex-wrap: wrap; gap: 0.5rem; list-style: none; margin: 1.8rem 0 0; padding: 0; }
.sitio-sellos li {
    border: 1px solid var(--border);
    background: var(--surface-alt);
    color: var(--text-soft);
    border-radius: 2rem;
    padding: 0.3rem 0.85rem;
    font-size: 0.85rem;
}

/* El tablero de una empresa nueva, dibujado con sus mismos pasos (F5.7). */
.sitio-muestra {
    margin: 0;
    padding: 1.2rem 1.3rem 1rem;
    background: var(--info-bg);
    border: 1px solid var(--info-borde);
    border-left-width: 4px;
    border-radius: var(--radio-l);
    color: var(--info-texto);
    box-shadow: 0 18px 40px var(--shadow);
    font-size: 0.92rem;
}
.sitio-muestra__cabeza { display: flex; justify-content: space-between; gap: 0.6rem; flex-wrap: wrap; align-items: baseline; }
.sitio-muestra__cabeza span { font-size: 0.82rem; }
.sitio-muestra__barra { height: 6px; border-radius: 3px; background: var(--surface); margin: 0.55rem 0 0.7rem; overflow: hidden; }
.sitio-muestra__barra span { display: block; width: 50%; height: 100%; background: var(--primary); }
.sitio-muestra__lista { list-style: none; margin: 0; padding: 0; }
.sitio-muestra__lista li { position: relative; padding: 0.3rem 0 0.3rem 1.6rem; font-weight: 600; }
.sitio-muestra__lista li::before { position: absolute; left: 0.1rem; font-weight: 700; }
.sitio-muestra__hecho { opacity: 0.75; }
.sitio-muestra__lista .sitio-muestra__hecho { font-weight: 400; text-decoration: line-through; }
.sitio-muestra__hecho::before { content: "✓"; }
.sitio-muestra__ahora::before { content: "○"; }
.sitio-muestra__lista small { display: block; font-weight: 400; font-size: 0.82rem; }
.sitio-muestra figcaption { margin-top: 0.8rem; padding-top: 0.7rem; border-top: 1px solid var(--info-borde); font-size: 0.82rem; }

.sitio-seccion { padding: 3.5rem 0; }
.sitio-seccion--alt { background: var(--surface); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.sitio-seccion h2 { font-size: 1.65rem; letter-spacing: -0.01em; margin: 0 0 0.4rem; }
.sitio-sub { color: var(--muted); margin: 0 0 1.8rem; max-width: 46rem; font-size: 1.02rem; }
.sitio-nota { color: var(--muted); font-size: 0.92rem; margin: 1rem 0 0; }

.sitio-pasos { list-style: none; margin: 0; padding: 0; display: grid; gap: 1.25rem; grid-template-columns: repeat(auto-fit, minmax(min(17rem, 100%), 1fr)); }
.sitio-paso { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radio-l); padding: 1.3rem 1.3rem 1.1rem; }
.sitio-paso__numero {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border-radius: 50%;
    background: var(--info-bg);
    color: var(--info-texto);
    border: 1px solid var(--info-borde);
    font-weight: 700;
}
.sitio-paso h3 { font-size: 1.08rem; margin: 0.7rem 0 0.4rem; }
.sitio-paso p { margin: 0; color: var(--text-soft); font-size: 0.95rem; }

.sitio-grilla { display: grid; gap: 1.25rem; grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr)); }
.sitio-caja { background: var(--bg); border: 1px solid var(--border); border-radius: var(--radio-l); padding: 1.1rem 1.25rem; }
.sitio-caja h3 { margin: 0 0 0.6rem; font-size: 1rem; }
.sitio-caja ul { margin: 0; padding-left: 1.1rem; color: var(--text-soft); font-size: 0.93rem; }
.sitio-caja li { margin: 0.3rem 0; }

.sitio-planes { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr)); }
.sitio-plan { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radio-l); padding: 1.15rem; display: flex; flex-direction: column; }
.sitio-plan h3 { margin: 0 0 0.2rem; font-size: 1.08rem; }
.sitio-plan__desc { margin: 0 0 0.6rem; color: var(--muted); font-size: 0.9rem; }
.sitio-plan__precio { font-size: 1.7rem; font-weight: 700; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.sitio-plan__precio small { font-size: 0.8rem; font-weight: 400; color: var(--muted); }
.sitio-plan__anual { color: var(--muted); font-size: 0.85rem; margin: 0.15rem 0 0.9rem; }
.sitio-plan__limites { font-size: 0.88rem; border-top: 1px solid var(--border); padding-top: 0.7rem; }
.sitio-plan ul { margin: 0.6rem 0 0; padding-left: 1.05rem; font-size: 0.88rem; color: var(--text-soft); }
.sitio-plan__prox { margin: 0.6rem 0 0; font-size: 0.85rem; color: var(--muted); }

.sitio-preguntas details {
    background: var(--bg);
    border: 1px solid var(--border);
    border-radius: var(--radio-l);
    padding: 0.85rem 1.1rem;
    margin: 0 0 0.6rem;
}
.sitio-preguntas summary { font-weight: 600; cursor: pointer; }
.sitio-preguntas details[open] summary { margin-bottom: 0.5rem; }
.sitio-preguntas p { margin: 0; color: var(--text-soft); }

.sitio-demo {
    text-align: center;
    background: var(--info-bg);
    border: 1px solid var(--info-borde);
    color: var(--info-texto);
    border-radius: var(--radio-l);
    padding: 2rem 1.25rem;
}
.sitio-demo h2 { color: inherit; }
.sitio-demo p { margin: 0.4rem 0 0; }
.sitio-demo a:not(.boton) { color: inherit; font-weight: 600; }
.sitio-demo__canales { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.3rem 1.2rem; font-size: 0.92rem; }

.sitio-seccion--entrar { background: var(--surface-alt); border-top: 1px solid var(--border); }
.sitio-otra { font-size: 0.92rem; }

body.sitio .sitio-pie { text-align: left; margin: 0; padding: 1.6rem 0 2.5rem; border-top: 1px solid var(--border); color: var(--muted); font-size: 0.88rem; }
.sitio-pie__fila { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 0.6rem 1.5rem; }
.sitio-pie__links { display: flex; flex-wrap: wrap; gap: 0.4rem 1.2rem; }

@media (max-width: 900px) {
    .sitio-hero__grilla { grid-template-columns: 1fr; gap: 2rem; }
}
@media (max-width: 760px) {
    /* En el celular la barra queda con el logo y «Entrar»: las secciones
       están a un scroll de distancia y no entran en un renglón. */
    .sitio-barra__seccion { display: none; }
    .sitio-ancho { padding: 0 1rem; }
    .sitio-hero { padding: 2.25rem 0 2.25rem; }
    .sitio-seccion { padding: 2.5rem 0; }
    .sitio-seccion h2 { font-size: 1.4rem; }
    .sitio-bajada { font-size: 1.05rem; }
}

/* ---- El panel de superadmin (admin_base.html, 9.57) ----
   Uso interno, con su barra oscura propia para que nadie confunda el panel
   con la app de un cliente. Lo demás —tablas, tarjetas, avisos— con los
   tokens del tema. Vivía en un <style> del layout con otra paleta. */
body.admin { background: var(--bg); }
.admin-barra {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem 1.2rem;
    align-items: baseline;
    padding: 0.7rem 1.2rem;
    background: #0f172a;
    color: #e2e8f0;
}
.admin-barra a { color: #cbd5e1; text-decoration: none; font-size: 0.9rem; }
.admin-barra a:hover,
.admin-barra a.on { color: #fff; text-decoration: underline; }
.admin-barra :focus-visible { outline-color: #fff; }
.admin-barra .marca { font-weight: 700; color: #fff; margin-right: 0.6rem; }
.admin-barra .yo { margin-left: auto; font-size: 0.8rem; color: #cbd5e1; }
body.admin main { padding: 1.2rem; max-width: 78rem; margin: 0 auto; }
body.admin h1 { font-size: 1.3rem; margin: 0 0 1rem; }
body.admin h2 { font-size: 1rem; margin: 1.6rem 0 0.5rem; color: var(--text-soft); }
body.admin main table { width: 100%; border-collapse: collapse; background: var(--surface); font-size: 0.88rem; }
body.admin main th,
body.admin main td { text-align: left; padding: 0.45rem 0.6rem; border-bottom: 1px solid var(--border); }
body.admin main th {
    background: var(--surface-alt);
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    color: var(--text-soft);
}
body.admin main .num { text-align: right; }
body.admin .mal { color: var(--negativo); font-weight: 600; }
body.admin .ok { color: var(--positivo); }
body.admin form.inline { display: inline; }
.tarjetas { display: flex; gap: 0.8rem; flex-wrap: wrap; margin-bottom: 1rem; }
.tarjetas .t {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--radio-s);
    padding: 0.7rem 1rem;
    min-width: 9rem;
}
.tarjetas .n { font-size: 1.5rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.tarjetas .r { font-size: 0.72rem; text-transform: uppercase; color: var(--muted); }

/* ============================================================
   5. PANTALLAS PUNTUALES
   ============================================================ */
.balance-box {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 1rem 1.5rem;
    margin: 1.5rem 0;
    max-width: 500px;
}
.balance-box table { width: 100%; }
.balance-box td { padding: 0.25rem 0.5rem; }
.balance-box .num { text-align: right; font-variant-numeric: tabular-nums; }
.balance-box tr.ok { color: var(--ok); font-weight: 600; }
.balance-box tr.warn { color: var(--warn); font-weight: 600; }

/* ---- Reportes: EERR + EP ---- */
.eerr-grid, .eep-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1.5rem;
    margin: 1rem 0;
}
.eerr-block, .eep-block { min-width: 0; }
.eerr-block h2, .eep-block h2 {
    margin: 0 0 0.5rem;
    font-size: 1.05rem;
    color: var(--primary-text);
}
.eep-block h3 {
    font-size: 0.95rem;
    color: var(--muted);
    margin: 1rem 0 0.5rem;
}

.resumen-box {
    background: var(--surface);
    border: 2px solid var(--border);
    border-radius: 8px;
    padding: 1rem 1.5rem;
    margin: 1.5rem 0;
    max-width: 520px;
}
.resumen-box.positive { border-color: var(--ok); }
.resumen-box.negative { border-color: var(--warn); }
.resumen-box table { width: 100%; }
.resumen-box td { padding: 0.3rem 0; }
.resumen-box .num { text-align: right; font-variant-numeric: tabular-nums; }
.resumen-box tr.total td {
    border-top: 1px solid var(--border);
    padding-top: 0.5rem;
    font-size: 1.05rem;
}

/* Selector de moneda tipo grupo de botones (igual que el mayor).
   Los radios estaban con display:none, que los saca del teclado: no se podía
   cambiar la moneda sin mouse en 13 pantallas. Ahora quedan ocultos a la
   vista pero enfocables, y el foco se dibuja en la etiqueta. */
.moneda-vista {
    display: inline-flex; gap: 0; align-items: center;
    border: 1px solid var(--input-borde); border-radius: 4px; overflow: hidden;
    vertical-align: middle;
    position: relative;
}
.moneda-vista label {
    padding: 0.4rem 0.7rem;
    background: var(--surface); color: var(--muted);
    cursor: pointer; font-size: 0.85rem;
    border-right: 1px solid var(--border-strong);
    margin: 0;
}
.moneda-vista label:last-child,
.moneda-vista label:last-of-type { border-right: 0; }
.moneda-vista input {
    position: absolute;
    opacity: 0;
    width: 1px;
    height: 1px;
    margin: 0;
    pointer-events: none;
}
.moneda-vista input:checked + label { background: var(--primary); color: var(--on-primary); }
.moneda-vista input:focus-visible + label { outline: 2px solid var(--foco); outline-offset: -3px; }

/* Barra de exportación (Imprimir / Excel), que vivía en base.html. */
.export-bar {
    display: flex;
    gap: .5rem;
    align-items: center;
    margin: .4rem 0;
    flex-wrap: wrap;
}
.export-bar a,
.export-bar button {
    font-size: .82rem;
    padding: .35rem .7rem;
    border-radius: 4px;
    border: 1px solid var(--input-borde);
    background: var(--surface);
    color: var(--link);
    cursor: pointer;
    text-decoration: none;
    font-family: inherit;
}
.export-bar a:hover,
.export-bar button:hover { background: var(--link-hover-bg); }

/* ============================================================
   6. RESPONSIVE
   Una sola media query había (la del EERR). Estas son las de la app entera;
   las de una pantalla puntual siguen en su template.
   ============================================================ */
@media (max-width: 900px) {
    .eerr-grid, .eep-grid { grid-template-columns: 1fr; }
    /* La barra en dos renglones —logo, «Menú», ayuda y usuario arriba; la
       empresa y el buscador abajo— y el menú en columna cuando se abre. Sin
       JS (html sin .js) el menú queda abierto: mejor largo que inaccesible. */
    .topbar { flex-wrap: wrap; gap: 0.45rem 0.5rem; padding: 0.5rem 0.75rem; }
    .topbar .brand { margin-right: 0; }
    .menu-toggle { display: inline-flex; }
    .nav-ayuda { margin-left: auto; }
    .topbar .empresa-switcher { order: 5; flex: 1 1 auto; }
    .empresa-switcher__nombre { max-width: none; }
    .nav-buscar,
    .nav-buscar:focus-within { order: 6; flex: 0 1 15rem; margin: 0; }
    .topbar .menu {
        order: 10;
        flex: 1 1 100%;
        margin-right: 0;
        flex-direction: column;
        align-items: stretch;
        gap: 0.1rem;
        padding: 0.35rem 0 0.2rem;
        border-top: 1px solid rgba(255, 255, 255, 0.22);
    }
    html.js .topbar .menu { display: none; }
    html.js .topbar .menu-toggle[aria-expanded="true"] ~ .menu { display: flex; }
    .topbar .menu > li > a,
    .topbar .menu > li > .group-label { width: 100%; padding: 0.55rem 0.6rem; font-size: 0.95rem; }
    .topbar .menu .caret { margin-left: auto; }
    .topbar .menu > li > a > .icono,
    .topbar .menu > li > .group-label > .icono:not(.caret) { display: inline-block; }
    .topbar .menu .dropdown {
        position: static;
        min-width: 0;
        max-width: none;
        margin: 0.15rem 0 0.4rem 1.6rem;
        box-shadow: none;
    }
    .topbar .menu .dropdown::before { display: none; }
    .topbar .dropdown li a { white-space: normal; }
    .columnas--ancha-angosta { grid-template-columns: 1fr; }
    .container { margin: 1.25rem auto; padding: 0 1rem; }
    .meta-grid { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
    /* La barra ocupa media pantalla en un celular: deja de ser fija. */
    .topbar { position: static; }
    /* La empresa no se esconde nunca, tampoco en el celular: es lo primero
       que hay que saber antes de cargar algo. Va sola en su renglón. */
    .topbar .empresa-switcher { flex: 1 1 100%; }
    .nav-buscar,
    .nav-buscar:focus-within { flex: 1 1 100%; }
    /* En el celular «Ayuda» queda en el ícono: el texto sigue ahí para el
       lector de pantalla, y el renglón de arriba entra en 360 px. */
    .nav-ayuda__texto {
        position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
        overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
    }
    .nav-ayuda .icono { width: 1.35em; height: 1.35em; }
    .container { margin: 1rem auto; padding: 0 0.75rem; }
    h1 { font-size: 1.3rem; }
    .filtros { gap: 0.6rem; padding: 0.6rem 0.75rem; }
    .filtros > label { flex: 1 1 9rem; }
    .filtros input, .filtros select { width: 100%; }
    .kpis { grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); }
    .kpi__valor { font-size: 1.1rem; }
    .encabezado__acciones { width: 100%; }
    footer { padding: 1.25rem; margin-top: 2rem; }
}
@media (max-width: 767px) {
    .aviso-pantalla-chica { display: block; }
}

/* ============================================================
   7. IMPRESIÓN Y MOVIMIENTO REDUCIDO
   ============================================================ */
/* Vista de impresión / "Guardar como PDF" del navegador: deja solo el
   contenido del reporte, oculta navegación, filtros y barras de export. */
@media print {
    .topbar,
    footer,
    .filtros,
    .acciones-bar,
    .atajos-periodo,
    .export-bar,
    .no-print,
    .buscador-cta,
    .moneda-vista,
    .nav-buscar,
    .topbar .user-box,
    .ayuda-btn,
    .ayuda-link,
    .saltar-contenido,
    .encabezado__acciones,
    form,
    .pagination {
        display: none !important;
    }
    main.container {
        margin: 0;
        padding: 0;
        max-width: none;
    }
    a {
        color: #000 !important;
        text-decoration: none;
    }
    table {
        font-size: 11px;
    }
    .tabla-scroll { overflow: visible; }
    .col-resizer {
        display: none !important;
    }
    table.grid {
        table-layout: auto !important;
    }
    table.grid th {
        width: auto !important;
    }
    @page {
        margin: 1.2cm;
    }
}

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        transition: none !important;
        animation: none !important;
        scroll-behavior: auto !important;
    }
    .btn:hover, .card:hover { transform: none; }
}
