/* ============================================================
   Expectra — Sistema de Diseño (Despacho Jurídico · Claro)
   Paleta neutra: gris claro de fondo, accent #1F2937 (gray-800) para
   invitacion al clic, negro puro en botones primarios.
   Tipografía: Satoshi display (Fontshare, 300-900 para jerarquía).
   ============================================================ */

/* Satoshi desde Fontshare (https://www.fontshare.com/fonts/satoshi).
   Fuente display geometrica de Indian Type Foundry, moderna y versatil.
   Estrategia de pesos:
     300 Light    - etiquetas uppercase pequenas, hint text, .muted
     400 Regular  - cuerpo (parrafos, body)
     500 Medium   - texto con emphasis sutil (.user-name)
     600 SemiBold - nav links, botones, thead
     700 Bold     - titulos (h1, h2), mensajes flash
     800 ExtraBold- wordmark "Expectra" en el sidebar
     900 Black    - logo del login (impacto visual) */
@import url('https://api.fontshare.com/v2/css?f[]=satoshi@300;400;500;600;700;800;900&display=swap');

:root {
    --bg:          #f4f6fa;
    --surface:     #ffffff;
    --surface-2:   #eef2f7;
    --surface-3:   #e2e8f0;
    --border:      rgba(15, 23, 42, 0.08);
    --border-strong: rgba(15, 23, 42, 0.14);
    --accent:      #0F1115;          /* negro mate para CTAs/botones (mismo en claro y dark) */
    --accent-alt:  #1F2937;
    --accent-vivid:#000000;
    --accent-soft: rgba(15, 23, 42, 0.06);
    --accent-line: rgba(15, 23, 42, 0.22);
    --button-text: #FFFFFF;
    --text:        #0f172a;
    --text-dim:    #475569;
    --text-dim-2:  #94a3b8;
    --text-accent: #1F2937;          /* alias semantico: --accent es bg, este es text-color */
    --success:     #16a34a;
    --warning:     #d97706;
    --danger:      #dc2626;
    --danger-strong: #991B1B;       /* rojo profundo — TEXTO de peligro en claro */
    --shadow:      0 1px 2px rgba(15, 23, 42, 0.04);
    --shadow-md:   0 4px 14px rgba(15, 23, 42, 0.05);

    /* Kravio tokens (sidebar claro · off-white neutro)
       — se usan en ``.edx-sidebar*``. La paleta principal del panel
       sigue siendo la turquesa del EDX (--accent, --surface, etc.).
       v9: hover y activo son fondos distinguibles (hover más suave que
       activo), icono cambia a color principal en hover/activo y
       aparece una barra lateral accent como indicador de ruta. */
    --sidebar-bg:           #FFFFFF;
    --sidebar-bg-hover:     #F7F7F7;   /* gris muy suave — hover */
    --sidebar-bg-active:    #F0F0EE;   /* gris cálido medio — activo (Kravio bg tarjeta secundaria) */
    --sidebar-border:       #E5E5E5;
    --sidebar-border-hover: #D9D9D9;
    --sidebar-text:         #0E1118;
    --sidebar-text-muted:   #9C9C9C;
    --sidebar-muted:        #6A6B6C;
    --sidebar-accent:       #1F2937;
    --sidebar-accent-soft:  rgba(31, 41, 55, 0.10);
    --sidebar-danger:       #dc2626;
    --sidebar-danger-soft:  rgba(220, 38, 38, 0.10);
    --sidebar-radius:       10px;
    --sidebar-easing:       cubic-bezier(0.2, 0.8, 0.2, 1);
    --sidebar-duration:     220ms;
    --shell-panel-bg:       #C4C7CB;
    --shell-panel-border:   #E5E5E5;

    /* Gradient sutil del sidebar (modo claro: blanco arriba, casi imperceptible abajo) */
    --sidebar-bg-top:       #FFFFFF;
    --sidebar-bg-bottom:    #FCFCFD;
}

/* ───────────── DARK MODE ─────────────
   Activado por .dark-mode en <html> (anti-FOUC) o <body> (toggle script).
   Solo override de variables — todas las reglas que usan var(--xxx)
   se actualizan automáticamente. Login NO usa esta clase (queda claro). */
html.dark-mode,
body.dark-mode {
    /* Tokens globales dark */
    --bg:          #0F1115;          /* fondo principal (Apple/Linear style) */
    --surface:     #1A1D23;          /* cards, panels */
    --surface-2:   #232730;          /* cards hover, sub-cards */
    --surface-3:   #2D3138;          /* cards active */
    --border:      rgba(255, 255, 255, 0.08);
    --border-strong: rgba(255, 255, 255, 0.14);
    /* IMPORTANTE: --accent es el color de FONDO de los CTAs/botones primarios.
       En AMBOS modos (claro y dark) es negro mate full black.
       El texto encima es siempre blanco (var(--button-text = #FFFFFF)).
       Esto da consistencia visual: los CTAs son siempre el mismo botón
       negro en cualquier esquema de color. */
    --accent:      #0F1115;
    --accent-alt:  #050810;
    --accent-vivid:#000000;
    --accent-soft: rgba(255, 255, 255, 0.06);
    --accent-line: rgba(255, 255, 255, 0.22);
    --button-text: #FFFFFF;          /* texto sobre botones primarios (negro mate) */
    --text:        #E5E7EB;          /* texto principal */
    --text-dim:    #9CA3AF;
    --text-dim-2:  #6B7280;
    --text-accent: #E5E7EB;          /* alias semántico para usar como color de acento en texto */
    --success:     #4ade80;
    --warning:     #fbbf24;
    --danger:      #ef4444;          /* rojo más brillante para contraste sobre dark */
    --danger-strong: #EF4444;       /* mismo rojo, legible sobre dark */
    --shadow:      0 1px 2px rgba(0, 0, 0, 0.3);
    --shadow-md:   0 4px 14px rgba(0, 0, 0, 0.4);

    /* Tokens sidebar dark */
    --sidebar-bg:           #1A1D23;
    --sidebar-bg-hover:     #232730;
    --sidebar-bg-active:    #2D3138;
    --sidebar-border:       rgba(255, 255, 255, 0.06);
    --sidebar-border-hover: rgba(255, 255, 255, 0.12);
    --sidebar-text:         #E5E7EB;
    --sidebar-text-muted:   #6B7280;
    --sidebar-muted:        #9CA3AF;
    --sidebar-accent:       #E5E7EB;
    --sidebar-accent-soft:  rgba(229, 231, 235, 0.10);
    --sidebar-danger:       #ef4444;
    --sidebar-danger-soft:  rgba(239, 68, 68, 0.10);
    --shell-panel-bg:       #0F1115;  /* mismo color que body dark, sin distinción */
    --shell-panel-border:   rgba(255, 255, 255, 0.06);

    /* Gradient sidebar dark: arriba un poco mas claro que abajo */
    --sidebar-bg-top:       #232730;
    --sidebar-bg-bottom:    #1A1D23;

    color-scheme: dark;  /* scrollbars y form controls nativos en dark */
}

/* ───────────── DARK MODE OVERRIDES (configuracion.html) ─────────────
   El panel de Configuracion usa clases Tailwind con colores hardcoded
   (bg-white, bg-[#F1F1F1], etc.) que ignoran las variables CSS.
   Estos selectores especificos los sobrescriben en dark mode sin
   modificar el HTML, manteniendo el template intacto. */
html.dark-mode .bg-white,
body.dark-mode .bg-white {
    background-color: var(--surface) !important;
    color: var(--text) !important;
}
html.dark-mode .bg-\[\#F1F1F1\],
body.dark-mode .bg-\[\#F1F1F1\] {
    background-color: var(--surface-2) !important;
    color: var(--text) !important;
}
html.dark-mode .bg-\[\#F7F7F7\],
body.dark-mode .bg-\[\#F7F7F7\] {
    background-color: var(--surface-2) !important;
    color: var(--text) !important;
}
html.dark-mode .bg-\[\#FFF8F0\],
body.dark-mode .bg-\[\#FFF8F0\] {
    background-color: rgba(176, 109, 71, 0.10) !important;  /* warm semántico sigue */
    color: var(--text) !important;
}

/* Bordes hardcoded: aclarar en dark para que se vean sobre dark */
html.dark-mode .border-\[\#E5E5E5\],
body.dark-mode .border-\[\#E5E5E5\] {
    border-color: var(--border) !important;
}
html.dark-mode .border-\[\#F5E4D8\],
body.dark-mode .border-\[\#F5E4D8\] {
    border-color: rgba(176, 109, 71, 0.30) !important;  /* warm semántico */
}

/* Texto hardcoded: usar variables para que tengan contraste correcto */
html.dark-mode .text-\[\#11141A\],
body.dark-mode .text-\[\#11141A\] {
    color: var(--text) !important;
}
html.dark-mode .text-\[\#9C9C9C\],
body.dark-mode .text-\[\#9C9C9C\] {
    color: var(--text-dim) !important;
}
html.dark-mode .placeholder\:text-\[\#D9D9D9\]::placeholder,
body.dark-mode .placeholder\:text-\[\#D9D9D9\]::placeholder {
    color: var(--text-dim-2) !important;
}

/* ───────────── DARK MODE OVERRIDES (configuracion.html <style> local) ─────────────
   El archivo configuracion.html tiene su propio <style> block con clases
   como .krav-tabla, .action-popover, .chip, etc. con colores hex literales.
   Estos selectores especificos sobrescriben cada uno en dark mode. */
html.dark-mode .krav-tabla,
body.dark-mode .krav-tabla {
    background: var(--surface) !important;
}
html.dark-mode .krav-tabla thead th,
body.dark-mode .krav-tabla thead th {
    background: var(--surface-2) !important;
    color: var(--text-dim) !important;
    border-bottom-color: var(--border) !important;
}
html.dark-mode .krav-tabla tbody tr,
body.dark-mode .krav-tabla tbody tr {
    border-bottom-color: var(--border) !important;
}
html.dark-mode .krav-tabla tbody tr:hover,
body.dark-mode .krav-tabla tbody tr:hover {
    background: var(--surface-2) !important;
}
html.dark-mode .krav-tabla tbody td,
body.dark-mode .krav-tabla tbody td {
    color: var(--text) !important;
}
html.dark-mode .krav-tabla td.muted,
body.dark-mode .krav-tabla td.muted {
    color: var(--text-dim) !important;
}
html.dark-mode .krav-tabla .username,
body.dark-mode .krav-tabla .username {
    color: var(--text) !important;
}

/* Action popover — panel flotante. El disparador (<summary>) y los botones
   internos usan el sistema .btn (themeable), así que aquí solo va el panel. */
html.dark-mode .action-popover .popover-body,
body.dark-mode .action-popover .popover-body {
    background: var(--surface) !important;
    color: var(--text) !important;
    border-color: var(--border) !important;
}

/* Chips semánticos (tu, warn, success, danger) — mantener color semantico
   pero subir luminosidad del texto para contraste sobre dark */
html.dark-mode .chip.success,
body.dark-mode .chip.success {
    color: var(--success) !important;
}
html.dark-mode .chip.warn,
body.dark-mode .chip.warn {
    color: var(--warning) !important;
}

/* Warm callouts (separador de reset, confirmacion peligrosa) — aclara texto */
html.dark-mode .warn-text,
body.dark-mode .warn-text {
    color: var(--warning) !important;
}

/* Color-scheme: light cuando NO hay dark-mode. dark cuando sí. */
html { color-scheme: light; }
html.dark-mode { color-scheme: dark; }

* { box-sizing: border-box; }

html, body {
    margin: 0;
    padding: 0;
    height: 100%;
    background: var(--bg);
    color: var(--text);
    font-family: "Satoshi", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
    font-size: 16px;
    font-weight: 500;
    letter-spacing: -0.01em;
    line-height: 1.45;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    overflow-x: hidden;
}

a { color: var(--text); text-decoration: none; }
a:hover { color: var(--accent-alt); }

img { max-width: 100%; display: block; }

::selection { background: var(--accent); color: var(--bg); }

/* ───────────── Fondo claro plano (sin nebulosas) ───────────── */
.coval-app {
    background: var(--bg) !important;
    background-attachment: fixed !important;
    min-height: 100vh;
}

/* ───────────── Layout shell ───────────── */
.coval-shell {
    max-width: 1320px;
    margin: 0 auto;
    padding: 0 24px;
}
.coval-main.block-container {
    max-width: none;
    padding: 32px 0 64px 0;
}

/* ───────────── SHELL KRAVIO: SIDEBAR + PANEL ───────────── */
/* Sidebar estático v10:
   · Ancho fijo 220px (15% menos que el 260px previo).
   · Sin toggle, sin collapsed state, sin mobile drawer.
   · Sin Alpine, sin hover-expand, sin resize de width/padding. */
.edx-shell {
    display: block;
    min-height: 100vh;
    padding-left: 220px;
}
.edx-main {
    max-width: none;
    padding: 32px 0 64px 0;
}
body.edx-kravio { background: var(--shell-panel-bg); }

.edx-sidebar {
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    width: 220px;
    background:
        linear-gradient(180deg, var(--sidebar-bg-top) 0%, var(--sidebar-bg-bottom) 100%),
        var(--sidebar-bg);
    border-bottom: 1px solid var(--sidebar-border);
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
    z-index: 50;
    font-family: "Satoshi", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
    /* Esquinas derechas concavas (curvan hacia adentro): dejan ver el bg
       del panel principal por detrás en las zonas top-right y bottom-right.
       La concavidad real requiere SVG mask (inset/round solo hace convexo).
       El SVG inline usa viewBox 0 0 100 100 + preserveAspectRatio=none para
       que las coordenadas escalen con la altura del sidebar en cualquier
       viewport (no asume 600px fijos como path() en CSS). */
    mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none'><path d='M 0 0 L 85 0 Q 100 0 100 7 L 100 93 Q 100 100 85 100 L 0 100 Z' fill='white'/></svg>");
    -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none'><path d='M 0 0 L 85 0 Q 100 0 100 7 L 100 93 Q 100 100 85 100 L 0 100 Z' fill='white'/></svg>");
}

.edx-sidebar-head {
    padding: 14px 14px 12px;
    border-bottom: 1px solid var(--sidebar-border);
    flex-shrink: 0;
}

.edx-sidebar-brand {
    display: flex;
    align-items: center;
    gap: 10px;
    color: var(--sidebar-text);
    padding: 6px 8px;
    border-radius: var(--sidebar-radius);
    text-decoration: none;
    transition: background var(--sidebar-duration) var(--sidebar-easing);
}
.edx-sidebar-brand:hover { background: var(--sidebar-bg-hover); }
.edx-sidebar-brand:active { background: var(--sidebar-bg-active); }

.edx-sidebar-logo {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.edx-sidebar-logo svg { width: 40px; height: 40px; filter: none; }
/* En dark mode invierte el logo (de negro a blanco) para que conserve
   contraste sobre el sidebar oscuro. Tambien usa el favicon-blanco.svg
   cuando el script lo sustituye via JS (ver theme-toggle.js). */
html.dark-mode .edx-sidebar-logo svg,
body.dark-mode .edx-sidebar-logo svg {
    filter: invert(1) hue-rotate(180deg) brightness(1.1);
}

.edx-sidebar-wordmark {
    display: flex;
    flex-direction: column;
    line-height: 1.1;
    min-width: 0;
}
.edx-sidebar-wordmark .wm {
    /* Mismo estilo que .login-brand-footer ("Data Engine"): Satoshi
       600 SemiBold, 12px (20% mas grande que 10px del footer),
       tracking amplio, uppercase. Identidad visual consistente entre
       el wordmark del sidebar y el footer del login.
       v10: color via --sidebar-text (claro: #0E1118, dark: #E5E7EB). */
    font-size: 12px;
    font-weight: 600;
    color: var(--sidebar-text);
    letter-spacing: 0.32em;
    text-transform: uppercase;
    transition: color var(--sidebar-duration) var(--sidebar-easing);
}
.edx-sidebar-wordmark .esv {
    /* Sin subtitulo: solo el wordmark "Expectra." centrado en el wordmark */
    display: none;
}

.edx-sidebar-nav {
    flex: 1 1 auto;
    overflow-y: auto;
    padding: 12px 10px;
    border-bottom: 1px solid var(--sidebar-border);
    display: flex;
    flex-direction: column;
    gap: 11px;
    min-height: 0;
}
.edx-sidebar-nav::-webkit-scrollbar { width: 6px; }
.edx-sidebar-nav::-webkit-scrollbar-track { background: transparent; }
.edx-sidebar-nav::-webkit-scrollbar-thumb {
    background: var(--sidebar-border-hover);
    border-radius: 9999px;
}

.edx-nav-link {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 9px 10px 9px 13px;
    border-radius: var(--sidebar-radius);
    color: var(--sidebar-muted);
    font-size: 13px;
    font-weight: 500;
    text-decoration: none;
    border: 1px solid transparent;
    transition:
        background var(--sidebar-duration) var(--sidebar-easing),
        color var(--sidebar-duration) var(--sidebar-easing),
        border-color var(--sidebar-duration) var(--sidebar-easing);
    cursor: pointer;
    /* Border-left 3px al estado active: visualmente el "pill" tiene 3px
       a ser turquesa (3px), respetando exactamente el border-radius del
       pill. Para que el texto no se mueva al aparecer el border-left,
       el padding-left se reduce en 3px (de 13 a 10). El border-radius del pill
       se hereda naturalmente porque el border-left es parte del box. */
}
.edx-nav-link:hover {
    background: var(--sidebar-bg-hover);
    color: var(--sidebar-text);
}
.edx-nav-link:active {
    background: var(--sidebar-bg-active);
}
.edx-nav-link.is-active {
    background: var(--sidebar-bg-active);
    color: var(--sidebar-text);
    font-weight: 600;
    border-color: var(--sidebar-border);
    border-left-color: var(--sidebar-accent);
    border-left-width: 3px;
    padding-left: 10px;
}

.edx-nav-icon {
    font-size: 18px;
    color: var(--sidebar-text-muted);
    flex-shrink: 0;
    line-height: 1;
    transition: color var(--sidebar-duration) var(--sidebar-easing);
}
.edx-nav-link:hover .edx-nav-icon { color: var(--sidebar-accent); }
.edx-nav-link.is-active .edx-nav-icon { color: var(--sidebar-accent); }

.edx-nav-label {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.edx-sidebar-footer {
    border-top: 1px solid var(--sidebar-border);
    padding: 10px;
    margin-top: auto;
    display: flex;
    flex-direction: column;
    gap: 6px;
    flex-shrink: 0;
}
.edx-sidebar-user {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 10px;
    border-radius: var(--sidebar-radius);
    background: var(--sidebar-bg-hover);
    border: 1px solid transparent;
    transition: background var(--sidebar-duration) var(--sidebar-easing);
}
.edx-sidebar-user:hover { background: var(--sidebar-bg-active); }

.edx-sidebar-status-dot {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 8px;
    height: 8px;
    flex-shrink: 0;
}
.edx-sidebar-status-dot .dot {
    display: inline-block;
    width: 6px;
    height: 6px;
    border-radius: 9999px;
    background: var(--success);
    box-shadow: 0 0 0 2px rgba(22, 163, 74, 0.18);
}

.edx-sidebar-avatar {
    width: 26px;
    height: 26px;
    border-radius: 9999px;
    background: linear-gradient(135deg, var(--sidebar-accent) 0%, #374151 100%);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 12px;
    font-weight: 700;
    flex-shrink: 0;
}

.edx-sidebar-username {
    flex: 1 1 auto;
    min-width: 0;
    font-size: 12px;
    font-weight: 600;
    color: var(--sidebar-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    padding-right: 4px;
}

.edx-sidebar-logout {
    margin: 0;
    flex-shrink: 0;
}
.edx-logout-btn {
    width: 28px;
    height: 28px;
    border-radius: 8px;
    background: transparent;
    color: var(--sidebar-muted);
    border: 1px solid transparent;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: background var(--sidebar-duration) var(--sidebar-easing),
                color var(--sidebar-duration) var(--sidebar-easing),
                border-color var(--sidebar-duration) var(--sidebar-easing);
}
.edx-logout-btn:hover {
    background: var(--sidebar-danger-soft);
    color: var(--sidebar-danger);
    border-color: rgba(220, 38, 38, 0.20);
}
.edx-logout-btn i { font-size: 16px; }

/* Boton de cambio de tema (luna/sol) — visual identico al logout.
   Cuando implementemos dark mode, el JS intercambia las clases
   edx-theme-icon-light / edx-theme-icon-dark para mostrar el icono correcto. */
.edx-theme-toggle-btn {
    width: 28px;
    height: 28px;
    border-radius: 8px;
    background: transparent;
    color: var(--sidebar-muted);
    border: 1px solid transparent;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: background var(--sidebar-duration) var(--sidebar-easing),
                color var(--sidebar-duration) var(--sidebar-easing),
                border-color var(--sidebar-duration) var(--sidebar-easing);
    flex-shrink: 0;
    padding: 0;
    margin: 0 0 0 6px;
}
.edx-theme-toggle-btn:hover {
    background: var(--sidebar-bg-hover);
    color: var(--sidebar-text);
    border-color: var(--sidebar-border);
}
.edx-theme-toggle-btn i { font-size: 16px; }

.edx-sidebar-version {
    display: block;
    text-align: center;
    /* Mismo estilo que .login-brand-footer ("Data Engine"):
       Satoshi 600 SemiBold, 10px, tracking amplio, uppercase.
       Identidad visual consistente entre el footer del sidebar y el login. */
    font-family: "Satoshi", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
    font-size: 8px;
    font-weight: 600;
    font-style: italic;
    color: #4a4a52;
    letter-spacing: 0.32em;
    text-transform: uppercase;
    padding-top: 6px;
}

/* ───────────── TOP NAV (EDX v4) ───────────── */
.topnav-edx {
    display: grid;
    grid-template-columns: minmax(160px, 1fr) 2fr minmax(220px, 0.9fr);
    gap: 24px;
    align-items: center;
    padding: 22px 8px;
    margin-bottom: 24px;
    position: relative;
}

.topnav-brand {
    display: flex;
    align-items: center;
    gap: 14px;
    color: var(--text);
    text-decoration: none;
}
.topnav-brand svg {
    /* Logo a tamaño nativo del SVG legacy (80×80, viewBox 0 0 80 80).
       Sin drop-shadow para evitar el glow inferior. */
    width: 80px; height: 80px;
    filter: none;
}
.topnav-brand-text { display: flex; flex-direction: column; line-height: 1; gap: 4px; }
.topnav-brand-text .wm {
    color: var(--text);
    font-size: 26px;
    font-weight: 800;
    letter-spacing: -0.04em;
}
.topnav-brand-text .esv {
    color: var(--text);
    font-size: 13px;
    font-weight: 700;
    letter-spacing: 0.26em;
    text-transform: uppercase;
}

.topnav-pills {
    display: flex;
    gap: 10px;
    justify-content: center;
    align-items: stretch;
}
.nav-pill {
    flex: 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 12px 18px;
    border-radius: 9999px;
    border: 1px solid var(--border);
    background: var(--surface);
    color: var(--text-dim);
    font-family: inherit;
    font-size: 14px;
    font-weight: 600;
    letter-spacing: 0.02em;
    text-decoration: none;
    transition: border-color .2s ease, background .2s ease, color .2s ease, transform .15s ease;
    white-space: nowrap;
    box-shadow: var(--shadow);
}
.nav-pill:hover {
    border-color: var(--accent-line);
    background: var(--accent-soft);
    color: var(--text);
    transform: translateY(-1px);
}
.nav-pill.is-active {
    background: var(--accent);
    border-color: var(--accent);
    color: var(--button-text);
    box-shadow: 0 1px 2px rgba(13, 148, 136, 0.20), 0 4px 12px rgba(13, 148, 136, 0.18);
}
.nav-pill-config {
    flex: 0 0 auto;
    width: 60px;
    height: 60px;
    padding: 0;
    font-size: 26px;
}

.topnav-user {
    display: flex;
    align-items: stretch;
    gap: 0;
    border-radius: 9999px;
    border: 1px solid var(--border);
    background: var(--surface);
    overflow: hidden;
    /* Auto-sized al contenido: el pill no se estira al ancho de la
       columna 3 (eso generaba espacio vacío raro a la izquierda).
       En lugar de eso, ``justify-self: end`` lo pega al borde derecho
       de la columna sin expandir el pill. */
    width: fit-content;
    justify-self: end;
    margin-left: auto;
    box-shadow: var(--shadow);
}
.topnav-user-info {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 16px 8px 8px;
}
.topnav-avatar {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background: var(--accent-soft);
    box-shadow: inset 0 0 0 2px var(--accent);
    color: var(--text);
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 800;
    font-size: 15px;
}
.topnav-user-text { display: flex; flex-direction: column; line-height: 1; gap: 3px; }
.user-name {
    color: var(--text);
    font-weight: 700;
    font-size: 13px;
}
.user-status {
    color: var(--text-dim-2);
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    display: flex;
    align-items: center;
    gap: 4px;
}
.user-status .dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--success);
    box-shadow: 0 0 6px var(--success);
}

.topnav-power {
    margin: 0;
    border-left: 1px solid var(--border);
    display: flex;
}
.topnav-power button {
    width: 56px;
    height: auto;
    border: none;
    background: transparent;
    color: var(--text-dim);
    font-size: 20px;
    cursor: pointer;
    transition: color .2s ease, background .2s ease;
}
.topnav-power button:hover {
    color: var(--danger);
    background: rgba(220, 38, 38, 0.08);
}

.topnav-version {
    position: absolute;
    right: 8px;
    top: 88px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    letter-spacing: 1.5px;
    color: var(--text-dim-2);
    padding: 2px 8px;
    border: 1px solid var(--border);
    border-radius: 9999px;
    background: var(--surface);
}
.topnav-version span { display: inline-block; }

/* ───────────── Page header ───────────── */
/* Page header v10 — card elevada minimalista con ícono a la izquierda.
   Estilo ejecutivo: card con fondo + borde sutil + ícono redondo.
   Padding reducido, shadow suave, hover sutil. */
.page-header-v10 {
    display: flex;
    align-items: center;
    gap: 16px;
    margin: 16px 0 28px 0;
    padding: 14px 20px;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 12px;
    transition: border-color .2s ease, transform .2s ease;
}
.page-header-v10:hover {
    border-color: var(--border-strong);
}
.page-header-v10-icon {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: 10px;
    background: var(--bg);
    border: 1px solid var(--border);
    color: var(--text);
}
.page-header-v10-icon i {
    font-size: 18px;
}
.page-header-v10-body {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 2px;
}
.page-h1 {
    margin: 0;
    /* Estilo monoespaciado tipo "version badge" del topnav:
       JetBrains Mono, tracking ligero, uppercase. */
    font-family: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
    font-size: 13px;
    font-weight: 500;
    letter-spacing: 0.20em;
    text-transform: uppercase;
    color: var(--text);
    flex-shrink: 0;
}
.page-h1-kicker {
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--text-dim-2);
    flex-shrink: 0;
}
.page-h1-sub {
    margin: 0;
    color: var(--text-dim);
    font-size: 13px;
    font-weight: 400;
    line-height: 1.4;
}
.page-subtitle {
    margin: 4px 0 0 0;
    color: var(--text-dim);
    font-size: 14px;
    font-weight: 500;
}
/* Meta badges a la derecha del header (ej: timestamp, status). */
.page-meta {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    color: var(--text-dim-2);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.10em;
    text-transform: uppercase;
    flex-shrink: 0;
}
.page-meta .dot {
    width: 6px;
    height: 6px;
    background: var(--success);
    border-radius: 50%;
    display: inline-block;
}

/* ───────────── Cards (EDX v5) ───────────── */
.card-edx {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 16px;
    padding: 22px 26px;
    margin: 18px 0;
    box-shadow: var(--shadow), var(--shadow-md);
    position: relative;
}
.card-edx-head {
    display: flex;
    align-items: center;
    gap: 14px;
    margin: -4px 0 14px 0;
}
.card-step {
    flex: 0 0 auto;
    width: 32px; height: 32px;
    border-radius: 9999px;
    background: var(--accent-soft);
    border: 1px solid var(--accent-line);
    color: var(--text);
    font-weight: 800;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.card-edx-title {
    margin: 0;
    font-size: 20px;
    font-weight: 800;
    letter-spacing: -0.025em;
    color: var(--text);
}
.card-actions {
    display: flex;
    justify-content: flex-end;
    margin-top: 18px;
}

/* ───────────── KPI grid ───────────── */
.kpi-grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 18px;
    margin: 22px 0;
}
@media (max-width: 1024px) {
    .kpi-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
    .kpi-grid { grid-template-columns: 1fr; }
}
.card-kpi {
    display: flex;
    align-items: center;
    gap: 18px;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 18px;
    padding: 24px 24px;
    box-shadow: var(--shadow), var(--shadow-md);
    transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease;
    min-height: 110px;
}
.card-kpi:hover {
    transform: translateY(-2px);
    border-color: var(--accent-line);
    box-shadow: 0 2px 4px rgba(15, 23, 42, 0.06), 0 8px 20px rgba(15, 23, 42, 0.06);
}
.kpi-icon {
    flex: 0 0 auto;
    width: 64px;
    height: 64px;
    border-radius: 16px;
    background: var(--accent-soft);
    border: 1px solid var(--accent-line);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--text);
    font-size: 24px;
}
.kpi-icon .ico { display: inline-flex; align-items: center; justify-content: center; }
.kpi-icon .ico svg { width: 32px; height: 32px; }
.kpi-label {
    color: var(--text-dim);
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    margin-bottom: 8px;
}
.kpi-value {
    color: var(--text);
    font-size: 36px;
    font-weight: 800;
    letter-spacing: -0.035em;
    font-variant-numeric: tabular-nums;
    line-height: 1;
}
.kpi-foot {
    color: var(--text-dim-2);
    font-size: 12px;
    margin-top: 6px;
}

/* ───────────── Filter chips (sub-pills) ───────────── */
.sub-pills {
    display: flex;
    gap: 8px;
    margin: 14px 0 22px 0;
    flex-wrap: wrap;
}
.filter-chip {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 8px 16px;
    border-radius: 9999px;
    background: var(--surface);
    border: 1px solid var(--border);
    color: var(--text-dim);
    text-decoration: none;
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0.02em;
    transition: all .2s ease;
}
.filter-chip:hover {
    color: var(--text);
    border-color: var(--accent);
}
.filter-chip.is-active {
    color: var(--text);
    background: var(--accent-soft);
    border-color: var(--accent);
}

/* ───────────── Dropzones (file uploaders) ───────────── */
.dropzone-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 14px;
    margin-top: 12px;
}
.dropzone-pill {
    display: flex;
    flex-direction: column;
    gap: 6px;
    background: var(--surface);
    border: 1px dashed var(--accent-line);
    border-radius: 14px;
    padding: 14px 16px;
    transition: border-color .2s ease, background .2s ease;
}
.dropzone-pill:hover {
    border-color: var(--accent);
    background: var(--surface-2);
}
.dropzone-label {
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 0.16em;
    color: var(--text);
    text-transform: uppercase;
}
.dropzone-input {
    color: var(--text);
    background: transparent;
    border: none;
    padding: 6px 0;
    font-family: inherit;
    font-size: 13px;
}
.dropzone-input::file-selector-button {
    background: var(--accent-soft);
    border: 1px solid var(--accent-line);
    color: var(--text);
    border-radius: 9999px;
    padding: 6px 12px;
    font-family: inherit;
    font-weight: 600;
    font-size: 12px;
    margin-right: 10px;
    cursor: pointer;
}
.dropzone-hint {
    color: var(--text-dim-2);
    font-size: 11px;
}

/* ───────────── Atomic grid (Bases · 3. Carga masiva) ───────────── */
.atomic-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 18px;
    margin-top: 14px;
}
.atomic-card {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 14px;
    padding: 14px 16px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.atomic-card input[type="file"],
.atomic-card input[type="number"],
.atomic-card input[type="date"] {
    background: var(--surface-2);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 8px 10px;
    color: var(--text);
    font-family: inherit;
}
.atomic-row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.input-pill-label {
    display: block;
    color: var(--text-dim);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    margin-bottom: 6px;
}

/* ───────────── Inputs (login + bases) ───────────── */
.input-pill {
    background: var(--surface);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    border-radius: 9999px;
    border: 1px solid var(--border);
    padding: 4px 20px;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
    display: flex;
    flex-direction: column;
    gap: 0;
    transition: border-color .2s ease, box-shadow .2s ease, background .2s ease;
    margin: 8px 0;
}
.input-pill:hover {
    border-color: var(--accent-line);
    background: var(--surface-2);
}
.input-pill:focus-within {
    background: var(--surface-2);
    border-color: var(--accent);
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04), 0 4px 14px rgba(15, 23, 42, 0.05),
                
}
.input-pill label {
    /* OJO: antes era var(--accent) = #0F1115 negro mate EN AMBOS modos →
       en dark quedaba texto negro invisible. var(--text) adapta (claro:
       #0f172a ≈ igual; dark: #E5E7EB blanco). */
    color: var(--text);
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    padding: 6px 0 2px 0;
}
.input-pill input,
.input-pill select,
.input-pill textarea {
    color: var(--text);
    background: transparent;
    border: none;
    font-family: inherit;
    font-size: 15px;
    font-weight: 500;
    letter-spacing: -0.01em;
    caret-color: var(--accent);
    padding: 4px 0 8px 0;
    width: 100%;
    outline: none;
}
.input-pill input::placeholder { color: #5a5a60; font-weight: 400; }
html.dark-mode .input-pill input::placeholder,
body.dark-mode .input-pill input::placeholder { color: var(--text-dim); }

.textarea-pill {
    width: 100%;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 14px;
    padding: 12px 16px;
    color: var(--text);
    font-family: inherit;
    font-size: 14px;
}

/* ───────────── Botones ───────────── */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 12px 22px;
    border-radius: 9999px;
    background: var(--surface);
    border: 1px solid var(--border);
    color: var(--text);
    font-family: inherit;
    font-size: 13px;
    font-weight: 700;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    text-decoration: none;
    cursor: pointer;
    transition: transform .15s ease, background .2s ease,
                border-color .2s ease, box-shadow .2s ease, color .2s ease;
    box-shadow: 
}
.btn:hover { border-color: var(--accent); transform: translateY(-1px); }
.btn:active { transform: translateY(0); }
.btn-icon { font-size: 12px; opacity: 0.9; }

.btn-primary {
    background: #000000;
    color: #ffffff;
    border-color: #000000;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.20), 0 4px 12px rgba(0, 0, 0, 0.18);
}
.btn-primary:hover {
    background: #1F2937;
    color: #ffffff;
    border-color: #1F2937;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25), 0 8px 20px rgba(0, 0, 0, 0.25);
}
.btn-secondary {
    background: var(--surface);
    border-color: var(--border);
    color: var(--text);
}
.btn-secondary:hover {
    background: var(--surface-2);
    border-color: var(--accent-line);
    color: var(--text);
}
.btn-danger {
    color: var(--danger);
    border-color: rgba(220, 38, 38, 0.30);
    background: rgba(220, 38, 38, 0.04);
}
.btn-danger:hover {
    background: rgba(220, 38, 38, 0.10);
    border-color: rgba(220, 38, 38, 0.55);
    color: var(--danger);
}
.btn-block { width: 100%; }
.btn-sm { padding: 8px 14px; font-size: 11px; letter-spacing: 0.10em; }
.btn-login {
    width: 100%;
    margin-top: 24px;
    padding: 16px 24px;
    font-size: 14px;
    letter-spacing: 0.18em;
    /* Full black con texto blanco — invita al clic. */
    background: #000000;
    color: #ffffff;
    border-color: #000000;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.20), 0 4px 12px rgba(0, 0, 0, 0.18);
}
.btn-login:hover {
    background: #1F2937;
    color: #ffffff;
    border-color: #1F2937;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25), 0 8px 20px rgba(0, 0, 0, 0.25);
}

/* ───────────── Tables ───────────── */
.table-wrap {
    overflow-x: auto;
    margin-top: 6px;
}
.table {
    width: 100%;
    border-collapse: collapse;
    font-size: 14px;
}
.table th {
    text-align: left;
    color: var(--text-dim);
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    padding: 14px 18px;
    border-bottom: 1px solid var(--border);
    background: var(--surface-2);
}
.table th.num, .table td.num {
    text-align: right;
    font-variant-numeric: tabular-nums;
}
.table td {
    padding: 14px 18px;
    border-bottom: 1px solid var(--border);
    color: var(--text);
}
.table tr:hover td {
    background: var(--accent-soft);
}
.table .empty-row {
    text-align: center;
    color: var(--text-dim-2);
    padding: 24px 14px;
}
.font-mono {
    font-family: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
    font-size: 12px;
    color: var(--text-dim);
}
.text-dim { color: var(--text-dim); }
.text-accent { color: var(--text); }
.text-success { color: var(--success); }
.text-danger { color: var(--danger); }

/* ───────────── Alerts ───────────── */
.alert {
    margin-top: 14px;
    padding: 11px 18px;
    border-radius: 14px;
    background-color: var(--accent-soft);
    box-shadow: inset 0 0 0 1px var(--accent-line), 0 1px 2px rgba(15, 23, 42, 0.04), 0 4px 12px rgba(15, 23, 42, 0.04);
    color: #b8f0f3;
    font-size: 13px;
    font-weight: 500;
    text-align: center;
    letter-spacing: 0.01em;
}
.alert-success {
    background-color: rgba(48, 209, 88, 0.08);
    box-shadow: inset 0 0 0 1px rgba(48, 209, 88, 0.32),
                0 4px 12px rgba(48, 209, 88, 0.06);
    color: #b6f0c4;
}
.alert-error,
.alert-danger {
    background-color: rgba(220, 38, 38, 0.06);
    box-shadow: inset 0 0 0 1px rgba(220, 38, 38, 0.24), 0 1px 2px rgba(220, 38, 38, 0.10), 0 4px 12px rgba(220, 38, 38, 0.06);
    color: var(--danger);
}

/* ───────────── Login page ───────────── */
.login-page {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 32px 24px;
    min-height: calc(100vh - 60px);
    position: relative;
    overflow: hidden;
}
/* ─── Login · líneas decorativas de fondo ───────────────────────
   Tres capas de SVG (líneas verticales finas, ondas suaves y
   destello turquesa) para que el fondo no se vea plano. */
.login-page::before {
    content: "";
    position: absolute;
    inset: 0;
    pointer-events: none;
    background-image:
        /* 1) líneas verticales finas (estilo "papel rayado" muy sutil) */
        repeating-linear-gradient(
            to right,
            transparent 0,
            transparent 79px,
            rgba(15, 23, 42, 0.04) 79px,
            rgba(15, 23, 42, 0.04) 80px
        ),
        /* 2) ondas suaves con tinte turquesa */
        radial-gradient(ellipse 700px 400px at 8% 12%,
            rgba(13, 148, 136, 0.07) 0%, transparent 60%),
        radial-gradient(ellipse 600px 350px at 92% 88%,
            rgba(13, 148, 136, 0.06) 0%, transparent 60%);
    background-size: 80px 100%, 100% 100%, 100% 100%;
    background-position: 0 0, 0 0, 0 0;
    background-repeat: repeat, no-repeat, no-repeat;
}
/* Una segunda capa con un par de círculos decorativos turquesa */
.login-page::after {
    content: "";
    position: absolute;
    inset: 0;
    pointer-events: none;
    background-image:
        radial-gradient(circle 6px at 12% 22%, rgba(13, 148, 136, 0.20) 0%, transparent 100%),
        radial-gradient(circle 4px at 88% 18%, rgba(13, 148, 136, 0.18) 0%, transparent 100%),
        radial-gradient(circle 5px at 18% 78%, rgba(13, 148, 136, 0.16) 0%, transparent 100%),
        radial-gradient(circle 7px at 82% 82%, rgba(13, 148, 136, 0.22) 0%, transparent 100%),
        radial-gradient(circle 3px at 50% 8%,  rgba(13, 148, 136, 0.15) 0%, transparent 100%),
        radial-gradient(circle 3px at 50% 92%, rgba(13, 148, 136, 0.15) 0%, transparent 100%);
}
.login-shell {
    position: relative;
    z-index: 2;
    width: 420px;
    max-width: calc(100vw - 48px);
    margin: 0 auto;
    padding: 36px 32px;
    display: flex;
    flex-direction: column;
    animation: loginFadeIn .55s cubic-bezier(.2,.7,.2,1) both;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 24px;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04),
                0 12px 40px rgba(15, 23, 42, 0.06);
}
.login-shell::before {
    /* Acento turquesa en la parte superior del card */
    content: "";
    position: absolute;
    top: 0; left: 32px; right: 32px;
    height: 3px;
    border-radius: 0 0 9999px 9999px;
    background: linear-gradient(90deg,
        transparent 0%,
        var(--accent) 50%,
        transparent 100%);
}
@keyframes loginFadeIn {
    from { opacity: 0; transform: translateY(12px); }
    to   { opacity: 1; transform: none; }
}
.login-brand {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 22px;
    margin-bottom: 16px;
    padding: 8px 0 4px 0;
}
.login-brand svg {
    width: 120px;
    height: 120px;
    filter: drop-shadow(0 1px 2px rgba(15, 23, 42, 0.10));
}
.login-brand .brand-text {
    display: flex;
    flex-direction: column;
    gap: 8px;
    line-height: 0.95;
    text-align: left;
}
.login-brand .wm {
    color: var(--text);
    font-size: 44px;
    font-weight: 800;
    letter-spacing: -0.045em;
}
.login-brand .esv {
    color: var(--text);
    font-size: 20px;
    font-weight: 700;
    letter-spacing: 0.25em;
    text-transform: uppercase;
}
.login-divider {
    width: 72px;
    height: 2px;
    border-radius: 9999px;
    background: linear-gradient(90deg,
        transparent 0%, var(--accent) 50%, transparent 100%);
    margin: 20px auto 32px auto;
}
.login-title {
    color: var(--text);
    font-size: 24px;
    font-weight: 700;
    letter-spacing: -0.03em;
    margin: 0 0 28px 0;
    text-align: center;
}
.login-label {
    display: block;
    color: var(--text-dim);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    margin: 14px 0 6px 4px;
}
.login-show-pwd {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-top: 14px;
    margin-left: 4px;
    color: var(--text-dim);
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 0.04em;
    cursor: pointer;
}

/* "Recuérdame" — checkbox turquesa + hint secundario */
.login-remember {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-top: 10px;
    margin-left: 4px;
    color: var(--text-dim);
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 0.04em;
    cursor: pointer;
}
.login-remember input[type="checkbox"] {
    accent-color: var(--accent);
    width: 16px;
    height: 16px;
    cursor: pointer;
}
.login-remember-hint {
    color: var(--text-dim-2);
    font-style: normal;
    font-weight: 400;
    margin-left: 2px;
}
.login-error {
    margin-top: 16px;
    padding: 11px 18px;
    border-radius: 14px;
    background-color: rgba(220, 38, 38, 0.06);
    box-shadow: inset 0 0 0 1px rgba(220, 38, 38, 0.24), 0 1px 2px rgba(220, 38, 38, 0.10), 0 4px 12px rgba(220, 38, 38, 0.06);
    color: var(--danger);
    font-size: 13px;
    font-weight: 500;
    text-align: center;
    letter-spacing: 0.01em;
    animation: loginErrorShake .4s ease both;
}
@keyframes loginErrorShake {
    0%, 100% { transform: translateX(0); }
    25%      { transform: translateX(-4px); }
    75%      { transform: translateX(4px); }
}
.login-footer {
    margin-top: 22px;
    text-align: center;
    color: var(--text-dim-2);
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 0.04em;
    transition: color .2s ease;
}
.login-footer:hover { color: var(--text-dim); }
.login-brand-footer {
    position: fixed;
    bottom: 24px;
    left: 0; right: 0;
    text-align: center;
    color: #4a4a52;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.32em;
    text-transform: uppercase;
}

/* ───────────── Aporte form grid (asesores) ───────────── */
.aporte-grid {
    display: grid;
    grid-template-columns: 2fr 2fr 1fr;
    gap: 14px;
}
.crear-grid {
    display: grid;
    grid-template-columns: 2fr 2fr 1fr auto;
    gap: 10px;
    align-items: end;
}
@media (max-width: 800px) {
    .aporte-grid, .crear-grid { grid-template-columns: 1fr; }
    .topnav-edx { grid-template-columns: 1fr; gap: 12px; }
    .topnav-pills { justify-content: flex-start; overflow-x: auto; }
    .topnav-version { position: static; margin-top: 8px; }
    .topnav-power button { width: 44px; }
}

/* ───────────── Badge tipo ───────────── */
.badge-tipo {
    display: inline-block;
    padding: 3px 10px;
    border-radius: 9999px;
    background: var(--accent-soft);
    border: 1px solid var(--accent-line);
    color: var(--text);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
}

/* ───────────── Resultado AJAX ───────────── */
.result {
    margin-top: 8px;
    min-height: 18px;
    font-size: 12px;
}
.result-text { font-weight: 600; letter-spacing: 0.02em; }
.form-msg { margin-top: 14px; }

/* ───────────── Carrusel (asesores) ───────────── */
.carrusel-frame {
    background: var(--surface);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    border: 1px solid var(--border);
    border-radius: 18px;
    padding: 22px;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04), 0 4px 14px rgba(15, 23, 42, 0.05);
    min-height: 200px;
    position: relative;
}

/* ───────────── Tabs (centradas · indicador deslizante) ───────────── */
/* Optimizado:
   - SIN ``overflow-x:auto``: el navegador PROMUEVE overflow-y a ``auto``, y
     el rail quedaba con 1-2px de overflow vertical → al pasar el cursor por
     encima y scrollear, el contenedor se movía ("micro scroll"). Con
     ``overflow:visible`` ya no es un contenedor de scroll.
   - ``justify-content:center`` → tabs centradas.
   - Peso de fuente CONSTANTE: el activo pasaba 600→700 y movía el layout.
   - Subrayado = un INDICADOR independiente (span.edx-tabs-ind) que se desliza
     con transform/width (compositor, sin reflow) en vez de un border-bottom. */
.edx-tabs {
    position: relative;
    display: flex;
    align-items: flex-end;
    justify-content: center;
    gap: 32px;
    border-bottom: 2px solid var(--border);
    margin: 16px 0 26px 0;
    padding: 0 4px;
    overflow: visible;
}
.edx-tab {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 12px 6px 14px 6px;
    font-size: 15px;
    font-weight: 700;
    letter-spacing: 0.01em;
    color: var(--text-dim);
    text-decoration: none;
    transition: color .18s ease;
    white-space: nowrap;
}
.edx-tab:hover { color: var(--text); }
.edx-tab.is-active { color: var(--text); }
.edx-tabs-ind {
    position: absolute;
    left: 0;
    bottom: -2px;
    height: 3px;
    width: 0;
    border-radius: 3px;
    background: var(--text);
    pointer-events: none;
    will-change: transform, width;
    transition: transform .3s cubic-bezier(0.23, 1, 0.32, 1),
                width .3s cubic-bezier(0.23, 1, 0.32, 1);
}
/* Fade de entrada del contenido: al cargar la página el contenido principal no
   aparece de golpe, entra con un fade corto. El <head> pone ``.edx-fade`` en
   <html> y se quita solo (ver base.html). */
html.edx-fade .edx-main {
    animation: edx-page-in .18s ease-out both;
}
@keyframes edx-page-in { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
    .edx-tabs-ind { transition: none; }
    .edx-tabpanel { animation: none; }
}
.edx-tab .ico-help {
    opacity: .75;
    font-size: 13px;
    color: var(--text-dim-2);
}
.tabs-row {
    display: flex;
    gap: 10px;
    margin: 14px 0;
    flex-wrap: wrap;
}

/* ───────────── Radio / checkbox / select ───────────── */
.radio-row label,
input[type="radio"],
input[type="checkbox"] {
    color: var(--text-dim);
    cursor: pointer;
}
input[type="checkbox"], input[type="radio"] {
    accent-color: var(--accent);
}

/* ───────────── Select base ───────────── */
select {
    background: var(--surface-2);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 10px 12px;
    color: var(--text);
    font-family: inherit;
    font-size: 14px;
    width: 100%;
}
select option { background: var(--surface-2); color: var(--text); }

/* ───────────── Messages (Django messages framework) ───────────── */
.messages {
    list-style: none;
    padding: 0;
    margin: 0 0 16px 0;
}
.messages li {
    margin-bottom: 8px;
}

/* ───────────── Barras de progreso (Bases · CGC) ───────────── */
.progress-bar {
    width: 100%;
    height: 6px;
    background: var(--surface);
    border-radius: 9999px;
    overflow: hidden;
    margin: 8px 0;
}
.progress-bar-fill {
    height: 100%;
    background: linear-gradient(90deg, var(--accent), var(--accent-vivid));
    border-radius: inherit;
    transition: width .4s ease;
}

/* ───────────── Expander ───────────── */
.expander {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 14px;
    padding: 14px 18px;
    margin: 10px 0;
}
.expander-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    color: var(--text);
    font-weight: 700;
}

/* ───────────── Cardinal (numérico) ───────────── */
.metric-value { color: var(--text); font-size: 28px; font-weight: 800; letter-spacing: -0.03em; }
.metric-label { color: var(--text-dim); font-size: 11px; text-transform: uppercase; letter-spacing: 0.16em; font-weight: 700; }

/* ───────────── Card bono (dashboard) ───────────── */
.card-bono { border-color: var(--border); }

/* ───────────── Helpers ───────────── */
[hidden] { display: none !important; }
.disabled { opacity: .55; pointer-events: none; }
.center { text-align: center; }
.right { text-align: right; }
.mt-24 { margin-top: 24px; }
.mb-24 { margin-bottom: 24px; }


/* ================================================================
   PANEL COMPONENTS (Kravio v10)
   ----------------------------------------------------------------
   Componentes compartidos por TODAS las páginas de contenido. Fueron
   extraídos del panel de Configuración (que es la referencia) para
   poder reutilizarlos sin duplicar estilos ni overrides de dark mode.

   Regla de oro: al usar los MISMOS nombres de clase en todos los
   paneles, un único bloque de overrides de dark mode (al final de este
   archivo) cubre a todos. No hardcodear colores nuevos en los templates;
   usar estas clases.
   ================================================================ */

/* ── Contenedor de contenido (ancho de lectura + padding lateral) ── */
.page-container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 24px 32px 24px 32px;
}
/* Tipografía de títulos del panel: Satoshi + tracking cerrado. Replica lo
   que antes hacía ``.krav-cfg-panel h1, .krav-cfg-panel h2`` y mantiene la
   identidad del header (h1 en Satoshi, no en JetBrains Mono). */
.page-container h1,
.page-container h2 {
    font-family: 'Satoshi', -apple-system, BlinkMacSystemFont, sans-serif;
    letter-spacing: -0.01em;
}
/* En los paneles no usamos monoespaciado (JetBrains/monospace): los
   elementos de código heredan Satoshi. Sin esto, el UA del navegador
   fuerza ``monospace`` en <code>/<kbd>/<samp>/<pre>. */
.page-container code,
.page-container kbd,
.page-container samp,
.page-container pre {
    font-family: 'Satoshi', sans-serif;
}

/* ── Doble card: anillo gris + interior blanco ── */
.panel-card {
    background: #F1F1F1;
    border-radius: 24px;                /* rounded-3xl */
    padding: 5px;
    overflow: hidden;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);
}
.panel-card-inner {
    background: #fff;
    border-radius: 0.875rem;
    overflow: hidden;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03), inset 0 0 0 1px rgba(0, 0, 0, 0.02);
}
/* Variante destructiva (roja) — Card de Limpieza. */
.panel-card--danger {
    box-shadow: 0 2px 4px rgba(220, 38, 38, 0.10);
}
.panel-card--danger > .panel-card-inner {
    box-shadow: inset 0 0 0 1px rgba(220, 38, 38, 0.08), 0 1px 2px rgba(220, 38, 38, 0.04);
}
/* Variante cálida (terracota) — Card de Reset operativo. */
.panel-card--warm {
    box-shadow: 0 2px 4px rgba(245, 228, 216, 0.40);
}
.panel-card--warm > .panel-card-inner {
    box-shadow: inset 0 0 0 1px rgba(176, 109, 71, 0.10), 0 1px 2px rgba(176, 109, 71, 0.06);
}

/* ── Head de card: barra con título + meta ── */
.panel-card-head {
    padding: 12px 20px;                 /* px-5 py-3 */
    display: flex;
    align-items: center;
    justify-content: space-between;
    border-radius: 0.875rem 0.875rem 0 0;
    background: #F1F1F1;
    box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.04);
}
.panel-card-head--danger { background: rgba(220, 38, 38, 0.06); box-shadow: none; }
.panel-card-head--warm   { background: rgba(176, 109, 71, 0.08); box-shadow: none; }

.panel-card-title { display: flex; align-items: center; gap: 8px; }
.panel-card-title > i { font-size: 16px; color: #1F2937; }
.panel-card-title h2 {
    margin: 0;
    font-size: 16px;
    font-weight: 700;
    color: #11141A;
    letter-spacing: -0.01em;             /* tracking-tight */
    font-family: 'Satoshi', sans-serif;
}
.panel-card-title--danger > i,
.panel-card-title--danger h2 { color: var(--danger-strong); }
.panel-card-title--warm > i,
.panel-card-title--warm h2   { color: #B06D47; }
.panel-card-title--success > i { color: #0D6558; }

.panel-card-meta { font-size: 11px; font-weight: 300; color: #9C9C9C; }
.panel-card-meta--danger { color: var(--danger-strong); }
.panel-card-meta--warm   { color: #B06D47; }

/* ── Tabla de panel ── */
.krav-tabla {
    width: 100%;
    border-collapse: collapse;
    background: #fff;
}
.krav-tabla thead th {
    background: #F1F1F1;
    color: #6A6B6C;
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .5px;
    padding: 12px;
    text-align: left;
    vertical-align: middle;
    border-bottom: 1px solid #E5E5E5;
}
.krav-tabla thead th.right { text-align: right; padding-right: 14px; }
.krav-tabla tbody tr { border-bottom: 1px solid #F1F1F1; transition: background .12s; }
.krav-tabla tbody tr:last-child { border-bottom: 0; }
.krav-tabla tbody tr:hover { background: #FAFAFA; }
.krav-tabla tbody td { padding: 12px; font-size: 13px; color: #11141A; vertical-align: middle; }
.krav-tabla td.right { text-align: right; }
.krav-tabla td.muted { color: #6A6B6C; font-weight: 300; }
.krav-tabla .username {
    font-family: 'Satoshi', sans-serif;
    font-weight: 700;
    color: #11141A;
}

/* ── Chips semánticos ── */
.chip {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 3px 10px;
    border-radius: 999px;
    font-size: 11px;
    font-weight: 700;
    line-height: 1.3;
}
.chip.tu      { background: rgba(30, 58, 138, 0.12); color: #1e3a8a; border: 1px solid rgba(30, 58, 138, 0.30); }
.chip.warn    { background: rgba(245, 158, 11, 0.12); color: #92400e; border: 1px solid rgba(245, 158, 11, 0.30); }
.chip.success { background: rgba(13, 101, 88, 0.12); color: #0D6558; border: 1px solid rgba(13, 101, 88, 0.30); }
.chip.danger  { background: rgba(220, 38, 38, 0.12); color: var(--danger-strong); border: 1px solid rgba(220, 38, 38, 0.30); }

/* ── Status chip grande (headers de cards de mantenimiento) ── */
.krav-status-chip {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 12px;
    border-radius: 999px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .02em;
}
.krav-status-chip--danger {
    background: rgba(220, 38, 38, 0.10);
    color: var(--danger-strong);
    border: 1px solid rgba(220, 38, 38, 0.30);
}
.krav-status-chip--warm {
    background: rgba(245, 158, 11, 0.10);
    color: #92400E;
    border: 1px solid rgba(245, 158, 11, 0.30);
}

/* ── Action popover (position: fixed con JS) ──
   El disparador (<summary>) es un .btn (ver template); aquí solo el layout. */
.action-popover { display: inline-block; position: relative; margin-left: 4px; }
.action-popover > summary { list-style: none; cursor: pointer; }
.action-popover > summary::-webkit-details-marker { display: none; }
.action-popover > summary::marker { content: ''; }

/* position: fixed evita quedar atrapado por overflow:hidden de los
   cards padre. Las coordenadas las pone el JS al abrir el details. */
.popover-body {
    position: fixed;
    background: #fff;
    border: 1px solid #E5E5E5;
    border-radius: 12px;
    box-shadow: 0 12px 32px rgba(15, 23, 42, 0.18), 0 2px 6px rgba(15, 23, 42, 0.06);
    padding: 14px;
    z-index: 9999;
    width: 320px;
    max-width: calc(100vw - 32px);
    display: none;
    animation: kravPopoverIn .14s cubic-bezier(.2,.8,.2,1);
}
.action-popover[open] > .popover-body { display: block; }
@keyframes kravPopoverIn {
    from { opacity: 0; transform: translateY(-6px) scale(0.97); }
    to   { opacity: 1; transform: translateY(0) scale(1); }
}
.popover-body label { display: flex; flex-direction: column; gap: 4px; margin-bottom: 8px; }
.popover-body label > span {
    font-size: 10px;
    font-weight: 700;
    color: #6A6B6C;
    text-transform: uppercase;
    letter-spacing: .4px;
}
.popover-body input,
.popover-body select {
    padding: 6px 10px;
    background: #F7F7F7;
    border: 1px solid #E5E5E5;
    border-radius: 8px;
    font-size: 13px;
    color: #11141A;
    font-weight: 500;
}
.popover-body input:focus,
.popover-body select:focus {
    outline: none;
    background: #fff;
    border-color: #1F2937;
    box-shadow: 0 0 0 3px rgba(31, 41, 55, 0.18);
}
/* Los botones del popover son .btn (block) — heredan la paleta de botones. */
.popover-body .btn { margin-top: 6px; }
.popover-body .warn-text {
    font-size: 11px;
    color: #92400e;
    background: rgba(245, 158, 11, 0.08);
    border: 1px solid rgba(245, 158, 11, 0.30);
    padding: 8px 10px;
    border-radius: 8px;
    margin: 0 0 8px;
}
.popover-body .normal-text { font-size: 11px; color: #6A6B6C; margin: 0 0 8px; }

/* ── Alerts de panel (renombrados para no chocar con ``.alert`` de
      los flash messages del shell, que tienen otro look) ── */
.panel-alert-danger {
    background: rgba(220, 38, 38, 0.08);
    border: 1px solid rgba(220, 38, 38, 0.30);
    border-radius: 10px;
    padding: 12px 14px;
    color: var(--danger-strong);
    font-size: 13px;
    margin-bottom: 12px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.panel-alert-success {
    background: rgba(13, 101, 88, 0.08);
    border: 1px solid rgba(13, 101, 88, 0.30);
    border-radius: 10px;
    padding: 12px 14px;
    color: #0D6558;
    font-size: 13px;
    margin-bottom: 12px;
    display: flex;
    align-items: center;
    gap: 8px;
}

/* ── Empty state ── */
.empty-cell { padding: 40px 20px; text-align: center; color: #6A6B6C; }

/* ── Control de visibilidad por JS ── */
.krav-hidden { display: none !important; }

/* ── Scrollbar fino ── */
.custom-scrollbar::-webkit-scrollbar { width: 4px; height: 4px; }
.custom-scrollbar::-webkit-scrollbar-track { background: transparent; }
.custom-scrollbar::-webkit-scrollbar-thumb { background: #e4e4e7; border-radius: 4px; }
.custom-scrollbar::-webkit-scrollbar-thumb:hover { background: #d4d4d8; }


/* ───────────── DARK MODE — PANEL COMPONENTS ─────────────
   Replica el comportamiento previo (los overrides viejos apuntaban a las
   clases Tailwind hardcodeadas ``bg-white`` / ``bg-[#F1F1F1]`` / etc.).
   Ahora que esas superficies son clases propias, el override va aquí. */
html.dark-mode .panel-card,
body.dark-mode .panel-card { background: var(--surface-2) !important; }

html.dark-mode .panel-card-inner,
body.dark-mode .panel-card-inner { background: var(--surface) !important; }

html.dark-mode .panel-card-head,
body.dark-mode .panel-card-head { background: var(--surface-2) !important; }
html.dark-mode .panel-card-head.panel-card-head--danger,
body.dark-mode .panel-card-head.panel-card-head--danger { background: rgba(220, 38, 38, 0.06) !important; }
html.dark-mode .panel-card-head.panel-card-head--warm,
body.dark-mode .panel-card-head.panel-card-head--warm { background: rgba(176, 109, 71, 0.08) !important; }

/* El color del título/meta base se adapta a dark, PERO las variantes
   --danger / --warm conservan su color semántico en ambos modos
   (antes eran estilos inline, que ganaban siempre). */
html.dark-mode .panel-card-title:not(.panel-card-title--danger):not(.panel-card-title--warm) h2,
body.dark-mode .panel-card-title:not(.panel-card-title--danger):not(.panel-card-title--warm) h2 { color: var(--text) !important; }

html.dark-mode .panel-card-meta:not(.panel-card-meta--danger):not(.panel-card-meta--warm),
body.dark-mode .panel-card-meta:not(.panel-card-meta--danger):not(.panel-card-meta--warm) { color: var(--text-dim) !important; }

/* Chips semánticos en dark: el azul/rojo oscuro del texto se pierde sobre
   fondo oscuro → subir luminosidad. (success/warn ya tienen override arriba.) */
html.dark-mode .chip.tu,
body.dark-mode .chip.tu {
    background: rgba(96, 165, 250, 0.16) !important;
    color: #93c5fd !important;
    border-color: rgba(147, 197, 253, 0.35) !important;
}
html.dark-mode .chip.danger,
body.dark-mode .chip.danger { color: var(--danger) !important; }

/* (El estado deshabilitado del botón "Ejecutar reset" lo maneja ahora
   el sistema .btn vía --btn-disabled-* — sin override específico.) */


/* ================================================================
   BUTTON SYSTEM (Kravio v10) — paleta de botones light + dark
   ----------------------------------------------------------------
   Jerarquía (de mayor a menor énfasis):
     1. .btn-primary    — acción principal (una por vista)
     2. .btn-secondary  — acción alternativa (outline)
     3. .btn-ghost      — acción menor / cancelar (texto, sin caja)
     4. .btn-danger     — acción DESTRUCTIVA (rojo, RESERVADO)

   Estados cubiertos por TODAS las variantes:
     hover / active (scale .97) / focus-visible (anillo) / disabled.

   Todo themeable por tokens (--btn-*). Un solo cambio de token
   re-tiñe light y dark a la vez.
   ================================================================ */

:root {
    /* 1 · Primary — color de ACCIÓN (azul) */
    --btn-primary-bg:       #2563EB;
    --btn-primary-fg:       #FFFFFF;
    --btn-primary-hover:    #1D4ED8;
    --btn-primary-active:   #1E40AF;

    /* 2 · Secondary — azul tonal (relleno suave) */
    --btn-secondary-bg:     #EFF6FF;
    --btn-secondary-fg:     #1D4ED8;
    --btn-secondary-border: #BFDBFE;
    --btn-secondary-hover:  #DBEAFE;

    /* 3 · Ghost — azul texto (sin caja) */
    --btn-ghost-fg:         #2563EB;
    --btn-ghost-fg-strong:  #1D4ED8;
    --btn-ghost-hover:      #EFF6FF;

    /* 4 · Danger — destructivo (rojo reservado) */
    --btn-danger-bg:        #DC2626;
    --btn-danger-fg:        #FFFFFF;
    --btn-danger-hover:     #B91C1C;

    /* 5 · Success — confirmar / agregar (verde) */
    --btn-success-bg:       #16A34A;
    --btn-success-fg:       #FFFFFF;
    --btn-success-hover:    #15803D;

    /* Estados compartidos */
    --btn-focus-ring:       rgba(37, 99, 235, 0.35);
    --btn-disabled-bg:      #F1F1F1;
    --btn-disabled-fg:      #9C9C9C;
    --btn-disabled-border:  #E5E5E5;
}

html.dark-mode,
body.dark-mode {
    /* Primary azul (se mantiene el blanco en texto; azul legible sobre dark) */
    --btn-primary-bg:       #2563EB;
    --btn-primary-fg:       #FFFFFF;
    --btn-primary-hover:    #3B82F6;
    --btn-primary-active:   #1D4ED8;

    --btn-secondary-bg:     rgba(37, 99, 235, 0.16);
    --btn-secondary-fg:     #93C5FD;
    --btn-secondary-border: rgba(96, 165, 250, 0.35);
    --btn-secondary-hover:  rgba(37, 99, 235, 0.26);

    --btn-ghost-fg:         #93C5FD;
    --btn-ghost-fg-strong:  #BFDBFE;
    --btn-ghost-hover:      rgba(37, 99, 235, 0.14);

    --btn-danger-bg:        #DC2626;
    --btn-danger-fg:        #FFFFFF;
    --btn-danger-hover:     #EF4444;

    --btn-success-bg:       #16A34A;
    --btn-success-fg:       #FFFFFF;
    --btn-success-hover:    #22C55E;

    --btn-focus-ring:       rgba(96, 165, 250, 0.45);
    --btn-disabled-bg:      #232730;
    --btn-disabled-fg:      #6B7280;
    --btn-disabled-border:  rgba(255, 255, 255, 0.08);
}

/* ── Base ──
   OJO: existe un `.btn` LEGACY (pill, uppercase) que siguen usando
   bases / asesores / dashboard / login. Estas reglas van SCOPED a
   `.page-container` para NO tocarlos. Al migrar un panel, se le pone
   `.page-container` y adopta esta paleta automáticamente. */
.page-container .btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 7px;
    height: 32px;
    padding: 0 13px;
    border-radius: 9px;
    border: 1px solid transparent;
    font-family: 'Satoshi', sans-serif;
    font-size: 12px;
    font-weight: 700;
    line-height: 1;
    letter-spacing: normal;
    text-transform: none;
    white-space: nowrap;
    cursor: pointer;
    text-decoration: none;
    box-shadow: none;
    transition: background-color .16s cubic-bezier(.23, 1, .32, 1),
                border-color .16s cubic-bezier(.23, 1, .32, 1),
                color .16s cubic-bezier(.23, 1, .32, 1),
                transform .1s ease;
}
.page-container .btn > i { font-size: 14px; }
.page-container .btn:hover { transform: none; }
.page-container .btn:active { transform: scale(0.97); }
.page-container .btn:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--btn-focus-ring); }
.page-container .btn:disabled,
.page-container .btn[aria-disabled="true"] {
    background: var(--btn-disabled-bg);
    color: var(--btn-disabled-fg);
    border-color: var(--btn-disabled-border);
    cursor: not-allowed;
    transform: none;
    box-shadow: none;
}

/* ── 1 · Primary ── */
.page-container .btn-primary { background: var(--btn-primary-bg); color: var(--btn-primary-fg); }
.page-container .btn-primary:hover:not(:disabled) { background: var(--btn-primary-hover); }
.page-container .btn-primary:active:not(:disabled) { background: var(--btn-primary-active); }

/* ── 2 · Secondary ── */
.page-container .btn-secondary { background: var(--btn-secondary-bg); color: var(--btn-secondary-fg); border-color: var(--btn-secondary-border); }
.page-container .btn-secondary:hover:not(:disabled) { background: var(--btn-secondary-hover); }

/* ── 3 · Ghost ── */
.page-container .btn-ghost { background: transparent; color: var(--btn-ghost-fg); }
.page-container .btn-ghost:hover:not(:disabled) { background: var(--btn-ghost-hover); color: var(--btn-ghost-fg-strong); }

/* ── 4 · Danger (destructivo) ── */
.page-container .btn-danger { background: var(--btn-danger-bg); color: var(--btn-danger-fg); }
.page-container .btn-danger:hover:not(:disabled) { background: var(--btn-danger-hover); }

/* ── 5 · Success (confirmar / agregar) ── */
.page-container .btn-success { background: var(--btn-success-bg); color: var(--btn-success-fg); }
.page-container .btn-success:hover:not(:disabled) { background: var(--btn-success-hover); }

/* ── Tamaños ── */
.page-container .btn-sm { height: 26px; padding: 0 9px; font-size: 11px; gap: 5px; border-radius: 7px; }
.page-container .btn-sm > i { font-size: 12px; }
.page-container .btn-lg { height: 44px; padding: 0 20px; font-size: 13px; border-radius: 10px; }
.page-container .btn-lg > i { font-size: 16px; }
.page-container .btn-block { width: 100%; }


/* Movimiento reducido: el contenido entra sin fade. */
@media (prefers-reduced-motion: reduce) {
    html.edx-fade .edx-main { animation: none; }
}

/* Barra de progreso de navegación (3px, arriba). Feedback inmediato al
   cambiar de URL (sidebar, tabs, botones). Retardo mínimo para no parpadear
   en navegaciones instantáneas. Se resetea en pageshow (incluye bfcache). */
.edx-progress {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 3px;
    z-index: 60;
    background: linear-gradient(90deg, #2563EB 0%, #60A5FA 100%);
    border-radius: 0 3px 3px 0;
    transform: scaleX(0);
    transform-origin: left center;
    opacity: 0;
    pointer-events: none;
}
.edx-progress.is-on {
    opacity: 1;
    transform: scaleX(0.85);
    transition: transform 1.2s cubic-bezier(.23, 1, .32, 1), opacity .1s ease;
}
