/* Fuente Inter auto-hospedada (wwwroot/fonts) — sin CDN, funciona offline (ADR-0004) */
@font-face {
    font-family: 'Inter';
    src: url('fonts/InterVariable.woff2') format('woff2');
    font-weight: 100 900;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Inter';
    src: url('fonts/InterVariable-Italic.woff2') format('woff2');
    font-weight: 100 900;
    font-style: italic;
    font-display: swap;
}

html, body {
    font-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    font-feature-settings: 'cv05' 1; /* i/l más distinguibles, recomendado por Inter */
}

/* MudBlazor toma la familia de estas variables; :root:root gana al tema por especificidad */
:root:root {
    --mud-typography-default-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-h1-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-h2-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-h3-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-h4-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-h5-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-h6-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-subtitle1-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-subtitle2-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-body1-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-body2-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-button-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-caption-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-overline-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    --mud-typography-input-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
}

/* ════════════════════════════════════════════════════════════════════════
   SISTEMA DE DISEÑO "FLUENT" tipo Outlook web (ADR-0006, spec de Sebas)
   Primario #0F6CBD · header azul sólido · lienzo #FAF9F8 con tarjetas blancas
   de sombra sutil · esquinas casi rectas (4-6px) · plano, sin gradientes
   ════════════════════════════════════════════════════════════════════════ */
:root {
    --erp-acento: #0F6CBD;        /* primario Fluent */
    --erp-acento-hover: #115EA3;
    --erp-acento-suave: #E0ECF9;  /* selección activa */
    --erp-acento-borde: #C7E0F4;  /* halo/borde azul claro */

    --erp-lienzo: #FAF9F8;        /* fondo general de la app */
    --erp-blanco: #FFFFFF;        /* tarjetas/paneles */
    --erp-linea: #E1DFDD;         /* bordes y divisores */
    --erp-linea-2: #EDEBE9;       /* divisor secundario */
    --erp-fila-hover: #F3F2F1;
    --erp-borde-input: #8A8886;

    --erp-texto: #242424;
    --erp-texto-2: #616161;
    --erp-texto-3: #A19F9D;

    /* Semánticos Fluent SOLO para estados (badge = fondo suave + texto oscuro) */
    --erp-ok: #107C10;       --erp-ok-suave: #DFF6DD;
    --erp-warn: #835B00;     --erp-warn-suave: #FFF4CE;  /* texto oscuro sobre ámbar suave */
    --erp-err: #D13438;      --erp-err-suave: #FDE7E9;
    --erp-neutro: #616161;   --erp-neutro-suave: #F3F2F1;

    --erp-radio-tarjeta: 6px;     /* Fluent: casi recto */
    --erp-radio-control: 4px;
    --erp-sombra-tarjeta: 0 1px 2px rgba(0, 0, 0, .08);
    --erp-sombra-flotante: 0 4px 14px rgba(0, 0, 0, .14);

    /* ── TIPOGRAFÍA ────────────────────────────────────────────────────────
       Hasta el 2026-08-25 el sistema tenía tokens de COLOR completos y ni uno
       de tamaño: los px vivían sueltos por el archivo. Se midieron 12, 13,
       13.5, 14, 15 y 20 — y ese 13.5 delataba ajuste a ojo, no sistema.

       La escala es la MISMA que declara TemaErp.cs. Si cambia una, cambia la
       otra: son la misma decisión escrita en dos sitios porque MudBlazor pinta
       desde C# y app.css retoca desde CSS.                                   */
    --erp-fs-2xs: 11px;   /* overline, contadores  */
    --erp-fs-xs: 12px;    /* caption, badges       */
    --erp-fs-sm: 13px;    /* body2, botones, tabla */
    --erp-fs-base: 14px;  /* body1, inputs, nav    */
    --erp-fs-lg: 16px;    /* h6, subtítulos        */
    --erp-fs-xl: 20px;    /* h5, título de página  */
    --erp-fs-2xl: 24px;   /* cifra de KPI          */

    /* Excepción declarada (regla: una excepción es una decisión escrita, no un
       descuido). La marca del header mide 15px y no 16 porque Inter tiene una
       altura de x mayor que Segoe UI: a 16px se veía más pesada que el Outlook
       real que sirvió de referencia. Es un ajuste ÓPTICO, no un valor suelto. */
    --erp-fs-marca: 15px;

    /* ── ESPACIADO — escala de 4 ───────────────────────────────────────────
       Medido el 2026-08-25 en UNA sola pantalla: 14 valores de padding
       distintos (2,3,5,6,7,8,9,10,12,14,15,16,24,48) y 7 de margen. Los
       impares no venían de ninguna decisión: venían de empujar hasta que se
       viera bien. Con una escala, "que se vea bien" deja de ser puntería.     */
    --erp-esp-0: 2px;
    --erp-esp-1: 4px;
    --erp-esp-2: 8px;
    --erp-esp-3: 12px;
    --erp-esp-4: 16px;
    --erp-esp-5: 24px;
    --erp-esp-6: 32px;
    --erp-esp-7: 48px;

    /* Alto de la franja azul superior. Estaba escrito a mano como 48px en cinco
       sitios y ademas en TemaErp.cs (AppbarHeight). Cualquier cosa que se
       coloque bajo la barra -- un panel lateral, por ejemplo -- necesita este
       numero, y si se desincroniza el panel queda tapado por la barra. */
    --erp-alto-appbar: 48px;
}

body {
    background: var(--erp-lienzo);
    color: var(--erp-texto);
    font-size: var(--erp-fs-base);
}

a, .btn-link {
    color: var(--erp-acento);
}

/* Foco visible en todo el sistema */
:focus-visible {
    outline: 2px solid var(--erp-acento);
    outline-offset: 2px;
}

/* El título de cada página (h1) recibe el foco al navegar — FocusOnNavigate en
   Routes.razor — para que el lector de pantalla anuncie dónde está. Ese foco lo
   pone el código, no el teclado: un h1 no se alcanza con Tab. Sin esta regla, el
   anillo azul de arriba se queda pintado alrededor del título después de entrar a
   una opción (Sebas, 2026-09-09). La plantilla de Blazor trae la misma regla. */
h1:focus,
h1:focus-visible {
    outline: none;
}

/* ── Superficies: tarjetas blancas con sombra SUTIL sobre lienzo gris (Fluent) ── */
.mud-paper {
    box-shadow: var(--erp-sombra-tarjeta) !important;
    border: 1px solid var(--erp-linea);
    border-radius: var(--erp-radio-tarjeta);
    background-color: var(--erp-blanco);
}

/* Excepción: lo FLOTANTE sí necesita sombra suave para leerse como flotante */
.mud-popover,
.mud-menu-paper,
.mud-dialog,
.mud-picker-popover-paper,
.mud-snackbar,
.mud-tooltip {
    box-shadow: var(--erp-sombra-flotante) !important;
    border: 1px solid var(--erp-linea);
}

/* El popover de los desplegables (MudSelect, MudMenu, MudAutocomplete) lleva
   `max-height: 300px` con `box-sizing: border-box`, y MudBlazor le da a la lista
   de adentro `max-height: inherit` + `overflow-y: auto`. Con un borde real de
   1 px la lista mide 1,6 px más que el hueco del contenedor y aparecen DOS
   scrollbars, uno pegado al otro (Sebas, 2026-09-09, «Estado Mov.Prov» en
   Movimientos). El outline dibuja la misma línea sin ocupar espacio. */
.mud-popover {
    border: none;
    outline: 1px solid var(--erp-linea);
    outline-offset: -1px;
}

/* Header superior Fluent: franja sólida del primario (48px EXACTOS), texto blanco */
.mud-appbar,
.mud-appbar .mud-toolbar {
    box-shadow: none !important;
    border-bottom: none;
    height: 48px !important;
    min-height: 48px !important;
}

/* Fila Fluent de botones del header (spec Outlook): 48×48 pegados, icono 20px blanco.
   CERO padding lateral: el waffle toca el borde izquierdo y el avatar el derecho;
   la separación la dan los propios botones de 48×48. */
.mud-appbar,
.mud-appbar .mud-toolbar {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

.botones-header {
    display: flex;
    align-items: stretch;
    height: 48px;
    margin-left: auto;
}

.boton-header {
    width: 48px;
    height: 48px;
    padding: var(--erp-esp-1);
    border-radius: 0;
    background: transparent;
    border: none;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #FFFFFF;
    cursor: pointer;
    font: inherit;
    text-decoration: none;
}

.boton-header .mud-icon-root,
.boton-header .icono-f {
    width: 20px;
    height: 20px;
    font-size: var(--erp-fs-xl);
    color: #FFFFFF;
    fill: currentColor;
}

/* Iconos Fluent (svg 20×20 del set oficial): heredan el color del texto */
.icono-f {
    fill: currentColor;
    flex-shrink: 0;
    display: inline-block;
    vertical-align: -0.25em;
}

.nav-con-icono {
    display: inline-flex;
    align-items: center;
    gap: var(--erp-esp-2);
}

.item-menu-avatar .icono-f {
    color: var(--erp-texto-2);
}

/* Hover/activo como Outlook: azules sólidos de Fluent (themeDark / themeDarker) */
.boton-header:hover {
    background-color: #0F548C;
}

.boton-header:active {
    background-color: #0C3B5E;
}

.boton-header:focus-visible {
    outline: 2px solid #fff;
    outline-offset: -2px;
}

/* Variante ancha (empresa y usuario): mismo alto 48px, contenido flexible */
.boton-header-ancho {
    width: auto;
    padding: var(--erp-esp-1) var(--erp-esp-3);
    gap: var(--erp-esp-2);
    font-size: var(--erp-fs-sm);
    font-weight: 600;
    white-space: nowrap;
}

/* Avatar Outlook: circular 32×32, iniciales o foto de perfil; abre menú al clic */
.avatar-header-foto {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    object-fit: cover;
    flex-shrink: 0;
    display: block;
}

.avatar-header {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    background: rgba(255, 255, 255, .25);
    color: #fff;
    font-size: var(--erp-fs-xs);
    font-weight: 700;
    display: grid;
    place-items: center;
    flex-shrink: 0;
}

/* Menú desplegable del avatar (Cerrar sesión, cambiar empresa) */
.fondo-menu-avatar {
    position: fixed;
    inset: 0;
    z-index: 1400;
}

.menu-avatar {
    position: fixed;
    top: 48px;
    right: 8px;
    z-index: 1401;
    min-width: 240px;
    background: var(--erp-blanco);
    border: 1px solid var(--erp-linea);
    border-radius: var(--erp-radio-control);
    box-shadow: var(--erp-sombra-flotante);
    padding: var(--erp-esp-1) 0;
}

.item-menu-avatar {
    width: 100%;
    display: flex;
    align-items: center;
    gap: var(--erp-esp-3);
    padding: var(--erp-esp-2) var(--erp-esp-4);
    border: none;
    background: transparent;
    color: var(--erp-texto);
    font: inherit;
    font-size: var(--erp-fs-sm);
    cursor: pointer;
    text-decoration: none;
}

.item-menu-avatar:hover {
    background: var(--erp-fila-hover);
}

.item-menu-avatar .mud-icon-root {
    color: var(--erp-texto-2);
}

.mud-appbar .logo-gema {
    background: #fff;
    color: var(--erp-acento);
}

/* Drawer: blanco, sin sombra, borde derecho; arranca EXACTO bajo el header de 48px */
.mud-drawer {
    box-shadow: none !important;
    border-right: 1px solid var(--erp-linea);
    border-radius: 0;
    top: 48px !important;
    height: calc(100vh - 48px) !important;
}

.mud-main-content {
    padding-top: var(--erp-esp-7) !important;
}

.mud-main-content {
    background: var(--erp-lienzo);
}

/* ── Sidebar de ALTURA COMPLETA (maqueta): logo arriba, ocupa toda la ventana ── */
.sidebar-completo {
    top: 0 !important;
    height: 100vh !important;
}

.logo-erp {
    display: flex;
    align-items: center;
    gap: var(--erp-esp-2);
    padding: var(--erp-esp-4) var(--erp-esp-4) var(--erp-esp-3);
    font-weight: 700;
    font-size: var(--erp-fs-base);
    letter-spacing: -.01em;
    color: var(--erp-texto);
    text-decoration: none;
    border-bottom: 1px solid var(--erp-linea-2);
}

/* Marca del header: métricas del "Outlook" real (16px/600/normal/48px) pero en Inter,
   como todo el sistema — decisión final de Sebas. */
.logo-erp-topbar {
    padding: 0 12px 0 6px;   /* respiro mínimo tras el waffle; sin logo GV */
    border-bottom: none;
    font-family: 'Inter', 'Segoe UI', Helvetica, Arial, sans-serif;
    font-size: var(--erp-fs-marca);
    font-weight: 500;
    letter-spacing: normal;
    line-height: 48px;
    color: #FFFFFF;
    user-select: none;      /* no se puede seleccionar/copiar */
    cursor: default;        /* no es enlace */
    text-decoration: none;
}

.logo-gema {
    width: 22px;
    height: 22px;
    border-radius: var(--erp-radio-tarjeta);
    background: var(--erp-acento);
    color: #fff;
    display: grid;
    place-items: center;
    font-size: var(--erp-fs-2xs);
    font-weight: 800;
    flex-shrink: 0;
}

/* Barra superior: solo sobre el contenido, blanca con borde inferior */
.barra-superior {
    position: sticky;
    top: 0;
    z-index: 10;
    display: flex;
    align-items: center;
    gap: var(--erp-esp-2);
    background: var(--erp-blanco);
    border-bottom: 1px solid var(--erp-linea);
    padding: var(--erp-esp-2) var(--erp-esp-5);
    min-height: 52px;
}

/* ── Sidebar tipo panel de carpetas de Outlook ── */
.menu-lateral .mud-nav-link {
    margin: 1px var(--erp-esp-1);                 /* la pastilla no toca los bordes */
    min-height: 36px;
    height: 36px;
    padding: 0 8px;
    display: flex;
    align-items: center;
    border-radius: var(--erp-radio-control);
    color: var(--erp-texto-2);
}

.menu-lateral .mud-nav-link .mud-nav-link-text {
    line-height: 36px;
}

.menu-lateral .mud-nav-link:hover {
    background: #F3F2F1;
    border-radius: var(--erp-radio-control);
}

/* Activo como Outlook: pastilla azul claro sólido, texto gris, SIN borde azul.
   !important porque MudBlazor pinta su propio .active con el primario. */
.menu-lateral .mud-nav-link.active,
.menu-lateral .mud-nav-link.active:hover {
    background: #CFE4FA !important;
    color: #424242 !important;
    border-radius: var(--erp-radio-control);
}

.menu-lateral .mud-nav-link.active *,
.menu-lateral .mud-nav-link.active .icono-f,
.menu-lateral .mud-nav-link.active .mud-icon-root {
    color: #424242 !important;
}

.nav-con-icono {
    gap: var(--erp-esp-2);                        /* icono ↔ texto */
    min-width: 0;
    width: 100%;
}

/* Nombres largos: una sola línea con elipsis (como Outlook), sin desbordes */
.nav-con-icono .texto-nav {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Encabezado de sección del sidebar (ej. "Operaciones"): etiqueta estática, azul */
.seccion-sidebar {
    display: flex;
    align-items: center;
    pointer-events: none;          /* ya no es clickeable / desplegable */
    cursor: default;
    background: transparent;
    justify-content: flex-start;   /* etiqueta pegada a la izquierda */
    text-align: left;
    padding: var(--erp-esp-4) var(--erp-esp-4) var(--erp-esp-2);
    min-height: 0;
    height: auto;
    border: none;
    font: inherit;
}

.seccion-sidebar:hover {
    background: transparent;       /* sin efecto hover */
}

/* Oculta el chevron del desplegable */
.seccion-sidebar > svg.icono-f {
    display: none;
}

/* Texto de la etiqueta de sección */
.seccion-sidebar > span {
    font-size: var(--erp-fs-sm);
    font-weight: 600;
    letter-spacing: 0.2px;
    text-transform: none;          /* sin mayúsculas */
    color: #0F6CBD;                /* mismo azul del header */
}

/* ===== Encabezado EMPRESA ACTIVA (spec exacta de Sebas) ===== */
/* Padding simétrico del bloque empresa (8px arriba y 8px abajo) */
.empresa-activa { padding: var(--erp-esp-2) 0 !important; }

/* Nunca fondo azul, ni activo, ni hover */
.empresa-activa .mud-nav-link,
.empresa-activa .mud-nav-link.active,
.empresa-activa .mud-nav-link:hover {
    background: transparent !important;
    cursor: default !important;
}

.empresa-activa .mud-nav-link,
.empresa-activa .mud-nav-link-text { color: #242424 !important; }
.empresa-activa .nav-con-icono svg { color: #242424 !important; }
.empresa-activa .mud-nav-link {
    min-height: 28px !important; height: 28px !important; margin: 0 !important;
}
.empresa-activa .mud-nav-link-text {
    display: flex !important; align-items: center !important; height: 28px !important;
    font-weight: 600 !important; color: #242424 !important;
    font-size: var(--erp-fs-base) !important; line-height: normal !important;
}
.empresa-activa .nav-con-icono {
    display: inline-flex !important; align-items: center !important; line-height: normal !important;
}
.empresa-activa .nav-con-icono svg {
    color: #242424 !important; vertical-align: middle !important; flex: 0 0 auto;
}
.empresa-activa .mud-nav-link:hover {
    background: transparent !important; cursor: default !important;
}

/* ===== Divisor sin espaciado propio ===== */
.mud-navmenu > hr.mud-divider { margin: 0 !important; padding: 0 !important; }

/* ===== Sección "Operaciones" (respiro simétrico ~10px) ===== */
.seccion-sidebar { padding: var(--erp-esp-2) var(--erp-esp-4) var(--erp-esp-1) var(--erp-esp-4) !important; }

/* ===== Centrado vertical de TODAS las opciones del sidebar (fix line-height 36px de Mud) ===== */
.mud-navmenu .mud-nav-item .mud-nav-link-text {
    display: flex !important; align-items: center !important;
    height: 36px !important; line-height: normal !important;
}
.mud-navmenu .mud-nav-item .nav-con-icono {
    display: inline-flex !important; align-items: center !important; line-height: normal !important;
}
.mud-navmenu .mud-nav-item .nav-con-icono svg {
    vertical-align: middle !important; flex: 0 0 auto;
}

/* El encabezado de empresa (28px) debe GANARLE a la regla general de 36px de arriba */
.mud-navmenu .empresa-activa .mud-nav-link,
.mud-navmenu .empresa-activa .mud-nav-link-text {
    min-height: 28px !important;
    height: 28px !important;
}

/* ── Tablas ── */
.mud-table {
    border-radius: var(--erp-radio-tarjeta);
}

.mud-table-head .mud-table-cell {
    font-size: var(--erp-fs-xs);
    font-weight: 600;
    color: var(--erp-texto-2);
    background: var(--erp-lienzo);   /* Fluent: cabecera gris suave */
    border-bottom: 1px solid var(--erp-linea);
}

.mud-table-hover .mud-table-body .mud-table-row:hover {
    background-color: var(--erp-fila-hover);
}

/* Números: tabulares y a la derecha (usar en <MudTd Class="num"> / <MudTh Class="num">) */
.num {
    text-align: right !important;
    font-variant-numeric: tabular-nums;
}

/* Las celdas no parten fechas/números en dos líneas; la celda a dos líneas sí fluye */
.mud-table-cell {
    white-space: nowrap;
}

.mud-table-cell .celda-2lineas,
.mud-table-cell .celda-2lineas * {
    white-space: normal;
}

/* ── Densidad de controles: inputs delineados más compactos (40px, no 56px) ── */
.mud-input-control > .mud-input-control-input-container > .mud-input.mud-input-outlined > input.mud-input-slot,
.mud-input-control > .mud-input-control-input-container > .mud-input.mud-input-outlined > div.mud-input-slot,
.mud-input.mud-input-outlined > .mud-input-slot {
    padding-top: 9px;
    padding-bottom: 9px;
}

/* ── El RÓTULO del campo: mismo cuerpo que el valor, y centrado de verdad ──────
   Dos defectos medidos el 2026-08-25 en el formulario de Países, y los dos son
   de MudBlazor, no del tema:

   1. El rótulo medía 16px mientras el valor medía 14. Sale de una regla del
      framework en `rem` —`.mud-input-label-inputcontrol { font-size: 1rem }`—
      que NO pasa por TemaErp.cs, así que declarar Subtitle1 no la alcanza. El
      efecto era que **el rótulo de un campo vacío pesaba más que el dato de la
      tabla**, con la jerarquía al revés.

   2. Estaba **3,9px por debajo del centro** de su caja. MudBlazor lo baja
      `translate(14px, 12px)`, que centra en SU altura por defecto; nuestro
      campo mide 35px porque arriba lo compactamos a 9px de padding. El número
      correcto sale de la caja: (35 − 21) / 2 ≈ 7px.

   Esto es exactamente lo que se veía como "los campos no se ven bien": no era
   el color ni el contraste —los dos miden bien— era el rótulo grande y bajo.  */
.mud-input-control > .mud-input-control-input-container > .mud-input-label-inputcontrol {
    font-size: var(--erp-fs-base);
    line-height: 1.5;
}

.mud-input-label-outlined.mud-input-label-margin-dense,
.mud-input-control:not(.mud-input-control-margin-dense) .mud-input-label-outlined {
    transform: translate(14px, 7px) scale(1);
}

/* Rótulo flotado (hay texto o el campo tiene el foco): se monta sobre el borde.
   El factor sale de la escala, no del ojo: 14px × .857 = 12px = --erp-fs-xs.
   Con el .72 de antes y el rótulo ya en 14px habría quedado en 10px, por debajo
   del escalón más pequeño del sistema. */
.mud-input-control .mud-input-label-outlined.mud-input-label-inputcontrol.mud-shrink,
.mud-shrink.mud-input-label-outlined {
    transform: translate(14px, -6px) scale(0.857) !important;
}

/* Botones: sin mayúsculas forzadas ya viene del tema; afinar altura */
.mud-button-root {
    letter-spacing: 0;
}

/* Botón secundario Fluent: blanco, borde gris, texto oscuro */
.mud-button-outlined {
    background: var(--erp-blanco);
    border-color: var(--erp-borde-input) !important;
    color: var(--erp-texto) !important;
}

.mud-button-outlined:hover {
    background: var(--erp-fila-hover);
}

/* Inputs: SIN halo — al enfocar solo el borde cambia al azul primario (pedido de
   Sebas 2026-07-12: nada de anillos de focus, ni permanentes ni al seleccionar) */
.mud-input.mud-input-outlined .mud-input-outlined-border,
.mud-input.mud-input-outlined:focus-within .mud-input-outlined-border {
    box-shadow: none;
}

/* Barra de comandos Fluent: fila de acciones icono+texto sobre la tabla */
.barra-comandos {
    display: flex;
    align-items: center;
    gap: var(--erp-esp-1);
    flex-wrap: wrap;
    padding: var(--erp-esp-2) var(--erp-esp-3);
    border-bottom: 1px solid var(--erp-linea);
}

.barra-comandos .mud-button-root {
    color: var(--erp-texto);
    font-weight: 400;
}

.barra-comandos .mud-button-root:hover {
    background: var(--erp-fila-hover);
}

.barra-comandos .mud-button-root .mud-icon-root {
    color: var(--erp-acento);
}

/* Fila a dos líneas: principal + secundaria en gris */
.celda-2lineas .linea-principal {
    font-weight: 500;
    color: var(--erp-texto);
    line-height: 1.3;
}

.celda-2lineas .linea-secundaria {
    font-size: var(--erp-fs-xs);
    color: var(--erp-texto-2);
    line-height: 1.3;
}

/* Referencia fuerte en zafiro (n.º de orden, códigos clicables) */
.ref-zafiro {
    color: var(--erp-acento);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

/* ── Chips de estado: píldora SUAVE (texto semántico + fondo suave + puntito) ── */
.mud-chip {
    border-radius: 999px;
    font-weight: 500;
}

.mud-chip.mud-chip-color-success { background: var(--erp-ok-suave) !important; color: var(--erp-ok) !important; }
.mud-chip.mud-chip-color-warning { background: var(--erp-warn-suave) !important; color: var(--erp-warn) !important; }
.mud-chip.mud-chip-color-error   { background: var(--erp-err-suave) !important; color: var(--erp-err) !important; }
.mud-chip.mud-chip-color-info    { background: var(--erp-acento-suave) !important; color: var(--erp-acento) !important; }
.mud-chip.mud-chip-color-default,
.mud-chip.mud-chip-color-secondary { background: var(--erp-neutro-suave) !important; color: var(--erp-neutro) !important; }
.mud-chip.mud-chip-color-primary { background: var(--erp-acento-suave) !important; color: var(--erp-acento) !important; }

/* Puntito de estado (solo cuando el chip no trae icono propio) */
.mud-chip.mud-chip-color-success:not(:has(.mud-chip-icon))::before,
.mud-chip.mud-chip-color-warning:not(:has(.mud-chip-icon))::before,
.mud-chip.mud-chip-color-error:not(:has(.mud-chip-icon))::before,
.mud-chip.mud-chip-color-info:not(:has(.mud-chip-icon))::before,
.mud-chip.mud-chip-color-default:not(:has(.mud-chip-icon))::before {
    content: "";
    display: inline-block;
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: currentColor;
    margin-right: 6px;
    flex-shrink: 0;
}

/* ── KPIs (fila de indicadores arriba de las pantallas) ── */
.kpi-tarjeta {
    padding: var(--erp-esp-3) var(--erp-esp-4);
    height: 100%;
}

.kpi-etiqueta {
    font-size: var(--erp-fs-2xs);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--erp-texto-3);
    margin-bottom: var(--erp-esp-1);
}

.kpi-valor {
    font-size: var(--erp-fs-2xl);
    font-weight: 600;
    color: var(--erp-texto);
    font-variant-numeric: tabular-nums;
    line-height: 1.2;
}

.kpi-detalle {
    font-size: var(--erp-fs-xs);
    color: var(--erp-texto-2);
    margin-top: var(--erp-esp-0);
}

/* ── Alertas: variante suave coherente con los chips ── */
.mud-alert {
    border-radius: var(--erp-radio-control);
}

/* ── Login (SSR estático) y tarjetas de navegación ── */
.pantalla-centrada {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--erp-lienzo);
    padding: var(--erp-esp-4);
}

.tarjeta-login {
    width: 100%;
    max-width: 400px;
    border: 1px solid var(--erp-linea);
    border-radius: var(--erp-radio-tarjeta);
    box-shadow: var(--erp-sombra-tarjeta) !important;
    background: var(--erp-blanco);
}

.etiqueta-login {
    display: block;
    font-size: var(--erp-fs-sm);
    font-weight: 600;
    color: var(--erp-texto-2);
    margin: 0.9rem 0 0.25rem;
}

.campo-login {
    width: 100%;
    padding: var(--erp-esp-2) var(--erp-esp-3);
    font-size: var(--erp-fs-lg);
    border: 1px solid var(--erp-linea);
    border-radius: var(--erp-radio-control);
}

.campo-login:focus {
    outline: none;
    border-color: var(--erp-acento);
    box-shadow: 0 0 0 2px var(--erp-acento-borde);
}

.casilla-login {
    display: flex;
    align-items: center;
    gap: var(--erp-esp-2);
    margin: var(--erp-esp-4) 0;
    font-size: var(--erp-fs-base);
    color: var(--erp-texto-2);
}

.boton-login {
    width: 100%;
    padding: var(--erp-esp-3);
    font-size: var(--erp-fs-lg);
    font-weight: 600;
    color: #fff;
    background-color: var(--erp-acento);
    border: none;
    border-radius: var(--erp-radio-control);
    cursor: pointer;
}

.boton-login:hover {
    background-color: var(--erp-acento-hover);
}

.texto-error {
    display: block;
    color: var(--erp-err);
    font-size: var(--erp-fs-xs);
    margin-top: var(--erp-esp-1);
}

/* Agenda de mantenimientos (Blindax): fila con la fecha programada ya vencida */
.fila-vencida td {
    background-color: rgba(196, 49, 75, 0.06);
}

/* ── Arrastre de columnas del DataGrid: sobrio y ESTABLE (auditoría QA 2026-07-13) ──
   MudBlazor trae `transition: all 300ms` + fondos verde/rojo en las zonas + una barra
   fantasma de 20px: se sentía lento y parpadeante. Aquí: transición corta solo del
   fondo, indicador de inserción azul fino, y sin barra fantasma. */
.mud-data-grid .mud-table-cell .mud-drop-zone {
    transition: background-color 120ms ease, box-shadow 120ms ease;
}

.mud-data-grid .mud-table-cell .mud-drop-zone.mud-drop-zone-can-drop {
    background-color: var(--erp-acento-suave);
    box-shadow: inset 3px 0 0 var(--erp-acento);
}

.mud-data-grid .mud-table-cell .mud-drop-zone.mud-drop-zone-no-drop {
    background-color: transparent;
}

.mud-data-grid .mud-table-cell .mud-drop-item-preview-start {
    display: none;
}

.mud-data-grid .drag-icon-options {
    transition: opacity 120ms ease;
}

/* Sidebar reordenable: las opciones se arrastran dentro de su sección (mismo criterio
   sobrio: sin verde/rojo de Material ni transiciones de 300ms) */
.zona-sidebar {
    min-height: 0;
    transition: background-color 120ms ease;
}

.zona-sidebar.mud-drop-zone-can-drop {
    background-color: var(--erp-acento-suave);
}

.zona-sidebar.mud-drop-zone-no-drop {
    background-color: transparent;
}

.zona-sidebar .mud-drop-item-preview-start {
    display: none;
}

.zona-sidebar .mud-drop-item {
    cursor: grab;
}

.zona-sidebar .mud-drop-item:active {
    cursor: grabbing;
}

.tarjeta-clic {
    cursor: pointer;
    transition: border-color .15s ease, background-color .15s ease;
}

.tarjeta-clic:hover {
    border-color: var(--erp-acento-borde);
    background-color: var(--erp-fila-hover);
}

/* ── Encabezado estándar de página: título 600 + subtítulo gris, acción primaria a la derecha ── */
.encabezado-pagina {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--erp-esp-4);
    flex-wrap: wrap;
    margin-bottom: var(--erp-esp-4);
}

.titulo-pagina {
    font-weight: 600 !important;
    letter-spacing: -.01em;
}

.subtitulo-pagina {
    color: var(--erp-texto-2);
    margin-top: var(--erp-esp-0);
    max-width: 72ch;
}

/* ── Ficha técnica de la pantalla: plegada por defecto ────────────────────────
   El subtítulo de cada pantalla llevaba texto como «Opción [211] del viejo
   (Timp_paises) — … datos sucios reales». Eso NO es un descuido: es la
   trazabilidad al sistema que se está reemplazando, y vale mucho — dice qué
   opción del menú viejo replica, qué rarezas se conservaron a propósito y por
   qué una pantalla está muerta.

   Pero el usuario de compras no tiene por qué leer «Timp_paises» cada vez que
   entra. Así que no se borra: se pliega. Quien la necesita —Sebas, la BDA, quien
   programe encima— la abre; quien no, ve la pantalla limpia.

   Se usa <details> nativo a propósito: sin JavaScript, sin estado en el
   servidor, y funciona igual si el circuito de Blazor todavía no ha conectado. */
.ficha-tecnica {
    margin-top: var(--erp-esp-1);
    max-width: 72ch;
    font-size: var(--erp-fs-sm);
    color: var(--erp-texto-2);
}

.ficha-tecnica > summary {
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: var(--erp-esp-1);
    padding: var(--erp-esp-0) var(--erp-esp-2);
    margin-left: calc(var(--erp-esp-2) * -1);
    border-radius: var(--erp-radio-control);
    color: var(--erp-texto-3);
    font-size: var(--erp-fs-xs);
    font-weight: 600;
    list-style: none;
    user-select: none;
}

.ficha-tecnica > summary::-webkit-details-marker { display: none; }

.ficha-tecnica > summary::before {
    content: "›";
    display: inline-block;
    font-size: var(--erp-fs-base);
    line-height: 1;
    transition: transform .15s ease;
}

.ficha-tecnica[open] > summary::before { transform: rotate(90deg); }

.ficha-tecnica > summary:hover {
    background: var(--erp-fila-hover);
    color: var(--erp-texto-2);
}

.ficha-tecnica > div {
    padding: var(--erp-esp-2) 0 0 var(--erp-esp-2);
    border-left: 2px solid var(--erp-linea);
    margin-left: var(--erp-esp-0);
}

/* ── Tarjeta de filtros compacta (campos densos + acción, arriba de cada tabla) ── */
.tarjeta-filtros {
    display: flex;
    align-items: center;
    gap: var(--erp-esp-3);
    flex-wrap: wrap;
    padding: var(--erp-esp-2) var(--erp-esp-4);
    margin-bottom: var(--erp-esp-4);
}

.tarjeta-filtros .mud-input-control {
    margin-top: 0;
}

/* ── Barra de captura operativa (Registro Diario, Consumos, MO): inline pero COMPACTA ── */
.barra-captura {
    padding: var(--erp-esp-3) var(--erp-esp-4);
    margin-bottom: var(--erp-esp-4);
}

/* ── Estado vacío de tablas: icono gris + mensaje amable centrado ── */
.estado-vacio {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--erp-esp-2);
    padding: var(--erp-esp-7) var(--erp-esp-4);
    color: var(--erp-texto-2);
    text-align: center;
}

.estado-vacio .mud-icon-root {
    font-size: var(--erp-fs-6xl, 32px);
    color: var(--erp-texto-3);
}

.mud-table-cell .estado-vacio,
.mud-table-cell .estado-vacio * {
    white-space: normal;
}

/* ── Tarjetas de navegación (Home / Empresa): gema suave zafiro + título + contador ── */
.gema-suave {
    width: 40px;
    height: 40px;
    border-radius: var(--erp-radio-tarjeta);
    background: var(--erp-acento-suave);
    color: var(--erp-acento);
    display: grid;
    place-items: center;
    flex-shrink: 0;
}

.tarjeta-nav {
    display: flex;
    align-items: center;
    gap: var(--erp-esp-3);
    padding: var(--erp-esp-4);
    height: 100%;
}

.tarjeta-nav .texto-nav {
    flex: 1;
    min-width: 0;
}

/* KPI con el valor acentuado en zafiro (p. ej. costo unitario por boya) */
.kpi-valor.acento {
    color: var(--erp-acento);
}

/* Logo-gema grande (login) */
.logo-gema-grande {
    width: 48px;
    height: 48px;
    border-radius: var(--erp-radio-tarjeta);
    font-size: var(--erp-fs-xl);
    margin: 0 auto;
}

/* ── Validación de formularios (Blazor) ── */
.valid.modified:not([type=checkbox]) {
    outline: 1px solid var(--erp-ok);
}

.invalid {
    outline: 1px solid var(--erp-err);
}

.validation-message {
    color: var(--erp-err);
}

.blazor-error-boundary {
    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
    padding: 1rem 1rem 1rem 3.7rem;
    color: white;
}

    .blazor-error-boundary::after {
        content: "An error has occurred."
    }

/* ══════════════════════════════════════════════════════════════════════════
   PANEL LATERAL DE EDICIÓN  (Sebas, 2026-08-25)
   ══════════════════════════════════════════════════════════════════════════
   El editor de un registro se abría como una tarjeta ENCIMA de la tabla, y eso
   la empujaba hacia abajo. Con 100 filas en pantalla, quien pulsaba «Editar»
   estando abajo no tenía forma de enterarse de que el formulario había
   aparecido — arriba del todo, fuera de la vista.

   El panel entra desde la derecha sobre un velo: no mueve ni un píxel de la
   tabla, y el velo deja claro que hay algo abierto y que lo demás está en
   pausa. El pie va fijo porque con tres pestañas y formularios largos, unos
   botones al final del contenido quedan fuera de la vista justo cuando hacen
   falta.                                                                      */

.velo-panel {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, .32);
    z-index: 1200;
    animation: velo-entra .15s ease;
}

.panel-lateral {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    width: min(760px, 92vw);
    z-index: 1201;
    background: var(--erp-blanco);
    border-left: 1px solid var(--erp-linea);
    box-shadow: -8px 0 24px rgba(0, 0, 0, .12);
    display: flex;
    flex-direction: column;
    animation: panel-entra .18s ease;
}

.panel-lateral-tapa {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--erp-esp-3);
    padding: var(--erp-esp-3) var(--erp-esp-4);
    border-bottom: 1px solid var(--erp-linea);
    flex: none;
}

/* El cuerpo es lo ÚNICO que rueda: la cabecera y el pie se quedan quietos. */
.panel-lateral-cuerpo {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
    padding: var(--erp-esp-4);
}

.panel-lateral-pie {
    display: flex;
    gap: var(--erp-esp-2);
    padding: var(--erp-esp-3) var(--erp-esp-4);
    border-top: 1px solid var(--erp-linea);
    background: var(--erp-lienzo);
    flex: none;
}

@keyframes velo-entra  { from { opacity: 0 } to { opacity: 1 } }
@keyframes panel-entra { from { transform: translateX(100%) } to { transform: none } }

/* Quien haya pedido menos movimiento, que no lo tenga. */
@media (prefers-reduced-motion: reduce) {
    .velo-panel, .panel-lateral { animation: none; }
}
