  /* Fase 10 (item 7): reemplazo progresivo de style="display:none" por
     clases - .is-hidden gana SIEMPRE (!important a proposito, mismo
     criterio que .d-none de Bootstrap) sin importar que otra regla de
     display tenga el elemento (ej. .active-batch-banner declara
     display:flex por defecto). */
  .is-hidden { display: none !important; }

  :root {
    /* ---- Tokens de marca SIImplifica ---- */
    --color-navy: #081A33;
    --color-indigo: #151C4D;
    --color-violet: #7C3AED;
    --color-violet-light: #A855F7;
    /* Ajustado de #F7F8FC a #F6F7FB (pedido de diseño RRHH: casi el mismo
       tono, un pixel de diferencia, pero pidieron el valor exacto). */
    --color-background: #F6F7FB;
    --color-card: #FFFFFF;
    /* Ajustado de #E5E7EB a #E2E8F0 (mismo motivo que el fondo de pagina). */
    --color-border: #E2E8F0;
    --color-violet-soft: #F1ECFC;
    --color-indigo-soft: #EDEFF8;

    /* ---- Alias: el resto del CSS sigue usando estos nombres ---- */
    --sidebar-bg: var(--color-navy);
    --primary: var(--color-violet);
    --primary-dark: #6D28D9;
    --secondary: var(--color-violet-light);
    --bg: var(--color-background);
    --card: var(--color-card);
    --text: var(--color-navy);
    --muted: #64748B;
    --success: #10B981;
    --success-bg: #ECFDF5;
    --danger: #EF4444;
    --danger-bg: #FEF2F2;
    --warning-bg: #FFFBEB;
    --warning: #B45309;
    --info: #2563EB;
    --info-bg: #EFF6FF;
    --border: var(--color-border);

    /* ---- Segunda pasada visual RR.HH. (Ago 2026) ---- */
    /* Radios propios de esa pantalla: el resto del sitio ya tiene sus
       tarjetas ajustadas a 16-18px y no es parte de este pedido, asi que
       estos dos tokens solo se usan dentro de #view-rrhh (ver mas abajo).
       Despues los tomaron tambien Formulario 29, Liquidaciones y
       Cotizaciones. El de tarjeta bajo de 12 a 8px el 2/10/2026: el usuario
       pidio "esquinas un poco menos redondas" mirando el tablero del F29. */
    --radius-card: 8px;
    --radius-control: 8px;
    /* Morado suave para hovers/fondos suaves. --color-violet-soft (#F1ECFC)
       ya existe pero se usa en iconos de todo el sitio (procesos, info-box);
       se agrega este con el tono exacto pedido para no correr el look de
       esas otras pantallas al tocarlo. */
    --primary-soft: #F3E8FF;
    --primary-soft-border: #DDD6FE;
    /* --warning (#B45309) es un naranja mas oscuro elegido a proposito para
       que el TEXTO tenga contraste sobre fondo blanco/--warning-bg - con el
       naranja "puro" de abajo el texto se ve palido. Este token es solo
       para rellenos de icono o detalles decorativos, nunca para texto. */
    --warning-icon: #F59E0B;
  }
  * { box-sizing: border-box; }
  body {
    font-family: "Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
    background: var(--bg);
    color: var(--text);
    margin: 0;
  }
  h1, h2, h3 { margin: 0; font-weight: 700; }
  a { color: var(--primary); text-decoration: none; }
  /* Tapa TODA la pantalla por encima de cualquier cosa (position:fixed +
     z-index alto) mientras se sabe si hay sesion o no - antes era un bloque
     normal que solo ocupaba lugar arriba del resto, asi que durante una
     recarga lenta se veian los dos apilados (el cartel de carga y, debajo,
     el contenido de la pagina anterior que el navegador mantiene pintado
     un rato). Con esto tapa de verdad, no se ve nada de atras. */
  #boot-loading {
    position: fixed; inset: 0; z-index: 9999; background: var(--bg);
    display: flex; align-items: center; justify-content: center; color: var(--muted); font-size: 0.9rem;
  }
  /* Fase 10: public/login.html es su propio documento (ya no comparte
     pagina con #app-box) - siempre visible por defecto, no hay ningun JS
     que decida "mostrar login o app" en este archivo compartido. */
  #login-box { display: flex; }

  /* ---------- Login ---------- */
  .auth-wrapper {
    min-height: 100vh; align-items: center; justify-content: center; padding: 16px;
    position: relative; overflow: hidden; background: var(--color-background);
  }
  .auth-blob {
    position: absolute; border-radius: 50%; pointer-events: none;
    background: radial-gradient(circle at 32% 32%, rgba(124,58,237,0.18), rgba(124,58,237,0.05) 70%);
  }
  .auth-blob.b1 { width: 460px; height: 460px; top: -180px; right: -160px; }
  .auth-blob.b2 { width: 420px; height: 420px; bottom: -180px; left: -160px; }
  .auth-dots {
    position: absolute; width: 108px; height: 108px; pointer-events: none;
    background-image: radial-gradient(rgba(124,58,237,0.35) 1.4px, transparent 1.4px);
    background-size: 14px 14px;
  }
  .auth-dots.d1 { top: 26px; left: 26px; }
  .auth-dots.d2 { bottom: 26px; right: 26px; }

  .auth-card {
    background: var(--card); width: 100%; max-width: 440px; margin: 0 auto;
    border-radius: 24px; box-shadow: 0 24px 60px rgba(11,16,48,0.14), 0 1px 3px rgba(11,16,48,0.06);
    position: relative; z-index: 1; padding: 40px 40px 34px;
  }
  .auth-header { text-align: center; margin-bottom: 26px; }
  .auth-form-icon { width: 84px; height: 84px; margin-bottom: 16px; }
  .auth-wordmark { font-size: 1.7rem; line-height: 1.15; color: var(--text); }
  .auth-tagline { color: var(--primary); font-size: 0.82rem; font-weight: 600; margin: 6px 0 0; }
  .auth-field { position: relative; display: block; margin-bottom: 14px; }
  .auth-field-icon { position: absolute; left: 15px; top: 50%; transform: translateY(-50%); width: 17px; height: 17px; color: var(--muted); pointer-events: none; }
  .auth-field input {
    width: 100%; font-size: 0.9rem; padding: 13px 16px 13px 42px; margin: 0;
    background: var(--bg); border: 1px solid var(--border); border-radius: 12px; outline: none;
    transition: border-color .15s, background .15s;
  }
  .auth-field input:focus { background: #fff; border-color: var(--primary); }
  .auth-field-toggle {
    position: absolute; right: 12px; top: 50%; transform: translateY(-50%); background: transparent; border: none;
    color: var(--muted); cursor: pointer; padding: 4px; display: flex;
  }
  .auth-field-toggle svg { width: 17px; height: 17px; }
  .auth-field-toggle:hover { color: var(--primary); }
  .auth-submit { margin-top: 6px; border-radius: 14px; padding: 13px 20px; font-size: 0.92rem; }
  .auth-error { color: var(--danger); font-size: 0.85rem; min-height: 1.2em; margin-top: 12px; text-align: center; }
  /* Aviso de por que la persona llego al login (ej. sesion vencida del
     portal de clientes). No es un error: es informativo. */
  .auth-aviso { background: var(--info-bg, #EFF6FF); color: var(--info, #1D4ED8); font-size: 0.83rem; line-height: 1.4; border-radius: 10px; padding: 10px 12px; margin: 0 0 16px; text-align: center; }
  .auth-forgot { display: block; text-align: center; font-size: 0.82rem; color: var(--primary); font-weight: 600; margin-top: 18px; }
  .auth-forgot:hover { color: var(--primary-dark); }

  /* ---------- App shell ---------- */
  #app-box { display: flex; min-height: 100vh; }
  .sidebar {
    width: 240px; flex-shrink: 0; background: var(--sidebar-bg); color: #cbd5e1;
    display: flex; flex-direction: column; padding: 20px 14px; position: sticky; top: 0; height: 100vh;
    transition: width .15s;
  }
  .sidebar-brand { display: flex; align-items: center; gap: 11px; color: #fff; font-weight: 700; padding: 6px 8px 14px; }
  .sidebar-brand .brand-badge { width: 34px; height: 34px; border-radius: 9px; flex-shrink: 0; display: block; }
  .sidebar-brand-text { font-size: 0.98rem; letter-spacing: -0.01em; white-space: nowrap; }
  /* Boton para minimizar el menu a solo iconos - el estado se guarda en
     localStorage (ver toggleSidebarCollapsed) para que no vuelva a
     expandirse solo al recargar la pagina. */
  .sidebar-collapse-btn {
    display: flex; align-items: center; gap: 8px; width: 100%; background: transparent;
    border: 1px solid rgba(255,255,255,0.12); color: #94a3b8; border-radius: 8px;
    padding: 7px 10px; font-size: 0.78rem; cursor: pointer; margin-bottom: 16px; transition: background .15s, color .15s;
  }
  .sidebar-collapse-btn:hover { background: rgba(255,255,255,0.06); color: #fff; }
  .sidebar-collapse-btn svg { flex-shrink: 0; transition: transform .15s; }
  /* La marca de la seccion abierta NO es el fondo de cada enlace: es una sola
     pastilla del contenedor que se DESLIZA de una a otra, el mismo efecto que
     las pestañas pero en vertical (pedido del usuario, 14/9/2026). Con el
     fondo puesto en cada enlace no hay nada que animar: uno se apaga y el
     otro se prende.

     Su posicion y su alto los mide el JS (posicionarPastillaDelMenu) porque
     entre los enlaces hay titulos de grupo -"Principal", "Operaciones"- y
     algunos enlaces se esconden segun el rol: la distancia entre uno y otro
     no es fija, y el CSS no puede calcularla. */
  .sidebar-nav { display: flex; flex-direction: column; gap: 5px; position: relative; }
  /* Con el navegador en zoom (o una pantalla baja) el menu no entra en el
     alto de la ventana, y la barra es sticky de 100vh: lo que sobraba
     quedaba debajo del borde, inalcanzable. "Salir" y la cuenta de Uwigo
     desaparecian (reportado el 21/9/2026, navegador al 125%: al menu le
     sobraban 35px; al 150%, 167px).

     Scrollea el MENU, no la barra entera, para que la marca, la cuenta y
     "Salir" queden siempre a la vista. La pastilla es un ::before de este
     mismo contenedor, asi que se mueve junto con los enlaces. */
  .sidebar-nav {
    flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden;
    scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.18) transparent;
    /* Hasta el borde de la barra (los 14px de padding de .sidebar): ahí va
       el palito del activo, que con overflow-x: hidden se cortaría si
       quedara fuera del menú. Los enlaces siguen donde estaban. */
    margin: 0 -14px; padding: 0 14px;
  }
  /* Sin esto, con el menu limitado en alto los renglones se ENCOGEN en vez
     de scrollear, y los primeros en encogerse son los titulos de grupo (su
     overflow: hidden les baja el minimo a 0): "Operaciones" y "Gestion"
     quedaban aplastados, cortados por la mitad. */
  .sidebar-nav > * { flex-shrink: 0; }
  /* SE MUEVE IGUAL QUE EN SIIMPLIFICA (23/10/2026, pedido del dueño:
     "elimina el rebote y que se mueva igual que el de SIImplifica"): 280 ms
     y la curva del indicador del portal (.cp-nav-indicador en
     client-portal.css), que frena al llegar sin pasarse. Antes era el
     resorte del interruptor, con rebote. */
  .sidebar-nav::before {
    content: ""; position: absolute; z-index: 0; left: 14px; right: 14px; top: 0;
    height: var(--nav-pastilla-h, 0); transform: translateY(var(--nav-pastilla-y, 0));
    background: rgba(124, 58, 237, 0.22); border-radius: 9px;
    transition: var(--nav-pastilla-transicion, transform 280ms cubic-bezier(.3, .7, .3, 1), height 280ms cubic-bezier(.3, .7, .3, 1));
    /* Sin alto -todavia no se midio- no se pinta: mejor nada que una barra
       violeta pegada arriba de todo. */
    opacity: var(--nav-pastilla-visible, 0);
  }
  /* EL PALITO DEL ACTIVO, como en SIImplifica (mismo pedido): 3px violeta,
     fuera de la pastilla, pegado al borde izquierdo de la barra, y se mueve
     junto con ella. */
  .sidebar-nav::after {
    content: ""; position: absolute; z-index: 0; left: 0; top: 9px; width: 3px;
    height: max(0px, calc(var(--nav-pastilla-h, 0px) - 18px)); transform: translateY(var(--nav-pastilla-y, 0));
    border-radius: 0 3px 3px 0; background: #8B5CF6;
    transition: var(--nav-pastilla-transicion, transform 280ms cubic-bezier(.3, .7, .3, 1), height 280ms cubic-bezier(.3, .7, .3, 1));
    opacity: var(--nav-pastilla-visible, 0);
  }
  @media (prefers-reduced-motion: reduce) {
    .sidebar-nav::before, .sidebar-nav::after { transition: none; }
  }
  .sidebar-nav-group-label {
    font-size: 0.68rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
    color: #64748b; padding: 14px 13px 6px; white-space: nowrap; overflow: hidden;
  }
  .sidebar-nav-group-label:first-child { padding-top: 2px; }
  .nav-item {
    display: flex; align-items: center; gap: 11px; padding: 11px 13px; border-radius: 10px;
    color: #cbd5e1; font-size: 0.88rem; font-weight: 500; cursor: pointer; transition: background .15s, color .15s;
  }
  .nav-item svg { width: 18px; height: 18px; flex-shrink: 0; }
  /* Encima de la pastilla, que va detras. */
  .nav-item { position: relative; z-index: 1; }
  .nav-item .nav-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .nav-item:hover { background: rgba(255,255,255,0.06); color: #fff; }
  /* Sin fondo propio (lo pone la pastilla, que se desliza) ni línea propia:
     el palito violeta va en .sidebar-nav::after, afuera, como en SIImplifica
     (volvió el 23/10/2026; antes se había sacado la línea pegada al enlace). */
  .nav-item.active { color: #fff; }
  .sidebar-footer { margin-top: auto; padding-top: 12px; border-top: 1px solid rgba(255,255,255,0.08); }
  .sidebar-footer .account-chip {
    background: rgba(255,255,255,0.06); border-color: rgba(255,255,255,0.12);
    min-width: 0; width: 100%; margin-bottom: 10px;
  }
  .sidebar-footer .account-chip:hover { border-color: rgba(255,255,255,0.3); }
  .sidebar-footer .account-chip-title { color: #fff; }
  .sidebar-footer .account-chip-email { color: #94a3b8; }
  .sidebar-footer .account-chip svg { color: #94a3b8; }
  .sidebar-footer button {
    display: flex; align-items: center; justify-content: center; gap: 8px;
    width: 100%; background: transparent; border: 1px solid rgba(255,255,255,0.15); color: #cbd5e1;
    padding: 9px 12px; border-radius: 10px; font-size: 0.85rem; cursor: pointer; transition: background .15s;
  }
  .sidebar-footer button:hover { background: rgba(255,255,255,0.08); color: #fff; }

  /* ---------- Sidebar minimizado (solo iconos) ---------- */
  .sidebar.collapsed { width: 72px; }
  .sidebar.collapsed .sidebar-brand { justify-content: center; padding-left: 0; padding-right: 0; }
  .sidebar.collapsed .sidebar-brand-text,
  .sidebar.collapsed .sidebar-collapse-btn span,
  .sidebar.collapsed .sidebar-nav-group-label,
  .sidebar.collapsed .nav-item .nav-label,
  .sidebar.collapsed .account-chip > div,
  .sidebar.collapsed .account-chip svg,
  .sidebar.collapsed .sidebar-footer button span {
    display: none;
  }
  .sidebar.collapsed .sidebar-collapse-btn { justify-content: center; }
  .sidebar.collapsed .sidebar-collapse-btn svg { transform: rotate(180deg); }
  .sidebar.collapsed .nav-item { justify-content: center; padding: 11px; }
  .sidebar.collapsed .sidebar-footer .account-chip { justify-content: center; padding: 8px; gap: 0; }

  /* EL AIRE DE ABAJO (--aire-natural) NO PUEDE SER EL MOTIVO DE UNA BARRA DE
     SCROLL. Esta para que la ultima tarjeta no quede pegada al borde cuando
     la pagina SI scrollea; cuando la pagina entra, lo que hay debajo del
     contenido ya es espacio vacio. Pero el alto de la pagina es contenido +
     este padding: una pantalla que entraba entera y terminaba a menos de
     28px del borde igual se pasaba, y aparecia una barra para 7 pixeles de
     nada. Achicarlo (era 70px) solo hizo mas angosta la franja.

     Lo resuelve /js/compartido/aire-del-pie.js: si lo unico que se pasa de
     la ventana es este aire, lo achica hasta que la pagina entre (escribe
     --aire-del-pie); con contenido de verdad debajo del borde queda entero.

     Por eso el padding de abajo de esta columna se escribe SIEMPRE con esta
     formula. Una regla que le ponga un numero fijo deja a esa pantalla otra
     vez con la barra (lo vigila test/aireDelPie.test.js). */
  .main-area { --aire-natural: 28px; flex: 1; min-width: 0; padding: 40px 48px var(--aire-del-pie, var(--aire-natural)); }

  /* Ventana baja: zoom del navegador o notebook. Se aprieta el menu para que
     entre entero, sin scroll. Solo escritorio: en movil el menu es una fila
     (ver el bloque de max-width: 720px).

     Los cortes salen de medir el menu con las 13 secciones del administrador
     (con Deudas) y la cuenta de Uwigo en dos renglones, como se ve en
     produccion (15/10/2026): normal necesita 951px de ventana; apretado, 800;
     mas apretado, 740. Con los cortes viejos (900 y 740, medidos el 8/10 con
     12 secciones) una ventana de 901 a 950 scrolleaba hasta 50px: el dueño lo
     vio en la suya ("esta por centimetros"). Al sumar una seccion al menu hay
     que volver a medir (scratchpad: medir_menu.js). */
  @media (min-width: 721px) and (max-height: 960px) {
    .sidebar { padding-top: 14px; padding-bottom: 14px; }
    .sidebar-brand { padding-bottom: 10px; }
    .sidebar-collapse-btn { margin-bottom: 10px; }
    .sidebar-nav { gap: 2px; }
    .sidebar-nav-group-label { padding-top: 10px; padding-bottom: 4px; }
    .nav-item { padding-top: 8px; padding-bottom: 8px; }
    .sidebar.collapsed .nav-item { padding: 8px 11px; }
    .sidebar-footer { padding-top: 10px; }
    .sidebar-footer .account-chip { margin-bottom: 8px; }
  }
  @media (min-width: 721px) and (max-height: 800px) {
    .nav-item { padding-top: 6px; padding-bottom: 6px; }
    .sidebar.collapsed .nav-item { padding: 6px 11px; }
  }
  /* Y con la ventana baja se recorta el aire de arriba del contenido: con
     zoom, esos 64px vacios eran lo primero que se veia. */
  @media (min-width: 721px) and (max-height: 800px) {
    .main-area { padding-top: 24px; }
    .main-area > .topheader { margin-bottom: 12px; }
  }
  /* Ventana angosta (zoom alto): 48px de cada lado le quitaban casi 100px
     a tablas que ya no entraban. */
  @media (min-width: 721px) and (max-width: 1100px) {
    .main-area { padding-left: 24px; padding-right: 24px; }
  }
  .topheader { display: flex; align-items: flex-start; justify-content: space-between; gap: 20px; margin-bottom: 24px; flex-wrap: wrap; }
  .topheader h1 { font-size: 1.6rem; }
  .topheader p { color: var(--muted); font-size: 0.92rem; margin-top: 4px; }

  .account-chip {
    display: flex; align-items: center; gap: 10px; background: #fff; border: 1px solid var(--border);
    border-radius: 12px; padding: 8px 14px; cursor: pointer; transition: border-color .15s; min-width: 220px;
  }
  .account-chip:hover { border-color: var(--primary); }
  .account-chip .dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }
  .dot-success { background: var(--success); }
  .dot-warning { background: #F59E0B; }
  .dot-muted { background: var(--muted); }
  .dot-danger { background: var(--danger); }
  .account-chip > div { min-width: 0; flex: 1; }
  .account-chip-title { font-size: 0.82rem; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .account-chip-email { font-size: 0.76rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .account-chip svg { margin-left: auto; width: 16px; height: 16px; color: var(--muted); flex-shrink: 0; }

  .view { display: none; }
  .view.active { display: block; }

  /* ---------- Stat cards ---------- */
  .stat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; margin-bottom: 20px; }
  /* En la columna de la derecha las fichas van UNA ABAJO DE LA OTRA. Con las
     dos al lado quedan en 159px y el texto se parte feo: "Procesos / en /
     ejecución" en tres líneas. Apareció al mover el resumen de Empresas a esa
     columna (pedido del usuario, 14/9/2026). */
  .col-side .stat-grid { grid-template-columns: 1fr; gap: 12px; }
  .col-side .stat-card { padding: 16px 18px; }
  .stat-card {
    background: var(--card); border: 1px solid var(--border); border-radius: 16px; padding: 22px 22px;
    display: flex; align-items: center; gap: 16px; box-shadow: 0 1px 2px rgba(15,23,42,0.04);
  }
  /* Los KPIs de Contabilidad son botones: tocar uno filtra la tabla por lo
     que ese número cuenta. Como son <button>, hay que resetear lo que el
     navegador les pone (fuente, alineación) para que se vean igual que las
     tarjetas de siempre. La activa se marca con el borde y un fondo tenue -
     nunca solo con color, para que se distinga también sin verlo bien. */
  .stat-card-filtro {
    width: 100%; text-align: left; font-family: inherit; cursor: pointer;
    transition: border-color .15s, box-shadow .15s, background .15s;
  }
  .stat-card-filtro:hover { border-color: var(--primary); }
  .stat-card-filtro.activa {
    border-color: var(--primary); background: var(--primary-soft);
    box-shadow: 0 0 0 1px var(--primary);
  }
  .stat-icon { width: 44px; height: 44px; border-radius: 12px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
  .stat-icon svg { width: 20px; height: 20px; }
  .stat-icon.i-indigo { background: var(--color-indigo-soft); color: var(--color-indigo); }
  .stat-icon.i-violet { background: var(--color-violet-soft); color: var(--primary); }
  .stat-icon.i-success { background: var(--success-bg); color: var(--success); }
  .stat-icon.i-danger { background: var(--danger-bg); color: var(--danger); }
  /* Usado por el indicador "Vencen en 30 días" de RRHH - color de relleno
     de icono, no de texto (ver --warning-icon en :root). */
  .stat-icon.i-warning { background: var(--warning-bg); color: var(--warning-icon); }
  .stat-label { font-size: 0.8rem; color: var(--muted); }
  .stat-value { font-size: 1.5rem; font-weight: 700; margin-top: 2px; }

  /* ---------- Layout grid ---------- */
  .dashboard-grid { display: grid; grid-template-columns: 1fr 340px; gap: 20px; align-items: stretch; }
  .col-main { display: flex; flex-direction: column; gap: 20px; min-width: 0; }
  .col-side { display: flex; flex-direction: column; gap: 20px; }
  /* Solo la tarjeta "Siguientes en la cola" del monitor de ejecucion masiva:
     con align-items:stretch en .dashboard-grid, esta tarjeta crece para
     quedar a la misma altura que "Empresa actual" de la izquierda, en vez
     de quedar mas corta y desalineada. */
  #batch-queue-card { flex: 1; }

  .card {
    background: var(--card); border: 1px solid var(--border); border-radius: 18px; padding: 28px 30px;
    box-shadow: 0 1px 2px rgba(15,23,42,0.04);
  }
  .card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; gap: 10px; flex-wrap: wrap; }
  .card h2 { font-size: 1.05rem; }
  .card .muted { color: var(--muted); font-size: 0.85rem; margin-top: 4px; margin-bottom: 18px; }

  /* ---------- Steps ---------- */
  .steps { display: flex; align-items: center; margin-bottom: 20px; }
  .step { display: flex; align-items: center; gap: 10px; }
  .step-num {
    width: 30px; height: 30px; border-radius: 50%; background: var(--primary); color: #fff;
    display: flex; align-items: center; justify-content: center; font-size: 0.85rem; font-weight: 700; flex-shrink: 0;
  }
  .step-text-title { font-size: 0.85rem; font-weight: 600; }
  .step-text-sub { font-size: 0.72rem; color: var(--muted); }
  .step-line { flex: 1; height: 1px; background: repeating-linear-gradient(to right, var(--border) 0 6px, transparent 6px 10px); margin: 0 14px; }

  .field-row { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-bottom: 16px; }
  .field-row select, .field-row input {
    font-size: 0.88rem; padding: 0 14px; height: 42px; margin: 0; background: var(--bg);
    border: 1px solid var(--border); border-radius: 11px; outline: none;
    transition: border-color .15s, background .15s;
  }
  .field-row select { flex: 1; min-width: 160px; }
  .field-row input:focus, .field-row select:focus { background: #fff; border-color: var(--primary); }
  /* .search-box trae margin-bottom: 14px porque casi siempre va SOLA arriba
     de una tabla. Dentro de una barra de filtros ese margen la deja 7px más
     arriba que los select de al lado: align-items:center centra la caja
     completa (42 + 14), no el campo. Mismo arreglo que ya tiene
     .hist-toolbar. */
  .field-row .search-box { margin-bottom: 0; }

  /* ---------- Select con busqueda (ej. empresa en "Ejecutar automatizacion") ---------- */
  .searchable-select { position: relative; flex: 1; min-width: 160px; }
  .searchable-select input { width: 100%; }
  .searchable-select-dropdown {
    display: none; position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 60;
    background: #fff; border: 1px solid var(--border); border-radius: 11px;
    box-shadow: 0 10px 25px rgba(15,23,42,0.12); max-height: 240px; overflow-y: auto; padding: 4px;
  }
  .searchable-select-dropdown.open { display: block; }
  .searchable-select-option {
    padding: 9px 12px; border-radius: 8px; font-size: 0.85rem; cursor: pointer;
  }
  .searchable-select-option:hover, .searchable-select-option.active { background: var(--bg); }
  /* La opcion ya elegida, cuando la lista se abre completa. */
  .searchable-select-option.active { color: var(--primary); font-weight: 600; }
  .searchable-select-option.all-option { font-weight: 600; color: var(--primary); border-bottom: 1px solid #F1F5F9; margin-bottom: 4px; border-radius: 8px 8px 0 0; }
  .searchable-select-empty { padding: 9px 12px; font-size: 0.85rem; color: var(--muted); }

  .btn-primary {
    background: linear-gradient(135deg, var(--color-violet), var(--primary-dark)); color: #fff; border: none;
    padding: 11px 20px; border-radius: 11px;
    font-size: 0.88rem; font-weight: 600; cursor: pointer; transition: filter .15s, opacity .15s;
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  }
  .btn-primary:hover { filter: brightness(0.93); }
  .btn-primary:disabled { opacity: 0.65; cursor: not-allowed; }
  .btn-block { width: 100%; }
  .btn-secondary {
    background: #fff; color: var(--text); border: 1px solid var(--border); padding: 10px 16px; border-radius: 10px;
    font-size: 0.85rem; font-weight: 600; cursor: pointer; transition: background .15s;
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  }
  .btn-secondary:hover { background: var(--bg); }
  .btn-ghost {
    background: transparent; border: 1px solid var(--border); color: var(--muted); padding: 7px 14px;
    border-radius: 8px; font-size: 0.82rem; cursor: pointer; transition: background .15s;
  }
  .btn-ghost:hover { background: var(--bg); }
  .btn-danger {
    background: var(--danger); color: #fff; border: none; padding: 10px 18px; border-radius: 10px;
    font-size: 0.85rem; font-weight: 600; cursor: pointer;
  }
  .btn-danger:hover { background: #dc2626; }
  /* Deshabilitado tiene que verse deshabilitado: en los diálogos de borrado
     (cliente, empresa) el botón espera la contraseña o el RUT, y en rojo
     pleno parecía listo para usar (27/9/2026). */
  .btn-danger:disabled, .btn-danger:disabled:hover { background: var(--danger); opacity: 0.5; cursor: not-allowed; }

  .info-box {
    display: flex; gap: 10px; background: var(--color-violet-soft); color: #5B21B6; border-radius: 12px; padding: 12px 14px;
    font-size: 0.8rem; line-height: 1.4; margin-top: 4px;
  }
  .info-box svg { width: 16px; height: 16px; flex-shrink: 0; margin-top: 1px; }

  /* El (i) que explica una accion masiva (ver iconoAyuda en
     public/app/core/dom.js). IGUAL AL DEL PORTAL SIImplifica (pedido del
     dueño, 13/10/2026: "que sean igual a los de siimplifica TODOS los (i)"):
     las medidas y los colores son los de .cp-f29-info y .cp-f29-info-caja de
     client-portal.css, escritos acá con su valor porque esta hoja no carga
     las variables del portal (--cp-gris, --cp-violeta-*, --cp-linea,
     --cp-tinta). Atenuado y chico: acompaña al boton, no compite con el. */
  .info-ayuda {
    flex: none; width: 20px; height: 20px; display: inline-grid; place-items: center;
    border-radius: 50%; background: transparent; color: #46629C; cursor: pointer;
  }
  .info-ayuda svg { width: 15px; height: 15px; display: block; }
  .info-ayuda:hover, .info-ayuda[aria-expanded="true"] { color: #5B21B6; background: #F5F3FF; }
  /* Quien llega con el teclado tiene que ver donde esta parado. */
  .info-ayuda:focus-visible { outline: 2px solid #6D28D9; outline-offset: 1px; }
  /* La tarjeta que abre: una sola para toda la app, colgada del <body> y con
     posición fija (la ubica ubicarAyuda). Por encima de los modales y los
     paneles; por debajo de los avisos. Con tope de alto se desplaza adentro.
     La que abre el cursor al pasar no recibe el puntero: si no, taparía el
     botón de al lado. La fijada con un clic sí (se puede seleccionar el
     texto). */
  .info-ayuda-caja {
    position: fixed; z-index: 9500; padding: 14px 16px;
    text-align: left; white-space: normal; font-size: 0.8125rem; font-weight: 500; line-height: 1.45;
    color: #0A1338; background: #fff; border: 1px solid #DCE5F6; border-radius: 12px;
    box-shadow: 0 14px 34px rgba(7, 27, 53, 0.16);
    overflow-y: auto; overscroll-behavior: contain;
  }
  .info-ayuda-caja[hidden] { display: none; }
  .info-ayuda-caja:not(.es-fijada) { pointer-events: none; }
  /* Un (i) solo, sin su boton, explica algo que no esta en pantalla. Varias
     pantallas esconden la accion masiva por rol o por estado con .is-hidden
     (ver valAplicarPermisos en validator.view.js y autActualizarPie en
     automatizaciones.view.js): el (i) que va inmediatamente despues se va con
     ella, sin que cada pantalla tenga que acordarse. */
  .is-hidden + .info-ayuda { display: none !important; }
  /* Para el (i) que acompaña a un boton de ancho completo (.btn-block): sin
     esto el span cae en una linea propia debajo del boton y parece otra cosa. */
  .accion-con-ayuda { display: flex; align-items: center; gap: 8px; }
  .accion-con-ayuda > .btn-block { flex: 1; width: auto; }

  .spinner {
    width: 13px; height: 13px; border: 2px solid rgba(255,255,255,0.4); border-top-color: #fff;
    border-radius: 50%; display: inline-block; animation: spin .7s linear infinite;
  }
  @keyframes spin { to { transform: rotate(360deg); } }
  .spinner-dark { border-color: rgba(79,70,229,0.25); border-top-color: var(--primary); }

  /* ---------- Ejecucion masiva ---------- */
  .active-batch-banner {
    display: flex; align-items: center; gap: 10px; background: #EEF2FF; border: 1px solid #C7D2FE;
    color: #3730A3; border-radius: 12px; padding: 12px 16px; margin-bottom: 20px; cursor: pointer;
    font-size: 0.86rem; transition: background .15s;
  }
  .active-batch-banner:hover { background: #E0E7FF; }
  .active-batch-banner-cta { margin-left: auto; font-weight: 700; flex-shrink: 0; }

  tr.batch-row-active { background: #F5F3FF !important; }
  tr.batch-row-active td:first-child { box-shadow: inset 3px 0 0 var(--primary); }

  .queue-item { display: flex; align-items: center; gap: 10px; padding: 10px 0; border-bottom: 1px solid #F1F5F9; font-size: 0.85rem; }
  .queue-item:last-child { border-bottom: none; }
  .queue-item-num { width: 24px; height: 24px; border-radius: 50%; background: #F1F5F9; color: var(--muted); font-size: 0.72rem; font-weight: 700; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
  .queue-item-name { font-weight: 600; }
  .queue-item-rut { color: var(--muted); font-size: 0.76rem; }

  .batch-progress-row { display: flex; gap: 28px; flex-wrap: wrap; align-items: center; }
  .batch-progress-main { flex: 1 1 320px; min-width: 260px; }
  .batch-progress-timings { display: grid; grid-template-columns: repeat(2, auto); gap: 14px 28px; flex: 0 0 auto; }
  .batch-timing { display: flex; align-items: center; gap: 8px; }
  .batch-timing svg { width: 18px; height: 18px; color: var(--primary); flex-shrink: 0; }
  .batch-timing-value { font-weight: 700; font-size: 0.95rem; }

  .filter-pills { display: flex; gap: 6px; flex-wrap: wrap; }
  .filter-pill {
    display: inline-flex; align-items: center; gap: 6px; background: #fff; border: 1px solid var(--border);
    color: var(--muted); font-size: 0.82rem; font-weight: 600; padding: 7px 14px; border-radius: 999px; cursor: pointer;
    transition: background .15s, border-color .15s, color .15s;
  }
  .filter-pill:hover { background: var(--bg); }
  .filter-pill.active { background: var(--primary); border-color: var(--primary); color: #fff; }
  .filter-pill .pill-count {
    background: rgba(0,0,0,0.08); border-radius: 999px; padding: 1px 7px; font-size: 0.72rem; font-weight: 700;
  }
  .filter-pill.active .pill-count { background: rgba(255,255,255,0.25); }

  .batch-summary-stats .stat-card { padding: 12px 16px; gap: 0; flex: 1 1 140px; }
  .batch-summary-stats .stat-value { font-size: 1.2rem; }

  .batch-autoretry-toggle { display: flex; align-items: center; gap: 7px; font-size: 0.82rem; color: var(--muted); cursor: pointer; }
  .batch-autoretry-toggle input { margin: 0; accent-color: var(--primary); }

  /* ---------- Search + table ---------- */
  .search-box { position: relative; margin-bottom: 14px; }
  .search-box svg { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; color: var(--muted); }
  .search-box input { width: 100%; height: 42px; padding: 0 12px 0 36px; border: 1px solid var(--border); border-radius: 11px; background: var(--bg); font-size: 0.85rem; outline: none; }
  .search-box input:focus { background: #fff; border-color: var(--primary); }

  table.modern { width: 100%; border-collapse: collapse; }
  table.modern thead th {
    text-align: left; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em;
    color: var(--muted); font-weight: 600; padding: 12px 16px; border-bottom: 1px solid var(--border);
  }
  table.modern tbody td { padding: 18px 16px; font-size: 0.88rem; border-bottom: 1px solid #F1F5F9; vertical-align: middle; }
  table.modern tbody tr:last-child td { border-bottom: none; }
  table.modern tbody tr:hover { background: #FAFBFF; }
  .empty-row td { text-align: center; color: var(--muted); padding: 32px 10px; font-size: 0.85rem; }

  .badge { display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 999px; font-size: 0.72rem; font-weight: 600; white-space: nowrap; }
  .badge-success { background: var(--success-bg); color: var(--success); }
  .badge-danger { background: var(--danger-bg); color: var(--danger); }
  .badge-warning { background: var(--warning-bg); color: var(--warning); }
  .badge-muted { background: #F1F5F9; color: var(--muted); }

/* La insignia de la columna Estado: solo el simbolo (la palabra va en el
   title y el aria-label). Cuadrada, para que no quede una pastilla larga con
   una tilde adentro. */
.badge-simbolo { display: inline-flex; align-items: center; justify-content: center; min-width: 26px; padding: 3px 0; font-size: 0.95rem; line-height: 1; }
  .badge-primary { background: var(--primary-soft); color: var(--primary-dark); }
  /* El estado de la Clave Tributaria en la lista de empresas es un boton:
     abre el modal para cargarla sin entrar al detalle. Se ve igual que el
     badge que era antes -hereda .badge- y solo se distingue al pasar por
     encima, para no ensuciar una columna que casi siempre se lee de corrido. */
  .sii-clave-chip { border: 1px solid transparent; cursor: pointer; font-family: inherit; }
  .sii-clave-chip:hover { border-color: currentColor; }
  /* Tarjetas-filtro de Empresas ("Clave ... incorrecta", "PreviRed sin
     configurar"). A la izquierda: no es un tablero de indicadores, es el
     aviso de lo que en esta pantalla hay que ir a arreglar. En gris cuando
     son cero -no hay nada que mirar-; con alguna, en rojo lo que es un error
     (la clave rechazada) y en ámbar lo que falta cargar. */
  #view-empresas .emp-kpis { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 16px; }
  #view-empresas .emp-kpi {
    display: flex; align-items: center; gap: 10px; padding: 12px 16px;
    border: 1px solid var(--border); border-radius: 12px; background: var(--card);
    font: inherit; color: inherit; cursor: pointer; transition: border-color .15s;
  }
  #view-empresas .emp-kpi:hover { border-color: var(--danger); }
  #view-empresas .emp-kpi[aria-pressed="true"] { border-color: var(--danger); box-shadow: 0 0 0 1px var(--danger) inset; }
  #view-empresas .emp-kpi-label { font-size: 0.82rem; color: var(--muted); }
  #view-empresas .emp-kpi-valor { font-size: 1.3rem; font-weight: 700; line-height: 1; font-variant-numeric: tabular-nums; color: var(--muted); }
  #view-empresas .emp-kpi-valor.emp-kpi-alerta { color: var(--danger); }
  #view-empresas .emp-kpi-icono { display: flex; color: var(--muted); }
  #view-empresas .emp-kpi-icono.emp-kpi-alerta { color: var(--danger); }
  #view-empresas .emp-kpi.emp-kpi-de-aviso:hover { border-color: var(--warning-icon); }
  #view-empresas .emp-kpi.emp-kpi-de-aviso[aria-pressed="true"] { border-color: var(--warning-icon); box-shadow: 0 0 0 1px var(--warning-icon) inset; }
  #view-empresas .emp-kpi-valor.emp-kpi-aviso, #view-empresas .emp-kpi-icono.emp-kpi-aviso { color: var(--warning); }
  /* Complejidad en la fila (22/10/2026): se elige ahí mismo. Se ve como el
     texto de la columna con su flecha; el borde aparece al pasar o enfocar.
     El margen negativo alinea el texto con el título de la columna. */
  #view-empresas .emp-complejidad {
    appearance: none; -webkit-appearance: none; -moz-appearance: none;
    font: inherit; font-size: 0.82rem; color: var(--text); cursor: pointer;
    margin: 0 0 0 -9px; padding: 5px 26px 5px 8px; border: 1px solid transparent; border-radius: 8px;
    background: transparent url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") no-repeat right 7px center / 13px 13px;
    transition: border-color .15s, background-color .15s;
  }
  #view-empresas .emp-complejidad.sin { color: var(--muted); }
  #view-empresas .emp-complejidad:hover { border-color: var(--border); background-color: var(--bg); }
  #view-empresas .emp-complejidad:focus-visible { outline: 2px solid var(--primary); outline-offset: 1px; }
  #view-empresas .emp-complejidad:disabled { opacity: 0.6; cursor: progress; }
  .msc-aviso { font-size: 0.78rem; margin: -6px 0 12px; }
  /* "Actualizaciones automáticas — Balances": modal de solo lectura. Las
     clases reemplazan los style="" que tenía el modal editable anterior. */
  /* Doble clase a propósito: .modal-box (más abajo en este archivo) fija
     max-width 400px, y con un solo nombre de clase ganaba por orden. Con
     760px el registro de corridas entra sin scroll horizontal. */
  .modal-box.mbcfg-box { max-width: 860px; max-height: 85vh; overflow-y: auto; }
  .mbcfg-programacion {
    border: 1px solid var(--border); border-radius: var(--radius-control);
    padding: 10px 14px; margin-bottom: 18px;
  }
  .mbcfg-fila { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 5px 0; font-size: 0.85rem; }
  .mbcfg-fila + .mbcfg-fila { border-top: 1px solid var(--border); }
  .mbcfg-etiqueta { font-weight: 600; color: var(--text); }
  .mbcfg-subtitulo { font-size: 0.95rem; margin: 0 0 10px; }
  .mbcfg-tabla-wrap {
    overflow-x: auto; max-height: 320px; overflow-y: auto;
    border: 1px solid var(--border); border-radius: var(--radius-control);
  }
  /* "135 listas · 135 en total" y la fecha se leen de corrido: partidos en
     tres líneas la tabla se vuelve ilegible. El origen es la excepción -
     puede ser un email largo, y si tampoco se parte empuja la tabla más
     ancha que el modal y aparece scroll horizontal. */
  .mbcfg-tabla-wrap td, .mbcfg-tabla-wrap th { white-space: nowrap; }
  .mbcfg-tabla-wrap td:nth-child(4) { white-space: normal; word-break: break-all; min-width: 150px; }
  /* La acción del estado vacío de la Mesa contable, debajo del texto. */
  /* Flex para que el (i) del boton masivo quede a su lado y no debajo. */
  .cont-vacio-accion { margin-top: 12px; display: flex; align-items: center; justify-content: center; gap: 8px; }
  /* Segundo paso de "Borrar empresa": lo que se va a destruir, a la vista y
     en rojo, antes de pedir la contraseña. */
  .cdel-aviso {
    background: var(--danger-bg, #FEF2F2); border: 1px solid var(--danger, #DC2626);
    border-radius: var(--radius-control); padding: 12px 14px; margin-bottom: 16px;
    font-size: 0.84rem; color: var(--text);
  }
  .cdel-aviso-titulo { font-weight: 700; color: var(--danger, #DC2626); margin-bottom: 6px; }
  .cdel-aviso ul { margin: 8px 0 0; padding-left: 20px; }
  .cdel-aviso li { margin-bottom: 3px; }
  /* Lo que el sistema vuelve a generar solo: se lista igual (no se esconde
     nada) pero sin el mismo peso visual que lo que no se recupera. */
  .cdel-reconstruible { margin-top: 8px; font-size: 0.78rem; opacity: 0.75; }
  /* Nota al pie de un campo de formulario dentro de un modal (ej. la Clave
     Tributaria al agregar una empresa). Igual que .msc-aviso, pero generica:
     esa quedo atada al modal de carga rapida de claves. */
  .field-nota { color: var(--muted); font-size: 0.78rem; margin: -6px 0 12px; }
  /* La frase de un modal que solo CONFIRMA: dice que va a pasar al apretar,
     y no cuelga de ningun campo (ej. "Actualizar balance" de Contabilidad,
     que desde el 22/9/2026 ya no vuelve a preguntar el mes). Se lee como
     texto normal, no como nota al pie: es la unica cosa que hay para
     revisar antes de encolar. El margen de arriba es negativo porque el
     .modal-sub con el nombre de la empresa ya trae 18px propios y las dos
     lineas van juntas. */
  .modal-confirmacion { color: var(--text); font-size: 0.85rem; margin: -8px 0 16px; }
  .badge-info { background: var(--info-bg); color: var(--info); }

  /* inline-flex y text-decoration porque esto tambien se usa en <a> (los
     iconos de descarga del balance en Contabilidad, que son enlaces reales
     a los endpoints): sin esto el icono se desalinea y el link va subrayado. */
  /* Un RUT no se parte NUNCA: "78.073.328-4" cortado en dos lineas deja de
     leerse como un RUT y ademas descuadra la fila entera. Es clase y no
     style="" repetido porque aparece en media docena de tablas. */
  .celda-rut { white-space: nowrap; }
  .row-menu-btn { background: transparent; border: none; cursor: pointer; padding: 5px 8px; border-radius: 6px; color: var(--muted); display: inline-flex; align-items: center; text-decoration: none; }
  .row-menu-btn:hover { background: var(--bg); }
  .row-menu {
    position: absolute; background: #fff; border: 1px solid var(--border); border-radius: 10px;
    box-shadow: 0 10px 25px rgba(15,23,42,0.12); min-width: 130px; z-index: 60; padding: 4px; display: none;
  }
  .row-menu button {
    width: 100%; text-align: left; background: transparent; border: none; padding: 8px 10px; border-radius: 8px;
    font-size: 0.83rem; color: var(--text); cursor: pointer; display: flex; align-items: center; gap: 8px;
  }
  .row-menu button:hover { background: var(--bg); }
  .row-menu button.danger { color: var(--danger); }
  .row-menu button.danger:hover { background: var(--danger-bg); }

  /* ---------- Uwigo status ---------- */
  .uwigo-status-box { display: flex; align-items: center; gap: 10px; background: var(--success-bg); border-radius: 12px; padding: 12px 14px; margin-bottom: 16px; }
  .uwigo-status-box.warn { background: var(--warning-bg); }
  .uwigo-status-box.muted { background: #F1F5F9; }
  .uwigo-status-box svg { width: 18px; height: 18px; flex-shrink: 0; }
  .uwigo-status-box.ok svg, .uwigo-status-box.ok .ust-title { color: var(--success); }
  .uwigo-status-box.warn svg, .uwigo-status-box.warn .ust-title { color: var(--warning); }
  .uwigo-status-box.muted svg, .uwigo-status-box.muted .ust-title { color: var(--muted); }
  .ust-title { font-size: 0.86rem; font-weight: 600; }
  .ust-sub { font-size: 0.76rem; color: var(--muted); margin-top: 1px; }
  .uwigo-account-row { display: flex; align-items: center; gap: 10px; padding: 12px 0; border-top: 1px solid var(--border); }
  .uwigo-avatar { width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0; overflow: hidden; }
  .uwigo-avatar img { width: 100%; height: 100%; object-fit: cover; }

  /* ---------- Recent activity ---------- */
  .activity-item { display: flex; align-items: flex-start; gap: 10px; padding: 11px 0; border-bottom: 1px solid #F1F5F9; }
  .activity-item:last-child { border-bottom: none; }
  .activity-icon { width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
  .activity-icon svg { width: 15px; height: 15px; }
  .activity-icon.ok { background: var(--success-bg); color: var(--success); }
  .activity-icon.err { background: var(--danger-bg); color: var(--danger); }
  .activity-icon.run { background: var(--color-violet-soft); color: var(--primary); }
  .activity-title { font-size: 0.85rem; font-weight: 600; }
  .activity-sub { font-size: 0.76rem; color: var(--muted); margin-top: 1px; }
  .activity-meta { margin-left: auto; text-align: right; flex-shrink: 0; }
  .activity-time { font-size: 0.72rem; color: var(--muted); }

  .error-detail { background: var(--danger-bg); color: #991B1B; border-radius: 10px; padding: 10px 12px; font-size: 0.78rem; font-family: ui-monospace, monospace; white-space: pre-wrap; margin-top: 8px; }

  .stepper { display: flex; gap: 3px; margin-bottom: 3px; }
  .step-dot { width: 7px; height: 7px; border-radius: 50%; background: #e5e7eb; flex-shrink: 0; }
  .step-dot.step-done { background: var(--success); }
  .step-dot.step-current { background: var(--primary); box-shadow: 0 0 0 3px rgba(79,70,229,0.25); }
  .stepper-label { font-size: 0.7rem; color: var(--muted); white-space: nowrap; text-transform: capitalize; }

  /* ---------- Historial: pestañas Masivas / Individuales ----------
     Mismo look que las de RR.HH. pero con clases propias: aquellas se
     togglean con querySelectorAll SIN scopear por contenedor (ver
     switchRRHHTab), asi que reusarlas dejaria el Historial en blanco cada
     vez que alguien cambia de pestana en RR.HH. */
  .hist-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--border); flex-wrap: wrap; margin-bottom: 20px; }
  .hist-tab {
    background: transparent; border: none; padding: 10px 18px; font-size: 0.88rem; font-weight: 600;
    color: var(--muted); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px;
    border-radius: 8px 8px 0 0; transition: color .15s, background .15s;
  }
  .hist-tab:not(.active):hover { color: var(--text); background: var(--primary-soft); }
  .hist-tab.active { color: var(--primary); border-bottom-color: var(--primary); }
  .hist-panel { display: none; }
  .hist-panel.active { display: block; }

  /* Nuevo ingreso: una fila por empresa (se abre con un clic) y, adentro,
     sus ejecuciones con una sangria para que se lean como hijas. */
  .ni-scroll { overflow-x: auto; }
  .ni-col-flecha { width: 34px; }
  #nuevo-ingreso-tbody tr.ni-empresa { cursor: pointer; }
  #nuevo-ingreso-tbody tr.ni-empresa.abierta > td { background: var(--primary-soft); }
  #nuevo-ingreso-tbody tr.ni-ejecucion > td:nth-child(2) { padding-left: 22px; color: var(--muted); }

  /* ---------- Historial: filas mas juntas ----------
     Las dos tablas del Historial -corridas y ejecuciones- heredaban los
     18px de table.modern, pensados para tablas de pocas filas. Aca son
     listas largas: con ese aire, tres corridas ya ocupaban la pantalla
     entera y habia que scrollear para comparar dos. 12px es el punto medio
     entre eso y los 10px que ya usa RR.HH. */
  #view-historial table.modern tbody td { padding: 12px 16px; }

  /* ---------- Historial: toolbar de filtros ---------- */
  .hist-toolbar { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-bottom: 18px; }
  .hist-toolbar .search-box { flex: 1 1 220px; margin-bottom: 0; }
  .hist-toolbar select {
    font-size: 0.85rem; padding: 11px 14px; background: var(--card); border: 1px solid var(--border);
    border-radius: 10px; outline: none; color: var(--text); height: 42px;
  }
  .hist-toolbar .search-box input { height: 42px; padding-top: 0; padding-bottom: 0; }
  .hist-toolbar select:focus { border-color: var(--primary); }

  /* ---------- Historial: flujo del proceso ---------- */
  .flow-grid { display: flex; gap: 0; align-items: flex-start; overflow-x: auto; margin-top: 20px; }
  .flow-step { display: flex; align-items: flex-start; gap: 12px; flex: 1; min-width: 165px; padding-right: 16px; }
  .flow-step-num {
    width: 34px; height: 34px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
    font-size: 0.88rem; font-weight: 700; flex-shrink: 0; color: #fff;
  }
  .flow-step:nth-child(1) .flow-step-num { background: var(--color-navy); }
  .flow-step:nth-child(2) .flow-step-num { background: var(--color-indigo); }
  .flow-step:nth-child(3) .flow-step-num { background: var(--primary-dark); }
  .flow-step:nth-child(4) .flow-step-num { background: var(--color-violet); }
  .flow-step:nth-child(5) .flow-step-num { background: var(--color-violet-light); }
  .flow-step-title { font-size: 0.88rem; font-weight: 700; margin-top: 6px; }
  .flow-step-desc { font-size: 0.76rem; color: var(--muted); margin-top: 4px; line-height: 1.4; }
  .flow-arrow { flex-shrink: 0; align-self: center; color: var(--border); width: 18px; height: 18px; margin: 0 2px; }

  /* ---------- Historial: barra de progreso animada ---------- */
  .progress-wrap { width: 190px; flex-shrink: 0; }
  .progress-track {
    position: relative; height: 10px; background: #EEF0F3; border-radius: 999px; margin-bottom: 8px;
    box-shadow: inset 0 1px 2px rgba(15,23,42,0.06);
  }
  .progress-fill {
    position: absolute; left: 0; top: 0; height: 100%; border-radius: 999px; width: 0%;
    transition: width .6s cubic-bezier(.4,0,.2,1), background-color .3s ease;
    background-image: linear-gradient(180deg, rgba(255,255,255,0.22), rgba(255,255,255,0));
  }
  .progress-fill.fill-done { background-color: var(--success); }
  .progress-fill.fill-error { background-color: var(--danger); }
  .progress-fill.fill-running { background-color: var(--primary); }
  .progress-fill.fill-muted { background-color: var(--muted); }
  .progress-marker {
    position: absolute; top: 50%; width: 16px; height: 16px; border-radius: 50%; background: #fff;
    border: 3px solid var(--primary); transform: translate(-50%, -50%);
    transition: left .6s cubic-bezier(.4,0,.2,1), border-color .3s ease; box-shadow: 0 1px 4px rgba(15,23,42,0.25);
  }
  .progress-marker.fill-error { border-color: var(--danger); box-shadow: 0 0 0 5px rgba(239,68,68,0.16); }
  .progress-marker.fill-running.pulse { border-color: var(--primary); animation: markerPulse 1.2s ease-in-out infinite; }
  .progress-marker.fill-done { display: none; }
  .progress-marker.fill-muted { display: none; }
  @keyframes markerPulse { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(79,70,229,0.35); } 50% { opacity: 0.7; box-shadow: 0 0 0 6px rgba(79,70,229,0); } }
  .progress-label {
    font-size: 0.76rem; color: var(--muted); white-space: nowrap; overflow: hidden;
    text-overflow: ellipsis; display: block; max-width: 190px;
  }
  .progress-label b { color: var(--text); font-weight: 700; }
  .progress-label.is-error { color: var(--danger); }
  .progress-label.is-error b { color: var(--danger); }

  /* ---------- Historial: progreso multi-mes ("Todos los meses") ---------- */
  .month-chip-strip { display: flex; flex-wrap: wrap; gap: 4px; margin: 3px 0; }
  .month-chip-mini { font-size: 0.62rem; font-weight: 700; padding: 2px 6px; border-radius: 6px; letter-spacing: 0.01em; }
  .month-chip-mini.m-done { background: var(--success-bg); color: var(--success); }
  .month-chip-mini.m-running { background: var(--color-violet-soft); color: var(--primary); box-shadow: 0 0 0 1.5px var(--primary); }
  .month-chip-mini.m-error { background: var(--danger-bg); color: var(--danger); box-shadow: 0 0 0 1.5px var(--danger); }
  .month-chip-mini.m-pending { background: #F1F5F9; color: var(--muted); }
  /* Terminado sin nada que hacer (sin monto, sin movimiento): gris con borde,
     distinto del verde de "comprobante creado" y del gris liso de pendiente. */
  .month-chip-mini.m-empty { background: #fff; color: var(--muted); box-shadow: inset 0 0 0 1px #CBD5E1; }

  /* Comprobantes sin confirmar (modal de Historial). */
  #modal-comprobantes-abiertos .modal-box { max-width: 560px; }
  .comprobantes-abiertos-lista { display: flex; flex-direction: column; gap: 10px; margin: 12px 0; }
  .comprobante-abierto { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px; font-size: 0.85rem; }
  .comprobante-abierto .btn-secondary { align-self: flex-start; }
  .months-current-line { display: flex; align-items: center; gap: 5px; font-size: 0.74rem; color: var(--muted); margin-top: 4px; }
  .months-current-line svg { flex-shrink: 0; }
  .months-current-line b { color: var(--text); }

  /* ---------- Historial: fila expandida "avance por meses" ---------- */
  .months-expand-row td { background: #FAFBFC; padding: 22px 24px !important; border-bottom: 1px solid #F1F5F9 !important; }
  .months-panel-grid { display: grid; grid-template-columns: 1.1fr 1fr; gap: 28px; margin: 18px 0; align-items: start; }
  @media (max-width: 900px) { .months-panel-grid { grid-template-columns: 1fr; } }

  .months-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
  .month-card {
    display: flex; flex-direction: column; gap: 4px; text-align: left; background: #fff; border: 1px solid var(--border);
    border-radius: 10px; padding: 9px 11px; cursor: pointer; font-family: inherit; transition: border-color .15s, box-shadow .15s;
  }
  .month-card:hover { border-color: var(--primary); }
  .month-card.selected { border-color: var(--primary); box-shadow: 0 0 0 1.5px var(--primary); }
  .month-card-top { display: flex; align-items: center; gap: 7px; font-size: 0.82rem; font-weight: 600; }
  /* El monto del comprobante del mes, a la derecha (15/10/2026). */
  .month-card-monto { margin-left: auto; padding-left: 8px; font-size: 0.78rem; font-weight: 600; color: var(--text); font-variant-numeric: tabular-nums; white-space: nowrap; }
  .month-card-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
  .month-card.m-done .month-card-dot { background: var(--success); }
  .month-card.m-running .month-card-dot { background: var(--primary); }
  .month-card.m-error .month-card-dot { background: var(--danger); }
  .month-card.m-pending .month-card-dot { background: #CBD5E1; }
  .month-card.m-empty .month-card-dot { background: #fff; box-shadow: inset 0 0 0 1.5px #94A3B8; }
  .month-card-status { font-size: 0.7rem; color: var(--muted); padding-left: 15px; }
  .month-card.m-done .month-card-status { color: var(--success); }
  .month-card.m-running .month-card-status { color: var(--primary); }
  .month-card.m-error .month-card-status { color: var(--danger); }

  /* ---------- Empresas: documentos de la empresa mes a mes ----------
     Cinco bloques que se despliegan (companies.documentos.js), cada uno con
     los 12 meses en tarjetas del mismo tamaño: 2 filas de 6 cuando entran,
     y si no, 3 de 4 o 6 de 2. Se decide por el ancho real del panel
     (container query), no por el de la ventana. */
  .empdocs { container-type: inline-size; container-name: empdocs; }
  .empdocs-titulo { font-size: 0.95rem; font-weight: 700; margin-bottom: 10px; }
  .empdocs-bloque { background: #fff; border: 1px solid var(--border); border-radius: 12px; margin-bottom: 8px; }
  .empdocs-cabecera {
    display: flex; align-items: center; gap: 10px; width: 100%; padding: 12px 14px;
    background: none; border: 0; cursor: pointer; font-family: inherit; text-align: left; color: var(--text);
  }
  .empdocs-cabecera svg { flex-shrink: 0; color: var(--muted); transition: transform .15s; }
  .empdocs-bloque.abierto .empdocs-cabecera svg { transform: rotate(90deg); }
  .empdocs-nombre { font-size: 0.88rem; font-weight: 600; }
  .empdocs-cuenta { margin-left: auto; font-size: 0.75rem; color: var(--muted); }
  .empdocs-grilla { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; padding: 0 14px 14px; }
  @container empdocs (min-width: 520px) { .empdocs-grilla { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
  @container empdocs (min-width: 820px) { .empdocs-grilla { grid-template-columns: repeat(6, minmax(0, 1fr)); } }
  .empdocs-mes { min-width: 0; min-height: 60px; color: var(--text); text-decoration: none; }
  .empdocs-mes .month-card-status { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .empdocs-mes .month-card-status a { color: var(--success); font-weight: 600; text-decoration: none; }
  .empdocs-mes .month-card-status a:hover { text-decoration: underline; }
  div.empdocs-mes { cursor: default; }
  .empdocs-mes.m-pending:hover { border-color: var(--border); }

  /* El desglose del resumen F29 (valRenderResumenF29) y la lista de
     comprobantes, en el modal de documentos de Empresas. Sus reglas
     originales viven scopeadas a #view-validador y este modal cuelga fuera de
     esa vista, asi que sin esto se veria sin formato.
     El 22/9/2026 se fue el otro llamador: el modal #modal-validador-f29 del
     Validador ("Resumen de SIImplifica"), que el usuario pidio sacar. Empresas
     es hoy el unico que dibuja este desglose. */
  #modal-empresa-doc .val-lista { list-style: none; margin: 0; padding: 0; font-size: 0.8rem; }
  #modal-empresa-doc .val-lista li { display: flex; justify-content: space-between; gap: 12px; padding: 7px 0; border-top: 1px solid #F1F5F9; }
  #modal-empresa-doc .val-lista li:first-child { border-top: 0; }
  #modal-empresa-doc .val-lista-clave { color: var(--muted); }
  #modal-empresa-doc .val-lista-valor { text-align: right; font-weight: 600; }
  #modal-empresa-doc .val-monto { font-variant-numeric: tabular-nums; white-space: nowrap; }

  /* Varios carriles activos (varias cuentas de Uwigo) muestran una tarjeta
     de "empresa actual" cada uno, una al lado de la otra - se apilan si no
     entran en el ancho disponible en vez de comprimirse ilegibles. */
  .batch-current-company-row { display: flex; gap: 20px; flex-wrap: wrap; align-items: flex-start; }
  .batch-current-company-item { flex: 1 1 320px; min-width: 280px; padding-right: 20px; }
  .batch-current-company-item:not(:last-child) { border-right: 1px solid var(--border); }
  .batch-current-company-item-label { font-size: 0.72rem; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase; color: var(--primary); margin-bottom: 8px; }
  /* flex-wrap en vez de scroll horizontal: con 2+ carriles activos cada
     tarjeta de "Empresa actual" tiene poco ancho, y los 5 pasos del flujo no
     entraban sin una barrita horizontal (había que hacer zoom out del
     navegador para verlos todos). Envolviendo a la linea siguiente en vez de
     recortar, los 5 quedan visibles siempre sin scroll ni zoom. */
  .flow-dynamic-grid { display: flex; flex-wrap: wrap; align-items: flex-start; row-gap: 14px; padding: 6px 2px 16px; }
  .flow-step-dynamic { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 3px; flex: 1 1 106px; min-width: 106px; }
  .fsd-num {
    width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
    font-size: 0.85rem; font-weight: 700; color: #fff; margin-bottom: 4px; flex-shrink: 0;
  }
  .flow-step-dynamic.fsd-done .fsd-num { background: var(--success); }
  .flow-step-dynamic.fsd-running .fsd-num { background: var(--primary); box-shadow: 0 0 0 4px rgba(79,70,229,0.16); }
  .flow-step-dynamic.fsd-error .fsd-num { background: var(--danger); }
  .flow-step-dynamic.fsd-pending .fsd-num { background: #E2E8F0; color: var(--muted); }
  .fsd-title { font-size: 0.78rem; font-weight: 700; }
  .fsd-desc { font-size: 0.68rem; color: var(--muted); line-height: 1.3; max-width: 108px; }
  .fsd-status { font-size: 0.66rem; font-weight: 700; margin-top: 3px; padding: 1px 8px; border-radius: 999px; }
  .flow-step-dynamic.fsd-done .fsd-status { background: var(--success-bg); color: var(--success); }
  .flow-step-dynamic.fsd-running .fsd-status { background: var(--color-violet-soft); color: var(--primary); }
  .flow-step-dynamic.fsd-error .fsd-status { background: var(--danger-bg); color: var(--danger); }
  .flow-step-dynamic.fsd-pending .fsd-status { background: #F1F5F9; color: var(--muted); }
  .fsd-mini { font-size: 0.66rem; color: var(--primary); font-weight: 700; margin-top: 4px; white-space: nowrap; }
  .fsd-connector { flex: 0 0 24px; height: 2px; background: #E2E8F0; margin-top: 16px; }
  .fsd-connector.on { background: var(--success); }

  .legend { display: flex; gap: 18px; flex-wrap: wrap; font-size: 0.78rem; color: var(--muted); margin-top: 6px; }
  .legend .swatch { width: 10px; height: 10px; border-radius: 3px; display: inline-block; margin-right: 6px; vertical-align: middle; }

  /* ---------- Detalle de empresa: tabs ---------- */
  .ced-tabs { display: flex; gap: 4px; padding: 6px 26px 0; border-bottom: 1px solid var(--border); }
  .ced-tab {
    background: transparent; border: none; padding: 13px 16px; font-size: 0.87rem; font-weight: 600;
    color: var(--muted); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color .15s;
  }
  .ced-tab:hover { color: var(--text); }
  .ced-tab.active { color: var(--primary); border-bottom-color: var(--primary); }
  .ced-panel { display: none; }
  .ced-panel.active { display: block; }

  /* ---------- RR.HH.: tabs de la seccion (Resumen/Empresas/Trabajadores/
     Calendario) y tabs internos del drawer de detalle de empresa. Mismo
     look que .ced-tabs/.ced-tab/.ced-panel de arriba, pero con clases
     propias: esas se togglean con querySelectorAll SIN scopear por
     contenedor (ver switchCompanyDetailTab), asi que reusar las mismas
     clases tocaria sin querer los tabs del otro drawer. ---------- */
  .rrhh-tabs, .rrhh-drawer-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--border); flex-wrap: wrap; }
  .rrhh-tab, .rrhh-drawer-tab {
    background: transparent; border: none; padding: 10px 18px; font-size: 0.88rem; font-weight: 600;
    color: var(--muted); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px;
    border-radius: 8px 8px 0 0; transition: color .15s, background .15s;
  }
  .rrhh-tab:not(.active):hover, .rrhh-drawer-tab:not(.active):hover { color: var(--text); background: var(--primary-soft); }
  .rrhh-tab.active, .rrhh-drawer-tab.active { color: var(--primary); border-bottom-color: var(--primary); }
  .rrhh-panel, .rrhh-drawer-panel { display: none; }
  .rrhh-panel.active, .rrhh-drawer-panel.active { display: block; }

  .rrhh-activity-item { display: flex; gap: 10px; padding: 10px 4px; border-bottom: 1px solid #F1F5F9; font-size: 0.82rem; align-items: flex-start; }
  .rrhh-activity-item:last-child { border-bottom: none; }
  .rrhh-activity-dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 5px; flex-shrink: 0; }

  .rrhh-cal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; gap: 10px; flex-wrap: wrap; }
  .rrhh-cal-daynames, .rrhh-cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
  .rrhh-cal-daynames { margin-bottom: 6px; font-size: 0.72rem; font-weight: 600; color: var(--muted); text-align: center; text-transform: uppercase; }
  .rrhh-cal-cell { min-height: 78px; border: 1px solid var(--border); border-radius: 8px; padding: 6px; font-size: 0.72rem; background: #fff; overflow: hidden; }
  .rrhh-cal-cell.rrhh-cal-vacia { background: var(--bg); border-color: transparent; }
  .rrhh-cal-cell .rrhh-cal-daynum { font-weight: 700; margin-bottom: 4px; font-size: 0.78rem; }
  .rrhh-cal-chip {
    display: block; background: var(--danger-bg); color: var(--danger); border-radius: 5px; padding: 1px 6px;
    margin-bottom: 3px; font-size: 0.66rem; cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .rrhh-cal-chip.futuro { background: var(--warning-bg); color: var(--warning); }
  @media (max-width: 900px) { .rrhh-cal-cell { min-height: 56px; } .rrhh-cal-chip { font-size: 0.6rem; } }
  /* Doble clase: le gana al max-width de .modal-box, que está más abajo. */
  .modal-box.rrhh-cal-modal { max-width: 980px; max-height: 90vh; overflow-y: auto; }
  .rrhh-cal-modal .rrhh-cal-header h3 { margin-bottom: 0; }

  /* ==================================================================
     RR.HH.: segunda pasada de UI/UX (solo visual - ver pedido del dueño
     del producto). Todo lo de aca abajo se scopea a #view-rrhh y a los
     overlays propios de RRHH (#rrhh-drawer-overlay, #modal-rrhh-scheduler)
     en vez de tocar clases genericas (.card, .stat-card, .btn-ghost,
     table.modern, .hist-toolbar) que comparten Empresas/Historial/Lote y
     no fueron parte de este pedido - asi ninguna otra pantalla se corre.
     ================================================================== */

  /* margin-top negativo: .main-area ya pone 40px de padding arriba (pensado
     para pantallas con un solo <h1>+<p> corto) - el encabezado de RR.HH.
     tiene un <p> extra (subtitulo + fecha de sync apilados) que hoy sigue
     con margen inferior por defecto del navegador (ver el reset de abajo),
     asi que el bloque completo terminaba mas alto de lo esperado, sumado a
     los 40px del contenedor. Se descuenta un poco aca en vez de tocar
     .main-area, que es compartido por el resto de las pantallas. */
  #view-rrhh { max-width: 1600px; margin: -16px auto 0; }

  /* ---------- Encabezado ---------- */
  #view-rrhh .rrhh-header { align-items: center; margin-bottom: 24px; gap: 20px; }
  #view-rrhh .rrhh-header h1 { font-size: 1.5rem; font-weight: 700; }
  /* margin-bottom:0 explicito: sin esto un <p> se queda con el margen
     inferior por defecto del navegador (~1em de su propio font-size), que
     sumado entre el subtitulo Y la fecha de sync (dos <p> apilados, a
     diferencia de otras pantallas que solo tienen uno) se notaba como un
     hueco de mas antes de las pestañas. */
  #view-rrhh .rrhh-subtitle { font-size: 0.86rem; color: var(--muted); margin: 3px 0 0; }
  #view-rrhh .rrhh-sync-label { display: flex; align-items: center; gap: 6px; font-size: 0.78rem; color: var(--muted); margin: 8px 0 0; }
  #view-rrhh .rrhh-sync-label svg { width: 13px; height: 13px; flex-shrink: 0; }
  #view-rrhh .rrhh-header-actions { display: flex; align-items: center; gap: 8px; }
  #view-rrhh .rrhh-header-actions .btn-secondary,
  #view-rrhh .rrhh-header-actions .btn-primary {
    height: 38px; padding: 0 16px; border-radius: var(--radius-control); font-size: 0.85rem; margin: 0;
  }
  #view-rrhh .rrhh-icon-btn {
    width: 38px; height: 38px; padding: 0; border-radius: var(--radius-control);
    display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
  }

  /* ---------- Pestañas Resumen/Empresas/Trabajadores/Calendario ---------- */
  #view-rrhh .rrhh-tabs { margin-bottom: 24px; }

  /* ---------- Indicadores (KPI) ---------- */
  #view-rrhh .stat-grid { gap: 16px; margin-bottom: 24px; }
  #view-rrhh .stat-grid .stat-card {
    padding: 18px 20px; min-height: 88px; border-radius: var(--radius-card); gap: 14px;
  }
  #view-rrhh .stat-grid .stat-icon { width: 42px; height: 42px; border-radius: 11px; }
  #view-rrhh .stat-grid .stat-label { font-size: 0.85rem; font-weight: 500; color: var(--muted); }
  #view-rrhh .stat-grid .stat-value { font-size: 1.75rem; font-weight: 700; margin-top: 3px; line-height: 1.1; }

  /* ---------- Bloques generales (tarjetas de la pantalla) ---------- */
  /* Todas las tarjetas de la pantalla con el mismo radio de .card. */
  #view-rrhh > .card { border-radius: var(--radius-card); }
  #view-rrhh .card-header h2 { font-size: 1rem; font-weight: 700; }
  #view-rrhh .rrhh-card-title-group { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
  #view-rrhh .rrhh-count-chip {
    font-size: 0.76rem; font-weight: 600; color: var(--muted); background: #F1F5F9;
    border-radius: 999px; padding: 2px 10px;
  }
  #view-rrhh .rrhh-link-btn { font-size: 0.83rem; font-weight: 600; white-space: nowrap; }

  /* Buscador con ancho util fijo en vez de ocupar toda la fila - el resto
     del sitio (Historial) sigue con .search-box creciendo a lo ancho, asi
     que se pisa el ancho solo adentro de #view-rrhh. */
  #view-rrhh .hist-toolbar .search-box { flex: 0 1 380px; min-width: 240px; }
  #view-rrhh .hist-toolbar select { min-width: 170px; }
  /* Trabajadores: los 6 filtros en una sola linea (pedido del usuario,
     11/9/2026). El select de empresas media lo que su opcion mas larga
     (~520px) y mandaba "por pagina" a una segunda fila. Ahora buscador y
     empresa parten de 200px y se reparten el sobrante, y min-width:0 los
     deja achicarse por debajo de su contenido. El resto queda a su ancho.
     Si ni asi entran (pantalla angosta), la barra sigue pudiendo partirse. */
  #view-rrhh .rrhh-trab-toolbar select { flex: 0 0 auto; }
  #view-rrhh .rrhh-trab-toolbar .search-box,
  #view-rrhh .rrhh-trab-toolbar #rrhh-trab-filtro-empresa { flex: 1 1 200px; min-width: 0; }

  /* ---------- Tablas (Empresas que requieren atención / Empresas / Trabajadores) ---------- */
  #view-rrhh table.modern thead th {
    background: #F8FAFC; font-size: 0.72rem; padding: 12px 16px; border-bottom: 1px solid var(--border);
  }
  #view-rrhh table.modern tbody td { padding: 10px 16px; font-size: 0.87rem; }
  #view-rrhh table.modern tbody tr:hover { background: #FAFAFE; }
  #view-rrhh .rrhh-table-empresas th:nth-child(1), #view-rrhh .rrhh-table-empresas td:nth-child(1) { width: 30%; }
  #view-rrhh .rrhh-table-empresas th:nth-child(2), #view-rrhh .rrhh-table-empresas td:nth-child(2) { width: 13%; }
  #view-rrhh .rrhh-table-empresas th:nth-child(3), #view-rrhh .rrhh-table-empresas td:nth-child(3),
  #view-rrhh .rrhh-table-empresas th:nth-child(4), #view-rrhh .rrhh-table-empresas td:nth-child(4) { width: 14%; text-align: center; }
  #view-rrhh .rrhh-table-empresas th:nth-child(5), #view-rrhh .rrhh-table-empresas td:nth-child(5) { width: 17%; }
  #view-rrhh .rrhh-table-empresas th:nth-child(6), #view-rrhh .rrhh-table-empresas td:nth-child(6) { width: 12%; text-align: right; }
  #view-rrhh .rrhh-table-trabajadores th:nth-child(1), #view-rrhh .rrhh-table-trabajadores td:nth-child(1),
  #view-rrhh .rrhh-table-trabajadores th:nth-child(2), #view-rrhh .rrhh-table-trabajadores td:nth-child(2) { width: 16%; }
  #view-rrhh .rrhh-cell-nombre {
    font-weight: 600; color: var(--text); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden; max-width: 320px;
  }
  #view-rrhh .rrhh-cell-empresa-secundaria { font-size: 0.78rem; color: var(--muted); margin-top: 1px; }
  #view-rrhh .rrhh-cell-fecha-proxima { color: var(--warning); font-weight: 600; }

  /* Boton "Ver empresa"/"Resolver": mismo look en toda la pantalla, borde
     morado suave y relleno morado suave al hover en vez del gris generico
     de .btn-ghost (que se sigue usando tal cual en el resto del sitio). */
  .rrhh-btn-outline {
    display: inline-flex; align-items: center; justify-content: center; gap: 6px; white-space: nowrap;
    height: 32px; padding: 0 14px; border-radius: var(--radius-control); margin: 0;
    background: #fff; border: 1px solid var(--primary-soft-border); color: var(--primary);
    font-size: 0.82rem; font-weight: 600; cursor: pointer; transition: background .15s, border-color .15s;
  }
  .rrhh-btn-outline:hover { background: var(--primary-soft); border-color: var(--primary); }

  /* ---------- Actividad reciente / Próximos hitos ---------- */
  #view-rrhh .rrhh-activity-item { padding: 12px 4px; align-items: center; gap: 12px; }
  #view-rrhh .rrhh-activity-main { flex: 1; min-width: 0; }
  #view-rrhh .rrhh-activity-title { font-size: 0.85rem; font-weight: 600; color: var(--text); }
  #view-rrhh .rrhh-activity-sub { font-size: 0.78rem; color: var(--muted); margin-top: 1px; }
  #view-rrhh .rrhh-activity-time { font-size: 0.74rem; color: var(--muted); white-space: nowrap; flex-shrink: 0; }
  #view-rrhh .rrhh-hito-nombre { font-size: 0.87rem; font-weight: 600; color: var(--text); }
  #view-rrhh .rrhh-hito-empresa { font-size: 0.78rem; color: var(--muted); margin-top: 1px; }

  /* ---------- Resumen: especificación "RRHH Inicio" (24/9/2026) ----------
     Solo lo accionable: Bandeja de acciones a la izquierda (~60%), Próximos
     hitos y Actividad reciente a la derecha (~40%). Colores de la
     especificación, como variables propias de esta vista. */
  #view-rrhh {
    --rrhh-rojo: #B91C1C; --rrhh-rojo-fuerte: #DC2626; --rrhh-rojo-bg: #FEF2F2; --rrhh-rojo-bg2: #FEE2E2;
    --rrhh-ambar: #B45309; --rrhh-ambar-bg: #FFFBEB; --rrhh-ambar-bg2: #FEF3C7;
    --rrhh-violeta: #7C3AED; --rrhh-violeta-bg: #EDE9FE;
    --rrhh-verde: #047857; --rrhh-verde-bg: #D1FAE5;
    --rrhh-texto: #1E2235; --rrhh-texto-2: #6B7190; --rrhh-borde: #E3E5EE; --rrhh-fondo: #F6F7FB;
  }
  #view-rrhh .rrhh-inicio-grid { display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: 20px; align-items: start; }
  #view-rrhh .rrhh-inicio-lateral { display: flex; flex-direction: column; gap: 20px; min-width: 0; }
  @media (max-width: 1100px) { #view-rrhh .rrhh-inicio-grid { grid-template-columns: 1fr; } }

  /* Notion caído o con copia vieja (renderRRHHAvisoNotion). */
  #view-rrhh .rrhh-aviso-notion { margin: 0 0 16px; padding: 12px 14px; border-radius: 10px; background: var(--rrhh-ambar-bg); color: var(--rrhh-ambar); font-size: 0.82rem; line-height: 1.45; }
  #view-rrhh .rrhh-aviso-notion p { margin: 0; display: flex; flex-direction: column; gap: 2px; }
  #view-rrhh .rrhh-aviso-notion p span { font-size: 0.78rem; opacity: 0.9; overflow-wrap: anywhere; }

  #view-rrhh .rrhh-bandeja { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
  #view-rrhh .rrhh-bandeja-titulo { display: flex; align-items: baseline; justify-content: space-between; gap: 4px 12px; flex-wrap: wrap; }
  #view-rrhh .rrhh-bandeja-titulo h2 { font-size: 1.125rem; font-weight: 700; color: var(--rrhh-texto); margin: 0; }
  #view-rrhh .rrhh-bandeja-titulo .muted { font-size: 0.78rem; color: var(--rrhh-texto-2); }

  /* Cada sección de la bandeja: tarjeta con header propio. */
  #view-rrhh .rrhh-sec { background: var(--card); border: 1px solid var(--rrhh-borde); border-radius: var(--radius-card); overflow: hidden; }
  /* Ícono · título y descripción · contador · Ocultar, todo centrado en alto
     (el contador va a la derecha, al lado de Ocultar: maqueta del 24/9/2026). */
  #view-rrhh .rrhh-sec-header { display: flex; align-items: center; gap: 12px; padding: 14px 16px; }
  #view-rrhh .rrhh-sec-icono { width: 34px; height: 34px; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
  #view-rrhh .rrhh-sec-icono svg { width: 18px; height: 18px; }
  #view-rrhh .rrhh-sec-textos { flex: 1; min-width: 0; }
  #view-rrhh .rrhh-sec-titulo { font-size: 1rem; font-weight: 700; color: var(--rrhh-texto); }
  #view-rrhh .rrhh-sec-descripcion { font-size: 0.78rem; color: var(--rrhh-texto-2); margin-top: 2px; }
  #view-rrhh .rrhh-sec-contador { font-size: 0.75rem; font-weight: 700; border-radius: 999px; padding: 2px 9px; flex-shrink: 0; min-width: 24px; text-align: center; }
  #view-rrhh .rrhh-sec-toggle { background: none; border: none; color: var(--rrhh-texto-2); font-size: 0.78rem; font-weight: 600; cursor: pointer; padding: 4px 6px; border-radius: 6px; flex-shrink: 0; }
  #view-rrhh .rrhh-sec-toggle:hover { background: var(--rrhh-fondo); color: var(--rrhh-texto); }
  #view-rrhh .rrhh-sec-cuerpo { border-top: 1px solid var(--rrhh-borde); }
  #view-rrhh .rrhh-sec-vacio { padding: 16px; font-size: 0.85rem; color: var(--rrhh-texto-2); text-align: center; }
  #view-rrhh .rrhh-sec-ver-mas { display: block; width: 100%; padding: 10px 16px; background: none; border: none; border-top: 1px solid var(--rrhh-borde); color: var(--rrhh-violeta); font-size: 0.82rem; font-weight: 600; cursor: pointer; }
  #view-rrhh .rrhh-sec-ver-mas:hover { background: var(--rrhh-fondo); }

  /* Requieren atención: la sección entera en rojo (borde, header y contador). */
  #view-rrhh .rrhh-sec-atencion { border-color: #FCA5A5; }
  #view-rrhh .rrhh-sec-atencion .rrhh-sec-header { background: var(--rrhh-rojo-bg); }
  #view-rrhh .rrhh-sec-atencion .rrhh-sec-icono { background: var(--rrhh-rojo-fuerte); color: #fff; }
  #view-rrhh .rrhh-sec-atencion .rrhh-sec-titulo { color: var(--rrhh-rojo); }
  #view-rrhh .rrhh-sec-atencion .rrhh-sec-descripcion { color: var(--rrhh-rojo); opacity: 0.8; }
  #view-rrhh .rrhh-sec-atencion .rrhh-sec-contador { background: var(--rrhh-rojo-fuerte); color: #fff; }
  #view-rrhh .rrhh-sec-atencion .rrhh-sec-cuerpo { border-top-color: #FECACA; }
  /* Por vencer (ámbar) y Pendientes (violeta): solo ícono y contador. */
  #view-rrhh .rrhh-sec-por-vencer .rrhh-sec-icono { background: var(--rrhh-ambar-bg2); color: var(--rrhh-ambar); }
  #view-rrhh .rrhh-sec-por-vencer .rrhh-sec-contador { background: var(--rrhh-ambar-bg2); color: var(--rrhh-ambar); }
  #view-rrhh .rrhh-sec-pendientes .rrhh-sec-icono { background: var(--rrhh-violeta-bg); color: var(--rrhh-violeta); }
  #view-rrhh .rrhh-sec-pendientes .rrhh-sec-contador { background: var(--rrhh-violeta-bg); color: var(--rrhh-violeta); }
  #view-rrhh .rrhh-sec-oculta .rrhh-sec-header { border-bottom: none; }

  /* Filas de la bandeja. */
  #view-rrhh .rrhh-fila { display: flex; align-items: center; gap: 14px; padding: 12px 16px; border-top: 1px solid var(--rrhh-borde); }
  #view-rrhh .rrhh-sec-cuerpo > .rrhh-fila:first-child { border-top: none; }
  #view-rrhh .rrhh-fila:hover { background: #FAFAFE; }
  #view-rrhh .rrhh-fila-main { flex: 1; min-width: 0; }
  #view-rrhh .rrhh-fila-titulo { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
  #view-rrhh .rrhh-fila-nombre { font-size: 0.875rem; font-weight: 600; color: var(--rrhh-texto); overflow-wrap: anywhere; }
  #view-rrhh .rrhh-fila-sub { font-size: 0.8125rem; color: var(--rrhh-texto); margin-top: 2px; overflow-wrap: anywhere; }
  #view-rrhh .rrhh-fila-problema { font-size: 0.8125rem; color: var(--rrhh-rojo); margin-top: 3px; overflow-wrap: anywhere; }
  #view-rrhh .rrhh-fila-meta { font-size: 0.75rem; color: var(--rrhh-texto-2); margin-top: 4px; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
  #view-rrhh .rrhh-fila-hace { font-weight: 600; }
  /* Cuándo: "Hace 6 días" (rojo) en atención, "Vence 30/09" en por vencer. */
  #view-rrhh .rrhh-fila-cuando { flex-shrink: 0; min-width: 84px; text-align: right; font-size: 0.78rem; color: var(--rrhh-texto-2); white-space: nowrap; }
  #view-rrhh .rrhh-fila-cuando-rojo { color: var(--rrhh-rojo); font-weight: 600; }
  #view-rrhh .rrhh-etiqueta { font-size: 0.7rem; font-weight: 700; border-radius: 6px; padding: 2px 8px; white-space: nowrap; }
  #view-rrhh .rrhh-etiqueta-roja { background: var(--rrhh-rojo-bg2); color: var(--rrhh-rojo); }
  #view-rrhh .rrhh-etiqueta-gris { background: #F1F5F9; color: var(--rrhh-texto-2); }
  /* Días restantes de "Por vencer". */
  #view-rrhh .rrhh-dias-bloque { width: 48px; height: 48px; border-radius: 10px; background: var(--rrhh-ambar-bg); color: var(--rrhh-ambar); display: flex; flex-direction: column; align-items: center; justify-content: center; flex-shrink: 0; line-height: 1.05; }
  #view-rrhh .rrhh-dias-bloque b { font-size: 1.05rem; }
  #view-rrhh .rrhh-dias-bloque span { font-size: 0.62rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; }
  /* Botones de acción de cada fila, del color de su sección. */
  #view-rrhh .rrhh-btn-accion {
    display: inline-flex; align-items: center; justify-content: center; height: 32px; padding: 0 14px; border-radius: var(--radius-control);
    font-size: 0.82rem; font-weight: 600; cursor: pointer; white-space: nowrap; flex-shrink: 0; text-decoration: none; border: 1px solid transparent; margin: 0;
    min-width: 88px;
  }
  #view-rrhh .rrhh-btn-rojo { background: var(--rrhh-rojo-fuerte); color: #fff; }
  #view-rrhh .rrhh-btn-rojo:hover { background: var(--rrhh-rojo); }
  #view-rrhh .rrhh-btn-ambar { background: #fff; color: var(--rrhh-ambar); border-color: #FCD34D; }
  #view-rrhh .rrhh-btn-ambar:hover { background: var(--rrhh-ambar-bg); }
  #view-rrhh .rrhh-btn-violeta { background: #fff; color: var(--rrhh-violeta); border-color: #DDD6FE; }
  #view-rrhh .rrhh-btn-violeta:hover { background: var(--rrhh-violeta-bg); }
  /* En el teléfono el botón baja a su propia línea en vez de apretar el texto. */
  @media (max-width: 560px) {
    #view-rrhh .rrhh-fila { flex-wrap: wrap; }
    #view-rrhh .rrhh-fila-main { flex: 1 1 200px; }
    #view-rrhh .rrhh-btn-accion { margin-left: auto; }
    #view-rrhh .rrhh-fila-cuando { margin-left: auto; min-width: 0; }
    #view-rrhh .rrhh-fila-cuando + .rrhh-btn-accion { margin-left: 0; }
    #view-rrhh .rrhh-sec-header { padding: 12px; }
    #view-rrhh .rrhh-fila { padding: 12px; }
  }

  /* Próximos hitos: fecha en bloque (día + mes). */
  #view-rrhh .rrhh-hito { display: flex; align-items: center; gap: 12px; padding: 10px 4px; border-bottom: 1px solid #F1F5F9; }
  #view-rrhh .rrhh-hito:last-child { border-bottom: none; }
  /* La fecha sola, sin recuadro ni fondo de color (pedido del 24/9/2026). */
  #view-rrhh .rrhh-fecha-bloque { width: 40px; color: var(--rrhh-texto); display: flex; flex-direction: column; align-items: center; justify-content: center; flex-shrink: 0; line-height: 1.1; }
  #view-rrhh .rrhh-fecha-bloque b { font-size: 1.05rem; }
  #view-rrhh .rrhh-fecha-bloque span { font-size: 0.66rem; font-weight: 700; color: var(--rrhh-texto-2); letter-spacing: 0.04em; }
  #view-rrhh .rrhh-hito-main { flex: 1; min-width: 0; }
  #view-rrhh .rrhh-hito-tipo { font-size: 0.8125rem; font-weight: 600; color: var(--rrhh-texto); }
  #view-rrhh .rrhh-hito-sub { font-size: 0.75rem; color: var(--rrhh-texto-2); margin-top: 1px; overflow-wrap: anywhere; }

  /* Actividad reciente: chip de tipo · persona · empresa · hora. */
  #view-rrhh .rrhh-act-fila { display: flex; align-items: center; gap: 10px; padding: 10px 4px; border-bottom: 1px solid #F1F5F9; }
  #view-rrhh .rrhh-act-fila:last-child { border-bottom: none; }
  #view-rrhh .rrhh-actividad-completa { max-height: 420px; overflow-y: auto; }
  /* La etiqueta ceñida a su texto y casi cuadrada; la columna de ancho fijo
     mantiene alineados los nombres aunque "Renovado" sea más largo que "Baja". */
  #view-rrhh .rrhh-act-tipo { width: 72px; flex-shrink: 0; }
  #view-rrhh .rrhh-chip { display: inline-block; font-size: 0.7rem; font-weight: 700; border-radius: 5px; padding: 2px 6px; white-space: nowrap; line-height: 1.35; }
  #view-rrhh .rrhh-chip-verde { background: var(--rrhh-verde-bg); color: var(--rrhh-verde); }
  #view-rrhh .rrhh-chip-rojo { background: var(--rrhh-rojo-bg2); color: var(--rrhh-rojo); }
  #view-rrhh .rrhh-chip-violeta { background: var(--rrhh-violeta-bg); color: var(--rrhh-violeta); }
  #view-rrhh .rrhh-chip-ambar { background: var(--rrhh-ambar-bg2); color: var(--rrhh-ambar); }
  #view-rrhh .rrhh-chip-gris { background: #F1F5F9; color: var(--rrhh-texto-2); }
  #view-rrhh .rrhh-act-main { flex: 1; min-width: 0; }
  #view-rrhh .rrhh-act-persona { font-size: 0.8125rem; font-weight: 600; color: var(--rrhh-texto); overflow-wrap: anywhere; }
  #view-rrhh .rrhh-act-empresa { font-size: 0.75rem; color: var(--rrhh-texto-2); overflow-wrap: anywhere; }
  #view-rrhh .rrhh-act-hora { font-size: 0.72rem; color: var(--rrhh-texto-2); white-space: nowrap; flex-shrink: 0; }

  /* ---------- Paginación unificada ---------- */
  .rrhh-pager-row { display: flex; align-items: center; justify-content: space-between; margin-top: 12px; flex-wrap: wrap; gap: 10px; }
  .rrhh-pager-info { font-size: 0.8rem; color: var(--muted); }
  .rrhh-pager-controls { display: flex; gap: 6px; align-items: center; }
  .rrhh-pager-controls .btn-ghost { height: 30px; width: 30px; padding: 0; border-radius: var(--radius-control); }
  .rrhh-pager-controls .btn-ghost:disabled { opacity: 0.45; cursor: not-allowed; }
  .rrhh-pager-current { font-size: 0.82rem; color: var(--text); min-width: 44px; text-align: center; }

  /* ---------- Estados vacíos ---------- */
  #view-rrhh .rrhh-empty-state {
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;
    padding: 32px 16px; color: var(--muted); text-align: center;
  }
  #view-rrhh .rrhh-empty-state svg { width: 26px; height: 26px; color: #CBD5E1; }
  #view-rrhh .rrhh-empty-state span { font-size: 0.85rem; }

  @media (max-width: 720px) {
    #view-rrhh .rrhh-header { align-items: flex-start; }
    #view-rrhh .rrhh-header-actions { width: 100%; }
    #view-rrhh .rrhh-header-actions .btn-primary { flex: 1; }
  }

  /* ---------- Simular Liquidación ---------- */
  /* Rediseño completo (Ago 2026) a partir de un mockup del contador (dueño
     de producto) - formulario en 3 secciones numeradas colapsables +
     resultado compacto con desglose completo opcional. Sigue usando los
     mismos tokens de la "segunda pasada visual" de RR.HH. (--radius-card /
     --radius-control) para que la pantalla se sienta parte del mismo
     sistema en vez de un agregado aparte - ver comentario en :root de
     por que esos tokens solo se aplican dentro de vistas puntuales. */
  #rrhh-panel-simular > .card { border-radius: var(--radius-card); }
  #rrhh-panel-simular .card-header { margin-bottom: 14px; }
  #rrhh-panel-simular .card > .muted:first-of-type { margin-top: -6px; }

  /* ---------- Encabezado: selector de periodo compacto + Restablecer ---------- */
  #rrhh-panel-simular .liq-periodo-select-wrap, #view-f29provisorio .liq-periodo-select-wrap, #view-contabilidad .liq-periodo-select-wrap { position: relative; }
  #rrhh-panel-simular .liq-periodo-select-wrap select, #view-f29provisorio .liq-periodo-select-wrap select, #view-contabilidad .liq-periodo-select-wrap select {
    appearance: none; -webkit-appearance: none; width: auto; min-width: 170px;
    height: 40px; padding: 0 34px 0 16px; border: 1px solid var(--border); border-radius: 999px;
    background: #fff; font-size: 0.85rem; font-weight: 600; color: var(--text); cursor: pointer;
  }
  /* En las barras de título, estos selects van al lado de botones
     .btn-secondary y la píldora desentonaba: mismo radio (10px) y misma
     altura que el botón, para que la fila se lea como una sola cosa.
     Pedido del usuario el 8/9/2026 sobre Formulario 29; se aplica también a
     Contabilidad, que tiene la misma barra. RR.HH./Simular liquidación
     conserva la píldora: ahí el select no acompaña a ningún botón. */
  #view-f29provisorio .f29p-header-actions .liq-periodo-select-wrap select,
  #view-contabilidad .liq-periodo-select-wrap select { border-radius: 10px; }
  #rrhh-panel-simular .liq-periodo-select-wrap select:focus, #view-f29provisorio .liq-periodo-select-wrap select:focus, #view-contabilidad .liq-periodo-select-wrap select:focus { border-color: var(--primary); outline: none; }
  #rrhh-panel-simular .liq-periodo-select-wrap svg, #view-f29provisorio .liq-periodo-select-wrap svg, #view-contabilidad .liq-periodo-select-wrap svg {
    position: absolute; right: 13px; top: 50%; transform: translateY(-50%); pointer-events: none;
    width: 14px; height: 14px; color: var(--muted);
  }
  #rrhh-panel-simular .liq-restablecer-link {
    display: inline-flex; align-items: center; gap: 6px; font-size: 0.85rem; font-weight: 600;
    color: var(--primary); cursor: pointer; background: none; border: none; padding: 0;
  }
  #rrhh-panel-simular .liq-restablecer-link:hover { color: var(--primary-dark); }
  #rrhh-panel-simular .liq-restablecer-link svg { width: 14px; height: 14px; }

  /* Select compacto para card-header (ej. "N por pagina" de Bandeja de
     acciones/Actividad reciente) - mismo espiritu que
     .liq-periodo-select-wrap (flecha propia, sin el select "crudo" del
     navegador) pero mas chico, pensado para convivir con un <h2>. */
  .mini-select-wrap { position: relative; display: inline-flex; align-items: center; flex-shrink: 0; }
  .mini-select-wrap select {
    appearance: none; -webkit-appearance: none; width: auto;
    height: 30px; padding: 0 26px 0 10px; border: 1px solid var(--border); border-radius: 8px;
    background: var(--bg); font-size: 0.76rem; font-weight: 600; color: var(--text); cursor: pointer;
  }
  .mini-select-wrap select:focus { border-color: var(--primary); outline: none; background: #fff; }
  .mini-select-wrap svg {
    position: absolute; right: 8px; top: 50%; transform: translateY(-50%); pointer-events: none;
    width: 12px; height: 12px; color: var(--muted);
  }

  /* Banner de estado: reusa .uwigo-status-box/.ust-title (mismo patron ya
     usado para el estado de cuentas Uwigo) en vez de inventar un componente
     de cero, con un borde sutil de mas pedido por el mockup. */
  #rrhh-panel-simular .uwigo-status-box { border: 1px solid var(--border); margin-bottom: 20px; }


  /* ---------- Secciones numeradas colapsables: un badge cuadrado con el
     numero hace de disparador, y el chevron gira al plegarse. ---------- */
  #rrhh-panel-simular .liq-section-header { display: flex; align-items: center; gap: 12px; cursor: pointer; user-select: none; }
  #rrhh-panel-simular .liq-section-badge {
    width: 24px; height: 24px; border-radius: 7px; background: var(--primary-soft); color: var(--primary);
    display: flex; align-items: center; justify-content: center; font-size: 0.78rem; font-weight: 700; flex-shrink: 0;
  }
  #rrhh-panel-simular .liq-section-header h2 { flex: 1; }
  #rrhh-panel-simular .liq-section-chevron { color: var(--muted); transition: transform .2s; flex-shrink: 0; }
  #rrhh-panel-simular .liq-section.collapsed .liq-section-chevron { transform: rotate(180deg); }
  #rrhh-panel-simular .liq-section-body { margin-top: 16px; }
  #rrhh-panel-simular .liq-section.collapsed .liq-section-body { display: none; }

  #rrhh-panel-simular .liq-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0 16px; }
  #rrhh-panel-simular .liq-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0 16px; }
  @media (max-width: 560px) { #rrhh-panel-simular .liq-grid, #rrhh-panel-simular .liq-grid-3 { grid-template-columns: 1fr; } }

  /* Tiles de checkbox (gratificacion / antiguedad / jubilado / empresarial) */
  #rrhh-panel-simular .liq-tiles { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin: 2px 0 4px; }
  @media (max-width: 720px) { #rrhh-panel-simular .liq-tiles { grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 420px) { #rrhh-panel-simular .liq-tiles { grid-template-columns: 1fr; } }
  #rrhh-panel-simular .liq-tile {
    display: flex; align-items: flex-start; gap: 8px; border: 1px solid var(--border); border-radius: var(--radius-control);
    padding: 10px 12px; font-size: 0.82rem; color: var(--text); cursor: pointer; transition: background .15s, border-color .15s;
  }
  #rrhh-panel-simular .liq-tile:hover { background: var(--bg); }
  #rrhh-panel-simular .liq-tile.liq-tile-checked { background: var(--primary-soft); border-color: var(--primary-soft-border); }
  #rrhh-panel-simular .liq-tile input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--primary); cursor: pointer; flex-shrink: 0; margin: 1px 0 0; }

  #rrhh-panel-simular .liq-check-list { display: flex; flex-direction: column; gap: 10px; margin-top: 6px; }
  #rrhh-panel-simular .liq-check-row {
    display: flex; align-items: center; gap: 9px; font-size: 0.87rem; color: var(--text); cursor: pointer;
  }
  #rrhh-panel-simular .liq-check-row input[type="checkbox"] { width: 17px; height: 17px; accent-color: var(--primary); cursor: pointer; flex-shrink: 0; margin: 0; }

  /* Segmented control "Imponibles / No imponibles" (seccion 2) */
  #rrhh-panel-simular .liq-segmented { display: flex; background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-control); padding: 3px; margin-bottom: 14px; }
  #rrhh-panel-simular .liq-segmented-btn {
    flex: 1; background: none; border: none; border-radius: 6px; padding: 8px 0; font-size: 0.85rem; font-weight: 600;
    color: var(--muted); cursor: pointer; transition: background .15s, color .15s;
  }
  #rrhh-panel-simular .liq-segmented-btn.active { background: var(--primary); color: #fff; }

  #rrhh-panel-simular .liq-ver-otros {
    display: inline-block; font-size: 0.8rem; font-weight: 600; color: var(--primary); cursor: pointer; margin: 2px 0 14px;
  }
  #rrhh-panel-simular .liq-ver-otros:hover { color: var(--primary-dark); }

  #rrhh-panel-simular select { width: 100%; font-size: 0.88rem; padding: 0 12px; height: 42px; background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-control); outline: none; color: var(--text); }
  #rrhh-panel-simular select:focus { background: #fff; border-color: var(--primary); }
  #rrhh-panel-simular .field input { border-radius: var(--radius-control); }

  #rrhh-panel-simular .liq-form-actions { display: flex; gap: 10px; margin-top: 4px; }
  #rrhh-panel-simular .liq-form-actions .btn-secondary { flex: 0 0 37%; }
  #rrhh-panel-simular .liq-form-actions .btn-primary { flex: 1; }
  @media (max-width: 560px) {
    #rrhh-panel-simular .liq-form-actions { flex-direction: column; }
    #rrhh-panel-simular .liq-form-actions .btn-secondary { flex: 1; }
  }

  /* ---------- Panel de resultado ---------- */
  /* .rrhh-empty-state vive scopeada a #view-rrhh en su CSS original - se
     duplica aca (mismo look) porque el estado vacio de este panel vive
     afuera de esa vista. */
  #rrhh-panel-simular .rrhh-empty-state {
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;
    padding: 32px 16px; color: var(--muted); text-align: center;
  }
  #rrhh-panel-simular .rrhh-empty-state svg { width: 26px; height: 26px; color: #CBD5E1; }
  #rrhh-panel-simular .rrhh-empty-state span { font-size: 0.85rem; }

  #rrhh-panel-simular .liq-resultado-nombre { font-size: 0.85rem; color: var(--text); margin-top: 2px; }
  #rrhh-panel-simular .liq-resultado-nombre:first-of-type { margin-top: 10px; }

  #rrhh-panel-simular .liq-section-title {
    font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em;
    color: var(--muted); margin: 20px 0 8px;
  }
  #rrhh-panel-simular .liq-section-title:first-child { margin-top: 0; }
  #rrhh-panel-simular .liq-section-title-haberes { color: var(--success); }
  #rrhh-panel-simular .liq-section-title-descuentos { color: var(--danger); }
  #rrhh-panel-simular .liq-line {
    display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
    padding: 6px 0; font-size: 0.86rem; border-bottom: 1px solid #F1F5F9;
  }
  #rrhh-panel-simular .liq-line:last-child { border-bottom: none; }
  #rrhh-panel-simular .liq-line-label { color: var(--muted); }
  #rrhh-panel-simular .liq-line-value { font-weight: 600; white-space: nowrap; font-variant-numeric: tabular-nums; }
  #rrhh-panel-simular .liq-line-total { border-top: 1px solid var(--border); border-bottom: none; margin-top: 4px; padding-top: 10px; }
  #rrhh-panel-simular .liq-line-total .liq-line-label { color: var(--text); font-weight: 700; }
  #rrhh-panel-simular .liq-line-total .liq-line-value { font-weight: 700; }
  #rrhh-panel-simular .liq-line-value.liq-negativo { color: var(--danger); }

  /* Filas "Total haberes"/"Total descuentos" resaltadas de la vista
     compacta - el #991B1B ya es el mismo tono usado en el resto del sitio
     para texto sobre --danger-bg (ver .error-detail, #batch-critical-alert),
     no un color nuevo. */
  #rrhh-panel-simular .liq-total-row {
    display: flex; justify-content: space-between; align-items: baseline; border-radius: var(--radius-control);
    padding: 9px 12px; margin-top: 6px; font-weight: 700; font-size: 0.9rem;
  }
  #rrhh-panel-simular .liq-total-row-haberes { background: var(--success-bg); color: var(--success); }
  #rrhh-panel-simular .liq-total-row-descuentos { background: var(--danger-bg); color: #991B1B; }

  #rrhh-panel-simular .liq-costo-simple-row {
    display: flex; justify-content: space-between; align-items: baseline; border: 1px solid var(--border);
    border-radius: var(--radius-control); padding: 12px 14px; margin-top: 18px; font-size: 0.88rem;
  }
  #rrhh-panel-simular .liq-costo-simple-row .liq-line-label { font-weight: 600; color: var(--text); }
  #rrhh-panel-simular .liq-costo-simple-row .liq-line-value { font-weight: 700; font-size: 0.98rem; }

  /* Campos en $0 empiezan ocultos (ver toggleLiqCeros) - a nadie le sirve
     ver 8 haberes en $0 cuando solo aplican 2. Un solo boton al inicio del
     panel los muestra/oculta todos juntos, en vez de uno por seccion. Sigue
     usandose tal cual dentro del desglose completo (ver #liq-desglose-full
     mas abajo). */
  #rrhh-panel-simular .liq-zero-group { display: none; }
  #rrhh-panel-simular .liq-zero-group.liq-zero-group-visible { display: block; }
  #rrhh-panel-simular .liq-toggle-ceros {
    display: block; width: 100%; text-align: left; background: none; border: none;
    color: var(--primary); font-size: 0.8rem; font-weight: 600; cursor: pointer;
    padding: 0 0 12px; margin-bottom: 4px; border-bottom: 1px dashed var(--border);
  }
  #rrhh-panel-simular .liq-toggle-ceros:hover { color: var(--primary-dark); }


  /* Badge "PDF" adentro del boton "Descargar liquidacion" y borde
     morado (btn-secondary generico usa borde gris) para que se distinga
     como la accion principal del panel de resultado. */
  #rrhh-panel-simular .btn-secondary.liq-btn-pdf { border-color: var(--primary); color: var(--primary); }
  #rrhh-panel-simular .btn-secondary.liq-btn-pdf:hover { background: var(--primary-soft); }
  #rrhh-panel-simular .liq-btn-pdf-badge {
    background: var(--primary-soft); color: var(--primary-dark); font-size: 0.66rem; font-weight: 700;
    padding: 2px 8px; border-radius: 999px; margin-left: 2px;
  }

  #rrhh-panel-simular .liq-ver-desglose {
    display: flex; align-items: center; justify-content: center; gap: 6px; width: 100%; background: none; border: none;
    color: var(--primary); font-size: 0.83rem; font-weight: 600; cursor: pointer; padding: 12px 0 0;
  }
  #rrhh-panel-simular .liq-ver-desglose:hover { color: var(--primary-dark); }
  #rrhh-panel-simular .liq-desglose-full { display: none; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border); }
  #rrhh-panel-simular .liq-desglose-full.liq-desglose-visible { display: block; }

  #rrhh-panel-simular .liq-costo-box {
    background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-card);
    padding: 16px 18px; margin-top: 18px;
  }
  #rrhh-panel-simular .liq-costo-box .liq-section-title { margin-top: 0; }


  /* ---------------- Liquidaciones ---------------- */
  /* La pestaña de RR.HH. tiene hoja propia desde el rediseño del 25/9/2026:
     public/styles/view-liquidaciones.css. Aca quedan solo dos cosas que no
     son de la pestaña: el esqueleto de carga (lo usan tambien Simular
     liquidacion y los KPIs de Contabilidad) y el modal de "Validar períodos"
     / "Guardar pendientes". */
  .liq-skeleton-bar { height: 13px; border-radius: 6px; background: linear-gradient(90deg, #F1F5F9 25%, #E9EDF2 37%, #F1F5F9 63%); background-size: 400% 100%; animation: liq-shimmer 1.4s ease infinite; }
  @keyframes liq-shimmer { 0% { background-position: 100% 0; } 100% { background-position: 0 0; } }

  #modal-liq-validar .modal-box, #modal-liq-de-nuevo .modal-box { max-width: 460px; }
  #modal-liq-validar .liq-modal-progress-bar { height: 8px; border-radius: 999px; background: #F1F5F9; overflow: hidden; margin: 16px 0 10px; }
  /* width: 0 de entrada (antes era un style="" en el HTML); el avance lo
     pone pollLiqValidarBatch. */
  #modal-liq-validar .liq-modal-progress-fill { width: 0; height: 100%; background: var(--primary); transition: width 0.3s ease; }
  #modal-liq-validar .liq-modal-stats { display: flex; gap: 14px; margin: 14px 0; }
  #modal-liq-validar .liq-modal-stat { flex: 1; text-align: center; }
  #modal-liq-validar .liq-modal-stat .n { font-size: 1.25rem; font-weight: 700; }
  #modal-liq-validar .liq-modal-stat .l { font-size: 0.66rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.03em; }
  #modal-liq-validar .liq-modal-actual { font-size: 0.82rem; color: var(--muted); }
  /* Lo que hay que saber al terminar "Guardar de nuevo" (13/10/2026). Vacío
     no ocupa lugar; lo que pide que alguien haga algo va en ámbar. */
  #modal-liq-validar .liq-modal-detalle { font-size: 0.8rem; line-height: 1.45; }
  #modal-liq-validar .liq-modal-detalle:empty { display: none; }
  #modal-liq-validar .liq-modal-detalle p { margin: 0 0 8px; }
  #modal-liq-validar .liq-modal-detalle .es-aviso { padding: 8px 10px; border-radius: 8px; background: var(--warning-bg); color: var(--warning); }

  /* El CSS de la vista de Impuesto Unico vivia en
     /styles/view-impuesto-unico.css, borrado el 10/9/2026 con la seccion
     (Fase 2 de la reorganización — decomposición inicial de index.html,
     ver docs/architecture/MULTI_TENANT_MIGRATION_PLAN.md). Vista elegida
     por estar genuinamente aislada (verificado: sin clases compartidas
     con otras vistas, a diferencia de #rrhh-panel-simular). */

  /* Vista "F29 Provisorio" - Etapa 1 (mesa operativa + calendario
     tributario, ver src/routes/f29Provisorio.js). Clases propias (f29p-*)
     para no atar el CSS a #rrhh-panel-simular; el calendario reusa las
     clases GLOBALES .rrhh-cal-* (definidas mas arriba, sin scope de
     vista) que ya usa RR.HH., asi que no se redefinen aca. */
  #view-f29provisorio .card { border-radius: var(--radius-card); }
  #view-f29provisorio .f29p-header-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
  /* Los controles van arriba a la DERECHA, en la línea del título (pedido
     del usuario, 8/9/2026). Sin esto se caían a una segunda línea alineados
     a la izquierda: .topheader tiene flex-wrap y acá el ancho útil es la
     columna izquierda del grid (el panel de detalle se lleva 460px), así que
     el título más los tres controles no entraban. El que cede es el bloque
     del título -su bajada puede ocupar dos líneas-, nunca los controles. */
  #view-f29provisorio .topheader { flex-wrap: nowrap; }
  #view-f29provisorio .topheader > div:first-child { min-width: 0; }
  #view-f29provisorio .f29p-header-actions { flex-shrink: 0; }

  #view-f29provisorio .f29p-tabs { display: inline-flex; background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-control); padding: 3px; margin-bottom: 20px; }
  #view-f29provisorio .f29p-tab { border: none; background: none; padding: 8px 18px; border-radius: 6px; font-size: 0.85rem; font-weight: 600; color: var(--muted); cursor: pointer; }
  #view-f29provisorio .f29p-tab.active { background: var(--primary); color: #fff; }

  /* Fase 3A: mismo patron de tabs internos que F29 Provisorio (.f29p-tab),
     con clase propia porque son 2 vistas distintas - no comparten estado ni
     logica, solo el look. */
  #view-contabilidad .cont-tabs { display: inline-flex; background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-control); padding: 3px; margin-bottom: 20px; }
  #view-contabilidad .cont-tab { border: none; background: none; padding: 8px 18px; border-radius: 6px; font-size: 0.85rem; font-weight: 600; color: var(--muted); cursor: pointer; }
  #view-contabilidad .cont-tab.active { background: var(--primary); color: #fff; }

  /* Contabilidad tiene CINCO indicadores y .stat-grid trae repeat(4, 1fr):
     el quinto caia solo en una segunda fila. Van los cinco en una linea.
     Se achican el relleno y el icono para que "En revisión / observados"
     -la etiqueta mas larga- siga entrando en una sola linea con la columna
     mas angosta que deja partir en cinco. */
  #view-contabilidad .stat-grid { grid-template-columns: repeat(5, 1fr); gap: 14px; }
  #view-contabilidad .stat-grid .stat-card { padding: 18px 16px; gap: 12px; }
  #view-contabilidad .stat-grid .stat-icon { width: 40px; height: 40px; border-radius: 11px; }
  #view-contabilidad .stat-grid .stat-label { font-size: 0.78rem; line-height: 1.25; }
  /* Debajo de 1280px cinco columnas quedan tan angostas que el numero se
     pega a la etiqueta; ahi vuelven a tres y dos, que es parejo. */
  @media (max-width: 1280px) {
    #view-contabilidad .stat-grid { grid-template-columns: repeat(3, 1fr); }
  }

  /* Las filas de la mesa contable eran de 82px: el td global trae 18px
     arriba y abajo, y la celda de empresa lleva dos lineas (nombre y RUT).
     Mismo tratamiento que ya tiene RRHH, que se ve bien. */
  #view-contabilidad table.modern tbody td { padding: 10px 16px; }
  /* Y el que de verdad estiraba la fila: el RUT bajo el nombre usa .muted, y
     la tabla vive dentro de una .card, asi que le caia
     ".card .muted { margin-top: 4px; margin-bottom: 18px }" -pensado para el
     subtitulo de una tarjeta, no para una celda-. Eran 18px de aire muerto
     debajo de cada RUT: mas que el propio relleno de la celda. */
  #view-contabilidad table.modern tbody td .muted { margin: 0; }
  /* El guion de "2026-09" era un punto de corte valido y la columna es
     angosta, asi que el periodo se partia en dos lineas y estiraba la fila.
     Ver periodoMesAnio() en contabilidad.view.js para el orden. */
  #view-contabilidad .cont-col-periodo { white-space: nowrap; }
  /* La revisión nombra las cuentas que fallan ("Proveedores, Clientes,
     Clientes boleta, Remuneraciones por pagar" en el peor caso). Se corta con
     puntos suspensivos para no ensanchar la columna: el detalle completo de
     las seis revisiones va en el title del badge. */
  #view-contabilidad .cont-col-revision { max-width: 320px; }
  /* El candado del mes cerrado: verde, con el icono pegado al texto. */
  #view-contabilidad .cont-cerrado { display: inline-flex; align-items: center; gap: 6px; }
  #view-contabilidad .cont-cerrado svg { width: 13px; height: 13px; flex: none; }
  #view-contabilidad .cont-col-revision .badge {
    display: inline-block;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    vertical-align: middle;
  }

  /* La última columna: en qué anda la actualización del mes ("En cola",
     "Actualizando…", "Error: …") y el botón, en una sola línea. El error
     se corta con puntos suspensivos para no ensanchar la tabla: el motivo
     completo va en el title del badge. */
  #view-contabilidad .cont-col-accion { text-align: right; white-space: nowrap; }
  #view-contabilidad .cont-col-accion .badge { vertical-align: middle; margin-right: 6px; }
  #view-contabilidad .cont-estado-error {
    display: inline-block;
    max-width: 260px;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  /* Fecha y hora de la última comprobación, sin partirse en dos líneas; el
     "sin cambios" va debajo, chico, cuando la última vez llegó el mismo
     balance que ya estaba. */
  #view-contabilidad .cont-col-comprobacion { white-space: nowrap; }
  #view-contabilidad .cont-sin-cambios { font-size: 0.75rem; }


  #view-f29provisorio .f29p-toolbar { display: flex; gap: 10px; margin-bottom: 16px; flex-wrap: wrap; }
  #view-f29provisorio .f29p-search-wrap { position: relative; flex: 1; min-width: 220px; }
  #view-f29provisorio .f29p-search-wrap svg { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; color: var(--muted); }
  #view-f29provisorio .f29p-search-wrap input { width: 100%; height: 42px; padding: 0 12px 0 36px; border: 1px solid var(--border); border-radius: var(--radius-control); font-size: 0.85rem; outline: none; }
  #view-f29provisorio .f29p-search-wrap input:focus { border-color: var(--primary); }
  #view-f29provisorio .f29p-toolbar select { height: 42px; padding: 0 12px; border: 1px solid var(--border); border-radius: var(--radius-control); font-size: 0.85rem; background: #fff; outline: none; min-width: 200px; }
  /* "Actualizar empresas", al final de la misma fila del buscador. La altura
     va igualada a la del input y el select (42px): un boton de 38 al lado de
     dos campos de 42 se ve desalineado aunque los tres esten centrados. */
  #view-f29provisorio .f29p-toolbar-accion { height: 42px; white-space: nowrap; }

  /* ═══════════ Simular liquidación (rediseño 14/9/2026) ═══════════ */

  /* 65 / 35, con el resultado pegado arriba al desplazarse: el pedido es
     "mantener los datos y su efecto económico a la vista". */


  /* De dónde salen los datos */
  #rrhh-panel-simular .liq-origen { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; padding: 16px 18px; margin-bottom: 14px; }

  /* Lo que no está guardado. Amarillo y no rojo: no es un error, es una
     ausencia de dato que hay que completar a mano. */
  #rrhh-panel-simular .liq-faltantes {
    border: 1px solid var(--warning); background: var(--warning-bg);
    border-radius: var(--radius-control); padding: 12px 16px; margin-bottom: 14px; font-size: 0.82rem;
  }
  #rrhh-panel-simular .liq-faltantes-titulo { display: flex; align-items: center; gap: 8px; font-weight: 600; margin-bottom: 6px; }
  #rrhh-panel-simular .liq-faltantes ul { margin: 0; padding-left: 22px; line-height: 1.5; }

  /* Modalidad */
  #rrhh-panel-simular .liq-modo {
    flex: 1; display: flex; align-items: center; justify-content: center; gap: 8px;
    padding: 10px 12px; border: 0; background: transparent; border-radius: 9px;
    font: inherit; font-size: 0.85rem; font-weight: 600; color: var(--muted); cursor: pointer;
  }
  #rrhh-panel-simular .liq-modo.active { background: #fff; color: var(--primary); box-shadow: 0 1px 3px rgba(15,23,42,0.1); }

  /* Líquido objetivo */
  #rrhh-panel-simular .liq-objetivo { padding: 16px 18px; }
  #rrhh-panel-simular .liq-objetivo-fila { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; }
  #rrhh-panel-simular .liq-objetivo-fila .field { flex: 1 1 170px; margin: 0; }
  #rrhh-panel-simular .liq-objetivo-btn { height: 42px; white-space: nowrap; }
  #rrhh-panel-simular .liq-objetivo-salida { margin-top: 14px; }
  #rrhh-panel-simular .liq-propuesta { border: 1px solid var(--border); border-radius: var(--radius-control); padding: 12px 14px; background: var(--bg); }
  #rrhh-panel-simular .liq-propuesta-fila { display: flex; justify-content: space-between; gap: 12px; padding: 4px 0; font-size: 0.85rem; }
  #rrhh-panel-simular .liq-propuesta-estado { margin-top: 8px; }
  #rrhh-panel-simular .liq-objetivo-ok { color: var(--success); font-weight: 700; font-size: 0.85rem; }
  /* "Queda una diferencia" NO es verde: si no se alcanzó el objetivo, no
     puede leerse como si sí. */
  #rrhh-panel-simular .liq-objetivo-parcial { color: var(--warning); font-weight: 700; font-size: 0.85rem; }
  #rrhh-panel-simular .liq-propuesta-motivo { margin-top: 6px; font-size: 0.78rem; color: var(--muted); line-height: 1.4; }
  #rrhh-panel-simular .liq-objetivo-error { color: var(--danger); font-size: 0.82rem; margin: 0; }

  /* Bloques del formulario */
  #rrhh-panel-simular .liq-bloque { padding: 16px 18px; }
  #rrhh-panel-simular .liq-bloque-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
  #rrhh-panel-simular .liq-bloque-header h3 { font-size: 0.92rem; margin: 0; }
  #rrhh-panel-simular .liq-origen-chip { font-size: 0.74rem; color: var(--muted); }
  /* Como texto va --warning (#B45309, 5.0:1 sobre blanco), no
     --warning-icon (#F59E0B), que es color de relleno y da 2.1:1. */
  #rrhh-panel-simular .liq-origen-chip-aviso { color: var(--warning); }
  #rrhh-panel-simular .liq-nota-casillas:empty { display: none; }

  /* Tabla de conceptos */
  #rrhh-panel-simular .liq-tabla-wrap { overflow-x: auto; }
  #rrhh-panel-simular .liq-tabla-conceptos { font-size: 0.83rem; }
  #rrhh-panel-simular .liq-col-monto { text-align: right; }
  #rrhh-panel-simular .liq-col-accion { text-align: right; white-space: nowrap; }
  #rrhh-panel-simular .liq-input-monto {
    width: 130px; height: 34px; text-align: right; border: 1px solid var(--border);
    border-radius: 8px; padding: 0 10px; font-size: 0.83rem; font-variant-numeric: tabular-nums;
  }
  /* Un calculado se ve distinto de un editable: no se puede escribir encima
     y tiene que notarse antes de intentarlo. */
  #rrhh-panel-simular .liq-monto-calculado { font-variant-numeric: tabular-nums; color: var(--muted); }
  #rrhh-panel-simular .liq-origen-texto { font-size: 0.76rem; }
  #rrhh-panel-simular .liq-quitar { color: var(--muted); }
  #rrhh-panel-simular .liq-agregar-panel { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
  #rrhh-panel-simular .liq-agregar-chip {
    border: 1px solid var(--border); background: var(--bg); border-radius: 999px;
    padding: 6px 12px; font: inherit; font-size: 0.78rem; cursor: pointer;
  }
  #rrhh-panel-simular .liq-agregar-chip:hover { border-color: var(--primary); color: var(--primary); }

  /* Avanzadas */

  /* Panel de resultado */
  #rrhh-panel-simular .liq-costo-detalle { margin-top: 12px; font-size: 0.82rem; }
  #rrhh-panel-simular .liq-costo-detalle summary { cursor: pointer; color: var(--muted); padding: 6px 0; }
  #rrhh-panel-simular .liq-parcial { font-size: 0.76rem; color: var(--warning); line-height: 1.4; margin-top: 8px; }
  #rrhh-panel-simular .liq-comparacion { margin-top: 14px; border-top: 1px solid var(--border); padding-top: 12px; }
  #rrhh-panel-simular .liq-comparacion-titulo { font-size: 0.8rem; font-weight: 600; margin-bottom: 6px; }
  #rrhh-panel-simular .liq-comparacion-nota { font-size: 0.76rem; margin-top: 6px; }

  /* Una columna en pantalla angosta, y el resultado deja de ser sticky: en
     un teléfono, pegar el panel arriba se come la pantalla. */



  /* ═══════════ Simular liquidación · rediseño 15/9/2026 ═══════════

     SELECCIÓN → CONTEXTO → VARIABLES → RESULTADO. El resultado deja de ser
     una caja al costado: en escritorio ocupa su propia columna y queda
     pegado arriba mientras se editan las variables.

     Todo cuelga de #rrhh-panel-simular para no escaparse a las otras
     pestañas de RR.HH. ------------------------------------------------- */

  /* El --muted global (#64748B) queda en 4.45:1 sobre el fondo de la app y
     en 4.11:1 sobre el violeta claro de la tarjeta de modo: por debajo del
     4.5:1 que WCAG AA pide para texto chico (medido, no estimado). Se
     redefine el token PARA ESTA PANTALLA en lugar de tocar el global, que
     lo comparte toda la aplicación. */
  #rrhh-panel-simular { --muted: #5B6A80; }

  /* Misma razón para el badge verde de "Uwigo": el --success global (#10B981)
     es un verde de relleno y como texto sobre su propio fondo claro da
     2.4:1. Se oscurece SÓLO dentro de esta pantalla (5.1:1). */
  #rrhh-panel-simular .badge-success { color: #0F7A53; }

  /* Única excepción al prefijo: .sr-only es una utilidad genérica (texto sólo
     para lectores de pantalla) y no existía en la hoja. Nace acá porque esta
     pantalla es la primera que la necesita. */
  .sr-only {
    position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
    overflow: hidden; clip-path: inset(50%); white-space: nowrap;
  }
  /* BUG REAL, visto en el banco de pruebas el 15/9/2026: el `display: grid`
     de .sim-contexto le gana al `display: none` que el navegador le da a
     [hidden] (regla de autor vs. hoja del navegador), así que la tarjeta
     oculta seguía ocupando 30px en blanco. Vale para toda tarjeta del panel
     que se muestre y se esconda. */
  #rrhh-panel-simular [hidden] { display: none !important; }

  /* Los montos en cifras de ancho fijo: si no, al recalcular bailan de
     izquierda a derecha y cuesta comparar dos escenarios. */
  #rrhh-panel-simular .money,
  #rrhh-panel-simular .liq-input-monto,
  #rrhh-panel-simular .sim-liquido-monto { font-variant-numeric: tabular-nums; }

  /* ---------- Encabezado ---------- */

  #rrhh-panel-simular .sim-head {
    display: flex; justify-content: space-between; align-items: flex-end;
    gap: 24px; margin-bottom: 16px; flex-wrap: wrap;
  }
  #rrhh-panel-simular .sim-head h2 { margin: 0; }
  #rrhh-panel-simular .sim-head-aside {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  }
  #rrhh-panel-simular .sim-aviso {
    font-size: 0.74rem; color: var(--muted); background: var(--bg);
    border: 1px solid var(--border); border-radius: 999px; padding: 6px 12px;
    white-space: nowrap;
  }

  /* ---------- Barra de selección ---------- */

  #rrhh-panel-simular .sim-seleccion { padding: 14px 16px; margin-bottom: 12px; }
  #rrhh-panel-simular .sim-seleccion-grid {
    display: grid;
    grid-template-columns: minmax(200px, 0.9fr) minmax(220px, 1.25fr) auto auto;
    gap: 12px; align-items: end;
  }
  #rrhh-panel-simular .sim-seleccion-accion { height: 42px; white-space: nowrap; }
  #rrhh-panel-simular .sim-campo-ayuda { font-size: 0.72rem; color: var(--muted); margin: 4px 0 0; }
  #rrhh-panel-simular .sim-seleccion-error {
    margin: 10px 0 0; font-size: 0.8rem; color: var(--danger);
  }

  /* ---------- Contexto del trabajador ---------- */

  #rrhh-panel-simular .sim-contexto {
    display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 1.2fr) auto;
    align-items: center; gap: 18px; padding: 14px 16px; margin-bottom: 12px;
  }
  #rrhh-panel-simular .sim-contexto-identidad { display: flex; align-items: center; gap: 12px; min-width: 0; }
  #rrhh-panel-simular .sim-avatar {
    flex: none; display: grid; place-items: center; width: 42px; height: 42px;
    border-radius: 50%; background: var(--violet-soft, #f1ecfc); color: var(--primary);
    font-size: 0.85rem; font-weight: 700; letter-spacing: .02em;
  }
  #rrhh-panel-simular .sim-contexto-identidad strong { display: block; font-size: 0.95rem; }
  #rrhh-panel-simular .sim-contexto-identidad span { font-size: 0.78rem; }
  #rrhh-panel-simular .sim-contexto-datos {
    display: flex; gap: 26px; margin: 0; min-width: 0; flex-wrap: wrap;
  }
  #rrhh-panel-simular .sim-contexto-datos dt {
    font-size: 0.7rem; text-transform: uppercase; letter-spacing: .07em; color: var(--muted);
  }
  #rrhh-panel-simular .sim-contexto-datos dd { margin: 3px 0 0; font-size: 0.85rem; font-weight: 600; }
  #rrhh-panel-simular .sim-contexto-estado { display: flex; align-items: center; gap: 10px; }
  #rrhh-panel-simular .sim-contexto-estado strong { display: block; font-size: 0.82rem; }
  #rrhh-panel-simular .sim-contexto-estado span { font-size: 0.72rem; }
  #rrhh-panel-simular .sim-punto {
    flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--muted); display: inline-block;
  }
  #rrhh-panel-simular .sim-punto-ok { background: var(--success-icon, #16a34a); }
  #rrhh-panel-simular .sim-punto-warning { background: var(--warning-icon, #d98a22); }

  /* ---------- Progreso ---------- */

  #rrhh-panel-simular .sim-pasos {
    display: flex; align-items: center; gap: 10px; margin-bottom: 14px; flex-wrap: wrap;
  }
  #rrhh-panel-simular .sim-paso {
    display: flex; align-items: center; gap: 8px;
    font-size: 0.8rem; color: var(--muted);
  }
  /* La línea entre etapas es decorativa: si no entra, desaparece sin dejar
     el texto cortado. */
  #rrhh-panel-simular .sim-paso + .sim-paso::before {
    content: ""; width: clamp(16px, 6vw, 70px); height: 1px;
    background: var(--border); margin-right: 2px;
  }
  #rrhh-panel-simular .sim-paso-marca {
    display: grid; place-items: center; width: 22px; height: 22px; border-radius: 50%;
    border: 1px solid var(--border); font-size: 0.72rem; font-weight: 700; background: var(--card);
  }
  #rrhh-panel-simular .sim-paso.es-actual { color: var(--text); font-weight: 600; }
  #rrhh-panel-simular .sim-paso.es-actual .sim-paso-marca {
    border-color: var(--primary); color: var(--primary);
  }
  /* BUG REAL, visto en el banco el 15/9/2026: el último paso es a la vez
     "hecho" y "actual", y `.es-actual .sim-paso-marca` (más específica) le
     ponía el check violeta SOBRE el círculo violeta — invisible. El check
     manda siempre, esté o no marcado como actual. */
  #rrhh-panel-simular .sim-paso-marca-ok,
  #rrhh-panel-simular .sim-paso.es-actual .sim-paso-marca-ok {
    background: var(--primary); border-color: var(--primary); color: #fff;
  }
  #rrhh-panel-simular .sim-paso.es-hecho { color: var(--text); }

  /* ---------- Distribución ---------- */

  #rrhh-panel-simular .sim-workspace {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(340px, 400px);
    align-items: start; gap: 20px;
  }
  #rrhh-panel-simular .sim-form { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
  #rrhh-panel-simular .sim-result-col { position: sticky; top: 16px; min-width: 0; }

  /* ---------- Modo de cálculo ---------- */

  #rrhh-panel-simular .sim-modos { padding: 12px 14px; border: 1px solid var(--border); }
  #rrhh-panel-simular .sim-modos-legend {
    font-size: 0.72rem; text-transform: uppercase; letter-spacing: .08em;
    color: var(--muted); font-weight: 700; padding: 0 0 8px;
  }
  #rrhh-panel-simular .sim-modos-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
  #rrhh-panel-simular .sim-modo {
    display: flex; align-items: center; gap: 12px; min-height: 58px; padding: 10px 14px;
    border: 1px solid var(--border); border-radius: 10px; cursor: pointer; background: var(--card);
    transition: border-color 160ms ease, background-color 160ms ease;
  }
  /* El radio real existe y recibe el foco; se esconde a la vista pero no del
     teclado ni del lector de pantalla. */
  #rrhh-panel-simular .sim-modo input {
    position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0;
  }
  #rrhh-panel-simular .sim-modo-ico { display: grid; place-items: center; color: var(--muted); flex: none; }
  #rrhh-panel-simular .sim-modo-ico svg { width: 18px; height: 18px; }
  #rrhh-panel-simular .sim-modo-txt strong { display: block; font-size: 0.87rem; }
  #rrhh-panel-simular .sim-modo-txt small { display: block; margin-top: 2px; font-size: 0.74rem; color: var(--muted); }
  #rrhh-panel-simular .sim-modo:has(input:checked) {
    border-color: var(--primary); background: var(--violet-soft, #f1ecfc);
  }
  #rrhh-panel-simular .sim-modo:has(input:checked) .sim-modo-ico,
  #rrhh-panel-simular .sim-modo:has(input:checked) .sim-modo-txt strong { color: var(--primary); }
  #rrhh-panel-simular .sim-modo:has(input:focus-visible) {
    outline: 3px solid rgba(124, 58, 237, 0.42); outline-offset: 2px;
  }

  /* ---------- Contrato y asistencia ---------- */

  #rrhh-panel-simular .sim-contrato-grid {
    display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px;
  }
  #rrhh-panel-simular .sim-asistencia-grid {
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px;
  }
  #rrhh-panel-simular .sim-stepper { display: flex; align-items: stretch; }
  #rrhh-panel-simular .sim-stepper input {
    flex: 1; min-width: 0; text-align: center; border-radius: 0;
    border-left: 0; border-right: 0; font-variant-numeric: tabular-nums;
  }
  /* Se le sacan las flechitas nativas: al lado de los botones − y + son dos
     controles para lo mismo, pegados. */
  #rrhh-panel-simular .sim-stepper input::-webkit-outer-spin-button,
  #rrhh-panel-simular .sim-stepper input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
  #rrhh-panel-simular .sim-stepper input[type="number"] { -moz-appearance: textfield; appearance: textfield; }
  #rrhh-panel-simular .sim-stepper-btn {
    flex: none; width: 38px; border: 1px solid var(--border); background: var(--bg);
    color: var(--text); font-size: 1rem; line-height: 1; cursor: pointer;
    transition: background-color 160ms ease;
  }
  #rrhh-panel-simular .sim-stepper-btn:first-child { border-radius: 8px 0 0 8px; }
  #rrhh-panel-simular .sim-stepper-btn:last-child { border-radius: 0 8px 8px 0; }
  #rrhh-panel-simular .sim-stepper-btn:hover { background: var(--violet-soft, #f1ecfc); }

  /* ---------- Subtotales de la tabla ---------- */

  /* No son KPI comerciales: son la suma de la tabla que está justo abajo. */
  #rrhh-panel-simular .sim-subtotales {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-bottom: 12px;
  }
  #rrhh-panel-simular .sim-subtotal {
    display: flex; align-items: center; justify-content: space-between; gap: 10px;
    padding: 10px 14px; border-radius: 10px; border: 1px solid var(--border);
  }
  #rrhh-panel-simular .sim-subtotal span { font-size: 0.78rem; color: var(--muted); }
  #rrhh-panel-simular .sim-subtotal b { font-size: 1rem; }
  #rrhh-panel-simular .sim-subtotal-haberes { background: var(--success-bg, #eaf8f2); border-color: #bfe6d5; }
  #rrhh-panel-simular .sim-subtotal-haberes b { color: var(--success-icon, #12805a); }
  #rrhh-panel-simular .sim-subtotal-descuentos { background: var(--warning-bg, #fff7e8); border-color: #f0dcb4; }
  #rrhh-panel-simular .sim-subtotal-descuentos b { color: var(--warning); }
  /* El campo que impide calcular se ve, además de nombrarse en el panel. */
  #rrhh-panel-simular .sim-campo-falta,
  #rrhh-panel-simular .sim-campo-falta:focus {
    border-color: var(--danger); background: #fff6f6;
  }

  /* Cuando el cálculo no está al día, estos dos montos son del escenario
     anterior. Se marcan con borde punteado y con texto ("· sin actualizar"),
     NO bajándoles la opacidad: atenuarlos arruinaría el contraste que recién
     se corrigió más arriba. */
  #rrhh-panel-simular .sim-subtotales-viejo .sim-subtotal {
    border-style: dashed; background: var(--bg);
  }

  /* ---------- Opciones avanzadas ---------- */

  #rrhh-panel-simular .sim-avanzadas { padding: 0; }
  #rrhh-panel-simular .sim-avanzadas-summary {
    display: flex; align-items: center; gap: 8px; padding: 14px 16px; cursor: pointer;
    font-size: 0.87rem; font-weight: 600; list-style: none;
  }
  #rrhh-panel-simular .sim-avanzadas-summary::-webkit-details-marker { display: none; }
  #rrhh-panel-simular .sim-avanzadas-summary svg { transition: transform 160ms ease; }
  #rrhh-panel-simular .sim-avanzadas[open] .sim-avanzadas-summary svg { transform: rotate(90deg); }
  #rrhh-panel-simular .sim-avanzadas-body { padding: 0 16px 16px; display: grid; gap: 12px; }

  /* ---------- Panel de resultado ---------- */

  #rrhh-panel-simular .sim-result {
    overflow: hidden; border-top: 3px solid var(--primary); padding: 18px 20px 16px;
  }
  #rrhh-panel-simular .sim-result-head {
    display: flex; align-items: flex-start; justify-content: space-between; gap: 12px;
    padding-bottom: 12px; border-bottom: 1px solid var(--border);
  }
  #rrhh-panel-simular .sim-result-head h3 { margin: 0; font-size: 0.95rem; }
  #rrhh-panel-simular .sim-result-periodo { margin: 2px 0 0; font-size: 0.75rem; color: var(--muted); }
  /* El estado lleva icono y texto: el color solo no alcanza. */
  #rrhh-panel-simular .sim-estado {
    display: inline-flex; align-items: center; gap: 5px; flex: none;
    font-size: 0.73rem; font-weight: 600; padding: 4px 9px; border-radius: 999px;
    border: 1px solid var(--border); color: var(--muted); background: var(--bg);
  }
  #rrhh-panel-simular .sim-estado-ok { color: var(--success-icon, #12805a); border-color: #bfe6d5; background: var(--success-bg, #eaf8f2); }
  #rrhh-panel-simular .sim-estado-warning { color: var(--warning); border-color: #f0dcb4; background: var(--warning-bg, #fff7e8); }
  #rrhh-panel-simular .sim-estado-danger { color: var(--danger); border-color: #f2c5c5; background: #fff0f0; }
  #rrhh-panel-simular .sim-estado-info { color: var(--primary); border-color: #d8c8fb; background: var(--violet-soft, #f1ecfc); }

  #rrhh-panel-simular .sim-liquido { padding: 16px 0 14px; }
  #rrhh-panel-simular .sim-liquido-label { display: block; font-size: 0.78rem; color: var(--muted); }
  #rrhh-panel-simular .sim-liquido-monto {
    display: block; margin-top: 4px; font-size: clamp(2rem, 3vw, 2.6rem);
    font-weight: 750; line-height: 1.05; letter-spacing: -.03em;
  }

  #rrhh-panel-simular .sim-result-lineas { margin: 0; display: grid; gap: 7px; }
  #rrhh-panel-simular .sim-result-lineas > div {
    display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  }
  #rrhh-panel-simular .sim-result-lineas dt { font-size: 0.82rem; color: var(--muted); }
  #rrhh-panel-simular .sim-result-lineas dd { margin: 0; font-size: 0.86rem; font-weight: 600; }
  #rrhh-panel-simular .sim-negativo { color: var(--warning); }

  #rrhh-panel-simular .sim-barra {
    display: flex; height: 8px; border-radius: 999px; overflow: hidden;
    background: var(--border); margin-top: 14px;
  }
  #rrhh-panel-simular .sim-barra span { transition: width 220ms ease; }
  #rrhh-panel-simular .sim-barra-haberes { background: var(--success-icon, #20a879); }
  #rrhh-panel-simular .sim-barra-descuentos { background: var(--warning-icon, #d98a22); }
  #rrhh-panel-simular .sim-barra-leyenda {
    display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 8px; font-size: 0.74rem; color: var(--muted);
  }
  #rrhh-panel-simular .sim-barra-leyenda span { display: inline-flex; align-items: center; gap: 6px; }
  #rrhh-panel-simular .sim-barra-leyenda b { color: var(--text); }

  #rrhh-panel-simular .sim-legales { margin-top: 16px; border-top: 1px solid var(--border); padding-top: 12px; }
  #rrhh-panel-simular .sim-legales h4 { margin: 0 0 8px; font-size: 0.8rem; }
  #rrhh-panel-simular .sim-legales dl { margin: 0; display: grid; gap: 6px; }
  #rrhh-panel-simular .sim-legales > dl > div {
    display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  }
  #rrhh-panel-simular .sim-legales dt { font-size: 0.79rem; color: var(--muted); }
  #rrhh-panel-simular .sim-legales dd { margin: 0; font-size: 0.82rem; font-weight: 600; }

  #rrhh-panel-simular .sim-result-nota {
    margin-top: 14px; font-size: 0.72rem; color: var(--muted); line-height: 1.5;
  }
  #rrhh-panel-simular .sim-result-acciones { margin-top: 12px; display: grid; gap: 8px; justify-items: center; }
  #rrhh-panel-simular .sim-restablecer { font-size: 0.78rem; }
  #rrhh-panel-simular .sim-result-vacio { font-size: 0.84rem; line-height: 1.5; padding: 18px 0; }
  #rrhh-panel-simular .sim-result-espera { display: flex; flex-direction: column; gap: 10px; padding: 18px 0; }

  /* ---------- Foco visible en todos los controles de la pantalla ---------- */

  #rrhh-panel-simular :is(button, input, select, summary, [role="button"]):focus-visible,
  /* El <select> del período lo pisaba una regla vieja y más específica
     (`.liq-periodo-select-wrap select:focus { outline: none }`), así que
     tabulando hasta él el foco desaparecía. Se repone con más peso, sin
     tocar esa regla, que la comparten otras pantallas. */
  #rrhh-panel-simular .liq-periodo-select-wrap select:focus-visible {
    outline: 3px solid rgba(124, 58, 237, 0.42); outline-offset: 2px;
  }

  /* ---------- Responsive ---------- */

  /* Escritorio compacto: el panel se angosta antes que el formulario. */
  @media (max-width: 1279px) {
    #rrhh-panel-simular .sim-workspace { grid-template-columns: minmax(0, 1fr) 340px; }
    #rrhh-panel-simular .sim-contrato-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  }

  /* Tablet: una columna y el resultado deja de estar pegado arriba; en una
     pantalla baja, un panel sticky se come la mitad del alto. */
  @media (max-width: 1023px) {
    #rrhh-panel-simular .sim-workspace { grid-template-columns: minmax(0, 1fr); }
    /* En una columna el resultado va después del contexto y antes de las
       opciones avanzadas (lo pide el documento). Al final de la página
       quedaba fuera de vista: se editaba una variable y no se veía nada. */
    #rrhh-panel-simular .sim-result-col { position: static; order: -1; }
    #rrhh-panel-simular .sim-seleccion-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    #rrhh-panel-simular .sim-seleccion-accion { grid-column: span 1; }
    #rrhh-panel-simular .sim-contexto { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
    #rrhh-panel-simular .sim-contexto-estado { grid-column: 1 / -1; }
  }

  @media (max-width: 767px) {
    #rrhh-panel-simular .sim-head { align-items: stretch; }
    #rrhh-panel-simular .sim-seleccion-grid,
    #rrhh-panel-simular .sim-contrato-grid,
    #rrhh-panel-simular .sim-asistencia-grid,
    #rrhh-panel-simular .sim-subtotales,
    #rrhh-panel-simular .sim-modos-grid { grid-template-columns: minmax(0, 1fr); }
    #rrhh-panel-simular .sim-seleccion-accion { width: 100%; }
    #rrhh-panel-simular .sim-contexto { grid-template-columns: minmax(0, 1fr); }
    #rrhh-panel-simular .sim-contexto-estado { flex-wrap: wrap; }
    /* La tabla se desplaza dentro de su caja, nunca arrastrando la página.
       El `position: relative` no es decorativo: dentro de la tabla hay
       .sr-only, que es `position: absolute`, y sin un ancestro posicionado
       su bloque contenedor queda FUERA de esta caja — se escapaba del
       recorte y estiraba la página a 558px en un móvil de 360px (medido). */
    #rrhh-panel-simular .liq-tabla-wrap { overflow-x: auto; position: relative; }
    /* Con el dedo, 31px de alto es un blanco chico. Los 40px que el pedido
       exige para las opciones contractuales valen igual para el resto de los
       controles de la pantalla. */
    #rrhh-panel-simular :is(button, select, input:not([type="checkbox"]):not([type="radio"])) {
      min-height: 40px;
    }
  }

  @media (prefers-reduced-motion: reduce) {
    #rrhh-panel-simular *,
    #rrhh-panel-simular *::before,
    #rrhh-panel-simular *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
    }
  }

  /* ---------- Contabilidad: la fila de filtros y las tarjetas ---------- */
  /* TRES tarjetas, no cuatro. .stat-grid es generica (repeat(4,1fr)) y desde
     que Contabilidad quedo con tres KPI la cuarta columna era un hueco
     blanco a la derecha. */
  #view-contabilidad #contabilidad-kpis { grid-template-columns: repeat(3, 1fr); }
  /* El numero a la derecha de la tarjeta, no debajo del rotulo: la tarjeta es
     ancha y el numero es lo que se viene a leer. El bloque de texto ocupa
     todo el ancho que sobra y empuja el valor contra el borde. */
  #view-contabilidad .stat-card > div:last-child {
    flex: 1; display: flex; align-items: center; justify-content: space-between; gap: 12px;
  }
  #view-contabilidad .stat-value { margin-top: 0; }
  /* El rotulo, un punto mas grande: a 0.8rem, en una tarjeta de 400px de
     ancho, quedaba chico al lado del numero (pedido del usuario, 14/9/2026). */
  #view-contabilidad .stat-label { font-size: 0.92rem; }
  /* Los dos botones comparten fila con el buscador y los filtros. La altura
     igualada a la de los campos (42px): un boton de 38 al lado de un select
     de 42 se ve desalineado aunque los dos esten centrados. */
  #view-contabilidad .cont-toolbar-accion { height: 42px; white-space: nowrap; }

  @media (max-width: 900px) {
    /* Apiladas antes que apretadas: tres numeros de 1.5rem no entran en un
       telefono uno al lado del otro. */
    #view-contabilidad #contabilidad-kpis { grid-template-columns: 1fr; }
  }

  /* El panel de detalle es hermano de TODO lo demas (titulo, tabs, KPIs,
     buscador, tablero) - no solo del tablero - para que llegue hasta el
     techo de la pantalla en vez de arrancar mas abajo (pedido explicito
     del usuario: "que lo de arriba se mueva a la izquierda y esto quede
     hasta el techo"). Ver la reestructuracion del HTML de
     #view-f29provisorio: .f29p-page-left agrupa topheader+tabs+paneles,
     .f29p-page-right es el drawer, ambos hijos directos de
     .f29p-page-layout. */
  #view-f29provisorio .f29p-page-layout { display: grid; grid-template-columns: 1fr 460px; gap: 20px; align-items: start; }
  /* Sin empresa seleccionada, el panel de detalle no existe: una sola
     columna a ancho completo. La clase la pone/saca renderF29pDetalle(). */
  #view-f29provisorio .f29p-page-layout.f29p-sin-detalle { grid-template-columns: 1fr; }
  #view-f29provisorio .f29p-page-layout.f29p-sin-detalle .f29p-page-right { display: none; }
  #view-f29provisorio .f29p-page-left { min-width: 0; }
  /* will-change ayuda al navegador a componer este elemento sticky en su
     propia capa - sin esto, en algunos casos quedaba con la posicion vieja
     (un hueco arriba) hasta el primer scroll, en vez de ubicarse bien
     desde el primer render (reportado por el usuario). */
  /* El panel llega hasta el techo, igual que el .drawer de las otras
     secciones. Pedido del usuario el 8/9/2026: "que quede mas arriba como
     las otras secciones".
     Con sticky no alcanzaba: el top: 0 es relativo al contenedor, y
     .main-area tiene su propio padding, asi que quedaban 24px de aire
     arriba. La tarjeta pasa a fixed -como .drawer- y esta columna se queda
     RESERVANDO su ancho en la grilla, para que la tabla de la izquierda no
     se corra al abrirlo y cerrarlo. */
  #view-f29provisorio .f29p-page-right { position: relative; }
  /* El panel es un drawer de 2 zonas (header/tabs fijos, contenido con
     scroll propio; sin pie desde el 19/10/2026) - por eso el padding pasa de la tarjeta a
     cada zona por separado, y el overflow vive en .f29p-drawer-content, no
     en la tarjeta entera (asi el header nunca se va con el
     scroll). Ver renderF29pDetalle(). */
  /* Altura fija (no solo un tope): antes el panel se achicaba al tamaño de
     su contenido y quedaba mas corto que el tablero de la izquierda,
     dejando un hueco visual a la derecha - pedido explicito del usuario
     ("tiene que cubrir toda esa parte de la derecha"). */
  /* 40px dejaba el footer (Guardar cambios/Descargar PDF) pegado al borde
     de abajo, a veces tapado por la barra de tareas del sistema - un poco
     mas de margen (70px) para que siempre quede holgado. */
  /* 50px y no 70px porque el panel ahora arranca en top: 0 - se le quitaron
     20px arriba, asi que se le devuelven abajo y el footer conserva el mismo
     aire de siempre (que fue un pedido explicito: sin eso queda pegado al
     borde y a veces tapado por la barra de tareas). */
  /* Pegada al techo, a la derecha y AL PISO, como .drawer.
     Antes el alto era calc(100vh - 24px): esos 24px eran para que el pie no
     quedara pegado al borde ni tapado por la barra de tareas (pedido de
     entonces), pero se veian como una franja de fondo abajo del panel
     -pedido nuevo del usuario el 8/9/2026: "tiene que estar tocando tambien
     el piso"-. El aire no se pierde, se muda ADENTRO: el pie lleva su propio
     padding inferior, donde nunca se lee como un hueco. En pantallas chicas
     ya era 100vh desde antes (ver mas abajo), asi que esto solo alinea el
     escritorio con lo que el movil ya hacia. Sin radio en NINGUNA esquina:
     al tocar los cuatro bordes, una esquina redondeada se ve cortada. */
  #view-f29provisorio .f29p-result-card {
    position: fixed; top: 0; right: 0; z-index: 40;
    width: 460px; max-width: 100vw;
    padding: 0; height: 100vh; max-height: 100vh;
    display: flex; flex-direction: column; overflow: hidden;
    border-radius: 0;
  }

  /* La animacion de entrada y salida, tambien para parecerse al .drawer de
     las otras secciones: el panel se desliza desde la derecha en vez de
     aparecer de golpe.
     Solo corre en la apertura y el cierre REALES, no en cada re-render
     (guardar, cambiar de periodo, recalcular): renderF29pDetalle se llama
     muchas veces con la misma empresa abierta y animar ahi seria un
     parpadeo constante. Ver f29pDetalleVisible en f29-provisorio.view.js. */
  /* Las clases van en la MISMA tarjeta, no en un contenedor: #f29p-detalle
     ES la .f29p-result-card (renderF29pDetalle le cambia el innerHTML). Con
     un selector de descendiente esto no aplicaba nunca y la animacion no
     corria - visto en el navegador, no en el codigo. */
  #view-f29provisorio .f29p-result-card.f29p-detalle-entrando {
    animation: f29p-drawer-entra .26s cubic-bezier(.22,1,.36,1) both;
  }
  #view-f29provisorio .f29p-result-card.f29p-detalle-saliendo {
    animation: f29p-drawer-sale .2s ease-in both;
  }
  @keyframes f29p-drawer-entra {
    from { transform: translateX(100%); }
    to   { transform: translateX(0); }
  }
  @keyframes f29p-drawer-sale {
    from { transform: translateX(0); }
    to   { transform: translateX(100%); }
  }
  @media (prefers-reduced-motion: reduce) {
    #view-f29provisorio .f29p-result-card.f29p-detalle-entrando,
    #view-f29provisorio .f29p-result-card.f29p-detalle-saliendo { animation: none; }
  }
  #view-f29provisorio .f29p-drawer-header { flex-shrink: 0; position: relative; padding: 20px 22px 0; }
  #view-f29provisorio .f29p-drawer-close {
    position: absolute; top: 16px; right: 16px; width: 28px; height: 28px; border-radius: 8px; border: none;
    background: var(--bg); color: var(--muted); font-size: 1.1rem; line-height: 1; cursor: pointer; display: flex;
    align-items: center; justify-content: center;
  }
  #view-f29provisorio .f29p-drawer-close:hover { background: var(--border); color: var(--text); }
  #view-f29provisorio .f29p-drawer-header h2 { font-size: 1.05rem; padding-right: 34px; }
  #view-f29provisorio .f29p-drawer-tabs { display: flex; gap: 4px; margin-top: 16px; border-bottom: 1px solid var(--border); }
  #view-f29provisorio .f29p-drawer-tab {
    flex: 1; text-align: center; padding: 10px 0 11px; font-size: 0.86rem; font-weight: 700; color: var(--muted);
    background: none; border: none; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px;
  }
  #view-f29provisorio .f29p-drawer-tab.active { color: var(--primary); border-bottom-color: var(--primary); }
  /* El padding de abajo es mayor que el de arriba a propósito: ahí vive el
     aire que antes estaba FUERA del panel (los 24px que lo separaban del
     piso). Así lo último nunca queda pegado al borde ni tapado por la barra
     de tareas, que fue el pedido original, y el panel igual llega al piso.
     Antes ese aire lo daba el pie fijo con "Guardar cambios", que se sacó el
     19/10/2026: cada campo guarda desde su propio botón. */
  #view-f29provisorio .f29p-drawer-content { flex: 1; overflow-y: auto; padding: 18px 22px 30px; scrollbar-width: thin; }

  #view-f29provisorio .f29p-drawer-backdrop { display: none; }
  @media (max-width: 1200px) {
    /* En pantalla chica ocupa todo, y ahi SI va pegado abajo: no hay
       espacio para regalar, y el aire de 24px del escritorio es para que el
       footer no quede contra la barra de tareas, cosa que aca no aplica.
       El height se repite a proposito: la regla base tiene
       calc(100vh - 24px) y un `inset: 0` solo no la vence. */
    #view-f29provisorio .f29p-result-card.f29p-drawer-open {
      position: fixed; inset: 0; z-index: 65;
      height: 100vh; max-height: 100vh; border-radius: 0; width: 100%;
    }
    #view-f29provisorio .f29p-drawer-backdrop.visible {
      display: block; position: fixed; inset: 0; background: rgba(15,23,42,.45); z-index: 64;
    }
  }
  @media (min-width: 700px) and (max-width: 1200px) {
    #view-f29provisorio .f29p-result-card.f29p-drawer-open { left: auto; width: min(94vw, 500px); }
  }

  /* Tarjeta lavanda del resultado: solo el F29 estimado y su explicacion.
     IVA determinado / PPM / Anticipo de IVA vivian aca a la derecha y se
     sacaron - las tres cifras ya estan en el resumen de abajo, y al irse
     la columna la explicacion usa todo el ancho (antes 190px). */
  /* El monto va a la derecha del título, en la misma línea (19/10/2026,
     pedido del dueño: "así nos ahorramos espacio"). */
  #view-f29provisorio .f29p-resultado-card {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    background: var(--primary-soft); border: 1px solid var(--primary-soft-border); border-radius: var(--radius-card);
    padding: 12px 18px; margin-bottom: 14px;
  }
  #view-f29provisorio .f29p-resultado-label { display: flex; align-items: center; gap: 4px; font-size: 0.68rem; font-weight: 700; color: var(--primary-dark); text-transform: uppercase; letter-spacing: 0.03em; }
  #view-f29provisorio .f29p-resultado-value { font-size: 1.9rem; font-weight: 800; color: var(--color-navy); line-height: 1.15; text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }

  #view-f29provisorio .f29p-origen-strip {
    display: flex; align-items: center; gap: 8px; background: var(--success-bg); color: #067A46; border-radius: 8px;
    padding: 9px 12px; font-size: 0.74rem; font-weight: 600; margin-bottom: 14px;
  }
  #view-f29provisorio .f29p-origen-strip svg { width: 16px; height: 16px; flex-shrink: 0; }

  /* Acordeones de secciones tributarias */
  #view-f29provisorio .f29p-accordion { border: 1px solid var(--border); border-radius: 10px; margin-bottom: 10px; overflow: hidden; }
  #view-f29provisorio .f29p-accordion-header { display: flex; align-items: center; gap: 8px; padding: 11px 14px; cursor: pointer; user-select: none; background: #FBFBFE; }
  #view-f29provisorio .f29p-accordion-header-title { font-weight: 700; font-size: 0.84rem; flex: 1; }
  #view-f29provisorio .f29p-accordion-badge { font-size: 0.6rem; font-weight: 800; padding: 2px 8px; border-radius: 999px; text-transform: uppercase; letter-spacing: 0.02em; flex-shrink: 0; }
  #view-f29provisorio .f29p-accordion-badge.automatico { background: var(--success-bg); color: #067A46; }
  #view-f29provisorio .f29p-accordion-badge.manual { background: var(--primary-soft); color: var(--primary-dark); }
  #view-f29provisorio .f29p-accordion-badge.mixto { background: var(--info-bg); color: var(--info); }
  #view-f29provisorio .f29p-accordion-chevron { transition: transform .2s; color: var(--muted); flex-shrink: 0; }
  #view-f29provisorio .f29p-accordion.abierto .f29p-accordion-chevron { transform: rotate(180deg); }
  #view-f29provisorio .f29p-accordion-body { display: none; padding: 14px; border-top: 1px solid var(--border); }
  #view-f29provisorio .f29p-accordion.abierto .f29p-accordion-body { display: block; }

  /* Campos automaticos (candado, solo lectura) vs. manuales (lapiz,
     editables) - la diferencia tiene que notarse en el propio campo, sin
     depender de un link aparte (pedido explicito del usuario). */
  #view-f29provisorio .f29p-campo-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 12px; }
  @media (max-width: 480px) { #view-f29provisorio .f29p-campo-grid { grid-template-columns: 1fr; } }
  #view-f29provisorio .f29p-campo-grid-1 { grid-template-columns: 1fr; }
  #view-f29provisorio .f29p-campo { min-height: 40px; }
  #view-f29provisorio .f29p-campo-label { display: flex; align-items: center; gap: 4px; font-size: 0.72rem; font-weight: 700; color: var(--muted); margin-bottom: 4px; }
  #view-f29provisorio .f29p-campo-label svg { width: 12px; height: 12px; flex-shrink: 0; }
  #view-f29provisorio .f29p-campo-box { border-radius: 8px; padding: 8px 10px; font-size: 0.86rem; font-weight: 700; min-height: 40px; display: flex; align-items: center; }
  #view-f29provisorio .f29p-campo-box.automatico { background: #F1F5F9; color: var(--text); border: 1px solid var(--border); }
  #view-f29provisorio .f29p-campo-box.manual { background: #fff; border: 1.5px solid var(--primary); padding: 7px 9px; }
  #view-f29provisorio .f29p-campo-box.manual.f29p-campo-bloqueado { border-color: var(--border); background: var(--bg); }
  #view-f29provisorio .f29p-campo-box input, #view-f29provisorio .f29p-campo-box textarea {
    border: none; background: none; outline: none; font: inherit; font-weight: 700; width: 100%; padding: 0; color: inherit;
  }
  #view-f29provisorio .f29p-campo-box input:disabled { color: var(--muted); cursor: not-allowed; }
  /* Sufijo (%) y "Editar" comparten la fila con el input, a su derecha */
  #view-f29provisorio .f29p-campo-sufijo { color: var(--muted); font-size: 0.8rem; font-weight: 600; flex-shrink: 0; padding-left: 4px; }
  #view-f29provisorio .f29p-campo-editar {
    flex-shrink: 0; margin-left: 8px; border: 1px solid var(--border); background: #fff; color: var(--primary);
    font-size: 0.68rem; font-weight: 700; padding: 3px 9px; border-radius: 6px; cursor: pointer;
  }
  #view-f29provisorio .f29p-campo-editar:hover { border-color: var(--primary); background: var(--primary-soft); }
  /* "Guardar" en el mismo lugar del "Editar" (19/10/2026): relleno violeta
     cuando hay algo que guardar; gris y apagado mientras no. */
  #view-f29provisorio .f29p-campo-guardar { border-color: var(--primary); background: var(--primary); color: #fff; }
  #view-f29provisorio .f29p-campo-guardar:hover { background: var(--primary-dark); border-color: var(--primary-dark); }
  #view-f29provisorio .f29p-campo-guardar:disabled { border-color: var(--border); background: #fff; color: var(--muted); cursor: default; }
  #view-f29provisorio .f29p-guardar-fila { display: flex; justify-content: flex-end; margin-top: 6px; }
  #view-f29provisorio .f29p-campo-hint { font-size: 0.64rem; color: var(--muted); margin-top: 3px; }
  #view-f29provisorio .f29p-campo-hint.pendiente { color: var(--warning); font-weight: 600; }

  #view-f29provisorio .f29p-board { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; align-items: start; }
  @media (max-width: 1200px) { #view-f29provisorio .f29p-board { grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 640px) { #view-f29provisorio .f29p-board { grid-template-columns: 1fr; } }
  #view-f29provisorio .f29p-col-header { display: flex; align-items: center; gap: 8px; font-size: 0.8rem; font-weight: 700; color: var(--text); margin-bottom: 10px; padding: 0 2px; }
  #view-f29provisorio .f29p-col-count { background: #F1F5F9; color: var(--muted); font-size: 0.72rem; font-weight: 700; padding: 1px 8px; border-radius: 999px; }
  #view-f29provisorio .f29p-col-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
  #view-f29provisorio .f29p-col-dot.pendiente { background: var(--warning); }
  #view-f29provisorio .f29p-col-dot.calculado { background: var(--success); }
  #view-f29provisorio .f29p-col-dot.aprobado { background: var(--primary); }
  #view-f29provisorio .f29p-col-dot.pagado { background: var(--info); }
  #view-f29provisorio .f29p-col-cards { display: flex; flex-direction: column; gap: 10px; min-height: 40px; }
  #view-f29provisorio .f29p-col-empty { font-size: 0.78rem; color: var(--muted); background: var(--bg); border: 1px dashed var(--border); border-radius: var(--radius-card); padding: 14px; text-align: center; }

  #view-f29provisorio .f29p-card { position: relative; background: #fff; border: 1px solid var(--border); border-radius: var(--radius-card); padding: 14px; cursor: pointer; transition: border-color .15s, box-shadow .15s; container-type: inline-size; container-name: f29p-card; }
  #view-f29provisorio .f29p-card:hover { border-color: var(--primary); box-shadow: 0 2px 10px rgba(109,40,217,.08); }
  #view-f29provisorio .f29p-card.f29p-card-selected { border-color: var(--primary); background: var(--primary-soft); }
  /* Pagado con diferencia entre lo declarado y lo calculado (19/10/2026):
     tono rojo, el mismo del Validador. Elegida conserva el rojo y toma el
     borde violeta de la selección. */
  #view-f29provisorio .f29p-card.f29p-card-diferencia { background: #FEF2F2; border-color: #FCA5A5; }
  #view-f29provisorio .f29p-card.f29p-card-diferencia:hover { border-color: #EF4444; box-shadow: 0 2px 10px rgba(239,68,68,.12); }
  #view-f29provisorio .f29p-card.f29p-card-diferencia.f29p-card-selected { background: #FEE2E2; border-color: var(--primary); }
  #view-f29provisorio .f29p-card-diferencia .f29p-card-monto { color: #991B1B; }
  #view-f29provisorio .f29p-card-diferencia .f29p-tag-observado { background: #fff; box-shadow: inset 0 0 0 1px #FCA5A5; }
  #view-f29provisorio .f29p-card-diferencia-linea { font-size: 0.74rem; font-weight: 600; color: #B91C1C; margin-top: 6px; font-variant-numeric: tabular-nums; }
  #view-f29provisorio .f29p-card-name { font-weight: 700; font-size: 0.88rem; color: var(--text); }
  #view-f29provisorio .f29p-card-rut { font-size: 0.74rem; color: var(--muted); margin-top: 1px; }
  #view-f29provisorio .f29p-card-monto { font-size: 1rem; font-weight: 800; color: var(--text); margin-top: 8px; }
  #view-f29provisorio .f29p-card-monto.f29p-card-monto-vacio { font-size: 0.76rem; font-weight: 600; color: var(--muted); }
  #view-f29provisorio .f29p-card-meta { font-size: 0.72rem; color: var(--muted); margin-top: 6px; }
  #view-f29provisorio .f29p-card-faltan { font-size: 0.72rem; color: var(--warning); margin-top: 6px; }
  #view-f29provisorio .f29p-card-badges { display: flex; gap: 4px; flex-wrap: wrap; margin-top: 6px; }
  /* El monto a la izquierda y la información (actualización y etiquetas) a la
     derecha (2/10/2026). Antes iban apilados y media tarjeta quedaba vacía. */
  #view-f29provisorio .f29p-card-fila { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 8px; }
  #view-f29provisorio .f29p-card-fila .f29p-card-monto { margin-top: 0; flex: 0 0 auto; }
  #view-f29provisorio .f29p-card-info { min-width: 0; display: flex; flex-direction: column; align-items: flex-end; gap: 5px; text-align: right; }
  #view-f29provisorio .f29p-card-info .f29p-card-meta,
  #view-f29provisorio .f29p-card-info .f29p-card-badges { margin-top: 0; }
  #view-f29provisorio .f29p-card-info .f29p-card-badges { justify-content: flex-end; }
  #view-f29provisorio .f29p-card-fecha { white-space: nowrap; }
  /* Tarjeta muy angosta (pantalla chica): lado a lado ya no entra el monto
     junto a la fecha, así que vuelve a apilarse, como antes. Mide el interior
     de la tarjeta (sin su relleno), no la ventana: con el panel de una
     empresa abierto (tarjetas de 258px, 228 por dentro) sigue lado a lado y
     las etiquetas bajan a dos líneas; se apila recién bajo los 230px de
     tarjeta. Medido el 2/10/2026 sobre el tablero real. */
  @container f29p-card (max-width: 200px) {
    #view-f29provisorio .f29p-card-fila { flex-direction: column; align-items: flex-start; gap: 6px; }
    #view-f29provisorio .f29p-card-info { align-items: flex-start; text-align: left; }
    #view-f29provisorio .f29p-card-info .f29p-card-badges { justify-content: flex-start; }
  }


  #view-f29provisorio .f29p-detalle-header { margin-bottom: 14px; }
  #view-f29provisorio .f29p-detalle-header h2 { font-size: 1.02rem; }
  #view-f29provisorio .f29p-detalle-header .muted { font-size: 0.78rem; margin-top: 2px; }
  #view-f29provisorio .f29p-monto-box { background: var(--primary-soft); border: 1px solid var(--primary-soft-border); border-radius: var(--radius-card); padding: 16px 18px; margin-bottom: 16px; text-align: center; }
  #view-f29provisorio .f29p-monto-label { font-size: 0.72rem; font-weight: 700; color: var(--primary-dark); text-transform: uppercase; letter-spacing: 0.03em; }
  #view-f29provisorio .f29p-monto-value { font-size: 1.7rem; font-weight: 800; color: var(--color-navy); margin-top: 4px; }
  #view-f29provisorio .f29p-monto-value.f29p-monto-vacio { font-size: 0.95rem; color: var(--muted); font-weight: 600; }

  #view-f29provisorio .f29p-field { margin-bottom: 12px; }
  #view-f29provisorio .f29p-field label { display: block; font-size: 0.76rem; font-weight: 600; color: var(--muted); margin-bottom: 4px; }
  #view-f29provisorio .f29p-field input, #view-f29provisorio .f29p-field textarea { width: 100%; border: 1px solid var(--border); border-radius: var(--radius-control); padding: 8px 10px; font-size: 0.85rem; outline: none; font-family: inherit; }
  #view-f29provisorio .f29p-field input:disabled { background: var(--bg); color: var(--muted); cursor: not-allowed; }
  #view-f29provisorio .f29p-field input:focus, #view-f29provisorio .f29p-field textarea:focus { border-color: var(--primary); }

  #view-f29provisorio .f29p-line { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--border); font-size: 0.85rem; }
  #view-f29provisorio .f29p-line:last-child { border-bottom: none; }
  #view-f29provisorio .f29p-line-label { color: var(--muted); }
  /* El remanente que viene de nuestro resumen (el mes anterior no esta declarado). */
  #view-f29provisorio .f29p-traspasado { display: inline-block; margin-left: 6px; padding: 1px 7px; border-radius: 999px; background: #FEF3C7; color: #92400E; font-size: 0.7rem; font-weight: 600; }
  #view-f29provisorio .f29p-line-value { font-weight: 600; white-space: nowrap; font-variant-numeric: tabular-nums; text-align: right; }
  /* De que esta hecha la linea de arriba (las dos mitades de la retencion
     de honorarios): sangrada, mas chica y sin linea divisoria, para que se
     lea como detalle del total y no como un monto mas que hay que sumar. */
  #view-f29provisorio .f29p-line-sub { border-bottom: none; padding: 2px 0 2px 14px; font-size: 0.78rem; }
  #view-f29provisorio .f29p-line-sub .f29p-line-value { font-weight: 500; color: var(--muted); }
  #view-f29provisorio .f29p-line-total { border-top: 1px solid var(--border); border-bottom: none; margin-top: 4px; padding-top: 10px; }
  #view-f29provisorio .f29p-line-total .f29p-line-label { color: var(--text); font-weight: 700; }
  #view-f29provisorio .f29p-line-total .f29p-line-value { font-weight: 700; font-size: 0.98rem; }

  /* La cuenta del Resumen (f29pResumenCuenta): tres bloques separados por
     una linea, que es como se lee una liquidacion de impuestos. */
  #view-f29provisorio .f29p-cuenta { margin-bottom: 18px; }
  #view-f29provisorio .f29p-cuenta .f29p-line { border-bottom: none; padding: 6px 0; }
  #view-f29provisorio .f29p-line-corte { border-bottom: 1px solid var(--border) !important; padding-bottom: 10px !important; margin-bottom: 4px; }
  /* "Postergar el pago del IVA" (f29pPostergacionEnLaCuenta): una casilla
     bajo la cuenta, con su (i) al lado y no dentro de la etiqueta (tocar el
     (i) no marca la casilla). */
  #view-f29provisorio .f29p-postergar { display: flex; align-items: center; gap: 6px; margin-top: 10px; font-size: 0.82rem; }
  #view-f29provisorio .f29p-postergar label { display: inline-flex; align-items: center; gap: 8px; font-weight: 600; color: var(--text); cursor: pointer; }
  #view-f29provisorio .f29p-postergar input { width: 16px; height: 16px; margin: 0; accent-color: var(--primary); cursor: pointer; }

  /* Los botones de accion del Resumen, uno debajo del otro; "Descargar PDF"
     y "Declarar en el SII" comparten una fila, mitad y mitad. */
  #view-f29provisorio .f29p-acciones { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }
  #view-f29provisorio .f29p-acciones-fila { display: flex; gap: 8px; }
  #view-f29provisorio .f29p-acciones-fila > button { flex: 1 1 0; min-width: 0; }
  /* "Declarar en el SII" con los colores del SII: mitad azul, mitad naranja.
     La sombra del texto lo mantiene legible sobre el naranja. */
  #view-f29provisorio .f29p-btn-sii {
    border: none; border-radius: 10px; padding: 9px 12px; cursor: pointer;
    background: linear-gradient(90deg, #00529B 50%, #F39200 50%);
    color: #fff; font-size: 0.86rem; font-weight: 700; text-shadow: 0 1px 2px rgba(0, 0, 0, .35);
    transition: filter .15s, box-shadow .15s;
  }
  #view-f29provisorio .f29p-btn-sii:hover { filter: brightness(1.06); box-shadow: 0 2px 10px rgba(0, 82, 155, .22); }
  #view-f29provisorio .f29p-btn-sii:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }

  /* "Marcar como aprobado": blanco en reposo, verde al pasar por encima
     (pedido del usuario). No existia ninguna clase de boton verde en el
     proyecto - se arma con el token --success que ya estaba definido. */
  #view-f29provisorio .btn-aprobar {
    background: #fff; color: var(--text); border: 1px solid var(--border);
    transition: background .15s, color .15s, border-color .15s;
  }
  #view-f29provisorio .btn-aprobar:hover:not(:disabled) {
    background: var(--success); color: #fff; border-color: var(--success);
  }

  /* El campo del Factor PPM, unico editable del Resumen. */
  #view-f29provisorio .f29p-campo-ppm { margin-bottom: 8px; }

  #view-f29provisorio .f29p-ayuda-toggle { display: flex; align-items: center; justify-content: space-between; cursor: pointer; user-select: none; padding: 10px 0; border-top: 1px solid var(--border); margin-top: 8px; font-size: 0.82rem; font-weight: 600; color: var(--text); }
  #view-f29provisorio .f29p-ayuda-toggle svg { transition: transform .2s; color: var(--muted); flex-shrink: 0; }
  #view-f29provisorio .f29p-ayuda-toggle.abierto svg { transform: rotate(180deg); }
  #view-f29provisorio .f29p-ayuda-body { display: none; font-size: 0.78rem; color: var(--muted); padding-bottom: 8px; }
  #view-f29provisorio .f29p-ayuda-body.abierto { display: block; }
  #view-f29provisorio .f29p-ayuda-body div { padding: 5px 0; }
  #view-f29provisorio .f29p-ayuda-body b { color: var(--text); }

  #view-f29provisorio .f29p-form-error { color: var(--danger); font-size: 0.78rem; margin-top: 8px; }
  #view-f29provisorio .f29p-form-hint { color: var(--warning); font-size: 0.76rem; margin-top: 6px; }
  #view-f29provisorio .f29p-check-row { display: flex; align-items: center; gap: 8px; font-size: 0.82rem; margin: 10px 0 6px; }
  #view-f29provisorio .f29p-check-row input { width: 16px; height: 16px; accent-color: var(--primary); }

  #view-f29provisorio .f29p-revision-box { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 16px; }
  #view-f29provisorio .f29p-revision-box .btn-secondary, #view-f29provisorio .f29p-revision-box .btn-primary { flex: 1; min-width: 140px; }
  #view-f29provisorio .f29p-revision-link { background: none; border: none; color: var(--muted); font-size: 0.76rem; text-decoration: underline; cursor: pointer; padding: 0; }
  #view-f29provisorio .f29p-revision-link:hover { color: var(--text); }
  /* Deshabilitado tiene que verse deshabilitado (3/10/2026). Con el Resumen
     bloqueado, "Recalcular", "Marcar como aprobado" y "Deshacer" llevan
     disabled, pero solo .btn-primary y .btn-danger tenían su regla: estos se
     veían activos, con cursor de mano y cambio al pasar el mouse, y el clic no
     hacía nada. Misma forma que .btn-danger:disabled. .btn-aprobar es también
     .btn-secondary, así que entra en la primera. */
  #view-f29provisorio .btn-secondary:disabled, #view-f29provisorio .btn-secondary:disabled:hover { background: #fff; opacity: 0.55; cursor: not-allowed; }
  #view-f29provisorio .f29p-revision-link:disabled, #view-f29provisorio .f29p-revision-link:disabled:hover { color: var(--muted); opacity: 0.5; cursor: not-allowed; text-decoration: none; }
  /* "Copiar enlace para ventana InPrivate", debajo de "Declarar en el SII":
     una acción secundaria, centrada y sin peso de botón. */

  /* Calendario tributario: reusa .rrhh-cal-* (globales) + chips propios */
  #view-f29provisorio .f29p-chip { display: block; width: 100%; text-align: left; border: none; border-radius: 5px; padding: 2px 5px; margin-bottom: 2px; font-size: 0.62rem; font-weight: 700; cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  #view-f29provisorio .f29p-chip-pendiente { background: var(--warning-bg); color: var(--warning); }
  #view-f29provisorio .f29p-chip-calculado { background: var(--success-bg); color: var(--success); }
  #view-f29provisorio .f29p-chip-aprobado { background: var(--primary-soft); color: var(--primary-dark); }
  #view-f29provisorio .f29p-chip-pagado { background: var(--info-bg); color: var(--info); }
  #view-f29provisorio .f29p-chip-actualizacion { background: var(--info-bg); color: var(--info); }
  #view-f29provisorio .rrhh-cal-cell.f29p-cal-seleccionada { border-color: var(--primary); box-shadow: inset 0 0 0 1px var(--primary); }
  #view-f29provisorio .f29p-tag-observado { display: inline-flex; align-items: center; gap: 4px; background: var(--danger-bg); color: var(--danger); font-size: 0.68rem; font-weight: 700; padding: 2px 8px; border-radius: 999px; margin-top: 6px; }
  /* Resumen bloqueado (2/10/2026): ya tiene su comprobante en Uwigo. El
     candado de la tarjeta va junto al nombre, sin agregar una fila; el aviso
     del panel va arriba, antes de las pestañas, para verse en las dos. */
  #view-f29provisorio .f29p-card-candado { display: inline-flex; vertical-align: -2px; margin-right: 5px; color: var(--muted); }
  #view-f29provisorio .f29p-card-candado svg { width: 13px; height: 13px; }
  #view-f29provisorio .f29p-bloqueo-aviso { display: flex; align-items: flex-start; gap: 10px; background: var(--info-bg); color: var(--text); border: 1px solid var(--border); border-radius: 10px; padding: 10px 12px; margin-bottom: 14px; font-size: 0.8rem; line-height: 1.35; }
  #view-f29provisorio .f29p-bloqueo-icono { flex: none; display: inline-flex; margin-top: 1px; color: var(--info); }
  #view-f29provisorio .f29p-bloqueo-icono svg { width: 16px; height: 16px; }
  #view-f29provisorio .f29p-bloqueo-texto { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
  #view-f29provisorio .f29p-bloqueo-texto span { color: var(--muted); overflow-wrap: anywhere; }
  #view-f29provisorio .f29p-bloqueo-boton { flex: none; font-size: 0.76rem; padding: 5px 10px; }

  #view-f29provisorio .f29p-dia-item { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--border); }
  #view-f29provisorio .f29p-dia-item:last-child { border-bottom: none; }
  #view-f29provisorio .f29p-dia-item-info { display: flex; flex-direction: column; gap: 2px; }
  #view-f29provisorio .f29p-dia-item-actions { display: flex; gap: 6px; flex-shrink: 0; }
  #view-f29provisorio .f29p-dia-item-actions button { font-size: 0.72rem; padding: 5px 9px; border-radius: 6px; border: 1px solid var(--border); background: #fff; cursor: pointer; }
  #view-f29provisorio .f29p-dia-item-actions button:hover { border-color: var(--primary); color: var(--primary); }

  @media (max-width: 1200px) {
    #view-f29provisorio .f29p-page-layout { grid-template-columns: 1fr; }
    #view-f29provisorio .f29p-page-right { position: static; height: auto; }
    #view-f29provisorio .f29p-result-card:not(.f29p-drawer-open) { height: auto; }
  }

  /* Vista imprimible de "Simular Liquidacion" (ver descargarLiquidacionPDF
     en el script) - #liq-print-area vive fuera de #app-box, oculta en
     pantalla normal, y solo se muestra durante window.print(). No usa
     ninguna libreria de PDF: es una hoja normal que el navegador convierte a
     PDF via su dialogo nativo de impresion ("Guardar como PDF" / "Microsoft
     Print to PDF"), sin agregar dependencias (ver CLAUDE.md). */
  #liq-print-area { display: none; }
  @media print {
    body > *:not(#liq-print-area) { display: none !important; }
    #liq-print-area, #liq-print-area * { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
    #liq-print-area {
      display: block !important;
      font-family: Arial, Helvetica, sans-serif;
      color: var(--color-navy);
      max-width: 740px;
      margin: 0 auto;
      padding: 8px 0 10px;
      font-size: 0.9rem;
    }

    /* Encabezado: logo + marca a la izquierda, periodo + badge a la derecha */
    #liq-print-area .liq-print-topbar {
      display: flex; justify-content: space-between; align-items: center;
      border-bottom: 2px solid var(--primary); padding-bottom: 8px; margin-bottom: 10px;
    }
    #liq-print-area .liq-print-brand { display: flex; align-items: center; gap: 8px; }
    #liq-print-area .liq-print-logo { width: 24px; height: 24px; border-radius: 7px; }
    #liq-print-area .liq-print-wordmark { font-size: 0.95rem; font-weight: 800; color: var(--color-navy); }
    #liq-print-area .liq-print-brand-right { text-align: right; }
    #liq-print-area .liq-print-periodo-label { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.06em; color: var(--muted); text-transform: uppercase; margin-bottom: 3px; }
    #liq-print-area .liq-print-badge {
      display: inline-block; border: 1px solid var(--primary); color: var(--primary);
      font-size: 0.6rem; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase;
      border-radius: 999px; padding: 2px 9px;
    }

    #liq-print-area .liq-print-title { font-size: 1.2rem; font-weight: 800; margin: 0 0 2px; }
    #liq-print-area .liq-print-subtitle { font-size: 0.78rem; color: var(--muted); margin: 0 0 10px; }

    /* Tarjeta UF/UTM del periodo */
    #liq-print-area .liq-print-uf-utm {
      display: flex; align-items: stretch; background: var(--primary-soft); border: 1px solid var(--primary-soft-border);
      border-radius: var(--radius-control); padding: 8px 14px; margin-bottom: 8px;
    }
    #liq-print-area .liq-print-uf-utm-item { flex: 1; display: flex; align-items: center; gap: 8px; }
    #liq-print-area .liq-print-uf-utm-item svg { color: var(--primary); flex-shrink: 0; width: 17px; height: 17px; }
    #liq-print-area .liq-print-uf-utm-texts { flex: 1; }
    #liq-print-area .liq-print-uf-utm-label { font-size: 0.6rem; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase; color: var(--primary-dark); }
    #liq-print-area .liq-print-uf-utm-sub { font-size: 0.68rem; color: var(--muted); }
    #liq-print-area .liq-print-uf-utm-value { font-size: 0.92rem; font-weight: 800; color: var(--primary-dark); white-space: nowrap; }
    #liq-print-area .liq-print-uf-utm-divider { width: 1px; background: var(--primary-soft-border); margin: 0 14px; }

    /* Tarjeta de datos (empresa/trabajador/contrato) */
    #liq-print-area .liq-print-info-card {
      background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-control);
      padding: 8px 14px; margin-bottom: 10px;
    }
    #liq-print-area .liq-print-info-row { display: grid; gap: 10px; padding: 5px 0; border-bottom: 1px solid var(--border); }
    #liq-print-area .liq-print-info-row:last-child { border-bottom: none; padding-bottom: 0; }
    #liq-print-area .liq-print-info-row:first-child { padding-top: 0; }
    #liq-print-area .liq-print-info-row-2 { grid-template-columns: 1fr 1fr; }
    #liq-print-area .liq-print-info-row-3 { grid-template-columns: 1fr 1fr 1fr; }
    #liq-print-area .liq-print-info-row-1 { grid-template-columns: 1fr; }
    #liq-print-area .liq-print-info-label { font-size: 0.6rem; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase; color: var(--muted); margin-bottom: 1px; }
    #liq-print-area .liq-print-info-value { font-size: 0.82rem; font-weight: 700; color: var(--color-navy); }

    /* Cajas Haberes / Descuentos lado a lado */
    #liq-print-area .liq-print-two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px; align-items: start; }
    #liq-print-area .liq-print-box { border-radius: var(--radius-control); padding: 8px 12px; border: 1px solid var(--border); }
    #liq-print-area .liq-print-box-green { background: var(--success-bg); border-color: #B7EFD5; }
    #liq-print-area .liq-print-box-red { background: var(--danger-bg); border-color: #FBD5D5; }
    #liq-print-area .liq-print-box-header { display: flex; align-items: center; gap: 6px; font-size: 0.76rem; font-weight: 800; letter-spacing: 0.02em; text-transform: uppercase; margin-bottom: 5px; }
    #liq-print-area .liq-print-box-green .liq-print-box-header { color: #067A46; }
    #liq-print-area .liq-print-box-red .liq-print-box-header { color: #B91C1C; }
    #liq-print-area .liq-print-icon-circle {
      display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px;
      border-radius: 50%; color: #fff; font-weight: 800; font-size: 0.65rem; flex-shrink: 0;
    }
    #liq-print-area .liq-print-icon-green { background: var(--success); }
    #liq-print-area .liq-print-icon-red { background: var(--danger); }
    #liq-print-area .liq-print-icon-navy { background: var(--color-navy); }
    #liq-print-area .liq-print-box-subtitle { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.02em; text-transform: uppercase; color: #067A46; margin: 5px 0 2px; }
    #liq-print-area .liq-print-box-subtitle:first-of-type { margin-top: 0; }
    #liq-print-area .liq-print-line { display: flex; justify-content: space-between; font-size: 0.72rem; padding: 1px 0; line-height: 1.3; }
    #liq-print-area .liq-print-line-label { color: #3A3A3A; }
    #liq-print-area .liq-print-line-value { font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
    #liq-print-area .liq-print-line-value.liq-negativo { color: var(--danger); }
    #liq-print-area .liq-print-subtotal { display: flex; justify-content: space-between; font-size: 0.74rem; font-weight: 800; border-top: 1px solid rgba(0,0,0,0.12); margin-top: 3px; padding-top: 3px; }
    #liq-print-area .liq-print-box-total {
      display: flex; justify-content: space-between; align-items: baseline; font-size: 0.82rem; font-weight: 800;
      border-radius: var(--radius-control); padding: 6px 10px; margin-top: 6px;
    }
    #liq-print-area .liq-print-box-total-green { background: #D3F5E4; color: #045B33; }
    #liq-print-area .liq-print-box-total-red { background: #FBDADA; color: #8F1616; }
    #liq-print-area .liq-print-box-footnote { font-size: 0.6rem; color: var(--muted); text-align: center; margin-top: 6px; }

    /* Barra de liquido a pagar */
    #liq-print-area .liq-print-liquido {
      display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 8px;
      background: var(--card); border: 1px solid var(--border); border-left: 5px solid var(--primary);
      border-radius: var(--radius-control); padding: 8px 14px; margin-bottom: 10px;
    }
    #liq-print-area .liq-print-liquido-label { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--primary-dark); }
    #liq-print-area .liq-print-liquido-value { font-size: 1.25rem; font-weight: 800; color: var(--primary-dark); }
    #liq-print-area .liq-print-liquido-breakdown { font-size: 0.7rem; color: var(--muted); }
    #liq-print-area .liq-print-liquido-breakdown strong { color: var(--color-navy); }
    #liq-print-area .liq-print-liquido-breakdown strong.liq-negativo { color: var(--danger); }

    /* Costo total empresa */
    #liq-print-area .liq-print-costo-card {
      background: var(--primary-soft); border: 1px solid var(--primary-soft-border); border-radius: var(--radius-control);
      padding: 8px 14px; margin-bottom: 8px;
    }
    #liq-print-area .liq-print-costo-card .liq-print-box-header { color: var(--color-navy); margin-bottom: 6px; }
    #liq-print-area .liq-print-costo-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; margin-bottom: 6px; }
    #liq-print-area .liq-print-costo-item-label { font-size: 0.58rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.01em; margin-bottom: 1px; }
    #liq-print-area .liq-print-costo-item-value { font-size: 0.74rem; font-weight: 700; color: var(--color-navy); }
    #liq-print-area .liq-print-costo-total {
      display: flex; justify-content: space-between; align-items: baseline; font-size: 0.85rem; font-weight: 800;
      color: var(--color-navy); border-top: 1px solid var(--primary-soft-border); padding-top: 6px;
    }

    #liq-print-area .liq-print-footer2 { text-align: center; border-top: 1px solid var(--primary-soft-border); padding-top: 6px; margin-top: 2px; }
    #liq-print-area .liq-print-footer2 p { font-size: 0.62rem; color: var(--muted); margin: 2px 0; }
    #liq-print-area .liq-print-footer2 strong { color: var(--primary-dark); }

    /* Evita que el navegador corte una caja a la mitad entre paginas -
       ademas de achicar tipografias/paddings, esto ayuda a que todo entre
       en una sola hoja sin quedar partido de forma rara. */
    #liq-print-area .liq-print-uf-utm, #liq-print-area .liq-print-info-card,
    #liq-print-area .liq-print-box, #liq-print-area .liq-print-liquido,
    #liq-print-area .liq-print-costo-card, #liq-print-area .liq-print-topbar {
      page-break-inside: avoid;
    }



    /* ============== "Resumen F29" - primera pagina + hojas de detalle ==============
       Rediseno completo (portada + Detalle de Compras/Ventas) siguiendo al
       pie de la letra el boceto exacto provisto por el usuario (elementos
       aislados renderizados y validados contra PDF real antes de integrar -
       ver el proceso en build_spec_v1.js / build_detalle_v1.js del chat).
       Vive en el mismo #liq-print-area / @media print que "Simular
       Liquidacion" (no se agrega ninguna libreria de PDF nueva - ver
       CLAUDE.md), con clases propias (.report-page, .detalle-page, etc.)
       para no interferir con las .liq-print-* de arriba.

       Tipografia: Inter auto-hospedada en /fonts (NO Google Fonts en tiempo
       de impresion - evita el mismo tipo de carrera que tuvo el logo).

       @page con NOMBRE ("f29p") en vez de tocar el @page por defecto de mas
       abajo: ese de abajo (margin: 10mm 12mm) lo sigue usando "Simular
       Liquidacion", que comparte este mismo #liq-print-area/@media print.

       Presupuesto de altura en A4: cada seccion tiene una ALTURA FIJA (nunca
       min-height) y el contenedor de pagina lleva "overflow:hidden" como red
       de seguridad final - la pagina de detalle pagina los documentos en
       bloques fijos de 13 filas (FILAS_POR_PAGINA en f29pHojaDetalle) en vez
       de calcular dinamicamente cuantas entran, por la misma razon. */
    
    @font-face { font-family: 'Inter'; font-weight: 400; font-style: normal; src: url(/fonts/Inter-400.woff2) format('woff2'); }
    @font-face { font-family: 'Inter'; font-weight: 500; font-style: normal; src: url(/fonts/Inter-500.woff2) format('woff2'); }
    @font-face { font-family: 'Inter'; font-weight: 600; font-style: normal; src: url(/fonts/Inter-600.woff2) format('woff2'); }
    @font-face { font-family: 'Inter'; font-weight: 700; font-style: normal; src: url(/fonts/Inter-700.woff2) format('woff2'); }

    @page f29p { size: A4 portrait; margin: 0; }

  
  
  
  

  
  
  #liq-print-area * { box-sizing: border-box; }

  #liq-print-area {
    --navy-950: #0B1739; --navy-900: #172554; --navy-800: #1E3A5F;
    --purple-700: #5B21B6; --purple-600: #6D28D9; --purple-500: #7C3AED; --purple-100: #EDE9FE; --purple-50: #F5F3FF;
    --teal-700: #0F766E; --teal-600: #0D9488; --teal-500: #14B8A6; --teal-100: #CCFBF1; --teal-50: #F0FDFA;
    --blue-600: #2563EB; --blue-100: #DBEAFE; --blue-50: #EFF6FF;
    --green-600: #16A34A; --green-100: #DCFCE7; --green-50: #F0FDF4;
    --amber-600: #D97706; --amber-100: #FEF3C7; --amber-50: #FFFBEB;
    --slate-900: #0F172A; --slate-700: #334155; --slate-600: #475569; --slate-500: #64748B;
    --slate-400: #94A3B8; --slate-300: #CBD5E1; --slate-200: #E2E8F0; --slate-100: #F1F5F9; --slate-50: #F8FAFC;
  }

  /* El contenedor #liq-print-area esta pensado para "Simular Liquidacion"
     (740px centrados). Las hojas de este informe miden una A4 completa, asi
     que ese ancho las desbordaba y las empujaba ~7mm a la derecha: la hoja
     arrancaba en 7,1mm y terminaba en 217,1mm sobre un papel de 210mm.
     f29pImprimir agrega esta clase; descargarLiquidacionPDF la saca. */
  #liq-print-area.print-area-hoja-completa { max-width: none; margin: 0; padding: 0; }

  #liq-print-area .report-page {
    page: f29p; page-break-after: always;
    width: 210mm; height: 297mm; padding: 0 9mm 6mm; overflow: hidden; position: relative;
    background: #FFFFFF; color: var(--navy-900); font-family: "Inter", "IBM Plex Sans", Arial, sans-serif;
    margin: 0 auto;
  }

  /* ---- type scale (section 4) ---- */
  #liq-print-area .company-title { font-size: 16pt; line-height: 1.08; font-weight: 700; letter-spacing: -0.02em; color: var(--navy-900);
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
  #liq-print-area .section-title { font-size: 9.5pt; line-height: 1.2; font-weight: 700; letter-spacing: 0.035em; text-transform: uppercase; color: var(--navy-900); margin: 0 0 1.5mm; }
  #liq-print-area .label-sm { font-size: 6.8pt; line-height: 1.2; font-weight: 600; letter-spacing: 0.045em; text-transform: uppercase; }
  #liq-print-area .amount-primary { font-size: 29pt; line-height: 1; font-weight: 700; font-variant-numeric: tabular-nums; }
  #liq-print-area .amount-secondary { font-size: 18pt; line-height: 1; font-weight: 700; font-variant-numeric: tabular-nums; }
  #liq-print-area .amount-indicator { font-size: 14.5pt; line-height: 1.05; font-weight: 700; font-variant-numeric: tabular-nums; }
  #liq-print-area .text-normal { font-size: 7.6pt; line-height: 1.35; font-weight: 400; color: var(--slate-600); }
  #liq-print-area .text-table { font-size: 7.4pt; line-height: 1.2; }
  #liq-print-area .footer-text { font-size: 6.3pt; line-height: 1.3; color: var(--slate-500); }

  /* ================= 1. Encabezado (35mm) ================= */
  #liq-print-area .report-header { position: relative; height: 35mm; margin: 0 -9mm; overflow: hidden; background: #fff; }
  #liq-print-area .header-background { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0; display: block; object-fit: fill; }
  #liq-print-area .brand-area { position: absolute; left: 9mm; top: 8mm; z-index: 1; max-width: 57mm; }
  #liq-print-area .brand-logo { display: block; max-width: 57mm; max-height: 14mm; width: auto; height: auto; object-fit: contain; }
  #liq-print-area .brand-subtitle { font-size: 7.4pt; font-weight: 500; color: var(--slate-500); margin-top: 1mm; }
  /* Diseño alternativo "Clave Tributaria" (ver f29pMarcaHtml): sin PNG propio
     de fondo/isotipo horizontal (solo se recibio el icono suelto) - se
     reemplaza la imagen de fondo por un degrade CSS con los colores reales
     de su marca (navy/violeta) y el isotipo + nombre se arman aparte (icono
     SVG + texto), mismo patron ya usado en .liq-print-brand para el logo de
     SIImplifica en la Simulacion de Liquidacion. */
  /* SIImplifica: las hojas de detalle también van en blanco (pedido del
     usuario, 20/9/2026). Se saca la imagen de fondo -la banda con la ola y
     el isotipo- Y se oscurece el texto que iba encima: era blanco porque
     esa banda lo sostenía, y dejarlo así lo volvería invisible. Es lo mismo
     que ya se hizo con la portada.
     (El diseño de Clave Tributaria ya no vive acá: desde el 2/10/2026 es
     otra hoja, public/styles/f29-informe-cta.css.) */
  #liq-print-area .detalle-header-plano { background: #fff; }
  #liq-print-area .detalle-header-plano .detalle-meta-card { color: var(--navy-900); }
  #liq-print-area .detalle-header-plano .detalle-meta-rutperiodo { color: var(--slate-500); }
  #liq-print-area .detalle-header-plano .detalle-pagina-badge {
    background: var(--slate-100); border-color: #D8DFEA; color: var(--slate-600);
  }
  /* Portada sin banda oscura (pedido del usuario): se saco la imagen/degrade
     de fondo y con ella la tarjeta translucida y el sello "Estimacion
     provisoria". Quedan solo la fecha de generacion y el periodo, ya en
     oscuro sobre blanco. La altura sigue siendo 35mm a proposito: el resto
     de la hoja es un presupuesto de alturas fijas para A4 (ver comentario
     del bloque) y moverla correria todas las secciones de abajo. */
  #liq-print-area .report-header-plano { background: #fff; }
  #liq-print-area .metadata-card {
    position: absolute; right: 9mm; top: 9mm; z-index: 1;
    display: flex; align-items: stretch; gap: 2.5mm;
  }
  #liq-print-area .metadata-box {
    display: flex; align-items: center; gap: 1.8mm; background: var(--slate-50);
    border: 1px solid var(--slate-200); border-radius: 2.5mm; padding: 1.8mm 3.2mm;
  }
  #liq-print-area .metadata-box svg { width: 3.4mm; height: 3.4mm; flex-shrink: 0; color: var(--purple-600); }
  #liq-print-area .metadata-label { color: var(--slate-500); }
  #liq-print-area .metadata-value { font-size: 7.4pt; font-weight: 700; margin-top: 0.6mm; color: var(--navy-900); white-space: nowrap; }

  /* ================= 2. Empresa y parametros (18mm) ================= */
  #liq-print-area .company-row { height: 18mm; display: grid; grid-template-columns: minmax(0,1fr) auto; align-items: center; column-gap: 6mm; }
  #liq-print-area .company-rut { font-size: 8pt; font-weight: 600; color: var(--slate-500); margin-top: 1.2mm; }
  #liq-print-area .param-capsule {
    height: 7mm; max-width: 85mm; padding: 0 4mm; border: 1px solid var(--slate-300); border-radius: 999px;
    background: #fff; display: flex; align-items: center; gap: 2mm; white-space: nowrap; flex-shrink: 0;
  }
  #liq-print-area .param-dot { width: 2.2mm; height: 2.2mm; border-radius: 50%; flex-shrink: 0; }
  #liq-print-area .param-text { font-size: 6.8pt; font-weight: 500; color: var(--slate-600); overflow: hidden; text-overflow: ellipsis; }

  /* ================= 3. Resultado principal (44mm) ================= */
  #liq-print-area .result-card { height: 44mm; display: grid; grid-template-rows: 34mm 10mm; border: 1px solid #DDD6FE; border-radius: 4mm;
    overflow: hidden; background: #fff; box-shadow: 0 2px 10px rgba(23,37,84,0.045); }
  #liq-print-area .result-main { display: grid; grid-template-columns: 62% 38%; position: relative; }
  #liq-print-area .result-primary { position: relative; overflow: hidden; }
  #liq-print-area .result-primary-bg { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
  #liq-print-area .result-primary-content { position: relative; z-index: 1; height: 100%; padding: 6mm 7mm; box-sizing: border-box;
    display: flex; flex-direction: column; justify-content: center; }
  #liq-print-area .result-primary-content .label-sm { color: rgba(255,255,255,0.78); }
  #liq-print-area .result-primary-content .amount-primary { color: #fff; margin-top: 1mm; }
  #liq-print-area .result-primary-sub { font-size: 7.4pt; line-height: 1.3; color: rgba(255,255,255,0.80); margin-top: 1.5mm; }
  #liq-print-area .result-secondary { padding: 6mm 7mm; display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; background: #fff; }
  /* corrido a la izquierda (pedido explicito) sin perder el centrado entre
     si de label/monto/badge - se mueve el grupo entero, no cada uno por su cuenta. */
  #liq-print-area .result-secondary > * { transform: translateX(-10mm); align-self: center; }
  #liq-print-area .result-secondary .label-sm { color: var(--navy-900); }
  #liq-print-area .result-secondary-amount { font-size: 27pt; line-height: 1; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--purple-700); margin-top: 1mm; }
  #liq-print-area .result-badge { margin-top: 1.5mm; display: inline-flex; align-items: center; width: fit-content; height: 5.5mm; padding: 0 3mm;
    background: var(--purple-50); color: var(--purple-700); border-radius: 999px; font-size: 6.6pt; font-weight: 700; letter-spacing: 0.02em; text-transform: uppercase; }
  #liq-print-area .result-footnote { height: 10mm; box-sizing: border-box; background: #FAFAFF; border-top: 1px solid var(--slate-200);
    display: flex; align-items: center; gap: 3mm; padding: 0 5mm; }
  #liq-print-area .result-footnote-bar { width: 1mm; align-self: stretch; margin: 2mm 0; background: var(--purple-600); border-radius: 1mm; flex-shrink: 0; }
  #liq-print-area .result-footnote-text { font-size: 7pt; color: var(--slate-600); line-height: 1.3; }

  /* ================= 4. Movimiento tributario (36mm incl. titulo) ================= */
  #liq-print-area .mov-wrap { height: 36mm; margin-top: 2.5mm; }
  #liq-print-area .mov-grid { height: 29mm; display: grid; grid-template-columns: repeat(4, 1fr); border: 1px solid #D8DFEA; border-radius: 4mm;
    overflow: hidden; background: #fff; position: relative; }
  #liq-print-area .mov-item { position: relative; padding: 3.5mm 3mm; display: grid; grid-template-columns: 9mm minmax(0,1fr); column-gap: 2.5mm; align-items: start; }
  #liq-print-area .mov-item + .mov-item { border-left: 1px solid #D8DFEA; }
  #liq-print-area .mov-item-text { min-width: 0; margin-top: 4.5mm; }
  #liq-print-area .mov-notch { position: absolute; left: 0; top: 50%; width: 3mm; height: 3mm; background: #FFFFFF;
    border-top: 1px solid #D8DFEA; border-right: 1px solid #D8DFEA; transform: translate(-50%,-50%) rotate(45deg); z-index: 1; }
  #liq-print-area .mov-icon { width: 8mm; height: 8mm; border-radius: 2mm; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
  #liq-print-area .mov-icon svg { width: 4.5mm; height: 4.5mm; }
  #liq-print-area .mov-label { font-size: 6.8pt; font-weight: 600; letter-spacing: 0.03em; text-transform: uppercase; color: var(--slate-600); }
  /* margin-left negativo: el "$" a este tamano visualmente arranca mas a la
     derecha que la etiqueta de arriba aunque los bordes de caja coincidan
     exacto (confirmado midiendo getBoundingClientRect - es puro efecto
     optico de la fuente en un simbolo grande, no un margen real distinto). */
  #liq-print-area .mov-value { font-size: 14.5pt; line-height: 1.05; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--navy-900); margin: 0.6mm 0 0.6mm -1.2mm; }
  /* Escalones de tamaño por largo del monto (ver f29pClaseMonto). El hueco
     util mide 31,5mm: a 14,5pt un monto de 12 caracteres no entra y se
     partia en dos lineas, descuadrando la tarjeta contra las de al lado.
     nowrap para que no pueda volver a pasar aunque los cortes queden
     cortos: antes que envolver, preferimos que se note. */
  #liq-print-area .mov-value, #liq-print-area .amount-primary, #liq-print-area .result-secondary-amount { white-space: nowrap; }
  #liq-print-area .mov-value.monto-largo { font-size: 12pt; }
  #liq-print-area .mov-value.monto-xl { font-size: 10pt; }
  /* El bloque oscuro tiene 104mm: solo hace falta bajar en los montos de
     mas de 12 caracteres (miles de millones). */
  #liq-print-area .amount-primary.monto-xl { font-size: 24pt; }
  /* El lado blanco es el mas apretado de los tres (~59mm utiles, y ademas
     el grupo va corrido 10mm a la izquierda). */
  #liq-print-area .result-secondary-amount.monto-largo { font-size: 22pt; }
  #liq-print-area .result-secondary-amount.monto-xl { font-size: 18pt; }
  /* "No disponible" no es un monto: no tiene por que ir en el tamaño de uno. */
  #liq-print-area .mov-value.mov-value-vacio { font-size: 10pt; color: var(--slate-500); }
  #liq-print-area .mov-desc { font-size: 6.3pt; line-height: 1.25; color: var(--slate-500); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }

  /* ================= 5. Relacion IVA (24mm incl. titulo) ================= */
  #liq-print-area .rel-wrap { height: 24mm; margin-top: 1mm !important; }
  #liq-print-area .rel-box { height: 18mm; box-sizing: border-box; background: linear-gradient(90deg, #FAF7FF 0%, #F5F3FF 48%, #F0FDFA 100%);
    border: 1px solid #DDD6FE; border-radius: 3.5mm; padding: 3mm 5mm; display: grid;
    grid-template-columns: 1fr 20mm 1fr 20mm 1fr; align-items: center; }
  #liq-print-area .rel-node { text-align: left; }
  #liq-print-area .rel-node-top { display: flex; align-items: center; gap: 1.3mm; }
  #liq-print-area .rel-node-label { font-size: 7pt; font-weight: 600; color: var(--slate-600); }
  #liq-print-area .rel-node-value { font-size: 9.5pt; font-weight: 700; color: var(--navy-900); margin-top: 0.8mm; font-variant-numeric: tabular-nums; }
  #liq-print-area .rel-node.resultado .rel-node-value { color: var(--purple-700); }
  #liq-print-area .rel-line-wrap { display: flex; align-items: center; justify-content: center; height: 100%; margin-left: -14mm; }
  #liq-print-area .rel-node-dot { width: 2.2mm; height: 2.2mm; border-radius: 50%; background: #fff; border: 1.2px solid var(--purple-600); flex-shrink: 0; }
  #liq-print-area .rel-node-dot.filled { background: var(--purple-600); }

  /* ================= 6. Composicion + doble resultado (70mm) ================= */
  #liq-print-area .comp-wrap { height: 75mm; margin-top: 2.5mm; }
  #liq-print-area .comp-table { height: 48mm; border: 1px solid #D8DFEA; border-radius: 3mm; overflow: hidden; position: relative; }
  /* Las filas se reparten los 48mm (--comp-filas lo pone la vista, ver
     f29pReporteEmpresa): con 9 filas miden 5,3mm y el circulo se achica
     para no tocar el borde. */
  #liq-print-area .comp-table {
    --comp-alto-fila: calc(48mm / var(--comp-filas, 7));
    --comp-num: min(5mm, calc(var(--comp-alto-fila) - 0.9mm));
  }
  #liq-print-area .comp-table::before {
    content: ""; position: absolute; left: 6.5mm; top: calc(var(--comp-alto-fila) / 2); bottom: calc(var(--comp-alto-fila) / 2); width: 1.2px; z-index: 0;
    background: linear-gradient(to bottom, var(--purple-500) 0%, var(--purple-500) 38%, var(--slate-200) 38%, var(--slate-200) 86%, var(--teal-500) 86%, var(--teal-500) 100%);
  }
  #liq-print-area .comp-row { height: var(--comp-alto-fila); display: grid; grid-template-columns: 11mm 1fr 32mm; align-items: center; padding: 0 4mm;
    border-bottom: 1px solid #EEF2F7; box-sizing: border-box; }
  #liq-print-area .comp-row:last-child { border-bottom: none; }
  /* El circulo se centra en el mismo lugar aunque se achique (el centro de
     uno de 5mm, que es por donde pasa la linea del ::before). */
  #liq-print-area .comp-num { position: relative; z-index: 1; width: var(--comp-num); height: var(--comp-num); margin-left: calc((5mm - var(--comp-num)) / 2); border-radius: 50%; background: #fff; border: 1.3px solid var(--slate-300); color: var(--slate-400);
    font-size: 5.8pt; font-weight: 700; display: flex; align-items: center; justify-content: center; box-sizing: border-box; }
  #liq-print-area .comp-row.activa .comp-num { background: var(--purple-600); border-color: var(--purple-600); color: #fff; }
  #liq-print-area .comp-concepto { font-size: 7.2pt; color: var(--slate-700); }
  #liq-print-area .comp-row.subtotal .comp-concepto { font-weight: 700; color: var(--purple-700); }
  #liq-print-area .comp-row.cero .comp-concepto, #liq-print-area .comp-row.cero .comp-monto { opacity: 0.68; }
  #liq-print-area .comp-monto { font-size: 7.5pt; font-weight: 600; color: var(--navy-900); text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
  #liq-print-area .comp-row.remanente { background: #ECFDF9; border-top: 1px solid #99F6E4; border-bottom: none; }
  #liq-print-area .comp-row.remanente .comp-concepto, #liq-print-area .comp-row.remanente .comp-monto { color: var(--teal-700); font-weight: 700; }
  #liq-print-area .comp-row.remanente .comp-num { background: var(--teal-600); border-color: var(--teal-600); color: #fff; }

  #liq-print-area .total-result { height: 18mm; margin-top: 3mm; position: relative; border-radius: 3.5mm; overflow: hidden; border: 1px solid var(--teal-500); }
  #liq-print-area .total-bg { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
  #liq-print-area .total-content { position: relative; z-index: 1; height: 100%; display: grid; grid-template-columns: 55% 45%; }
  #liq-print-area .total-izq { color: #fff; box-sizing: border-box; padding: 3mm 6mm; display: flex; align-items: center; gap: 3mm; }
  #liq-print-area .total-der { box-sizing: border-box; padding: 3mm 6mm; display: flex; align-items: center; justify-content: center; gap: 10mm; }
  #liq-print-area .total-der > div:first-child { text-align: center; }
  #liq-print-area .total-icon { width: 8mm; height: 8mm; border-radius: 50%; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
  #liq-print-area .total-icon svg { width: 4.2mm; height: 4.2mm; }
  #liq-print-area .total-der .label-sm { color: var(--teal-700); }
  #liq-print-area .total-izq .label-sm { color: rgba(255,255,255,0.85); }
  #liq-print-area .total-value { font-size: 15pt; font-weight: 700; margin-top: 0.8mm; font-variant-numeric: tabular-nums; }
  #liq-print-area .total-der .total-value { color: var(--teal-700); }

  /* ================= 7. Lectura del periodo (22mm incl. titulo) ================= */
  #liq-print-area .lectura-wrap { height: 22mm; margin-top: 2.5mm; }
  #liq-print-area .lectura-box { height: 16.5mm; box-sizing: border-box; background: linear-gradient(90deg, #F8FAFC 0%, #EFF6FF 65%, #F5F3FF 100%);
    border: 1px solid #DBEAFE; border-radius: 3.5mm; padding: 3mm 4mm; display: grid; grid-template-columns: auto 1fr auto auto; align-items: center; gap: 3.5mm; }
  #liq-print-area .lectura-divider { width: 1px; align-self: stretch; background: #C7DAF5; }
  #liq-print-area .lectura-icon { width: 9mm; height: 9mm; border-radius: 50%; background: #fff; border: 1px solid #DBEAFE; flex-shrink: 0;
    display: flex; align-items: center; justify-content: center; }
  #liq-print-area .lectura-icon svg { width: 4.6mm; height: 4.6mm; }
  #liq-print-area .lectura-item { display: flex; gap: 1.5mm; align-items: center; font-size: 7.4pt; color: var(--slate-700); margin-bottom: 1mm; }
  #liq-print-area .lectura-item:last-child { margin-bottom: 0; }
  #liq-print-area .lectura-check { width: 3mm; height: 3mm; border-radius: 50%; background: var(--green-600); flex-shrink: 0; display: flex; align-items: center; justify-content: center; }
  #liq-print-area .lectura-check svg { width: 2mm; height: 2mm; stroke-width: 3; }
  #liq-print-area .lectura-badge { background: var(--purple-50); color: var(--purple-700); border: 1px solid #DDD6FE; height: 7mm; padding: 0 4mm;
    border-radius: 999px; display: flex; align-items: center; gap: 1.3mm; font-size: 6.6pt; font-weight: 700; letter-spacing: 0.02em; text-transform: uppercase; white-space: nowrap; }
  #liq-print-area .lectura-badge svg { width: 3mm; height: 3mm; flex-shrink: 0; }

  /* ================= 8. Footer (10mm) ================= */
  #liq-print-area .report-footer { height: 10mm; }
  #liq-print-area .footer-line { height: 1px; margin-bottom: 1.5mm; background: linear-gradient(90deg, #6D28D9 0%, #2563EB 50%, #14B8A6 100%); }
  #liq-print-area .footer-body { text-align: center; }
  #liq-print-area .footer-body p { margin: 0.5mm 0; }
  #liq-print-area .footer-body strong { color: var(--purple-600); font-weight: 600; }

#liq-print-area .report-page:last-child { page-break-after: auto; }



#liq-print-area * { box-sizing: border-box; }

#liq-print-area {
  --navy-950: #0B1739; --navy-900: #172554; --navy-800: #1E3A5F;
  --purple-700: #5B21B6; --purple-600: #6D28D9; --purple-500: #7C3AED; --purple-100: #EDE9FE; --purple-50: #F5F3FF;
  --teal-700: #0F766E; --teal-600: #0D9488; --teal-500: #14B8A6; --teal-100: #CCFBF1; --teal-50: #F0FDFA;
  --blue-600: #2563EB; --blue-100: #DBEAFE; --blue-50: #EFF6FF;
  --green-600: #16A34A; --amber-600: #D97706;
  --slate-900: #0F172A; --slate-700: #334155; --slate-600: #475569; --slate-500: #64748B;
  --slate-400: #94A3B8; --slate-300: #CBD5E1; --slate-200: #E2E8F0; --slate-100: #F1F5F9; --slate-50: #F8FAFC;
}

#liq-print-area .report-page {
  width: 210mm; height: 297mm; padding: 0 9mm 6mm; overflow: hidden; position: relative;
  background: #FFFFFF; color: var(--navy-900); font-family: "Inter", "IBM Plex Sans", Arial, sans-serif;
  margin: 0 auto; display: flex; flex-direction: column;
}
#liq-print-area .report-page > * { flex: 0 0 auto; }

#liq-print-area .label-sm { font-size: 6.8pt; line-height: 1.2; font-weight: 600; letter-spacing: 0.045em; text-transform: uppercase; }
#liq-print-area .footer-text { font-size: 6.3pt; line-height: 1.3; color: var(--slate-500); }

/* ---- Encabezado (mas bajo que el de la portada: esta pagina necesita mas
   alto para la tabla, no lleva resultado principal debajo) ---- */
#liq-print-area .detalle-header { position: relative; height: 30mm; margin: 0 -9mm 3mm; overflow: hidden; }
#liq-print-area .header-background { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0; display: block; object-fit: fill; }
#liq-print-area .brand-area { position: absolute; left: 9mm; top: 6mm; z-index: 1; max-width: 55mm; }
#liq-print-area .brand-logo { display: block; max-width: 55mm; max-height: 11mm; width: auto; height: auto; object-fit: contain; }
#liq-print-area .brand-subtitle { font-size: 6.8pt; font-weight: 500; color: var(--slate-500); margin-top: 1mm; }
#liq-print-area .detalle-meta-card { position: absolute; right: 9mm; top: 4.5mm; z-index: 1; width: 78mm; text-align: right; color: #fff; }
#liq-print-area .detalle-meta-empresa { font-size: 9pt; font-weight: 700; line-height: 1.2; }
#liq-print-area .detalle-meta-rutperiodo { font-size: 7.2pt; color: rgba(255,255,255,0.75); margin-top: 0.8mm; }
#liq-print-area .detalle-meta-sep { margin: 0 1.2mm; }
#liq-print-area .detalle-pagina-badge {
  display: inline-block; margin-top: 1.8mm; background: rgba(124,58,237,0.85); border: 1px solid rgba(255,255,255,0.18);
  border-radius: 999px; padding: 1mm 3mm; font-size: 6.2pt; font-weight: 700; letter-spacing: 0.03em;
}

#liq-print-area .detalle-title-row { margin-bottom: 3mm; }
#liq-print-area .detalle-title { font-size: 14pt; font-weight: 700; letter-spacing: -0.01em; color: var(--navy-900); }
#liq-print-area .detalle-subtitle { font-size: 7.6pt; color: var(--slate-500); margin-top: 0.8mm; }

#liq-print-area .detalle-stats { height: 16mm; margin-bottom: 3mm; border: 1px solid #D8DFEA; border-radius: 3.5mm; display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); overflow: hidden; }
#liq-print-area .detalle-stat-item { display: flex; align-items: center; gap: 2mm; padding: 0 3mm; min-width: 0; }
#liq-print-area .detalle-stat-item + .detalle-stat-item { border-left: 1px solid #EEF2F7; }
#liq-print-area .detalle-stat-icon { width: 8mm; height: 8mm; border-radius: 2mm; background: var(--slate-50); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
#liq-print-area .detalle-stat-icon svg { width: 4.2mm; height: 4.2mm; }
#liq-print-area .detalle-stat-label { color: var(--slate-500); }
#liq-print-area .detalle-stat-value { font-size: 10pt; font-weight: 700; color: var(--navy-900); margin-top: 0.5mm; font-variant-numeric: tabular-nums; }

#liq-print-area .detalle-origen { height: 5mm; margin-bottom: 2.5mm; display: flex; align-items: center; gap: 1.8mm; font-size: 6.8pt; color: var(--slate-500); }
#liq-print-area .detalle-origen svg { width: 3mm; height: 3mm; flex-shrink: 0; }

#liq-print-area .detalle-lectura {
  height: 10mm; margin-bottom: 3.5mm; background: var(--amber-50, #FFFBEB); border: 1px solid #FDE68A; border-radius: 3mm;
  padding: 0 4mm; display: flex; align-items: center; gap: 2.5mm; box-sizing: border-box;
}
#liq-print-area .detalle-lectura svg { width: 4mm; height: 4mm; flex-shrink: 0; }
#liq-print-area .detalle-lectura-text { flex: 1; font-size: 7.2pt; color: var(--slate-700); }
#liq-print-area .detalle-lectura-text strong { color: var(--navy-900); }
#liq-print-area .detalle-lectura-pct { font-size: 6.8pt; font-weight: 700; color: #92400E; white-space: nowrap; flex-shrink: 0; }

#liq-print-area .detalle-table-title { font-size: 8pt; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--navy-900); margin-bottom: 1.5mm; }

/* Hojas de CONTINUACION de una seccion (.detalle-page-cont): sueltan el
   encabezado grande y la tarjeta de estadisticas/origen/lectura rapida, que
   en la segunda hoja en adelante repiten exactamente la misma informacion
   que en la primera. Ese alto se usa para mas filas: 16 en la primera hoja
   y 26 en cada continuacion (ver F29P_DETALLE_FILAS_* en
   f29-provisorio.view.js). Con 200 documentos el informe pasa de 16 hojas
   a 9. La identidad de la hoja no se pierde: el encabezado sigue trayendo
   empresa, RUT, periodo y "PAGINA n DE m". */
#liq-print-area .detalle-page-cont .detalle-header { height: 22mm; margin-bottom: 2.5mm; }
#liq-print-area .detalle-page-cont .detalle-meta-card { top: 3mm; }
#liq-print-area .detalle-page-cont .detalle-title-row { margin-bottom: 2.5mm; }
#liq-print-area .detalle-page-cont .detalle-title { font-size: 11pt; }

#liq-print-area .detalle-table { width: 100%; border-collapse: collapse; table-layout: fixed; margin-bottom: 3mm; }
#liq-print-area .detalle-table thead th {
  text-align: left; font-size: 6.4pt; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; color: var(--slate-500);
  background: var(--slate-50); padding: 1.3mm 1.6mm; border-bottom: 1px solid #D8DFEA;
}
#liq-print-area .detalle-table thead th.col-monto { text-align: right; }
#liq-print-area .detalle-table tbody td { font-size: 7pt; color: var(--slate-700); padding: 1.15mm 1.6mm; border-bottom: 1px solid #EEF2F7; font-variant-numeric: tabular-nums; }
#liq-print-area .detalle-table tbody tr:nth-child(even) td { background: #FAFBFC; }
#liq-print-area .detalle-table tbody tr.fila-nc td { background: #FFF7ED; color: #C2410C; }
#liq-print-area .detalle-table td.col-monto { text-align: right; white-space: nowrap; }
#liq-print-area .detalle-table td.col-n { color: var(--slate-400); }
/* Con table-layout:fixed manda la PRIMERA fila, que es el <thead>: si el
   ancho vive solo en el <td> el navegador lo ignora y reparte el sobrante
   en partes iguales entre las columnas sin ancho. Eso pasaba con "N°" y con
   la del proveedor/cliente: 30mm cada una (medido), por eso "Fecha"
   arrancaba tan lejos del numero. Ahora TODAS llevan ancho en th y td menos
   la del nombre, que a proposito queda sin ancho para quedarse con el
   sobrante - es la unica que de verdad lo necesita (razon social larga). */
#liq-print-area .detalle-table td.col-n, #liq-print-area .detalle-table th.col-n { width: 8mm; }
#liq-print-area .detalle-table td.col-fecha, #liq-print-area .detalle-table th.col-fecha { width: 16mm; }
#liq-print-area .detalle-table td.col-folio, #liq-print-area .detalle-table th.col-folio { width: 15mm; }
/* 14mm y sin envolver: la celda "Tipo" puede llevar el codigo del documento
   MAS la etiqueta NC ("61 NC"). Con 11mm no entraban los dos en una linea,
   asi que la etiqueta caia a una segunda linea: la fila de nota de credito
   quedaba de 8,19mm contra 5,21mm del resto, descuadrada respecto de las
   demas columnas. El nowrap ademas la protege de los codigos de 3 cifras
   (110, 112, ...). El ancho sale de la columna del nombre, que es la que
   absorbe el sobrante. */
#liq-print-area .detalle-table td.col-tipo, #liq-print-area .detalle-table th.col-tipo { width: 14mm; }
#liq-print-area .detalle-table td.col-tipo { white-space: nowrap; }
#liq-print-area .detalle-table td.col-rut, #liq-print-area .detalle-table th.col-rut { width: 21mm; }
/* 19mm desde que se sumó la columna Exento (30/9/2026): con 4 montos a 22mm
   la razón social quedaba demasiado angosta. */
#liq-print-area .detalle-table td.col-monto, #liq-print-area .detalle-table th.col-monto { width: 19mm; }
/* La razon social es lo unico que puede no entrar: se corta con puntos
   suspensivos en vez de romper la fila en dos lineas y descuadrar el
   presupuesto de altura de la hoja. */
#liq-print-area .detalle-table td.col-nombre { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#liq-print-area .tag-nc { display: inline-block; background: #FEE2E2; color: #B91C1C; font-size: 5.6pt; font-weight: 700; border-radius: 999px; padding: 0.3mm 1.3mm; margin-left: 0.8mm; vertical-align: middle; line-height: 1.1; }

#liq-print-area .detalle-subtotal-bar, #liq-print-area .detalle-acumulado-bar {
  height: 7.5mm; margin-bottom: 2mm; border-radius: 2.5mm; padding: 0 4mm; display: flex; align-items: center; gap: 2.5mm;
  font-size: 7pt; box-sizing: border-box;
}
#liq-print-area .detalle-subtotal-bar { background: var(--purple-50); }
#liq-print-area .detalle-acumulado-bar { background: var(--teal-600); color: #fff; margin-bottom: 3mm; }
#liq-print-area .detalle-bar-icon svg { width: 3.6mm; height: 3.6mm; display: block; }
#liq-print-area .detalle-bar-label { font-size: 6.6pt; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase; color: var(--purple-700); }
#liq-print-area .detalle-acumulado-bar .detalle-bar-label { color: #fff; }
#liq-print-area .detalle-bar-vals { margin-left: auto; font-variant-numeric: tabular-nums; color: var(--navy-900); }
#liq-print-area .detalle-acumulado-bar .detalle-bar-vals { color: #fff; }
#liq-print-area .detalle-bar-vals b { font-weight: 600; opacity: 0.7; margin-right: 0.8mm; }

#liq-print-area .detalle-paginacion { height: 10mm; margin-top: auto; display: flex; align-items: center; gap: 3mm; border-top: 1px solid #EEF2F7; padding-top: 3mm; }
#liq-print-area .detalle-paginacion-dots { display: flex; align-items: center; }
#liq-print-area .detalle-dot {
  width: 5mm; height: 5mm; border-radius: 50%; background: #fff; border: 1.3px solid var(--slate-300); color: var(--slate-400);
  font-size: 6pt; font-weight: 700; display: flex; align-items: center; justify-content: center; box-sizing: border-box;
}
#liq-print-area .detalle-dot.activo { background: var(--purple-600); border-color: var(--purple-600); color: #fff; }
#liq-print-area .detalle-dot-line { width: 6mm; height: 1.3px; background: var(--slate-300); }
#liq-print-area .detalle-paginacion-texto { font-size: 7.2pt; font-weight: 600; color: var(--slate-600); }
#liq-print-area .detalle-paginacion-siguiente { margin-left: auto; display: flex; align-items: center; gap: 1.3mm; font-size: 6.8pt; font-weight: 600; color: var(--purple-700); }
#liq-print-area .detalle-paginacion-siguiente svg { width: 3mm; height: 3mm; }

/* Hojas "Honorarios" e "Impuesto Único" (29/9/2026, ver f29pHojaHonorarios
   en f29-provisorio.view.js): usan las mismas piezas que el detalle de
   facturas. El cuadre contra el SII reusa la caja de "lectura rapida" con
   un tono neutro, verde si cuadra y ambar si hay diferencia. */
#liq-print-area .f29p-cuadre { background: var(--slate-50); border-color: #D8DFEA; }
#liq-print-area .f29p-cuadre-ok { background: #ECFDF5; border-color: #A7F3D0; }
#liq-print-area .f29p-cuadre-diferencia { background: var(--amber-50, #FFFBEB); border-color: #FDE68A; }
#liq-print-area .f29p-hoja-honorarios .detalle-table tbody td { padding-top: 1.8mm; padding-bottom: 1.8mm; }
/* Estas tablas tienen pocas columnas: los montos se ensanchan para que
   "Líquido pagado" e "Impuesto único" no se partan en dos lineas. */
#liq-print-area .f29p-hoja-honorarios .detalle-table .col-monto,
#liq-print-area .f29p-hoja-iu .detalle-table .col-monto { width: 30mm; }
/* En "Detalle por persona" hay 7 columnas: el nombre necesita el ancho. */
#liq-print-area .f29p-hoja-honorarios .f29p-tabla-personas .col-monto { width: 21mm; }
#liq-print-area .f29p-hoja-honorarios .f29p-tabla-personas .col-folio { width: 13mm; }
#liq-print-area .f29p-hoja-honorarios .f29p-tabla-personas tbody td { padding-top: 1mm; padding-bottom: 1mm; }
/* Una linea por persona: el nombre a la izquierda y sus boletas a la
   derecha. Si no entran las dos, se acorta la lista de boletas: el nombre
   (30 letras como mucho, asi lo corta el SII) no se achica. */
#liq-print-area .f29p-persona { display: flex; align-items: baseline; gap: 2mm; min-width: 0; }
#liq-print-area .f29p-persona-nombre { flex: 0 0 auto; max-width: 70%; font-weight: 600; color: var(--navy-900); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#liq-print-area .f29p-persona-boletas { flex: 0 1 auto; min-width: 0; margin-left: auto; font-size: 6.2pt; color: var(--slate-500); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: right; }
#liq-print-area .f29p-hoja-honorarios .detalle-table thead th,
#liq-print-area .f29p-hoja-iu .detalle-table thead th { white-space: nowrap; }
#liq-print-area .f29p-hoja-origen { font-weight: 600; color: var(--navy-900); overflow: hidden; text-overflow: ellipsis; }
#liq-print-area .f29p-hoja-nota { font-size: 6.2pt; color: var(--slate-500); margin-top: 0.4mm; overflow: hidden; text-overflow: ellipsis; }
#liq-print-area .f29p-hoja-aviso { font-size: 6.8pt; color: #92400E; margin-bottom: 2mm; }

#liq-print-area .report-footer { height: 10mm; margin-top: 3mm; }
#liq-print-area .footer-line { height: 1px; margin-bottom: 1.5mm; background: linear-gradient(90deg, #6D28D9 0%, #2563EB 50%, #14B8A6 100%); }
#liq-print-area .footer-body { text-align: center; }
#liq-print-area .footer-body p { margin: 0.5mm 0; }
#liq-print-area .footer-body strong { color: var(--purple-600); font-weight: 600; }


    @page { size: A4 portrait; margin: 10mm 12mm; }
  }

  .process-group { margin-bottom: 24px; }
  .process-group:last-child { margin-bottom: 0; }
  .process-group-title { font-size: 0.78rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); margin-bottom: 10px; }
  .process-row {
    display: flex; align-items: center; justify-content: space-between; padding: 13px 16px;
    border: 1px solid var(--border); border-radius: 11px; margin-bottom: 8px; cursor: pointer; transition: border-color .15s;
  }
  .process-row:last-child { margin-bottom: 0; }
  .process-row:hover { border-color: var(--primary); }
  .process-row.disabled { opacity: 0.6; cursor: default; }
  .process-row.disabled:hover { border-color: var(--border); }
  .process-row-label { display: flex; align-items: center; gap: 10px; font-size: 0.88rem; font-weight: 500; }
  .process-row input[type="checkbox"] { width: 18px; height: 18px; accent-color: var(--primary); cursor: pointer; flex-shrink: 0; }
  .process-row.disabled input[type="checkbox"] { cursor: default; }
  .badge-soon { background: #F1F5F9; color: var(--muted); font-size: 0.66rem; font-weight: 700; padding: 2px 9px; border-radius: 999px; }

  .link-btn {
    background: transparent; border: none; color: var(--primary); font-size: 0.82rem; font-weight: 600;
    cursor: pointer; padding: 4px;
  }
  .link-btn:hover { color: var(--primary-dark); text-decoration: underline; }


  /* ---------- Historial: drawer de detalle ---------- */
  /* display se maneja desde JS (ver abrirDrawer/cerrarDrawer), no desde
     ".open" - alternar display:none->block y la transicion en el mismo
     tick no alcanza a animar (el navegador pinta directo el estado final,
     sin una foto "cerrado" de la que partir). El fade de opacidad si lo
     puede manejar la clase, separado en un frame aparte por el helper. */
  .drawer-overlay {
    display: none; position: fixed; inset: 0; background: rgba(15,23,42,0.45); z-index: 100;
    opacity: 0; transition: opacity .2s ease;
  }
  .drawer-overlay.open { opacity: 1; }
  .drawer {
    position: fixed; top: 0; right: 0; height: 100vh; width: min(420px, 100vw); background: #fff;
    box-shadow: -20px 0 50px rgba(15,23,42,0.18); padding: 24px; overflow-y: auto;
    transform: translateX(100%); transition: transform .25s ease;
  }
  /* Version mas ancha para paneles con tabs/formularios (detalle de
     empresa), el drawer angosto de ejecucion se queda con el default. */
  .drawer.drawer-wide { width: min(640px, 100vw); }
  /* El drawer de "Ver empresa" de RRHH (Trabajadores/Contratos) tiene tablas
     de 5-6 columnas con texto largo (nombre completo, RUT, cargo, fechas) -
     con drawer-wide (640px) no entraban y quedaban cortadas, obligando a
     scroll horizontal para ver la ultima columna (pedido explicito del
     usuario, 31-08-2026). Clase aparte en vez de agrandar drawer-wide para
     no tocar el otro drawer que la reusa (detalle/edicion de empresa). */
  .drawer.drawer-xwide { width: min(920px, 100vw); }
  .drawer-overlay.open .drawer { transform: translateX(0); }
  .drawer-header { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 18px; }
  .drawer-header h3 { font-size: 1.1rem; }
  .drawer-close { background: transparent; border: none; cursor: pointer; color: var(--muted); padding: 4px; }
  .drawer-meta { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 20px; }
  .drawer-meta-label { font-size: 0.72rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.03em; }
  .drawer-meta-value { font-size: 0.88rem; font-weight: 600; margin-top: 2px; }

  .timeline { display: flex; flex-direction: column; margin-bottom: 18px; }
  .timeline-item { display: flex; gap: 12px; padding-bottom: 18px; position: relative; }
  .timeline-item:last-child { padding-bottom: 0; }
  .timeline-item::before {
    content: ""; position: absolute; left: 11px; top: 24px; bottom: 0; width: 2px; background: var(--border);
  }
  .timeline-item:last-child::before { display: none; }
  .timeline-dot {
    width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
    flex-shrink: 0; font-size: 0.7rem; font-weight: 700; z-index: 1;
  }
  .timeline-dot.td-done { background: var(--success-bg); color: var(--success); }
  .timeline-dot.td-error { background: var(--danger-bg); color: var(--danger); }
  .timeline-dot.td-pending { background: #F1F5F9; color: var(--muted); }
  .timeline-title { font-size: 0.85rem; font-weight: 600; }
  .timeline-sub { font-size: 0.76rem; color: var(--muted); margin-top: 1px; }
  .timeline-time { font-size: 0.72rem; color: var(--muted); margin-left: auto; white-space: nowrap; }

  .drawer .btn-block { margin-top: 6px; }

  /* ---------- Modals ---------- */
  .modal-overlay {
    display: none; position: fixed; inset: 0; background: rgba(15,23,42,0.55); align-items: center;
    justify-content: center; z-index: 100; padding: 16px;
  }
  .modal-overlay.open { display: flex; }
  /* La captura del error se abre ENCIMA de otro modal (el detalle de una
     corrida), asi que necesita ganarle. Todos los .modal-overlay comparten
     z-index 100, y con empate gana el ultimo del DOM: #modal-aut-corrida
     esta despues que #modal-screenshot en internal-app.html, o sea que la
     captura quedaria tapada y el boton pareceria no hacer nada. */
  #modal-screenshot { z-index: 110; }
  .modal-box { background: #fff; width: 100%; max-width: 400px; border-radius: 16px; padding: 26px; box-shadow: 0 25px 60px rgba(15,23,42,0.25); }
  .modal-box h3 { font-size: 1.05rem; margin-bottom: 4px; }
  .modal-box .modal-sub { color: var(--muted); font-size: 0.83rem; margin-bottom: 18px; }

  /* Alta de empresa: datos + credenciales a la izquierda, lo que se encola a
     la derecha. Dos columnas y no una lista larga porque las tareas dependen
     de las credenciales de al lado (se prenden solas al escribirlas), y eso
     solo se entiende viendo las dos cosas al mismo tiempo. */
  /* Alto tope con su propio scroll, como el de Holding: en celular (una sola
     columna) el modal es más alto que la pantalla y sin esto "Agregar"
     quedaba fuera, sin forma de llegar. */
  .modal-box-alta { max-width: 760px; max-height: calc(100vh - 32px); overflow-y: auto; }
  .modal-box-alta .alta-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 26px; align-items: start; }
  .modal-box-alta .alta-col-tareas { border-left: 1px solid var(--border); padding-left: 24px; }
  .modal-box-alta .alta-separador {
    font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em; font-weight: 700;
    color: var(--muted); margin: 4px 0 12px;
  }
  .modal-box-alta .alta-tarea {
    display: flex; gap: 10px; align-items: flex-start; padding: 10px 0;
    border-bottom: 1px solid var(--border); cursor: pointer;
  }
  .modal-box-alta .alta-tarea:last-child { border-bottom: none; }
  .modal-box-alta .alta-tarea input { margin-top: 2px; flex-shrink: 0; }
  .modal-box-alta .alta-tarea-texto { display: flex; flex-direction: column; gap: 2px; font-size: 0.83rem; line-height: 1.3; }
  .modal-box-alta .alta-tarea-texto .muted { font-size: 0.76rem; }
  /* Apagada = no tiene la credencial que necesita. Se ve, y dice por que:
     esconderla dejaria a alguien preguntandose donde esta la tarea. */
  .modal-box-alta .alta-tarea-off { opacity: 0.45; cursor: not-allowed; }

  @media (max-width: 720px) {
    .modal-box-alta .alta-cols { grid-template-columns: 1fr; gap: 8px; }
    .modal-box-alta .alta-col-tareas { border-left: none; padding-left: 0; border-top: 1px solid var(--border); padding-top: 16px; }
  }
  /* Genericas (no solo dentro de .modal-box) para reusar el mismo patron
     de campo con label en formularios fuera de un modal, como el resumen
     editable del detalle de empresa. */
  .field label { font-size: 0.78rem; color: var(--muted); display: block; margin: 0 0 5px; }
  .field { margin-bottom: 14px; }
  .field input {
    width: 100%; font-size: 0.88rem; padding: 0 12px; height: 42px; margin: 0;
    background: var(--bg); border: 1px solid var(--border); border-radius: 11px; outline: none;
  }
  .field input:focus { background: #fff; border-color: var(--primary); }
  /* Los <select> y <textarea> de un .field se veian como el control CRUDO
     del navegador (gris, chiquito, con su propia flecha del sistema) al
     lado de inputs ya diseñados - se notaba sobre todo en Administracion,
     donde casi todos los formularios son un select. Misma altura, mismo
     radio, mismo fondo y mismo foco que .field input; la flecha se dibuja
     acá (appearance:none saca la del sistema, así que hay que reponerla o
     el select queda sin ninguna). */
  .field select, .field textarea {
    width: 100%; font: inherit; font-size: 0.88rem; padding: 0 12px; height: 42px; margin: 0;
    background: var(--bg); border: 1px solid var(--border); border-radius: 11px; outline: none;
    color: inherit;
  }
  .field textarea { height: auto; min-height: 84px; padding: 10px 12px; resize: vertical; line-height: 1.5; }
  .field select {
    appearance: none; -webkit-appearance: none; -moz-appearance: none;
    padding-right: 34px; cursor: pointer;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 12px center; background-size: 15px 15px;
  }
  .field select:focus, .field textarea:focus { background-color: #fff; border-color: var(--primary); }
  .field select:disabled { opacity: 0.6; cursor: not-allowed; }
  .field input:focus-visible, .field select:focus-visible, .field textarea:focus-visible { outline: 2px solid var(--primary); outline-offset: 1px; }

  /* Selects de hora/minuto/AM-PM del modal de RR.HH. (agregar horario) -
     sin esto quedaban con el <select> crudo del navegador, chico y sin
     relacion visual con el resto de los campos del modal. */
  .rrhh-hora-picker { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
  .rrhh-hora-picker-select {
    font-size: 0.88rem; padding: 0 10px; height: 38px; margin: 0; background: var(--bg);
    border: 1px solid var(--border); border-radius: var(--radius-control, 8px); outline: none;
    width: 64px; transition: border-color .15s, background .15s;
  }
  .rrhh-hora-picker-select:focus { background: #fff; border-color: var(--primary); }
  .rrhh-hora-picker-ampm { width: 68px; }
  .rrhh-hora-picker-colon { color: var(--muted); font-weight: 600; }
  .modal-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 18px; }
  .modal-error { color: var(--danger); font-size: 0.82rem; min-height: 1.1em; margin-top: 10px; }
  /* Lo que está pasando mientras el modal espera al servidor (el alta de una
     empresa mientras el SII revisa su Clave Tributaria). Una línea tenue con
     fondo suave; vacía no ocupa lugar. */
  .modal-estado {
    margin-top: 10px; padding: 9px 12px; border-radius: 10px; font-size: 0.82rem; line-height: 1.35;
    color: var(--muted); background: var(--bg); border: 1px solid var(--border);
  }
  .modal-estado:empty { display: none; }
  /* Mientras se ve, ocupa el lugar del error (que en ese rato está vacío). */
  .modal-estado:not(:empty) + .modal-error:empty { display: none; }
  /* El spinner del botón quieto: el "Verificando…" y la línea de arriba ya
     dicen que está esperando. */
  @media (prefers-reduced-motion: reduce) {
    .modal-actions .spinner { animation: none; }
  }

  .toast-wrap { position: fixed; top: 18px; right: 18px; z-index: 200; display: flex; flex-direction: column; gap: 8px; }
  .toast { background: var(--text); color: #fff; padding: 10px 16px; border-radius: 10px; font-size: 0.83rem; box-shadow: 0 10px 25px rgba(0,0,0,0.2); }
  .toast.err { background: var(--danger); }
  .toast.ok { background: var(--success); }

  @media (max-width: 980px) {
    .dashboard-grid { grid-template-columns: 1fr; }
    .stat-grid { grid-template-columns: repeat(2, 1fr); }
  }
  @media (max-width: 720px) {
    #app-box { flex-direction: column; }
    .sidebar, .sidebar.collapsed { width: 100%; height: auto; position: static; flex-direction: row; align-items: center; padding: 12px 14px; overflow-x: auto; }
    .sidebar-brand { padding: 0 14px 0 0; }
    .sidebar-nav { flex: none; overflow: visible; margin: 0; padding: 0; }
    /* El menu minimizado y los encabezados de grupo son cosa de escritorio -
       en movil el menu ya es una fila horizontal angosta, no tiene sentido
       ahi (ver toggleSidebarCollapsed). */
    .sidebar-collapse-btn, .sidebar-nav-group-label { display: none; }
    .sidebar-nav { flex-direction: row; }
    /* En movil el menu es una FILA: la pastilla, que se mide en vertical
       (top/height y left:0/right:0), taparia el ancho entero. Ahi se apaga y
       el enlace abierto vuelve a llevar su propio fondo. */
    .sidebar-nav::before, .sidebar-nav::after { display: none; }
    .nav-item.active { background: rgba(124, 58, 237, 0.22); }
    .nav-item .nav-label { display: inline; }
    .sidebar-footer { margin-top: 0; margin-left: auto; padding-top: 0; border-top: none; }
    .main-area { --aire-natural: 24px; padding: 20px 16px var(--aire-del-pie, var(--aire-natural)); }
    .stat-grid { grid-template-columns: 1fr 1fr; }
    .steps { flex-wrap: wrap; }
  }
  @media (max-width: 480px) {
    .stat-grid { grid-template-columns: 1fr; }
    .auth-card { padding: 32px 24px 26px; }
    .auth-blob { display: none; }
  }

  /* Fase 11 (el plan es del cliente, no de la empresa) - pestaña "Clientes"
     de Administracion. Clases en vez de style="" inline a proposito (ver
     test/internalAppFrontendHardening.test.js - el trinquete de estilos
     inline nunca puede subir). */
  .admin-clientes-h3 { font-size: 0.95rem; }
  .admin-clientes-resultado { margin-top: 10px; }
  .admin-clientes-tabla { margin-top: 18px; }
  .admin-clientes-th-acciones { text-align: right; }

  /* Pestaña "Clientes": cabecera con filtros, listado a la izquierda y el
     detalle del cliente elegido a la derecha. Los dos conviven, asi que
     elegir uno no hace perder de vista a los demas. */
  /* ---------- Administración: formularios ----------
     .liq-grid y .liq-grid-3 estaban definidas SOLO dentro de
     #rrhh-panel-simular, pero los 8 formularios de Administración las usan
     igual - o sea que no tenían ninguna regla: los campos se apilaban a lo
     ancho, uno debajo del otro, y la pantalla quedaba como una pila de
     cajones sueltos en vez de un formulario. */
  #view-administracion .liq-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 16px; }
  #view-administracion .liq-grid-3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0 16px; }
  @media (max-width: 760px) {
    #view-administracion .liq-grid, #view-administracion .liq-grid-3 { grid-template-columns: 1fr; }
  }
  /* Y TODO select de la sección lleva la misma flecha dibujada acá, no la
     del sistema operativo (que cambia de navegador en navegador y no
     combina con nada del resto de la pantalla). */
  #view-administracion select {
    appearance: none; -webkit-appearance: none; -moz-appearance: none;
    padding-right: 34px; cursor: pointer;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 12px center; background-size: 15px 15px;
  }
  #view-administracion select:disabled { opacity: 0.6; cursor: not-allowed; }
  /* Los tres controles de la cabecera (buscador y dos filtros) comparten
     alto y foco con los campos de los formularios. */
  .cli-buscar, .cli-filtro { height: 40px; transition: border-color .15s, background .15s; }
  .cli-buscar:focus, .cli-filtro:focus { outline: none; border-color: var(--primary); background: #fff; }
  .cli-panel-campo select { height: 40px; transition: border-color .15s; }
  .cli-panel-campo select:focus { outline: none; border-color: var(--primary); }

  .cli-cabecera { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 16px; }
  .cli-titulo { margin: 0; font-size: 1.05rem; }
  .cli-bajada { margin: 4px 0 0; font-size: 0.84rem; color: var(--muted); }
  .cli-controles { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
  .cli-buscar, .cli-filtro {
    font: inherit; padding: 9px 12px; border-radius: 9px;
    border: 1px solid var(--border); background: var(--card); color: inherit;
  }
  .cli-buscar { min-width: 230px; }

  /* Tarjeta blanca con sombra suave, no un rectángulo gris plano: es el
     formulario que la persona está mirando en ese momento, tiene que
     destacarse del fondo en vez de confundirse con él. */
  .cli-alta {
    margin-bottom: 18px; padding: 20px; border: 1px solid var(--border); border-radius: 14px;
    background: var(--card); box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);
  }
  .cli-alta-titulo { margin: 0 0 4px; font-size: 0.95rem; }
  .cli-alta-bajada { margin: 0 0 16px; font-size: 0.8rem; color: var(--muted); }
  .cli-alta .field input, .cli-alta .field select { background: var(--bg); }
  .cli-alta-pie { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 4px; }

  .cli-columnas { display: grid; grid-template-columns: minmax(0, 320px) minmax(0, 1fr); gap: 16px; align-items: start; }
  /* Se apilan antes de que empiecen a apretarse: a 1060px el detalle
     quedaba tan angosto que "Plan y suscripcion" y "Suspender cliente" se
     partian en dos lineas. */
  /* minmax(0, 1fr) y no 1fr: con 1fr el correo largo (sin cortes) ensanchaba
     la columna y en el celular la página scrolleaba de costado. */
  @media (max-width: 1200px) { .cli-columnas { grid-template-columns: minmax(0, 1fr); } }
  /* Y la cabecera: los filtros y el boton se van a su propia linea antes de
     encimarse con el titulo. */
  @media (max-width: 900px) { .cli-controles { width: 100%; } .cli-buscar { flex: 1 1 200px; min-width: 0; } }

  .cli-listado { border: 1px solid var(--border); border-radius: 12px; padding: 16px; }
  .cli-listado-titulo { margin: 0; font-size: 0.95rem; }
  .cli-listado-conteo { margin: 4px 0 12px; font-size: 0.78rem; color: var(--muted); }
  .cli-lista { display: flex; flex-direction: column; gap: 8px; }

  /* Invitaciones que todavía nadie aceptó: personas que TODAVÍA no son
     clientes, así que no son una fila más del listado. Borde punteado para
     que se lea como "esto está a medio camino", y a ancho completo porque
     el enlace nuevo que aparece acá abajo tiene que entrar en una línea. */
  .cli-pendientes {
    margin-bottom: 18px; padding: 18px 20px;
    border: 1px dashed var(--border); border-radius: 14px; background: var(--card);
  }
  .cli-pendientes-cab { margin-bottom: 12px; }
  .cli-pendientes-titulo { margin: 0; font-size: 0.95rem; }
  .cli-pendientes-cab .cli-listado-conteo { margin: 4px 0 0; }
  .cli-pendientes-lista { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 10px; }
  .cli-pendiente {
    display: flex; align-items: center; gap: 10px; min-width: 0;
    padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg);
  }
  .cli-pendiente-vencida { border-color: #FDE68A; background: var(--warning-bg); }
  .cli-pendiente-acciones { display: flex; align-items: center; gap: 12px; flex: none; }
  .cli-avatar-tenue { background: #E2E8F0; color: var(--muted); }
  .cli-enlace-riesgo { color: var(--danger); }
  /* Cada fila es un <button>: se llega con Tab y responde a Enter, cosa que
     un <div> con onclick no hace. */
  .cli-fila {
    display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
    font: inherit; color: inherit; cursor: pointer;
    padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--card);
  }
  .cli-fila:hover { border-color: var(--primary); }
  .cli-fila-activa { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
  .cli-fila-datos { flex: 1 1 auto; min-width: 0; }
  .cli-fila-datos b { display: block; font-size: 0.85rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .cli-fila-datos span { display: block; font-size: 0.75rem; color: var(--muted); }

  .cli-avatar {
    flex: none; width: 38px; height: 38px; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--primary); color: #fff; font-size: 0.78rem; font-weight: 700;
  }

  .cli-chip { flex: none; font-size: 0.72rem; font-weight: 600; padding: 3px 9px; border-radius: 999px; }
  .cli-chip-ok { background: var(--ok-bg, rgba(30,158,107,0.12)); color: #16744F; }
  .cli-chip-warn { background: rgba(200,134,13,0.14); color: #8A5C05; }
  .cli-chip-muted { background: var(--bg); color: var(--muted); }

  .cli-detalle { border: 1px solid var(--border); border-radius: 12px; padding: 18px; }
  .cli-detalle-cab { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
  .cli-detalle-titulo { margin: 0; font-size: 1.05rem; }
  .cli-detalle-sub { margin: 2px 0 0; font-size: 0.78rem; color: var(--muted); }
  .cli-resultado:empty { display: none; }

  .cli-tarjeta { border: 1px solid var(--border); border-radius: 12px; padding: 16px; margin-top: 14px; }
  .cli-tarjeta-cab { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
  .cli-tarjeta-titulo { margin: 0; font-size: 0.95rem; }

  /* "Plan: Impulso · Activo — Ver o cambiar ›" (19/10/2026): el plan se ve
     entero y se cambia en la pestaña Plan y suscripción. */
  .cli-plan-resumen { display: flex; align-items: center; justify-content: space-between; gap: 8px 14px; flex-wrap: wrap; }
  .cli-plan-linea { margin: 0; font-size: 0.88rem; }

  /* Los paneles que se abren -cambiar plan, vincular empresa- son un paso
     dentro de la tarjeta, no un formulario suelto: van sobre un fondo
     propio y con su borde, para que se lea que pertenecen a la tarjeta que
     los abrio. Sin esto quedaba un <select> crudo flotando. */
  .cli-panel { margin-top: 14px; padding: 14px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg); }
  .cli-panel-fila { display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; }
  /* Qué empresas cubre el plan: una casilla por empresa (17/10/2026). */
  .cli-cubre { margin-top: 12px; }
  .cli-cubre-lista { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
  .cli-cubre-lista label { display: flex; align-items: center; gap: 8px; font-size: .88rem; cursor: pointer; }
  .cli-cubre-lista input:disabled + span { opacity: .55; }
  .cli-panel-campo { flex: 1 1 240px; min-width: 0; }
  .cli-panel-campo label { display: block; margin-bottom: 6px; font-size: 0.76rem; font-weight: 600; color: var(--muted); }
  /* Mismo alto y mismo borde que el buscador de arriba: en una pantalla no
     puede haber dos estilos de campo. */
  .cli-panel-campo select {
    width: 100%; font: inherit; padding: 9px 12px; border-radius: 9px;
    border: 1px solid var(--border); background: var(--card); color: inherit;
  }
  .cli-panel-campo select:focus-visible { outline: 2px solid var(--primary); outline-offset: 1px; }
  .cli-panel .btn-secondary { flex: none; }

  /* Un boton que se ve como enlace: abre y cierra el historial. */
  .cli-enlace { font: inherit; font-size: 0.82rem; color: var(--primary); background: none; border: none; padding: 0; cursor: pointer; }
  .cli-boton-riesgo { font: inherit; font-size: 0.82rem; padding: 7px 12px; border-radius: 8px; cursor: pointer; color: var(--danger); background: none; border: 1px solid var(--danger-bg); }
  .cli-boton-riesgo:hover { background: var(--danger-bg); }
  .cli-boton-riesgo-fuerte { border-color: transparent; }

  .cli-historial { margin-top: 12px; }
  .cli-historial-lista { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
  .cli-historial-lista li { padding: 10px 12px; border-radius: 9px; background: var(--bg); }
  .cli-historial-lista b { display: block; font-size: 0.82rem; }
  .cli-historial-lista span { display: block; font-size: 0.75rem; color: var(--muted); }

  .cli-empresas { display: flex; flex-direction: column; gap: 8px; }
  .cli-empresa { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px; }
  .cli-empresa-icono { flex: none; width: 34px; height: 34px; border-radius: 9px; display: inline-flex; align-items: center; justify-content: center; background: var(--bg); color: var(--muted); }
  .cli-empresa-icono svg { width: 18px; height: 18px; }
  .cli-empresa-datos { flex: 1 1 auto; min-width: 0; }
  .cli-empresa-datos b { display: block; font-size: 0.85rem; }
  .cli-empresa-datos span { display: block; font-size: 0.75rem; color: var(--muted); }

  .cli-vacio { margin: 0; padding: 14px 0; font-size: 0.82rem; color: var(--muted); text-align: center; }
  .cli-aviso { margin: 0; font-size: 0.8rem; color: var(--muted); }
  /* Eliminar cliente: al final del detalle y separado, para que no se
     confunda con las acciones de todos los días. */
  .cli-peligro { margin-top: 22px; padding: 14px 16px; border: 1px solid #fecaca; border-radius: 10px; background: #fef2f2; display: flex; align-items: center; justify-content: space-between; gap: 12px 18px; flex-wrap: wrap; }
  .cli-peligro-texto { min-width: 0; flex: 1 1 260px; }
  .cli-peligro h4 { margin: 0 0 2px; font-size: 0.92rem; color: #991b1b; }
  .cli-peligro p { margin: 0; font-size: 0.82rem; color: #7f1d1d; }
  .cli-borrado-lista { margin: 8px 0 0; padding-left: 18px; }
  .cli-borrado-lista li { margin: 2px 0; }
  .cli-borrado-nota { margin: 8px 0 0; }
  .cli-panel-aviso { margin-top: 10px; }
  /* Mismo tamaño que .btn-ghost, pero en rojo: lo que hace no se deshace. */
  .admin-btn-eliminar { color: var(--danger); border-color: var(--danger-bg); }
  .admin-btn-eliminar:hover { background: var(--danger-bg); }
  /* Empresa de SIImplifica sin ninguna cuenta de cliente activa (27/9/2026):
     en rojo suave, porque nadie la puede usar y hay que asignarle otra cuenta
     o eliminarla. */
  .admin-sin-correo {
    display: inline-block; padding: 2px 9px; border-radius: 999px; white-space: nowrap;
    background: var(--danger-bg); color: #B42318; font-size: 0.8rem; font-weight: 600;
  }
  .admin-clientes-aviso { font-size: 0.82rem; }
  /* ---- Constructor de planes ---- */
  .cat-cabecera { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 16px; }
  .cat-titulo { margin: 0; font-size: 1.15rem; }
  .cat-bajada { margin: 4px 0 0; font-size: 0.84rem; color: var(--muted); }
  .cat-alta { margin-bottom: 16px; padding: 16px; border: 1px solid var(--border); border-radius: 12px; background: var(--bg); }

  /* Barra de contexto: sobre que se esta trabajando. */
  .cat-contexto { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 16px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg); font-size: 0.84rem; }
  .cat-contexto-sep { width: 1px; height: 18px; background: var(--border); }
  .cat-contexto-fecha { color: var(--muted); }

  .cat-columnas { display: grid; grid-template-columns: minmax(0, 300px) minmax(0, 1.4fr) minmax(0, 320px); gap: 16px; align-items: start; }
  @media (max-width: 1400px) { .cat-columnas { grid-template-columns: minmax(0, 280px) minmax(0, 1fr); } }
  @media (max-width: 1000px) { .cat-columnas { grid-template-columns: 1fr; } }
  .cat-col { border: 1px solid var(--border); border-radius: 12px; padding: 16px; }
  .cat-col-titulo { margin: 0 0 4px; font-size: 0.95rem; }
  .cat-col-sub { margin: 0 0 12px; font-size: 0.78rem; color: var(--muted); }

  .cat-buscar { width: 100%; font: inherit; padding: 9px 12px; margin: 10px 0 12px; border-radius: 9px; border: 1px solid var(--border); background: var(--card); color: inherit; }
  .cat-arbol { display: flex; flex-direction: column; gap: 4px; }
  .cat-plan-fila, .cat-version {
    display: flex; align-items: center; gap: 9px; width: 100%; text-align: left;
    font: inherit; color: inherit; cursor: pointer;
    padding: 9px 10px; border: 1px solid transparent; border-radius: 9px; background: none;
  }
  .cat-plan-fila:hover, .cat-version:hover { background: var(--bg); }
  .cat-plan-nombre { flex: 1 1 auto; font-size: 0.87rem; font-weight: 600; }
  .cat-plan-archivado .cat-plan-nombre { color: var(--muted); font-weight: 500; }
  /* Archivar… / Reactivar / Eliminar (19/10/2026), al pie del plan
     desplegado, debajo de sus versiones. Chicos y grises: el árbol se sigue
     leyendo como una lista de planes. */
  .cat-plan-acciones { display: flex; flex-wrap: wrap; gap: 4px; margin: 4px 0 2px; }
  .cat-plan-accion {
    font: inherit; font-size: 0.78rem; color: var(--muted); cursor: pointer; white-space: nowrap;
    padding: 6px 10px; border: 1px solid var(--border); border-radius: 8px; background: none;
  }
  .cat-plan-accion:hover { background: var(--bg); color: inherit; }
  .cat-plan-accion-peligro { color: var(--danger); border-color: var(--danger-bg); }
  .cat-plan-accion-peligro:hover { background: var(--danger-bg); color: var(--danger); }
  /* El modal de Archivar. */
  .modal-box.cat-archivar-caja { max-width: 480px; }
  /* Quién lo usa en una línea y, si hay, las solicitudes que se cancelan en
     la siguiente: separadas, no cortadas a mitad de frase. */
  .cat-archivar-uso { white-space: pre-line; }
  .cat-archivar-mencion { margin: -10px 0 16px; font-size: 0.8rem; color: var(--warning); }
  .cat-archivar-sin-cupo { margin: 6px 0 0; padding-left: 18px; font-size: 0.8rem; color: var(--muted); }
  .cat-archivar-sin-cupo li { margin: 2px 0; overflow-wrap: anywhere; }
  .cat-flecha { flex: none; display: inline-block; transition: transform 0.15s; color: var(--muted); }
  .cat-flecha-abierta { transform: rotate(90deg); }
  .cat-versiones { margin: 2px 0 6px 18px; padding-left: 10px; border-left: 1px solid var(--border); }
  .cat-version-activa { background: var(--bg); border-color: var(--primary); }
  .cat-version-punto { flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--muted); }
  .cat-version-activa .cat-version-punto { background: var(--primary); }
  .cat-version-nombre { font-size: 0.84rem; font-weight: 600; }
  .cat-version-estado { font-size: 0.7rem; font-weight: 600; padding: 2px 8px; border-radius: 999px; }
  .cat-version-draft { background: rgba(200,134,13,0.14); color: #8A5C05; }
  .cat-version-published { background: var(--bg); color: var(--muted); }
  .cat-version-retired { background: var(--bg); color: var(--muted); }
  .cat-candado { margin-left: auto; font-size: 0.78rem; }
  .cat-boton-ancho { width: 100%; margin-top: 12px; }

  .cat-filtros { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }
  .cat-filtro { font: inherit; font-size: 0.8rem; padding: 7px 14px; border-radius: 999px; cursor: pointer; border: 1px solid var(--border); background: var(--card); color: inherit; }
  .cat-filtro-activo { background: var(--primary); border-color: var(--primary); color: #fff; }

  .cat-modulos { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 12px; }
  .cat-modulo {
    display: flex; flex-direction: column; gap: 5px; text-align: left;
    font: inherit; color: inherit; cursor: pointer;
    padding: 14px; border: 1px solid var(--border); border-radius: 11px; background: var(--card);
  }
  .cat-modulo:hover { border-color: var(--primary); }
  .cat-modulo-activo { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
  .cat-modulo-cab { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
  .cat-modulo-cab b { font-size: 0.85rem; }
  .cat-modulo-limite { font-size: 0.75rem; font-weight: 600; }
  /* Módulos con sus submódulos (20/10/2026, migración 142): cada módulo es un
     grupo, y sus submódulos van debajo con sangría, una línea guía y un
     interruptor chico. Con el módulo apagado se ven atenuados: no valen,
     pero conservan su valor. */
  .cat-modulos { align-items: start; }
  .cat-grupo { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
  .cat-submodulos { display: flex; flex-direction: column; gap: 2px; margin-left: 14px; padding-left: 10px; border-left: 2px solid var(--border); }
  .cat-submodulo {
    display: flex; align-items: center; justify-content: space-between; gap: 10px; text-align: left;
    font: inherit; font-size: 0.8rem; color: inherit; cursor: pointer;
    padding: 7px 8px 7px 10px; border: 1px solid transparent; border-radius: 9px; background: none;
  }
  .cat-submodulo:hover { background: var(--bg); }
  .cat-submodulo.cat-modulo-activo { border-color: var(--primary); box-shadow: none; }
  .cat-submodulo-nombre { min-width: 0; }
  .cat-submodulos-sin-modulo .cat-submodulo-nombre { color: var(--muted); }
  .cat-interruptor.cat-interruptor-chico { --sw-ancho: 38px; --sw-alto: 20px; --sw-circulo: 14px; }
  .cat-conteo { margin: 14px 0 0; font-size: 0.78rem; color: var(--muted); }

  /* ═══════════════ INTERRUPTORES: UN SOLO ESTILO PARA TODO EL SISTEMA ═══
     Basado en el switch de Galahhad (uiverse.io/Galahhad/modern-quail-75,
     MIT), elegido por el usuario el 13/9/2026.

     Habia TRES interruptores distintos -Automatizaciones, Validador y el
     catalogo de Administracion- cada uno con su tamano y su color, cada uno
     en su archivo. Ahora el estilo vive aca, que es la hoja que carga
     siempre, y los tres apuntan al mismo bloque.

     UNA ADAPTACION IMPORTANTE. El original es un <input type="checkbox">
     oculto y todo cuelga de input:checked. Nuestros interruptores son
     <span role="switch" aria-checked>, que es lo que leen los lectores de
     pantalla y lo que ya togglean los tres modulos. Reescribir el markup
     para meter un checkbox habria tocado siete lugares y el JS de los tres;
     en vez de eso, lo que alla mira input:checked aca mira el aria. Mismo
     dibujo, sin tocar una sola linea de JS.

     Y el dibujo entra en dos elementos porque es lo que hay: la pista es el
     .slider, su ::after es el circulo (con el icono adentro, como imagen de
     fondo) y su ::before es la rayita que se desliza. */
  .cat-interruptor,
  #view-automatizaciones .aut-switch-pista,
  #view-validador .val-switch-pista {
    --sw-ancho: 46px;
    --sw-alto: 24px;
    --sw-circulo: 18px;
    --sw-borde: calc((var(--sw-alto) - var(--sw-circulo)) / 2);
    --sw-apagado: rgb(131, 131, 131);
    --sw-prendido: rgb(0, 218, 80);
    --sw-transicion: all .2s cubic-bezier(0.27, 0.2, 0.25, 1.51);
    --sw-raya-ancho: calc(var(--sw-circulo) / 2);
    flex: none; position: relative; box-sizing: border-box;
    width: var(--sw-ancho); height: var(--sw-alto); border-radius: 999px;
    background: var(--sw-apagado); cursor: pointer; transition: var(--sw-transicion);
  }
  /* El circulo. Prendido lleva un tilde verde de fondo; apagado va limpio.
     El original trae ademas una cruz gris para el apagado, y el usuario la
     saco (13/9/2026): con la pista ya gris, la cruz repite lo mismo y ensucia
     el circulo. El tilde queda porque ese si agrega algo -confirma el estado
     bueno- y va de fondo, sin sumar nodos al markup. */
  .cat-interruptor::after,
  #view-automatizaciones .aut-switch-pista::after,
  #view-validador .val-switch-pista::after {
    content: ""; position: absolute; z-index: 1;
    top: var(--sw-borde); left: var(--sw-borde);
    width: var(--sw-circulo); height: var(--sw-circulo); border-radius: 50%;
    background: #fff center / 10px no-repeat;
    box-shadow: 1px 1px 2px rgba(146, 146, 146, 0.45);
    transition: var(--sw-transicion);
  }
  /* La rayita que acompana al circulo. */
  .cat-interruptor::before,
  #view-automatizaciones .aut-switch-pista::before,
  #view-validador .val-switch-pista::before {
    content: ""; position: absolute; top: 50%; transform: translateY(-50%);
    left: calc(var(--sw-borde) + (var(--sw-raya-ancho) / 2));
    width: var(--sw-raya-ancho); height: calc(var(--sw-raya-ancho) / 2 - 1px);
    background: #fff; border-radius: 1px; transition: all .2s ease-in-out;
  }
  .cat-interruptor[aria-checked="true"],
  #view-automatizaciones .aut-switch[aria-checked="true"] .aut-switch-pista,
  #view-validador .val-switch[aria-checked="true"] .val-switch-pista { background: var(--sw-prendido); }
  .cat-interruptor[aria-checked="true"]::after,
  #view-automatizaciones .aut-switch[aria-checked="true"] .aut-switch-pista::after,
  #view-validador .val-switch[aria-checked="true"] .val-switch-pista::after {
    left: calc(100% - var(--sw-circulo) - var(--sw-borde));
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300da50' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'><path d='m5 13 4 4 10-10'/></svg>");
    box-shadow: -1px 1px 2px rgba(163, 163, 163, 0.45);
  }
  .cat-interruptor[aria-checked="true"]::before,
  #view-automatizaciones .aut-switch[aria-checked="true"] .aut-switch-pista::before,
  #view-validador .val-switch[aria-checked="true"] .val-switch-pista::before {
    left: calc(100% - var(--sw-raya-ancho) - (var(--sw-raya-ancho) / 2) - var(--sw-borde));
  }
  .cat-interruptor-bloqueado { opacity: 0.5; cursor: not-allowed; }

  .cat-config-cab { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
  .cat-config-cab b { font-size: 0.95rem; }
  /* Lo que abre el módulo en el portal (19/10/2026): reemplaza a la clave
     interna ("f29", "max_companies") que se veía debajo del nombre. */
  .cat-config-incluye { margin: 6px 0 16px; }
  .cat-config-incluye ul { margin: 6px 0 0; padding-left: 18px; font-size: 0.82rem; color: var(--text); }
  .cat-config-incluye li { margin: 3px 0; }
  .cat-config-fila { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 0; font-size: 0.83rem; }
  .cat-config-nota { margin: 0 0 6px; font-size: 0.78rem; color: var(--muted); }
  .cat-config-bloque { margin-top: 8px; padding-top: 12px; border-top: 1px solid var(--border); }
  .cat-config-etiqueta { display: block; margin-bottom: 6px; font-size: 0.76rem; font-weight: 600; color: var(--muted); }
  .cat-config-input { width: 100%; font: inherit; padding: 9px 12px; border-radius: 9px; border: 1px solid var(--border); background: var(--card); color: inherit; }
  .cat-config-input:disabled { opacity: 0.6; }
  .cat-aviso { margin: 16px 0 0; padding: 10px 12px; border-radius: 9px; background: var(--bg); font-size: 0.76rem; line-height: 1.45; color: var(--muted); }
  .cat-vacio { margin: 0; padding: 20px 0; font-size: 0.82rem; color: var(--muted); text-align: center; }

  .cat-pie { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin-top: 16px; padding: 14px 16px; border: 1px solid var(--border); border-radius: 12px; background: var(--bg); }
  .cat-estado-cambios { font-size: 0.82rem; color: var(--muted); }
  .cat-pie-botones { display: flex; gap: 10px; flex-wrap: wrap; }

  .admin-catalogo-toolbar { margin: 10px 0 14px; }
  .admin-catalogo-limit-input { width: 90px; }

  /* Fase 12: pestaña "Empresas" de Administracion (listado de empresas de
     clientes). */
  .admin-empresas-check { display: inline-flex; align-items: center; gap: 8px; font-size: 0.85rem; color: var(--muted); }
  /* Fase 12: pestaña "Auditoría" - eventos filtrados a la izquierda,
     procesos masivos (execution_batches) en su propia columna a la derecha. */
  .admin-auditoria-layout { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 22px; align-items: start; }
  /* Una celda de grid mide por defecto lo que mide su contenido (min-width:
     auto), no lo que le toca de la grilla: sin esto la tabla de eventos se
     salía de su columna y se encimaba con "Procesos masivos". Y si aun así
     no entra, scrollea adentro de su propia celda, nunca el documento. */
  .admin-auditoria-layout > * { min-width: 0; }
  .admin-auditoria-layout > * > table.modern { display: block; overflow-x: auto; }
  .admin-auditoria-masivos { border-left: 1px solid var(--border); padding-left: 18px; }
  .admin-audit-grid-fechas { align-items: end; margin-top: 10px; }
  .admin-masivo-item { border: 1px solid var(--border); border-radius: 10px; padding: 10px 12px; margin-bottom: 10px; }
  .admin-masivo-activo { border-color: var(--primary); }
  /* El nombre del proceso es un codigo sin espacios (rrhh_liquidaciones_
     guardar_pdf) y el estado tampoco se parte (completed_with_errors): en
     una fila, entre los dos no entraban en la columna de 300px y el estado
     se salia 40px de la pantalla, con barra horizontal para TODA la pagina
     (medido el 8/10/2026). El estado baja de renglon y el codigo se parte. */
  .admin-masivo-cabecera { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 4px 8px; margin-bottom: 4px; }
  .admin-masivo-cabecera > b { min-width: 0; overflow-wrap: anywhere; }
  .admin-masivo-detalle { font-size: 0.78rem; }
  @media (max-width: 1100px) {
    .admin-auditoria-layout { grid-template-columns: 1fr; }
    .admin-auditoria-masivos { border-left: 0; border-top: 1px solid var(--border); padding-left: 0; padding-top: 18px; }
  }
  /* Caja del enlace de invitacion: token tapado + botones de ver y copiar
     (ver public/js/admin/invitation-link.js). */
  .admin-enlace-box { display: block; }
  .admin-enlace-titulo { font-size: 0.85rem; margin-bottom: 10px; }
  .admin-enlace-fila { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
  .admin-enlace-url { flex: 1; min-width: 240px; word-break: break-all; font-size: 0.8rem; background: rgba(15, 23, 42, 0.05); border-radius: 8px; padding: 8px 10px; }
  .admin-enlace-btn { flex: none; }
  .admin-enlace-aviso { display: inline-block; margin-top: 8px; font-size: 0.8rem; color: var(--success); }
  .admin-enlace-aviso-error { color: var(--danger); }

/* Credencial de PreviRed en el drawer de Empresas.
   Vive acá y no en un style="" porque el trinquete de
   test/internalAppFrontendHardening.test.js no deja subir la cuenta de
   estilos inline de internal-app.html - y tiene razón: un style suelto no se
   puede reutilizar ni ajustar para móvil. */
.ced-cred-titulo { margin-top: 20px; }
.ced-cred-hint { margin: 0 0 8px; font-size: 0.85rem; }
.ced-cred-fila { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.ced-cred-fila input { flex: 1; }
.ced-cred-acciones { display: flex; gap: 8px; }

/* ---------- Celular: ajustes de la revisión del 25/9/2026 ----------
   Revisado a 390px con datos reales. En escritorio nada cambia: todo va
   dentro de max-width 720px (el mismo corte del menú en fila). Va al final
   de app.css, que es la última hoja que se carga, para ganarle a las reglas
   de cada vista sin subir la especificidad. */
@media (max-width: 720px) {
  /* Pestañas en una sola fila que se desliza, en vez de 3-4 renglones. */
  #view-rrhh .rrhh-tabs, #view-administracion .cont-tabs {
    display: flex; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch;
  }
  #view-rrhh .rrhh-tabs::-webkit-scrollbar, #view-administracion .cont-tabs::-webkit-scrollbar { display: none; }
  #view-rrhh .rrhh-tab, #view-administracion .cont-tab { flex: none; white-space: nowrap; }

  /* RR.HH. > Actividad reciente: la etiqueta a la izquierda y, a su lado,
     persona, empresa y hora una debajo de la otra. En fila, la etiqueta y la
     hora dejaban al nombre en una columna de pocas letras. */
  #view-rrhh .rrhh-act-fila { display: grid; grid-template-columns: 64px minmax(0, 1fr); column-gap: 10px; row-gap: 2px; align-items: start; }
  #view-rrhh .rrhh-act-tipo { width: auto; grid-row: 1 / span 2; padding-top: 1px; }
  #view-rrhh .rrhh-act-hora { grid-column: 2; }

  /* Inicio > Actividad reciente: la fecha y el estado bajan debajo de la
     empresa en vez de comerle el ancho. */
  .activity-item { flex-wrap: wrap; }
  .activity-item > div:nth-child(2) { flex: 1 1 0; min-width: 0; }
  .activity-meta { flex: 1 1 100%; display: flex; align-items: center; gap: 8px; text-align: left; margin-left: 0; padding-left: 40px; }
  .activity-meta > div { margin-top: 0 !important; }

  /* Inicio > Ejecutar automatización: los 3 pasos en columna. */
  .steps { flex-direction: column; align-items: flex-start; gap: 8px; }
  .step-line { display: none; }

  /* Buscadores que compartían renglón con un filtro: a lo ancho. */
  .field-row .search-box { flex: 1 1 100%; }

  /* Procesos: los tiempos en una columna (en dos se cortaban los textos). */
  .batch-progress-timings { grid-template-columns: minmax(0, 1fr); }

  /* Tablas anchas: se deslizan dentro de su tarjeta en vez de ensanchar
     toda la página (Historial > Masivas y la Mesa de Contabilidad). */
  #aut-corridas-lista, #cont-panel-mesa { overflow-x: auto; -webkit-overflow-scrolling: touch; }

  /* Formulario 29: el título arriba y los selectores debajo (en fila el
     título quedaba de una palabra por renglón). */
  #view-f29provisorio .topheader { flex-wrap: wrap; }
  #view-f29provisorio .topheader > div:first-child { flex: 1 1 100%; }
  #view-f29provisorio .f29p-header-actions { width: 100%; }

  /* Contabilidad: los controles del encabezado bajan de renglón. */
  #view-contabilidad .topheader > div:last-child { flex-wrap: wrap; max-width: 100%; }
}

/* Validador: con poco ancho los indicadores van uno por renglón (en dos
   columnas el número se montaba sobre el texto). Mide su contenedor, igual
   que las reglas de view-validador.css. */
@container val-kpis (max-width: 460px) {
  #view-validador .val-kpis { grid-template-columns: minmax(0, 1fr); gap: 10px; }
}

/* ---------- Celular: menú con botón (25/9/2026) ----------
   Antes, en celular, el menú era una fila que se salía de la pantalla por
   la derecha (se veían "Inicio" y "Empresas" y el resto quedaba cortado,
   sin ninguna pista de que había más). Ahora la barra lleva el logo y un
   botón de tres líneas; al tocarlo el menú se abre hacia abajo, completo y
   con sus grupos, igual que en escritorio (ver alternarMenuMovil). */
.sidebar-menu-btn { display: none; }
@media (max-width: 720px) {
  .sidebar, .sidebar.collapsed {
    position: sticky; top: 0; z-index: 60; flex-wrap: wrap; overflow: visible;
    padding: 10px 16px; row-gap: 0;
  }
  .sidebar-brand, .sidebar.collapsed .sidebar-brand { padding: 0; }
  .sidebar.collapsed .sidebar-brand-text { display: inline; }
  .sidebar-menu-btn {
    display: flex; align-items: center; justify-content: center; margin-left: auto;
    width: 42px; height: 42px; border-radius: 10px; cursor: pointer;
    background: transparent; border: 1px solid rgba(255,255,255,0.14); color: #fff;
  }
  .sidebar-menu-btn .icono-cerrar,
  .sidebar.menu-movil-abierto .sidebar-menu-btn .icono-abrir { display: none; }
  .sidebar.menu-movil-abierto .sidebar-menu-btn .icono-cerrar { display: block; }
  .sidebar-nav, .sidebar-footer { display: none; }
  .sidebar.menu-movil-abierto .sidebar-nav {
    display: flex; flex-direction: column; flex: 1 1 100%; gap: 2px; margin-top: 14px;
    max-height: calc(100dvh - 210px); overflow-y: auto;
  }
  .sidebar.menu-movil-abierto .sidebar-nav-group-label { display: block; }
  .sidebar.menu-movil-abierto .nav-item { justify-content: flex-start; padding: 11px 12px; }
  .sidebar.menu-movil-abierto .nav-item .nav-label,
  .sidebar.menu-movil-abierto .sidebar-footer button span { display: inline; }
  .sidebar.menu-movil-abierto .account-chip > div,
  .sidebar.menu-movil-abierto .account-chip svg { display: block; }
  .sidebar.menu-movil-abierto .sidebar-footer {
    display: block; flex: 1 1 100%; margin: 10px 0 4px; padding-top: 12px;
    border-top: 1px solid rgba(255,255,255,0.08);
  }
  .sidebar.menu-movil-abierto .sidebar-footer .account-chip { justify-content: flex-start; padding: 10px 12px; gap: 10px; margin-bottom: 8px; }
}

/* Edge dibuja su propio ojo en los campos de contraseña y quedaban dos
   (14/10/2026, pedido del dueño: "tengo 2 ojos, deja el morado"). Queda
   solo el nuestro. */
input[type="password"]::-ms-reveal,
input[type="password"]::-ms-clear { display: none; }

/* Formulario 29 > "Actualizar empresas" (16/10/2026, pedido del dueño: elegir
   la columna -Pendientes, Calculados o las dos- y "un poquito más bonito").
   La ventana vive fuera de #view-f29provisorio: las reglas .f29p-line de esa
   sección no la alcanzaban y se leía "PeríodoAbril 2026" todo junto. */
.modal-box.f29m-modal { max-width: 460px; }
.f29m-periodo { margin: 2px 0 18px; font-size: .85rem; color: var(--muted); }
.f29m-pregunta { margin: 0 0 8px; font-size: .78rem; font-weight: 600; color: var(--muted); }
.f29m-columnas { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.f29m-columna {
  display: flex; align-items: center; gap: 8px; padding: 12px 14px;
  border: 1.5px solid var(--border); border-radius: 12px; background: #fff;
  color: var(--muted); font: inherit; font-size: .88rem; text-align: left; cursor: pointer;
}
.f29m-columna:hover { border-color: var(--primary-soft-border); }
.f29m-columna:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.f29m-columna[aria-pressed="true"] { border-color: var(--primary); background: var(--primary-soft); color: var(--text); }
.f29m-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.f29m-dot.pendiente { background: var(--warning); }
.f29m-dot.calculado { background: var(--success); }
.f29m-columna-nombre { font-weight: 600; }
.f29m-columna-n { margin-left: auto; font-size: .8rem; color: var(--muted); font-variant-numeric: tabular-nums; }
.f29m-check {
  flex: none; display: inline-grid; place-items: center; width: 18px; height: 18px;
  border: 1.5px solid var(--border); border-radius: 50%; background: #fff; color: #fff;
}
.f29m-columna[aria-pressed="true"] .f29m-check { border-color: var(--primary); background: var(--primary); }
.f29m-tilde { width: 11px; height: 11px; visibility: hidden; }
.f29m-columna[aria-pressed="true"] .f29m-tilde { visibility: visible; }
.f29m-resumen { margin-top: 16px; padding: 16px; border-radius: 12px; background: var(--bg); min-height: 64px; }
.f29m-cargando { opacity: .55; }
.f29m-total { display: flex; align-items: baseline; gap: 8px; }
.f29m-total-n { font-size: 1.9rem; font-weight: 700; line-height: 1; color: var(--text); font-variant-numeric: tabular-nums; }
.f29m-total-texto { font-size: .88rem; color: var(--muted); }
.f29m-fuera { margin: 8px 0 0; font-size: .8rem; color: var(--muted); }
.f29m-fuera .link-btn { font-size: .8rem; }
.f29m-vacio { margin: 0; font-size: .85rem; color: var(--muted); }
.f29m-total ~ .f29m-vacio { margin-top: 8px; color: var(--warning); }
.f29m-excluidas-lista { margin-top: 10px; max-height: 200px; overflow-y: auto; border: 1px solid var(--border); border-radius: 10px; padding: 2px 12px; }
.f29m-excluida { display: flex; justify-content: space-between; gap: 12px; padding: 7px 0; border-bottom: 1px solid #F1F5F9; font-size: .8rem; }
.f29m-excluida:last-child { border-bottom: none; }
.f29m-excluida-nombre { font-weight: 600; color: var(--text); }
.f29m-excluida-motivo { color: var(--muted); text-align: right; }
@media (max-width: 420px) { .f29m-columnas { grid-template-columns: 1fr; } }

/* Ajustar PPM (16/10/2026, contabilidad.ajuste-ppm.js). */
.modal-box.appm-modal { max-width: 560px; }
.appm-sub { margin: 2px 0 14px; font-size: .85rem; color: var(--muted); }
.appm-lista { max-height: 340px; overflow-y: auto; border: 1px solid var(--border); border-radius: 12px; }
.appm-fila { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 12px; padding: 9px 14px; border-bottom: 1px solid #F1F5F9; font-size: .8rem; }
.appm-fila:last-child { border-bottom: none; }
.appm-nombre { font-weight: 600; color: var(--text); overflow-wrap: break-word; }
.appm-montos { grid-row: 2; color: var(--muted); font-variant-numeric: tabular-nums; }
.appm-asiento { grid-column: 2; grid-row: 1 / span 2; align-self: center; color: var(--primary-dark); font-variant-numeric: tabular-nums; text-align: right; }
.appm-fuera { color: var(--muted); }
.appm-clave { margin: 14px 0 0; }
.appm-vacio { margin: 0; padding: 12px 14px; font-size: .85rem; color: var(--muted); }
@media (max-width: 520px) { .appm-asiento { grid-column: 1; grid-row: auto; text-align: left; } }
