/* ============================================================
   TRACEHOLD — Design System (2026)
   Tokens · Components · Shell · Legacy compat
   ============================================================ */

/* ====================== TIPOGRAFÍA (Geist, auto-alojada) ======================
   Geist y Geist Mono de Vercel (SIL Open Font License 1.1 → fonts/OFL.txt),
   fuentes VARIABLES (un fichero cubre 100–900), tomadas tal cual del paquete npm
   `geist@1.7.2` (dist/fonts/<familia>/…-Variable.woff2). Se sirven desde /admin
   (CSP font-src 'self'): nada de Google Fonts ni CDN, un producto DLP no hace
   llamadas externas para pintar su propia consola. Sin estas reglas los tokens
   --font-sans/--font-mono nombraban 'Geist' pero caían siempre a la fuente del
   sistema. font-display:swap = el texto se pinta al momento con la pila de
   respaldo y cambia a Geist en cuanto carga. */
@font-face {
  font-family:'Geist';
  src:url('fonts/Geist-Variable.woff2') format('woff2');
  font-weight:100 900; font-style:normal; font-display:swap;
}
@font-face {
  font-family:'Geist Mono';
  src:url('fonts/GeistMono-Variable.woff2') format('woff2');
  font-weight:100 900; font-style:normal; font-display:swap;
}

/* ====================== TOKENS ====================== */
/* Claro = valores base; oscuro es el modo por defecto y se declara en [data-theme="dark"]. */
:root, [data-theme="light"] {
  /* navy */
  --navy-950:#070d1a; --navy-900:#0a1326; --navy-850:#0d1830;
  --navy-800:#101f3f; --navy-700:#192847; --navy-600:#243861;
  --navy-500:#37507f; --navy-400:#5a72a0; --navy-300:#8ea0c2;

  /* teal */
  --teal-800:#0b5f60; --teal-700:#0e7e80; --teal-600:#10999a;
  --teal-500:#12b1b0; --teal-450:#19abad; --teal-400:#34c6c5;
  --teal-300:#6fdcdb; --teal-200:#a9ecec; --teal-100:#d7f6f6; --teal-50:#eefbfb;

  /* status */
  --coral-700:#a3271a; --coral-600:#c8392a; --coral-500:#e85544;
  --coral-200:#f8c0b8; --coral-100:#fde6e2;
  --amber-700:#9a5d05; --amber-600:#bd7708; --amber-500:#e8a020; --amber-100:#fcefd4;
  --green-700:#0c6e44; --green-600:#0f9259; --green-500:#1bb56f; --green-100:#d6f4e4;
  --blue-600:#2563d6; --blue-500:#3b82f6; --blue-100:#dbe8fe;
  --violet-600:#6d3fe0; --violet-500:#8456f0; --violet-100:#ece4fd;
  --pink-500:#e4519b; --orange-500:#f3743a;

  /* neutral */
  --gray-50:#f6f7f9; --gray-100:#eef0f4; --gray-200:#e4e7ee; --gray-300:#d3d8e2;
  --gray-400:#a6adbd; --gray-500:#717a8c; --gray-600:#515a6e;
  --gray-700:#39414f; --gray-800:#222936; --gray-900:#10141d;

  /* semantic · light */
  --bg:#f7f7f9; --bg-grid:none;
  --surface:#ffffff; --surface-2:#f2f2f6;
  --surface-sunken:#ececf1; --surface-hover:#f2f2f6;
  --border:#e4e4ea; --border-strong:#d2d2db; --divider:#ececf1;
  --text:#2e3040; --text-strong:#16171f; --text-muted:#555869;
  --text-subtle:#666a7c; --text-inverse:#ffffff;
  --bar-neutral:#d6d7df;

  --accent:#6d5fd0; --accent-hover:#5f52bd; --accent-strong:#5145a8;
  --accent-soft:rgba(109,95,208,.12); --accent-softer:rgba(109,95,208,.07);
  --accent-fg:#ffffff; --accent-rgb:109,95,208;

  --brand:var(--navy-800); --brand-soft:#eaeef6;

  --danger:#d0504b; --danger-soft:var(--coral-100); --danger-fg:#8f2217;
  --warn:#c27a1a;   --warn-soft:var(--amber-100);   --warn-fg:#855004;
  --ok:#2f9a5f;     --ok-soft:var(--green-100);     --ok-fg:#0a6140;
  --info:var(--blue-500);    --info-soft:var(--blue-100);    --info-fg:#1f55b8;
  --violet:var(--violet-500);--violet-soft:var(--violet-100);

  /* rail: sigue al tema (claro en claro, oscuro en oscuro) */
  --rail-bg:#efeff3; --rail-bg-2:#ffffff;
  --rail-border:#e4e4ea;
  --rail-text:#555869; --rail-text-dim:#606376; --rail-text-hi:#16171f;
  --rail-hover:#e6e6ec;
  --rail-active:#dedee6;
  --rail-section:#666a7c;

  /* type */
  --font-sans:'Geist','Geist Fallback',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  --font-mono:'Geist Mono','JetBrains Mono',ui-monospace,'SFMono-Regular',Menlo,monospace;
  --fs-2xs:10.5px; --fs-xs:11.5px; --fs-sm:12.5px; --fs-base:13px; --fs-md:14.5px;
  --fs-lg:16px; --fs-xl:19px; --fs-2xl:23px; --fs-3xl:29px; --fs-4xl:38px; --fs-5xl:52px;

  /* shape */
  --r-xs:5px; --r-sm:4px; --r-md:6px; --r:6px; --r-lg:8px; --r-xl:10px; --r-2xl:24px; --r-pill:999px;

  /* spacing */
  --sp-1:4px; --sp-2:6px; --sp-3:10px; --sp-4:14px; --sp-5:18px;
  --sp-6:24px; --sp-7:32px; --sp-8:44px;
  --pad-card:16px; --row-h:36px;

  /* shadows */
  --sh-xs:none; --sh-sm:none; --sh:none; --sh-glow:none;
  /* solo drawer/popover */
  --sh-lg:0 12px 32px rgba(0,0,0,.35);
  --sh-xl:0 12px 32px rgba(0,0,0,.35);
  --focus:0 0 0 3px rgba(var(--accent-rgb),.30);

  --ease:cubic-bezier(.4,0,.2,1);
  --ease-out:cubic-bezier(.16,1,.3,1);
  --ease-spring:cubic-bezier(.34,1.56,.64,1);
}

/* ====================== DARK ====================== */
[data-theme="dark"] {
  --bg:#191b2a; --bg-grid:none;
  --surface:#1d1f2c; --surface-2:#222433;
  --surface-sunken:#161923; --surface-hover:#222433;
  --border:#282a37; --border-strong:#353746; --divider:#282a37;
  --text:#c9cbd6; --text-strong:#eceef4; --text-muted:#a3a7ba;
  --text-subtle:#868ba2; --text-inverse:#16171f;
  --bar-neutral:#3f414d;
  --accent:#9284d9; --accent-hover:#a095e0;
  --accent-strong:#b3a8ec; --accent-soft:rgba(146,132,217,.16);
  --accent-softer:rgba(146,132,217,.08);
  --accent-fg:#16171f; --accent-rgb:146,132,217;
  --brand:#9284d9; --brand-soft:rgba(146,132,217,.16);
  --danger:#e7827e; --warn:#ecb16a; --ok:#6fce96;
  --danger-soft:rgba(231,130,126,.14); --danger-fg:#e7827e;
  --warn-soft:rgba(236,177,106,.14);   --warn-fg:#ecb16a;
  --ok-soft:rgba(111,206,150,.14);     --ok-fg:#6fce96;
  --info-soft:rgba(59,130,246,.14);    --info-fg:#9cc2fb;
  --violet-soft:rgba(146,132,217,.16);
  --rail-bg:#161825; --rail-bg-2:#1d1f2c; --rail-border:#282a37;
  --rail-text:#a3a7ba; --rail-text-dim:#868ba2; --rail-text-hi:#eceef4;
  --rail-hover:#222433; --rail-active:#2a2c3d; --rail-section:#868ba2;
}

/* ====================== DENSIDAD ======================
   Esto FUE la perilla `data-density` (comfortable/compact). Nunca llegó a
   existir: el único bloque escrito era el de "comfortable" —el valor por
   defecto—, así que elegir "compact" en el panel Apariencia no cambiaba un
   píxel. El control se retiró (2026-09-20); ver DESIGN.md.

   Las declaraciones se quedan TAL CUAL y solo cambia el selector, de
   [data-density="comfortable"] a :root. Son los valores REALMENTE activos hoy
   (pad-card 20px, row-h 46px, sp-4/5/6 16/22/30px, fs-base 14px) y difieren de
   los de :root de arriba (16px, 36px, 14/18/24px, 13.5px): borrar el bloque
   compactaría la consola entera. Misma especificidad (0,1,0) y misma posición
   en la cascada que antes, y nada entre medias redefine estos tokens, así que
   el resultado calculado es idéntico. Si algún día se quiere densidad de
   verdad, se reintroduce con AMBOS valores escritos. */
:root {
  --pad-card:16px; --row-h:36px;
  --sp-4:16px; --sp-5:22px; --sp-6:30px;
  --fs-base:13px;
}
@media (min-width: 2400px) {
  :root { --fs-base:14px; --pad-card:20px; --row-h:40px; }
}

/* ====================== BACKWARD COMPAT ALIASES ====================== */
:root {
  --text-xs:var(--fs-xs); --text-sm:var(--fs-sm); --text-base:var(--fs-base);
  --text-md:var(--fs-md); --text-lg:var(--fs-lg); --text-xl:var(--fs-xl);
  --text-2xl:var(--fs-2xl); --text-3xl:var(--fs-3xl); --text-4xl:var(--fs-4xl);
  --radius-xs:var(--r-xs); --radius-sm:var(--r-sm); --radius:var(--r);
  --radius-lg:var(--r-lg); --radius-xl:var(--r-xl); --radius-2xl:var(--r-2xl);
  --shadow-xs:var(--sh-xs); --shadow-sm:var(--sh-sm); --shadow:var(--sh);
  --shadow-lg:var(--sh-lg); --shadow-xl:var(--sh-xl);
  --surface-alt:var(--surface-2); --text-inverted:var(--text-inverse);
  --gap:var(--sp-4); --gap-xs:var(--sp-2); --gap-sm:var(--sp-3);
  --gap-lg:var(--sp-6); --gap-xl:var(--sp-7);
}

/* ====================== BASE ====================== */
*{box-sizing:border-box;}
html,body{margin:0;padding:0;}
body{
  font-family:var(--font-sans); font-size:var(--fs-base); line-height:1.5;
  color:var(--text); background:var(--bg);
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
  font-feature-settings:'ss01','cv01','tnum' 0;
}
button,input,textarea,select{font:inherit;color:inherit;}
button{background:none;border:0;padding:0;cursor:pointer;}
a{color:inherit;text-decoration:none;}
h1,h2,h3,h4{margin:0;font-weight:600;letter-spacing:-0.02em;color:var(--text-strong);}
::selection{background:var(--accent-soft);color:var(--accent-strong);}
:focus-visible{outline:none;box-shadow:var(--focus);}
.tnum{font-variant-numeric:tabular-nums;}
.mono{font-family:var(--font-mono);}

/* ====================== SCROLLBAR ====================== */
::-webkit-scrollbar{width:10px;height:10px;}
::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:999px;border:2px solid transparent;background-clip:padding-box;}
::-webkit-scrollbar-thumb:hover{background:var(--gray-400);background-clip:padding-box;}
::-webkit-scrollbar-track{background:transparent;}

/* ====================== ANIMATIONS ====================== */
@keyframes kl-fade-up{from{opacity:0;transform:translateY(10px);}to{opacity:1;transform:none;}}
@keyframes kl-fade-in{from{opacity:0;}to{opacity:1;}}
@keyframes kl-scale-in{from{opacity:0;transform:scale(.96);}to{opacity:1;transform:none;}}
@keyframes kl-pulse{0%{box-shadow:0 0 0 0 rgba(var(--accent-rgb),.45);}70%{box-shadow:0 0 0 7px rgba(var(--accent-rgb),0);}100%{box-shadow:0 0 0 0 rgba(var(--accent-rgb),0);}}
@keyframes kl-pulse-live{0%{box-shadow:0 0 0 0 rgba(27,181,111,.5);}70%{box-shadow:0 0 0 6px rgba(27,181,111,0);}100%{box-shadow:0 0 0 0 rgba(27,181,111,0);}}
@keyframes kl-spin{to{transform:rotate(360deg);}}
@keyframes kl-shimmer{0%{background-position:-180% 0;}100%{background-position:180% 0;}}
@keyframes kl-sweep{from{stroke-dashoffset:var(--dash);}to{stroke-dashoffset:0;}}
@keyframes kl-bar-rise{from{transform:scaleY(0);}to{transform:scaleY(1);}}
@keyframes kl-flash{0%{background:var(--accent-softer);}100%{background:transparent;}}
@keyframes vfsp{to{transform:rotate(360deg)}}
@keyframes vfboot{to{transform:rotate(360deg);}}
@keyframes kl-pop{from{opacity:0;transform:scale(.96) translateY(-4px);}to{opacity:1;transform:none;}}
@keyframes kl-cell-pop{from{opacity:0;transform:scale(0);}to{opacity:1;transform:scale(1);}}
@keyframes kl-dot-pop{from{opacity:0;transform:scale(0);}to{opacity:1;transform:scale(1);}}
@keyframes loginOrbA{0%,100%{transform:translate(0,0) scale(1);}50%{transform:translate(80px,60px) scale(1.15);}}
@keyframes loginOrbB{0%,100%{transform:translate(0,0) scale(1);}50%{transform:translate(-90px,-50px) scale(1.1);}}
@keyframes loginOrbC{0%,100%{transform:translate(0,0) scale(1);opacity:.45;}50%{transform:translate(-60px,70px) scale(1.2);opacity:.7;}}
@keyframes loginGridDrift{from{background-position:0 0,0 0;}to{background-position:48px 48px,48px 48px;}}

.kl-anim-up{animation:kl-fade-up .5s var(--ease-out) both;}
.kl-anim-in{animation:kl-fade-in .4s var(--ease) both;}
.kl-anim-scale{animation:kl-scale-in .4s var(--ease-out) both;}

@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;transition-duration:.001ms !important;}
}

/* ====================== APP LAYOUT ====================== */
.kl-app{
  display:grid; grid-template-columns:var(--rail-w,220px) 1fr;
  min-height:100vh; background:var(--bg);
  background-image:none;
}
.kl-app[data-rail="collapsed"]{--rail-w:56px;}

/* legacy .app alias for viewing-tenant class checks */
.kl-app.viewing-tenant .tenant-rw{display:none !important;}

/* ====================== UTILS ====================== */
.row{display:flex;align-items:center;gap:var(--sp-3);}
.col{display:flex;flex-direction:column;gap:var(--sp-3);}
.spread{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);}
.grow{flex:1;min-width:0;}
.wrap{flex-wrap:wrap;}
.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.muted{color:var(--text-muted);}
.subtle{color:var(--text-subtle);}
.strong{color:var(--text-strong);font-weight:600;}
.center{display:grid;place-items:center;}
.hide{display:none !important;}
.upper{text-transform:uppercase;letter-spacing:.08em;}
.divider-h{height:1px;background:var(--divider);margin:8px 0;}

/* ====================== RAIL / SIDEBAR ====================== */
/* Rail de iconos: plegado por defecto (56px) con flyout; desplegado 220px.
   Sin degradados, brillos ni barras laterales: superficie plana + borde fino. */
.kl-rail{
  position:sticky;top:0;height:100vh;
  background:var(--rail-bg);
  border-right:1px solid var(--rail-border);
  display:flex;flex-direction:column;
  z-index:40;color:var(--rail-text);overflow:hidden;
}
.kl-app[data-rail="collapsed"] .kl-rail{overflow:visible;}
.kl-rail-brand{
  display:flex;align-items:center;gap:10px;
  padding:14px 12px 12px;position:relative;
}
.kl-rail-brand img.logo-full{height:28px;width:auto;display:block;}
.kl-rail-brand img.logo-mark{height:28px;width:auto;display:none;}
/* Logo completo por tema (el wordmark del SVG por defecto es claro). Un logo propio
   (consoleLogoUrl) se muestra tal cual en los dos temas. */
html[data-theme="light"] .kl-rail-brand img.logo-on-dark{display:none;}
html:not([data-theme="light"]) .kl-rail-brand img.logo-on-light{display:none;}
.kl-app[data-rail="collapsed"] .kl-rail-brand img.logo-full{display:none;}
.kl-app[data-rail="collapsed"] .kl-rail-brand img.logo-mark{display:block;}
.kl-app[data-rail="collapsed"] .kl-rail-brand{justify-content:center;padding:14px 0 12px;}

.kl-rail-nav{flex:1;overflow-y:auto;padding:4px 8px 16px;display:flex;flex-direction:column;gap:2px;}
.kl-app[data-rail="collapsed"] .kl-rail-nav{overflow-y:auto;scrollbar-width:none;align-items:center;}
.kl-app[data-rail="collapsed"] .kl-rail-nav::-webkit-scrollbar{display:none;}
.kl-rail-nav::-webkit-scrollbar{width:6px;}
.kl-rail-nav::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:var(--r-pill);}

.kl-nav-item,.kl-nav-group{
  display:flex;align-items:center;gap:10px;
  padding:8px 10px;border-radius:var(--r-lg);
  color:var(--rail-text);font-size:13px;font-weight:500;cursor:pointer;
  position:relative;transition:color .14s,background .14s;white-space:nowrap;
}
.kl-nav-group{user-select:none;}
.kl-nav-item:focus-visible,.kl-nav-group:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;}
.kl-nav-item:hover,.kl-nav-group:hover{color:var(--rail-text-hi);background:var(--rail-hover);}
.kl-nav-item .th-ico,.kl-nav-group .th-ico{width:18px;height:18px;flex-shrink:0;}
.kl-nav-item .lbl,.kl-nav-group .lbl{flex:1;overflow:hidden;text-overflow:ellipsis;}
.kl-nav-item.active,.kl-nav-group.has-active{color:var(--rail-text-hi);background:var(--rail-active);}
.kl-nav-group .chev{flex-shrink:0;color:var(--rail-text-dim);transition:transform .2s var(--ease-out);}
.kl-nav-grp-wrap.open>.kl-nav-group .chev{transform:rotate(-180deg);}
.kl-nav-item .badge-n,.kl-nav-group .badge-n{
  margin-left:auto;font-family:var(--font-mono);font-size:10.5px;font-weight:600;
  padding:1px 6px;border-radius:var(--r-pill);background:var(--surface-hover);color:var(--rail-text);
  min-width:20px;text-align:center;
}
.kl-nav-group .badge-n{margin-right:6px;}
.kl-nav-item .badge-n.danger,.kl-nav-group .badge-n.danger{background:var(--danger);color:var(--bg);}
.kl-nav-item .badge-n.live{background:var(--ok-soft);color:var(--ok);}
/* "Nuevo" / "Actualizado": marcadores de sección de fase de desarrollo */
/* también dentro de las pestañas de un grupo (.kl-secnav-tab): misma píldora, sin empujar a la derecha */
.kl-secnav-tab .kl-nav-tag{
  margin-left:var(--sp-2);flex-shrink:0;
  font-size:9px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  padding:1px 6px;border-radius:var(--r-pill);line-height:1.6;
}
.kl-secnav-tab .kl-nav-tag.new{background:var(--accent-soft);color:var(--accent);}
.kl-secnav-tab .kl-nav-tag.updated{background:var(--ok-soft);color:var(--ok);}
.kl-nav-item .kl-nav-tag{
  margin-left:auto;flex-shrink:0;
  font-size:9px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  padding:1px 6px;border-radius:var(--r-pill);line-height:1.6;
}
.kl-nav-item .kl-nav-tag.new{background:var(--accent-soft);color:var(--accent);}
.kl-nav-item .kl-nav-tag.updated{background:var(--ok-soft);color:var(--ok);}
/* Punto en cabecera de grupo cuando un hijo está marcado (Nuevo/Actualizado) */
.kl-nav-group .kl-nav-grp-dot{margin-left:auto;margin-right:6px;flex-shrink:0;width:6px;height:6px;border-radius:50%;background:var(--accent);}
.kl-nav-group .badge-n + .kl-nav-grp-dot{margin-left:0;}

/* Plegado: solo iconos, casillas de 40×40 */
.kl-app[data-rail="collapsed"] .kl-nav-item,
.kl-app[data-rail="collapsed"] .kl-nav-group{width:40px;height:40px;padding:0;justify-content:center;}
.kl-app[data-rail="collapsed"] .kl-nav-item .lbl,
.kl-app[data-rail="collapsed"] .kl-nav-item .badge-n,
.kl-app[data-rail="collapsed"] .kl-nav-item .kl-nav-tag,
.kl-app[data-rail="collapsed"] .kl-nav-item .live-dot,
.kl-app[data-rail="collapsed"] .kl-nav-group .lbl,
.kl-app[data-rail="collapsed"] .kl-nav-group .chev,
.kl-app[data-rail="collapsed"] .kl-nav-group .badge-n,
.kl-app[data-rail="collapsed"] .kl-nav-group .kl-nav-grp-dot{display:none;}

/* Grupos: submenú en acordeón (desplegado) o flyout (plegado) */
.kl-nav-grp-wrap{display:flex;flex-direction:column;}
.kl-app[data-rail="collapsed"] .kl-nav-grp-wrap{position:relative;}
.kl-nav-sub{
  overflow:hidden;transition:max-height .26s var(--ease-out);
  display:flex;flex-direction:column;gap:1px;
  margin:1px 0 3px 18px;padding-left:10px;
  border-left:1px solid var(--rail-border);
}
.kl-nav-sub .kl-nav-item{padding:7px 10px;font-size:12.5px;}
/* Las hojas hijas no llevan icono: solo texto */
.kl-rail .kl-nav-sub .th-ico,.kl-rail .kl-nav-sub .th-glyph{display:none;}
.kl-nav-sub.flyout{
  display:none;position:fixed;left:64px;top:8px;
  min-width:220px;max-height:calc(100vh - 16px);overflow-y:auto;margin:0;padding:6px;
  background:var(--surface);border:1px solid var(--border);border-radius:var(--r-xl);
  box-shadow:var(--sh-lg);z-index:60;
}
.kl-nav-grp-wrap.open>.kl-nav-sub.flyout{display:flex;}
.kl-nav-sub.flyout .kl-nav-item{width:auto;height:auto;justify-content:flex-start;padding:7px 10px;font-size:13px;color:var(--text);}
.kl-nav-sub.flyout .kl-nav-item .lbl{display:block;}
.kl-nav-sub.flyout .kl-nav-item:hover{background:var(--surface-hover);color:var(--text-strong);}
.kl-nav-sub.flyout .kl-nav-item.active{background:transparent;color:var(--accent);}
.kl-nav-sub.flyout .kl-nav-item .badge-n{display:inline-block;}
.kl-nav-sub.flyout .kl-nav-item .kl-nav-tag{display:inline-block;}
.kl-nav-flyout-title{padding:6px 10px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-subtle);}

/* Staff de plataforma: separador y eyebrow (el texto sigue en el DOM; oculto al plegar) */
.kl-nav-grp-wrap.superadmin{margin-top:10px;padding-top:8px;border-top:1px dashed var(--rail-border);}
.kl-nav-sa-eyebrow{
  display:flex;align-items:center;gap:5px;padding:1px 12px 5px;
  font-size:9.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  color:var(--warn);opacity:.9;
}
.kl-app[data-rail="collapsed"] .kl-nav-sa-eyebrow{display:none;}
.kl-app[data-rail="collapsed"] .kl-nav-grp-wrap.superadmin{margin-top:6px;padding-top:6px;}

.kl-rail-foot{border-top:1px solid var(--rail-border);padding:8px;}
.kl-rail-toggle{
  width:100%;display:flex;align-items:center;gap:8px;
  padding:6px 9px;border-radius:var(--r-lg);
  background:transparent;border:1px solid transparent;
  color:var(--rail-text-dim);font-size:11.5px;font-weight:500;cursor:pointer;
  transition:background .15s,color .15s;
}
.kl-rail-toggle:hover{background:var(--rail-hover);color:var(--rail-text);}
.kl-app[data-rail="collapsed"] .kl-rail-toggle{width:40px;height:40px;margin:0 auto;padding:0;justify-content:center;}
.kl-app[data-rail="collapsed"] .kl-rail-toggle .lbl{display:none;}

.kl-avatar{
  width:32px;height:32px;border-radius:var(--r-lg);display:grid;place-items:center;
  background:var(--accent-soft);color:var(--accent);
  font-size:12px;font-weight:600;flex-shrink:0;letter-spacing:.02em;
}
.kl-avatar.sm{width:24px;height:24px;font-size:10px;border-radius:var(--r-md);}
.kl-avatar.lg{width:40px;height:40px;font-size:14px;border-radius:var(--r-xl);}

/* ====================== MAIN + TOPBAR ====================== */
.kl-main{min-width:0;display:flex;flex-direction:column;}
.kl-topbar{
  position:sticky;top:0;z-index:30;
  background:var(--bg);
  border-bottom:1px solid var(--border);
  padding:0 24px;height:48px;display:flex;align-items:center;gap:14px;
}
.kl-crumbs{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-muted);flex-shrink:0;white-space:nowrap;}
.kl-crumbs .sep{color:var(--text-subtle);}
.kl-crumbs .now{color:var(--text-strong);font-weight:600;}
.kl-tenant-wrap{position:relative;}
.kl-crumb-tenant{
  display:inline-flex;align-items:center;gap:6px;max-width:240px;
  padding:4px 8px;margin:0 -8px;border-radius:var(--r-md);
  background:transparent;border:none;color:var(--text-muted);font-size:13px;cursor:pointer;
  transition:background .14s,color .14s;
}
.kl-crumb-tenant .truncate{min-width:0;}
.kl-crumb-tenant:hover{background:var(--surface-hover);color:var(--text-strong);}
.kl-crumb-tenant.static{cursor:default;padding:0;margin:0;}
.kl-crumb-tenant.static:hover{background:transparent;color:var(--text-muted);}
.kl-crumb-tenant .chev{font-size:10px;color:var(--text-subtle);}
.kl-tenant-wrap .tenant-switch-pop{left:0;right:auto;width:300px;top:calc(100% + 6px);}
.kl-topbar-actions{margin-left:0;display:flex;align-items:center;gap:6px;flex-shrink:0;}
.kl-topbar-link{
  display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;
  border-radius:var(--r-md);background:transparent;border:none;
  color:var(--text-muted);font-size:13px;font-weight:500;cursor:pointer;
  transition:background .14s,color .14s;
}
.kl-topbar-link:hover{background:var(--surface-hover);color:var(--text-strong);}
.kl-topbar-link .n{
  font-family:var(--font-mono);font-size:10.5px;font-weight:600;line-height:1.5;
  padding:0 6px;border-radius:var(--r-pill);background:var(--danger);color:var(--bg);
}
.kl-topbar-searchwrap{flex:1;display:flex;justify-content:center;padding:0 16px;min-width:0;}
.kl-topbar-search{
  position:relative;width:100%;max-width:360px;height:32px;
  display:flex;align-items:center;gap:0;
  padding:0 40px 0 12px;
  border-radius:var(--r-lg);border:1px solid var(--border);
  background:var(--surface-sunken);color:var(--text-muted);font-size:13px;
  cursor:text;text-align:left;
  transition:border-color .15s,background .15s;
}
.kl-topbar-search:hover{border-color:var(--border-strong);}
.kl-topbar-search:focus-visible{border-color:var(--accent);outline:none;}
.kl-topbar-search .ph{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-subtle);}
.kl-topbar-search .kbd{position:absolute;right:8px;top:50%;transform:translateY(-50%);pointer-events:none;}
@media(min-width:1920px){.kl-topbar-search{max-width:440px;}}

/* ── Search Palette ── */
.sp-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.45);display:flex;align-items:flex-start;justify-content:center;padding-top:80px;}
.sp-modal{width:100%;max-width:580px;background:var(--surface);border:1px solid var(--border);border-radius:16px;box-shadow:0 24px 60px rgba(0,0,0,.22),0 4px 16px rgba(0,0,0,.12);overflow:hidden;display:flex;flex-direction:column;max-height:calc(100vh - 160px);}
.sp-input-row{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--divider);}
.sp-ico{flex-shrink:0;color:var(--text-muted);}
.sp-input{flex:1;background:transparent;border:none;outline:none;font-size:15px;color:var(--text);font-family:inherit;}
.sp-input::placeholder{color:var(--text-subtle);}
.sp-spin{width:16px;height:16px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:sp-rotate .6s linear infinite;flex-shrink:0;}
@keyframes sp-rotate{to{transform:rotate(360deg)}}
.sp-results{overflow-y:auto;padding:8px 0;}
.sp-group{padding:0 8px 4px;}
.sp-group-label{display:flex;align-items:center;gap:5px;font-size:10.5px;font-weight:600;color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;padding:6px 8px 4px;}
.sp-item{width:100%;display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:8px;background:none;border:none;cursor:pointer;color:var(--text);font-size:13px;text-align:left;transition:background .1s;}
.sp-item:hover,.sp-item.active{background:var(--surface-hover);}
.sp-item-ico{flex-shrink:0;color:var(--text-muted);}
.sp-item-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sp-badge{font-size:10px;padding:1px 6px;border-radius:5px;background:var(--surface-2);color:var(--text-muted);white-space:nowrap;flex-shrink:0;}
.sp-badge.danger{background:var(--danger-soft,#fde8e8);color:var(--danger,#d0021b);}
.sp-badge.muted{opacity:.7;}
.sp-hint{padding:28px 16px;text-align:center;color:var(--text-muted);font-size:13px;}
.sp-footer{display:flex;align-items:center;gap:16px;padding:10px 16px;border-top:1px solid var(--divider);font-size:11px;color:var(--text-muted);}
.sp-footer kbd{display:inline-block;padding:1px 5px;border:1px solid var(--border);border-radius:4px;font-size:10.5px;font-family:var(--font-mono);background:var(--surface-2);margin-right:3px;}

/* lang */
.kl-lang{position:relative;}
.kl-lang-btn{
  display:flex;align-items:center;gap:6px;height:34px;padding:0 9px;
  border-radius:9px;border:1px solid transparent;background:transparent;cursor:pointer;
  transition:background .15s,border-color .15s;
}
.kl-lang-btn:hover,.kl-lang-btn.open{background:var(--surface-hover);border-color:var(--border);}
.kl-lang-btn .flag{font-size:15px;line-height:1;}
.kl-lang-btn .code{font-size:11.5px;font-weight:700;letter-spacing:.04em;color:var(--text-strong);}
.kl-lang-btn .chev{color:var(--text-subtle);transition:transform .2s;}
.kl-lang-btn.open .chev{transform:rotate(180deg);}
.kl-lang-menu{
  position:absolute;top:calc(100% + 8px);right:0;width:188px;z-index:60;
  background:var(--surface);border:1px solid var(--border);border-radius:13px;
  box-shadow:0 14px 40px -8px rgba(16,31,63,.28),0 2px 8px rgba(16,31,63,.08);
  padding:6px;animation:kl-pop .14s ease-out;
}
.kl-lang-item{
  width:100%;display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:9px;
  border:none;background:transparent;font-size:13px;color:var(--text);cursor:pointer;text-align:left;
  transition:background .12s;
}
.kl-lang-item .flag{font-size:16px;}
.kl-lang-item .lbl{flex:1;}
.kl-lang-item .tick{color:var(--accent);}
.kl-lang-item:hover{background:var(--surface-hover);}
.kl-lang-item.on{color:var(--text-strong);font-weight:600;}

/* profile */
.kl-profile{position:relative;}
.kl-profile-btn{
  display:flex;align-items:center;gap:8px;max-width:200px;
  padding:3px 8px 3px 4px;border-radius:var(--r-md);
  background:transparent;border:1px solid transparent;cursor:pointer;
  transition:background .15s,border-color .15s;
}
.kl-profile-btn:hover,.kl-profile-btn.open{background:var(--surface-hover);border-color:var(--border);}
.kl-profile-btn .who{line-height:1.2;min-width:0;text-align:left;}
.kl-profile-btn .who .n{font-size:12.5px;font-weight:600;color:var(--text-strong);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:120px;}
.kl-profile-btn .who .m{font-size:10.5px;color:var(--text-muted);}
.kl-profile-btn .chev{font-size:10px;color:var(--text-subtle);transition:transform .2s;flex-shrink:0;}
.kl-profile-btn.open .chev{transform:rotate(180deg);}
@media(max-width:1100px){.kl-profile-btn .who{display:none;}}
.kl-profile-menu{
  position:absolute;top:calc(100% + 8px);right:0;width:248px;z-index:60;
  background:var(--surface);border:1px solid var(--border);border-radius:13px;
  box-shadow:0 14px 40px -8px rgba(16,31,63,.28),0 2px 8px rgba(16,31,63,.08);
  padding:7px;animation:kl-pop .14s ease-out;
}
.kl-profile-card{display:flex;align-items:center;gap:11px;padding:8px 9px 10px;}
.kl-profile-card .pm-n{font-size:13.5px;font-weight:650;color:var(--text-strong);}
.kl-profile-card .pm-e{font-size:11.5px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:160px;}
.kl-profile-sep{height:1px;background:var(--divider);margin:4px 2px;}
.kl-profile-card .pm-who{min-width:0;}
.kl-profile-label{padding:6px 10px 2px;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-subtle);}
.kl-lang-inline{display:flex;flex-direction:column;}
.kl-profile-item{
  width:100%;display:flex;align-items:center;gap:10px;
  padding:9px 10px;border-radius:9px;border:none;background:transparent;
  font-size:12.5px;font-weight:550;color:var(--text);cursor:pointer;text-align:left;
  transition:background .12s,color .12s;
}
.kl-profile-item:hover{background:var(--surface-hover);color:var(--text-strong);}
.kl-profile-item svg{color:var(--text-muted);flex-shrink:0;}
.kl-profile-item:hover svg{color:var(--accent);}
.kl-profile-item.danger{color:var(--coral-600,#d6453a);}
.kl-profile-item.danger svg{color:var(--coral-600,#d6453a);}
.kl-profile-item.danger:hover{background:color-mix(in srgb,var(--coral-500,#e85544) 12%,transparent);color:var(--coral-600,#d6453a);}
.kl-profile-item.danger:hover svg{color:var(--coral-600,#d6453a);}

.kl-content{flex:1;min-width:0;padding:24px 26px 64px;}

/* page header */
.kl-page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:20px;}
.kl-page-head h1{font-size:24px;font-weight:500;letter-spacing:-.01em;color:var(--text-strong);}
.kl-eyebrow{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--accent);font-weight:500;}
.kl-page-head .lede{margin-top:5px;font-size:13px;color:var(--text-muted);max-width:62ch;}
.kl-page-head .actions{display:flex;gap:8px;flex-wrap:wrap;}

/* ====================== BUTTONS ====================== */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:7px;
  min-height:32px;padding:0 13px;border-radius:var(--r-lg);
  font-size:13px;font-weight:500;border:1px solid var(--border);
  background:transparent;color:var(--text);cursor:pointer;white-space:nowrap;
  transition:background .14s,border-color .14s,color .14s;
}
.btn:hover{background:var(--surface-2);border-color:var(--border-strong);}
/* Estado deshabilitado: sin esta regla un .btn[disabled] se pintaba idéntico a
   uno activo → parecía pulsable pero el click era un no-op silencioso. Lo
   atenuamos y neutralizamos el hover; el `title` explica por qué. */
.btn:disabled,.btn[disabled]{opacity:.45;cursor:not-allowed;}
.btn:disabled:hover,.btn[disabled]:hover{background:transparent;border-color:var(--border);}
.btn.accent,.btn.brand,.btn.primary{background:var(--accent);color:var(--accent-fg);border-color:transparent;}
.btn.accent:hover,.btn.brand:hover,.btn.primary:hover{background:var(--accent-hover);border-color:transparent;}
.btn.accent:disabled:hover,.btn.brand:disabled:hover,.btn.primary:disabled:hover,.btn.accent[disabled]:hover,.btn.brand[disabled]:hover,.btn.primary[disabled]:hover{background:var(--accent);border-color:transparent;}
.btn.ghost{background:transparent;border-color:transparent;}
.btn.ghost:hover{background:var(--surface-2);}
.btn.ghost:disabled:hover,.btn.ghost[disabled]:hover{background:transparent;border-color:transparent;}
.btn.danger{color:var(--danger);background:transparent;border-color:var(--danger-soft);}
.btn.danger:hover{background:var(--danger-soft);border-color:var(--danger-soft);}
.btn.sm{min-height:26px;padding:0 10px;font-size:var(--fs-xs);}
.btn.lg{min-height:38px;padding:0 18px;font-size:var(--fs-md);}
.btn.block{width:100%;justify-content:center;}

/* ── Iconos: solo en el rail (spec 2026-10-01 D7) ─────────────────────── */
.th-ico{display:none;}
.kl-rail .th-ico,.th-icons-on .th-ico{display:inline-block;}
.th-glyph{display:inline-block;font-size:1.05em;line-height:1;color:currentColor;min-width:.8em;text-align:center;}
.kl-rail .th-glyph,.th-icons-on .th-glyph{display:none;}
/* Parche hasta el barrido de PR3: un control cuyo UNICO contenido es un icono
   oculto (iconbtn de papelera, editar, copiar…) mostraria un hueco; enseña su
   `title` como texto de boton pequeño. (`data-iconly` lo marca app.jsx con window.vfIsIconOnly, que
   si ve los nodos de texto.) */
:is(button,a,[role=button])[data-iconly]::after{content:attr(title);font-size:13px;font-weight:500;line-height:1;color:var(--text-muted);white-space:nowrap;}
:is(button,a,[role=button])[data-iconly]:hover::after{color:var(--text-strong);}
.iconbtn[data-iconly]{width:auto;min-width:32px;padding:0 8px;}
.ai-dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--ai-c,var(--text-muted));flex-shrink:0;}
/* Contenedores que existian solo para alojar un icono */
.k-ico,.k-ico-lg,.ek-ico,.ph-icon,.op-banner-icon,.ep-cell-ico,.ep-action-ico,.inc-mini-ico,.list-ico{display:none;}
/* Detección (eventos, informes de usuarios, incidentes, reglas de correlación)
   recupera los pictogramas (decisión de Ander, 2026-10-06): `.th-icons-on` en la
   raíz de esas páginas y de sus detalles revierte D7 SOLO ahí. El ámbito es de
   CUALQUIER pantalla que lo declare: el kit de listas (`dx-*` de ui.jsx) lo pone
   en todas sus raíces y `DxPage` lo pone en la de la pantalla (Políticas,
   Biblioteca, Notificaciones). Ver DESIGN.md → «Kit de listas». */
.th-icons-on :is(.list-ico,.inc-mini-ico,.op-banner-icon){display:grid;}

.iconbtn{
  width:32px;height:32px;display:inline-grid;place-items:center;border-radius:var(--r-sm);
  color:var(--text-muted);cursor:pointer;transition:background .14s,color .14s;
}
.iconbtn:hover{background:var(--surface-sunken);color:var(--text-strong);}
.iconbtn.active{background:var(--accent-soft);color:var(--accent-strong);}

.seg{display:inline-flex;gap:2px;padding:2px;background:var(--rail-bg);border:1px solid var(--border);border-radius:var(--r-lg);}
.seg button{padding:5px 12px;border-radius:var(--r-md);font-size:12px;font-weight:500;color:var(--text-muted);transition:color .14s,background .14s;}
.seg button:hover{color:var(--text-strong);}
.seg button.on{background:var(--surface-2);color:var(--text-strong);}
.seg button:disabled{opacity:.5;cursor:not-allowed;}
.seg button:disabled:hover{color:var(--text-muted);}

/* ====================== CARD ====================== */
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-xl);box-shadow:none;padding:var(--pad-card);position:relative;}
.card.flat{box-shadow:none;}
.card.raised{box-shadow:var(--sh-sm);}
.card.pad-lg{padding:calc(var(--pad-card) + 6px);}
.card-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px;}
.card-head h3{font-size:15px;font-weight:600;color:var(--text-strong);display:flex;align-items:center;gap:8px;}
.card-head .sub{font-size:var(--fs-xs);color:var(--text-muted);}
.card-head a:not(.btn),.card-head .link{font-size:13px;color:var(--accent);}
.card-title-ico{color:var(--text-subtle);display:inline-grid;place-items:center;}

/* ====================== BADGES ====================== */
.badge{
  display:inline-flex;align-items:center;gap:5px;padding:2px 8px;
  font-size:11px;font-weight:500;border-radius:var(--r-sm);line-height:1.5;
  background:var(--surface-sunken);color:var(--text-muted);border:1px solid transparent;
}
.badge .dot{width:6px;height:6px;border-radius:50%;background:currentColor;}
.badge.accent{background:var(--accent-soft);color:var(--accent-strong);}
.badge.brand{background:var(--accent-soft);color:var(--accent-strong);}
.badge.danger{background:var(--danger-soft);color:var(--danger-fg);}
.badge.warn{background:var(--warn-soft);color:var(--warn-fg);}
.badge.ok{background:var(--ok-soft);color:var(--ok-fg);}
.badge.info{background:var(--info-soft);color:var(--info-fg);}
.badge.violet{background:var(--violet-soft);color:var(--violet);}
.badge.outline{background:transparent;border-color:var(--border-strong);color:var(--text-muted);}

.live-dot{width:8px;height:8px;border-radius:50%;background:var(--green-500);animation:kl-pulse-live 2s infinite;flex-shrink:0;}
.live-tag{display:inline-flex;align-items:center;gap:7px;padding:4px 10px 4px 9px;border-radius:var(--r-pill);background:var(--ok-soft);color:var(--ok-fg);font-size:var(--fs-xs);font-weight:700;letter-spacing:.04em;}

/* severity chip (new design) */
.sev{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:11px;font-weight:500;border-radius:var(--r-sm);}
.sev-critical{background:var(--danger-soft);color:var(--danger-fg);}
.sev-high{background:var(--warn-soft);color:var(--warn-fg);}
.sev-medium{background:var(--info-soft);color:var(--info-fg);}
.sev-low{background:var(--ok-soft);color:var(--ok-fg);}

/* action pill (new design) */
.act{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;font-size:11px;font-weight:500;border-radius:var(--r-sm);}
.act-block{background:var(--danger-soft);color:var(--danger-fg);}
.act-warn{background:var(--warn-soft);color:var(--warn-fg);}
.act-redact{background:var(--accent-soft);color:var(--accent-strong);}
.act-allow,.act-log{background:var(--ok-soft);color:var(--ok-fg);}
.act-confirm{background:var(--info-soft);color:var(--info-fg);}

/* El chip de identidad de la IA: su NOMBRE, monocromo, pegado al de severidad.
   Un nombre no se confunde nunca; una inicial de color sí (ChatGPT, Claude y
   Copilot empiezan igual, y eso era justo la queja). */
.ai-chip{flex-shrink:0;padding:1px 6px;border-radius:var(--r-sm);
  background:var(--surface-sunken);border:1px solid var(--border);
  font-size:var(--fs-2xs);font-weight:600;color:var(--text-muted);
  white-space:nowrap;line-height:1.5;}
[data-theme="dark"] .ai-chip{background:var(--surface-2);}

/* ====================== TABLE ====================== */
.tablewrap{overflow-x:auto;margin:0 calc(-1 * var(--pad-card)) calc(-1 * var(--pad-card));}
/* Tarjeta sin relleno (style padding:0): la tabla ancha desplaza DENTRO de la tarjeta, sin márgenes negativos. */
.tablewrap.flush{margin:0;}
table.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-base);}
.tbl thead th{
  font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;
  color:var(--text-subtle);text-align:left;padding:9px 14px;white-space:nowrap;
  background:var(--surface);border-bottom:1px solid var(--border);
  position:sticky;top:0;
}
.tbl thead th.right{text-align:right;}
.tbl tbody td{padding:12px 14px;border-bottom:1px solid var(--border);vertical-align:middle;}
.tbl tbody tr:last-child td{border-bottom:0;}
.tbl tbody tr{transition:background .1s;}
.tbl tbody tr.clickable,.tbl tbody tr.row-selectable{cursor:pointer;}
.tbl tbody tr:hover{background:var(--surface-2);}
.tbl td.right{text-align:right;}
.tbl td.mono,.tbl .mono{font-family:var(--font-mono);font-size:12.5px;}
.tbl .t-strong{color:var(--text-strong);font-weight:600;}
.tbl .muted{color:var(--text-muted);}
.tbl .nowrap{white-space:nowrap;}
.tbl .truncate{max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
tfoot td{padding:10px 14px;color:var(--text-muted);font-size:var(--fs-sm);border-top:1px solid var(--border);}
.row-new{animation:kl-fade-up .45s var(--ease-out) both;}
.row-flash{animation:kl-flash 1.2s var(--ease) both;}

/* ====================== FILTER BAR ====================== */
.filterbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:14px;}
.filter{
  display:inline-flex;align-items:center;gap:7px;padding:7px 11px;
  background:var(--surface);border:1px solid var(--border);border-radius:var(--r-sm);
  font-size:12.5px;cursor:pointer;transition:all .14s;user-select:none;
}
.filter:hover{border-color:var(--gray-400);background:var(--surface-hover);}
.filter.active{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-strong);}
.filter .lbl{color:var(--text-muted);}
.filter.active .lbl{color:var(--accent-strong);}
.filter .val{font-weight:600;color:var(--text-strong);}
.filter.active .val{color:var(--accent-strong);}

.searchbox{
  display:flex;align-items:center;gap:8px;flex:1;min-width:200px;max-width:360px;
  padding:7px 12px;background:var(--surface-sunken);border:1px solid var(--border);border-radius:var(--r-lg);
  transition:border-color .14s,box-shadow .14s;
}
.searchbox:focus-within{border-color:var(--accent);box-shadow:var(--focus);}
.searchbox input{border:0;outline:0;flex:1;background:transparent;font-size:12.5px;}
.searchbox .ico{color:var(--text-subtle);flex-shrink:0;}

.select,.kl-select{
  appearance:none;padding:7px 30px 7px 11px;border:1px solid var(--border-strong);
  border-radius:var(--r-sm);background:var(--surface);font-size:12.5px;color:var(--text);cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2397a0b2' stroke-width='2.5'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 9px center;
  transition:border-color .14s;
}
.select:focus,.kl-select:focus{border-color:var(--accent);box-shadow:var(--focus);outline:none;}

/* ====================== OPERATION BANNER ====================== */
.op-banner{display:flex;align-items:center;gap:12px;padding:12px 16px;border-left:3px solid var(--amber-400,#fbbf24);background:var(--amber-50,#fffbeb);}
[data-theme="dark"] .op-banner{background:#2a1f08;border-left-color:var(--amber-500,#f59e0b);}

/* ====================== KPI ====================== */
.kpi{
  background:transparent;border:0;border-radius:0;
  padding:0 0 22px;display:flex;flex-direction:column;gap:7px;position:relative;overflow:hidden;
}
.kpi .k-top{display:flex;align-items:center;gap:8px;}
.kpi .k-ico{width:28px;height:28px;border-radius:8px;display:none;place-items:center;background:var(--accent-soft);color:var(--accent-strong);flex-shrink:0;}
.kpi .k-label{font-size:12px;font-weight:500;color:var(--text-muted);line-height:1.25;display:inline-flex;align-items:center;gap:6px;}
.kpi.crit .k-label::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--danger);flex-shrink:0;}
.kpi .k-value{font-size:32px;font-weight:600;color:var(--text-strong)!important;font-variant-numeric:tabular-nums;line-height:1.05;letter-spacing:-.02em;}
.kpi .k-foot{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-muted);}
.kpi .delta{display:inline-flex;align-items:center;gap:3px;font-weight:600;font-variant-numeric:tabular-nums;}
.kpi .delta.up{color:var(--green-600);}
.kpi .delta.down{color:var(--coral-600);}
.kpi .delta.flat{color:var(--text-muted);}
/* Tendencia como gráfico de FONDO: ocupa la mitad inferior de la tarjeta y
   queda DETRÁS del contenido (z-index). El degradado se desvanece hacia abajo,
   así el valor (parte superior) permanece legible. */
.kpi .k-spark{position:absolute;left:0;right:0;bottom:0;height:62px;opacity:.5;pointer-events:none;z-index:0;}
.kpi .k-top,.kpi .k-value,.kpi .k-foot{position:relative;z-index:1;}
.kpi .k-rail{display:none;}
.kpi .k-spark{height:40px;opacity:.45;}

/* progress bar (new .bar + compat .progress) */
.bar{height:4px;background:var(--surface-sunken);border-radius:2px;overflow:hidden;}
.bar>span{display:block;height:100%;background:var(--accent);border-radius:2px;transition:width 1s var(--ease-out);}
.bar.brand>span{background:var(--navy-700);}
.bar.danger>span{background:var(--coral-500);}
.bar.warn>span{background:var(--amber-500);}
.bar.ok>span{background:var(--green-500);}

/* ====================== DRAWER (new kl-drawer) ====================== */
.kl-backdrop{position:fixed;inset:0;background:rgba(7,13,26,.5);backdrop-filter:blur(3px);z-index:60;opacity:0;pointer-events:none;transition:opacity .25s;}
.kl-backdrop.open{opacity:1;pointer-events:auto;}
.kl-drawer{
  position:fixed;top:0;right:0;height:100vh;width:560px;max-width:100vw;
  background:var(--surface);border-left:1px solid var(--border);z-index:70;
  transform:translateX(100%);transition:transform .3s var(--ease-out);
  display:flex;flex-direction:column;box-shadow:var(--sh-xl);
}
.kl-drawer.open{transform:none;}
.kl-drawer-head{padding:18px 22px;border-bottom:1px solid var(--border);display:flex;align-items:flex-start;gap:12px;}
.kl-drawer-body{padding:20px 22px;overflow-y:auto;flex:1;}
.kl-drawer-foot{padding:14px 22px;border-top:1px solid var(--border);display:flex;gap:8px;}

/* ====================== KPI MODAL (centrado) ====================== */
.kl-kpi-modal-bd{position:fixed;inset:0;background:rgba(7,13,26,.55);backdrop-filter:blur(5px);z-index:70;display:flex;align-items:center;justify-content:center;padding:24px;}
.kl-kpi-modal{background:var(--surface);border-radius:18px;border:1px solid var(--border);box-shadow:0 24px 64px rgba(7,13,26,.32),0 0 0 1px rgba(123,54,255,.08);width:100%;max-width:600px;max-height:88vh;display:flex;flex-direction:column;animation:kl-modal-in .22s var(--ease-out) both;}
@keyframes kl-modal-in{from{opacity:0;transform:scale(.96) translateY(10px);}to{opacity:1;transform:none;}}
.kl-kpi-modal-head{padding:22px 26px 18px;border-bottom:1px solid var(--border);display:flex;align-items:flex-start;gap:14px;}
.kl-kpi-modal-head .k-ico-lg{width:38px;height:38px;border-radius:11px;display:none;place-items:center;background:var(--accent-soft);color:var(--accent);flex-shrink:0;}
.kl-kpi-modal-body{padding:22px 26px;overflow-y:auto;flex:1;}
.kl-kpi-modal-val{font-size:var(--fs-5xl);font-weight:700;color:var(--text-strong);font-variant-numeric:tabular-nums;letter-spacing:-.04em;line-height:1;}
.kl-kpi-modal-foot{display:flex;align-items:center;gap:10px;margin-top:8px;font-size:var(--fs-sm);}

/* ====================== EMPTY / LOADING ====================== */
.empty{text-align:center;padding:40px 20px;color:var(--text-muted);}
.empty .ico{display:none;}
.skel{background:linear-gradient(90deg,var(--surface-sunken) 25%,var(--surface-hover) 50%,var(--surface-sunken) 75%);background-size:200% 100%;animation:kl-shimmer 1.4s infinite;border-radius:var(--r-sm);}
.spinner{width:18px;height:18px;border:2px solid var(--border-strong);border-top-color:var(--accent);border-radius:50%;animation:kl-spin .7s linear infinite;}
.kbd{font-family:var(--font-mono);font-size:11px;padding:1px 6px;background:var(--surface-sunken);border:1px solid var(--border);border-bottom-width:2px;border-radius:5px;color:var(--text-muted);}
.metaline{display:flex;align-items:center;gap:6px;font-size:var(--fs-xs);color:var(--text-muted);}
.metaline .dotsep{width:3px;height:3px;border-radius:50%;background:var(--text-subtle);}
.sdot{width:8px;height:8px;border-radius:50%;display:inline-block;flex-shrink:0;}
.sdot.on{background:var(--green-500);box-shadow:0 0 0 3px rgba(27,181,111,.18);}
.sdot.idle{background:var(--amber-500);}
.sdot.off{background:var(--gray-400);}
.sdot.crit{background:var(--coral-500);box-shadow:0 0 0 3px rgba(232,85,68,.18);}
.sec-lbl{font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-subtle);margin-bottom:9px;}

/* ============================================================
   LEGACY PAGE COMPONENTS (used by existing pages-*.jsx)
   ============================================================ */

/* Stats card */
.stat{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:16px 18px;display:flex;flex-direction:column;gap:8px;position:relative;overflow:hidden;}
.stat .label{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);display:flex;align-items:center;gap:6px;}
.stat .value{font-size:26px;font-weight:600;letter-spacing:-0.01em;color:var(--text-strong);font-variant-numeric:tabular-nums;}
.stat .delta{font-size:var(--text-xs);display:flex;align-items:center;gap:4px;}
.stat .delta.up{color:var(--green-600);}
.stat .delta.down{color:var(--coral-600);}
.stat .delta.neutral{color:var(--text-muted);}
.stat .spark{position:absolute;right:12px;bottom:10px;opacity:.9;pointer-events:none;}

/* Severity chip (old) */
.chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:11px;font-weight:500;border-radius:var(--r-sm);}
.chip-critical{background:var(--danger-soft);color:var(--danger-fg);}
.chip-high{background:var(--warn-soft);color:var(--warn-fg);}
.chip-medium{background:var(--info-soft);color:var(--info-fg);}
.chip-low{background:var(--ok-soft);color:var(--ok-fg);}

/* Action pill (old) */
.action-pill{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;font-size:11px;font-weight:500;border-radius:var(--r-sm);}
.action-block{background:var(--danger-soft);color:var(--danger-fg);}
.action-warn{background:var(--warn-soft);color:var(--warn-fg);}
.action-log,.action-allow{background:var(--ok-soft);color:var(--ok-fg);}
.action-confirm,.action-redact,.action-redirect{background:var(--accent-soft);color:var(--accent-strong);}
.action-continue{background:var(--info-soft);color:var(--info-fg);}

/* Op chips */
.op-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;font-size:11px;font-weight:500;border-radius:var(--r-sm);}
.op-chip-coverage{background:var(--warn-soft);color:var(--warn-fg);}
.op-chip-shadow{background:var(--danger-soft);color:var(--danger-fg);}
.op-chip-lifecycle{background:var(--info-soft);color:var(--info-fg);}
.op-banner{display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:var(--radius-sm);margin-bottom:14px;font-size:var(--text-sm);}
.op-banner-coverage{background:#fef6ec;border:1px solid #f0c896;color:#8a4d0c;}
.op-banner-shadow{background:#fdf0ee;border:1px solid #f4b3a8;color:#93291d;}
.op-banner-lifecycle{background:#eef4fe;border:1px solid #b3cdf4;color:#1e40af;}
[data-theme="dark"] .op-banner-coverage{background:#271c0e;border-color:#5c4318;color:#fcd34d;}
[data-theme="dark"] .op-banner-shadow{background:#2a1513;border-color:#5e2723;color:#fca5a5;}
[data-theme="dark"] .op-banner-lifecycle{background:#131d33;border-color:#27395e;color:#93c5fd;}
.op-banner-icon{flex-shrink:0;display:none;place-items:center;}
.op-banner-body{flex:1;line-height:1.45;}
.op-banner-body strong{font-weight:700;}

/* Drawer (old .drawer for ui.jsx Drawer component) */
.drawer-backdrop{position:fixed;inset:0;background:rgba(8,12,24,0.45);backdrop-filter:blur(2px);z-index:50;opacity:0;pointer-events:none;transition:opacity .2s;}
.drawer-backdrop.open{opacity:1;pointer-events:auto;}
/* Movimiento: transición (interrumpible: cerrar a mitad de la entrada vuelve
   desde donde está), curva de cajón tipo iOS al entrar y salida más corta.
   @starting-style anima también los cajones que se montan ya abiertos
   (`{open && <Drawer open …/>}`), que antes aparecían de golpe. */
.drawer{position:fixed;top:0;right:0;height:100vh;width:520px;max-width:100vw;background:var(--surface);border-left:1px solid var(--border);z-index:60;transform:translateX(100%);transition:transform .2s cubic-bezier(.4,0,.2,1);display:flex;flex-direction:column;box-shadow:var(--sh-lg);outline:none;}
.drawer.open{transform:translateX(0);transition:transform .3s cubic-bezier(.32,.72,0,1);}
@starting-style{.drawer.open{transform:translateX(100%);}.drawer-backdrop.open{opacity:0;}}
@media (prefers-reduced-motion:reduce){
  .drawer{transform:none;opacity:0;visibility:hidden;transition:opacity .16s ease,visibility 0s linear .16s;}
  .drawer.open{transform:none;opacity:1;visibility:visible;transition:opacity .16s ease,visibility 0s;}
  @starting-style{.drawer.open{transform:none;opacity:0;}}
}
.drawer-head{padding:18px 22px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:12px;}
.drawer-head.has-head{align-items:flex-start;}
.drawer-head-rich{flex:1;min-width:0;}
.drawer-head h2{margin:0;font-size:var(--text-lg);font-weight:600;color:var(--text-strong);flex:1;}
.drawer-body{padding:18px 22px;overflow-y:auto;flex:1;}
.drawer-foot{padding:14px 22px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:8px;}

/* Misc */
.spread{display:flex;align-items:center;justify-content:space-between;gap:12px;}
.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dot-status{width:8px;height:8px;border-radius:50%;display:inline-block;flex-shrink:0;}
.dot-status.active{background:var(--green-500);box-shadow:0 0 0 3px rgba(22,165,101,0.18);}
.dot-status.idle{background:var(--amber-500);}
.dot-status.offline{background:var(--gray-400);}
.dot-status.outdated{background:var(--violet-500);}
.dot-status.unenrolled{background:transparent;box-shadow:inset 0 0 0 1.5px var(--text-subtle);}

/* Charts */
.barchart{display:flex;align-items:stretch;gap:2px;height:130px;}
.barchart .bar{flex:1;min-width:0;height:100%;border-radius:2px 2px 0 0;transition:opacity .15s;position:relative;}
.barchart .bar:hover{opacity:0.8;}
.heat{display:grid;grid-template-columns:repeat(24,1fr);gap:3px;}
.heat .cell{aspect-ratio:1.4;border-radius:2px;background:var(--surface-sunken);}
.progress{height:6px;background:var(--surface-sunken);border-radius:999px;overflow:hidden;}
.progress>span{display:block;height:100%;background:var(--accent);border-radius:999px;}
.progress.brand>span{background:var(--brand);}
.progress.danger>span{background:var(--coral-500);}
.progress.warn>span{background:var(--amber-500);}
.progress.ok>span{background:var(--green-500);}

/* Input/field */
.field{display:flex;flex-direction:column;gap:4px;}
.field-label{font-size:11px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;}
/* Texto de ayuda. `.hint` era la utilidad MÁS usada de la consola (73 elementos)
   y no tenía ni una regla: 32 de ellos se renderizaban como texto normal, sin
   distinguirse del contenido. `.field-hint` es su variante bajo un campo,
   hermana de .field-label/.input. (20-09-2026.) */
.hint{font-size:12px;color:var(--text-muted);line-height:1.45;}
.field-hint{font-size:12px;color:var(--text-muted);line-height:1.45;margin-top:6px;}
/* Fila de casilla con título y explicación (Restricciones de subida, etc.). */
.check-row{display:flex;align-items:flex-start;gap:8px;font-size:13px;margin-bottom:14px;}
.check-row > input[type="checkbox"]{margin-top:2px;}
.check-row-hint{display:block;font-size:12px;color:var(--text-muted);line-height:1.45;}
/* Aviso en línea dentro de formularios y diálogos. Sin esto, un error de
   validación salía como texto negro corriente, indistinguible del resto. */
.alert{padding:9px 11px;border-radius:var(--radius-sm);font-size:12.5px;line-height:1.45;}
.alert.error{background:var(--danger-soft);color:var(--danger-fg);}
.alert.warn{background:var(--warn-soft);color:var(--warn-fg);}
.alert.ok{background:var(--ok-soft);color:var(--ok-fg);}
.alert.info{background:var(--info-soft);color:var(--info-fg);}
/* Contenido redactado por IA: cuadro propio con filo de acento, para que no se
   confunda con texto escrito por una persona ni con un aviso de estado. */
.alert.ai{display:flex;align-items:flex-start;gap:8px;background:var(--accent-soft);color:var(--accent-strong);border-left:3px solid var(--accent);}
.alert.ai > svg{flex:none;margin-top:2px;}
/* Aviso suelto entre bloques de página (alarma de deriva de release): deja el
   hueco de 14px que el resto de tarjetas de la consola ponen con marginBottom. */
.alert.spaced{margin-bottom:14px;}
.input{padding:8px 12px;border-radius:var(--r-lg);border:1px solid var(--border);font-size:var(--text-base);background:var(--surface-sunken);color:var(--text);outline:none;transition:border-color .15s,box-shadow .15s;width:100%;}
/* Controles nativos con el acento de la consola (casillas y radios no salen en azul del navegador). */
input[type="checkbox"],input[type="radio"]{accent-color:var(--accent);}
/* select.input / select.fe-ctl: flecha propia por tokens (sin icono ni data-URI); el nativo se oculta. */
select.input,select.fe-ctl{appearance:none;-webkit-appearance:none;padding-right:30px;cursor:pointer;
  background-image:linear-gradient(45deg,transparent 50%,var(--text-muted) 50%),linear-gradient(135deg,var(--text-muted) 50%,transparent 50%);
  background-position:calc(100% - 15px) 50%,calc(100% - 10px) 50%;background-size:5px 5px;background-repeat:no-repeat;}
/* Lista desplegable nativa de TODO <select>: el navegador la pinta con el fondo/color del propio control
   (un filtro activo con acento translúcido salía claro sobre claro). Fondo y texto por tokens, siempre. */
select option,select optgroup{background-color:var(--surface);color:var(--text);font-weight:400;}
.input:focus{border-color:var(--accent);box-shadow:var(--focus);}
/* Contraste AA: el placeholder por defecto del navegador (~3,9:1) no llega a 4,5:1; usa el token terciario (verificado en contrast-tokens.test.js). */
input::placeholder,textarea::placeholder{color:var(--text-subtle);opacity:1;}
.input--error{border-color:var(--coral-500) !important;}
.switch{display:inline-block;vertical-align:middle;position:relative;width:36px;height:20px;cursor:pointer;}
.switch input{opacity:0;width:0;height:0;position:absolute;}
.switch-track{position:absolute;inset:0;border-radius:999px;background:var(--border-strong);transition:background .2s;}
.switch input:checked+.switch-track{background:var(--accent);}
.switch-knob{position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:left .2s;box-shadow:0 1px 2px rgba(0,0,0,.2);}
.switch input:checked~.switch-knob{left:18px;}

/* Threat hunting v2 */
.th-win{display:inline-flex;gap:2px;background:var(--surface-sunken);padding:2px;border-radius:var(--radius-sm);}
.th-win .btn{border:0;padding:4px 10px;font-size:12px;font-weight:500;box-shadow:none;}
.th-win .btn.primary{background:var(--surface);color:var(--text-strong);border:1px solid var(--border-strong);}
.th-win .btn.ghost{background:transparent;color:var(--text-muted);}
.th-win .btn.ghost:hover{background:var(--surface);color:var(--text-strong);}

/* ── Threat Hunting redesign ─────────────────────────────── */
/* KPI cards: se renderizan con exec-kpis sm + window.StatCard (sin CSS custom) */
/* SIEM query console */
/* two-column main layout */
/* saved hunts sidebar */
/* IOC compact pills */

/* Tenant banner */
.tenant-banner{display:flex;align-items:center;gap:10px;padding:9px 16px;background:var(--info-soft);color:var(--info);border-bottom:1px solid rgba(44,108,239,0.25);font-size:var(--text-sm);font-weight:500;}
.tenant-banner .lab{background:var(--info);color:white;font-size:10px;font-weight:700;padding:2px 7px;border-radius:4px;letter-spacing:.05em;}
[data-theme="dark"] .tenant-banner{background:#15233e;color:#93c5fd;}

/* Asistente de configuración inicial (pages-org-setup.jsx) */
.obw-banner{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:9px 16px;background:var(--accent-soft);color:var(--accent-strong);border-bottom:1px solid var(--border);font-size:var(--text-sm);font-weight:500;}
.obw-banner .lab{background:var(--accent);color:var(--accent-fg);font-size:10px;font-weight:700;padding:2px 7px;border-radius:4px;letter-spacing:.05em;}
.obw-steps{display:flex;gap:var(--sp-2);flex-wrap:wrap;list-style:none;margin:0 0 var(--sp-4);padding:0;}
.obw-step{display:inline-flex;align-items:center;gap:8px;padding:7px 12px;border:1px solid var(--border);border-radius:var(--r-xl);background:var(--surface);color:var(--text-muted);font-size:13px;font-weight:500;cursor:pointer;}
.obw-step:disabled{opacity:.5;cursor:not-allowed;}
.obw-step .n{display:inline-grid;place-items:center;width:18px;height:18px;font-size:12px;}
.obw-step.is-current{border-color:var(--accent);color:var(--accent-strong);background:var(--accent-soft);}
.obw-step.is-done{color:var(--text-strong);}
.obw-step.is-skipped{color:var(--text-subtle);}
.obw-body{display:flex;flex-direction:column;gap:var(--sp-4);}
.obw-title{font-size:18px;font-weight:600;color:var(--text-strong);outline:none;}
.obw-title:focus-visible{box-shadow:none;}
.obw-body .seg{flex-wrap:wrap;max-width:100%;}
.obw-piece > .badge{align-self:flex-start;}
.obw-stack{display:flex;flex-direction:column;gap:var(--sp-4);}
.obw-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:var(--sp-4);}
.obw-row{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;}
.obw-foot{display:flex;align-items:center;justify-content:flex-end;gap:var(--sp-3);flex-wrap:wrap;padding-top:var(--sp-4);border-top:1px solid var(--border);}
.obw-chips{display:flex;gap:var(--sp-2);flex-wrap:wrap;}
.obw-chip{padding:5px 11px;border:1px solid var(--border);border-radius:var(--r-xl);background:var(--surface);color:var(--text-muted);font-size:13px;cursor:pointer;}
.obw-chip.on{border-color:var(--accent);color:var(--accent-strong);background:var(--accent-soft);font-weight:600;}
.obw-chip:disabled{opacity:.5;cursor:not-allowed;}
.obw-piece{display:flex;flex-direction:column;gap:var(--sp-3);padding:var(--sp-4);border:1px solid var(--border);border-radius:var(--r-xl);background:var(--surface);}
.obw-reasons{margin:0;padding-left:18px;color:var(--text-muted);font-size:13px;}
.obw-live{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;margin-bottom:var(--sp-3);}
.obw-secret{display:flex;flex-direction:column;gap:var(--sp-3);margin-top:var(--sp-3);}
.obw-invite{display:grid;grid-template-columns:2fr 2fr 1fr auto;gap:var(--sp-3);align-items:end;}
.obw-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--sp-2);}
.obw-sent{margin:0;padding:var(--sp-3);background:var(--surface-2);border:1px solid var(--border);border-radius:var(--r-xl);font-family:var(--font-mono);font-size:12px;white-space:pre-wrap;overflow:auto;max-height:260px;}
@media(max-width:760px){.obw-invite{grid-template-columns:1fr;}}

/* Tenant switcher */
.tenant-switch{position:relative;margin:8px 12px 4px;}
.tenant-switch-btn{width:100%;display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--surface-sunken);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:12.5px;font-weight:600;color:var(--text-strong);cursor:pointer;transition:border-color .12s,background .12s;}
.tenant-switch-btn:hover{border-color:var(--accent);}
.tenant-switch.open .tenant-switch-btn{border-color:var(--accent);background:var(--surface);}
.tenant-switch-btn .ico-lead{color:var(--accent);flex:0 0 auto;}
.tenant-switch-btn .ts-current{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tenant-switch-btn .ico-caret{color:var(--text-subtle);flex:0 0 auto;transition:transform .15s;}
.tenant-switch.open .tenant-switch-btn .ico-caret{transform:rotate(180deg);}
.tenant-switch-pop{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:50;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:0 8px 28px rgba(0,0,0,.16);overflow:hidden;}
.ts-pop-head{padding:8px 10px 6px;}
.ts-pop-title{font-size:10.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-subtle);}
.ts-pop-search{display:flex;align-items:center;gap:6px;margin:0 8px 6px;padding:5px 8px;background:var(--surface-sunken);border-radius:var(--radius-sm);}
.ts-pop-search .ico{color:var(--text-subtle);}
.ts-pop-search input{flex:1;border:0;background:transparent;outline:none;font-size:12px;color:var(--text-strong);}
.ts-pop-list{max-height:320px;overflow-y:auto;padding:4px;}
.ts-empty{padding:12px;text-align:center;font-size:12px;color:var(--text-subtle);}
.ts-item{width:100%;display:flex;align-items:center;gap:7px;padding:7px 10px;border:0;background:transparent;border-radius:6px;font-size:12.5px;color:var(--text-strong);cursor:pointer;text-align:left;}
.ts-item:hover{background:var(--surface-sunken);}
.ts-item.active{background:var(--accent-soft);}
.ts-guide{color:var(--text-subtle);font-size:11px;flex:0 0 auto;opacity:.6;margin-right:-2px;}
.ts-ico{color:var(--text-muted);flex:0 0 auto;}
.ts-ico.root{color:var(--accent);}
.ts-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ts-tag{font-size:9.5px;font-weight:700;letter-spacing:.03em;padding:1px 6px;border-radius:999px;flex:0 0 auto;}
.ts-tag.own{background:var(--accent-soft);color:var(--accent-strong);}
.ts-tag.off{background:var(--danger-soft);color:var(--coral-600);}
.ts-check{color:var(--accent);flex:0 0 auto;}

/* DLP filterbar */
.dlp-filterbar select.select{padding:6px 26px 6px 10px;font-size:var(--text-sm);}
.group-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 7px 2px 6px;font-size:11px;font-weight:600;border-radius:4px;letter-spacing:.02em;color:white;}
.group-chip .gc-dot{width:6px;height:6px;border-radius:50%;background:white;opacity:.85;}
.org-inactive td{color:var(--text-subtle);}

/* Demo banner */
.demo-banner{display:flex;align-items:center;gap:10px;background:var(--info-soft);color:var(--info);border:1px solid color-mix(in srgb,var(--info) 18%,transparent);padding:10px 14px;border-radius:var(--radius);font-size:12.5px;margin-bottom:14px;}
.demo-banner svg{flex:none;}
.demo-banner strong{color:var(--info);margin-right:4px;}
.api-loading,.api-empty,.api-error{padding:32px 18px;text-align:center;color:var(--text-muted);font-size:13px;}
.api-error{color:var(--coral-600);}
.api-spinner{display:inline-block;width:18px;height:18px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:vfboot .7s linear infinite;margin-right:8px;vertical-align:-4px;}
.data-pill{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:500;padding:5px 10px;border-radius:99px;border:1px solid var(--border);background:var(--surface);color:var(--text-muted);white-space:nowrap;}
.data-pill.ok{color:var(--green-600);border-color:color-mix(in srgb,var(--green-500) 25%,transparent);background:var(--ok-soft);}
.data-pill.warn{color:var(--amber-600);border-color:color-mix(in srgb,var(--amber-500) 25%,transparent);background:var(--warn-soft);}

/* ====================== LOGIN + BOOT ====================== */
/* Pantalla de acceso: lienzo plano `--bg` y una tarjeta quieta, igual que la
   consola (sin patron animado, orbes ni degradados). El fondo animado de la
   version anterior sigue en el DOM de pages-onboarding.jsx y se oculta aqui. */
.login-shell{position:fixed;inset:0;overflow:auto;background:var(--bg);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px;z-index:1000;font-family:var(--font-sans);}
.login-card{position:relative;z-index:2;width:100%;max-width:380px;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-xl);padding:32px 32px 28px;box-shadow:none;display:flex;flex-direction:column;gap:12px;}
.login-card .login-logo{display:block;max-width:200px;height:auto;margin:0 auto 14px;}
.login-card .login-logo-default{max-width:240px;}
html[data-theme="light"] .login-card img.logo-on-dark{display:none;}
html:not([data-theme="light"]) .login-card img.logo-on-light{display:none;}
.login-card .login-brand{display:flex;align-items:center;justify-content:center;gap:12px;padding-bottom:18px;border-bottom:1px solid var(--divider);margin-bottom:6px;}
.login-brand-name{font-size:18px;font-weight:700;letter-spacing:.06em;color:var(--text-strong);}
.login-brand-sub{font-size:11.5px;color:var(--text-muted);}
.login-title{font-size:18px;font-weight:600;color:var(--text-strong);margin:6px 0 2px;}
.login-lede{font-size:12.5px;color:var(--text-muted);margin:0 0 8px;}
.login-lede.center{text-align:center;}
.login-error{background:var(--danger-soft);color:var(--danger-fg);border-radius:var(--radius-sm);padding:8px 12px;font-size:12.5px;margin-bottom:2px;}
.login-card .field{display:flex;flex-direction:column;gap:4px;}
.login-card .field-label{font-size:11px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;}
.login-card .input{padding:9px 12px;border-radius:var(--r-lg);border:1px solid var(--border);font-size:13.5px;background:var(--surface-sunken);color:var(--text);outline:none;transition:border-color .15s,box-shadow .15s;}
.login-card .input:focus{border-color:var(--accent);box-shadow:var(--focus);}
.login-submit{width:100%;justify-content:center;margin-top:6px;padding:10px;font-weight:600;}
.login-server-toggle{background:none;border:none;cursor:pointer;font-size:11.5px;color:var(--text-muted);align-self:flex-end;padding:4px 0;}
.login-server-toggle:hover{color:var(--accent);}
.login-foot{position:relative;z-index:2;margin-top:22px;font-size:11.5px;color:var(--text-subtle);text-align:center;}
.login-bg,.login-patt,.login-mask,.login-orb,.orb-a,.orb-b{display:none;}
.login-lang{position:absolute;top:20px;right:24px;z-index:3;}
.login-lang .lang-switcher{font-size:13px;}

/* ====================== MFA SETUP WIZARD ====================== */
.login-card.mfa-wizard-card{max-width:440px;}
.mfa-wizard{display:flex;flex-direction:column;gap:12px;}

/* step indicator (active=accent, done=ok) */
.mfa-steps{display:flex;align-items:center;justify-content:center;gap:0;margin:2px 0 4px;}
.mfa-steps-dot{width:24px;height:24px;border-radius:50%;background:var(--border);color:var(--text-muted);
  display:flex;align-items:center;justify-content:center;font-size:11.5px;font-weight:700;flex-shrink:0;
  transition:background .15s,color .15s;}
.mfa-steps-dot.is-active{background:var(--accent);color:var(--accent-fg);}
.mfa-steps-dot.is-done{background:var(--ok);color:var(--accent-fg);}
.mfa-steps-bar{width:34px;height:2px;background:var(--border);margin:0 4px;border-radius:2px;
  transition:background .15s;}
.mfa-steps-bar.is-filled{background:var(--ok);}

/* QR frame */
.mfa-qr-frame{display:flex;align-items:center;justify-content:center;padding:12px;margin:2px auto 0;
  background:#fff;border:1px solid var(--border);border-radius:var(--radius-sm);}
.mfa-qr-img{width:184px;height:184px;display:block;image-rendering:pixelated;}

/* manual secret + copy */
.mfa-secret{display:flex;flex-direction:column;gap:6px;}
.mfa-secret-label{font-size:11.5px;color:var(--text-muted);text-align:center;}
.mfa-secret-row{display:flex;align-items:stretch;gap:8px;}
.mfa-secret-code{flex:1;min-width:0;padding:9px 12px;border-radius:var(--radius-sm);
  border:1px dashed var(--border-strong);background:var(--surface-alt);color:var(--text-strong);
  font-family:monospace;font-size:13px;letter-spacing:.06em;word-break:break-all;user-select:all;
  display:flex;align-items:center;}
.mfa-copy-btn{flex-shrink:0;}

/* code input — center, spaced digits */
.mfa-code-input{text-align:center;letter-spacing:.5em;font-size:18px;font-family:monospace;padding-left:.5em;}

/* backup codes grid */
.mfa-codes-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px 12px;
  background:var(--surface-alt);border:1px solid var(--border);border-radius:var(--radius-sm);
  padding:14px 16px;margin:2px 0;}
.mfa-code-cell{font-family:monospace;font-size:13.5px;color:var(--text-strong);letter-spacing:.04em;
  user-select:all;text-align:center;}
.mfa-codes-actions{display:flex;gap:8px;justify-content:center;}

/* acknowledgement checkbox */
.mfa-ack{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--text);cursor:pointer;
  margin:2px 0;justify-content:center;}
.mfa-ack input{width:15px;height:15px;accent-color:var(--accent);cursor:pointer;}

/* back link */
.mfa-link{background:transparent;border:none;cursor:pointer;color:var(--text-muted);font-size:13px;
  text-decoration:underline;align-self:center;padding:2px 0;}
.mfa-link:hover{color:var(--accent);}

.boot-shell{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:var(--bg);font-family:var(--font-sans);z-index:999;}
.boot-spinner{width:32px;height:32px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:vfboot .7s linear infinite;}
.boot-text{font-size:13px;color:var(--text-muted);}

/* Brand logo helpers */
.brand-logo-img{max-width:130px;max-height:36px;object-fit:contain;display:block;}

/* ====================== ONBOARDING WIZARD ====================== */
.register-shell{display:flex;width:100%;max-width:860px;min-height:520px;background:var(--surface);border-radius:var(--radius-xl);overflow:hidden;box-shadow:0 30px 80px rgba(0,0,0,0.35);margin:auto;position:relative;z-index:2;}
.register-sidebar{width:240px;flex-shrink:0;background:var(--surface-alt);border-right:1px solid var(--divider);padding:28px 20px;display:flex;flex-direction:column;gap:28px;}
.register-sidebar .login-brand{margin:0;padding:0;border:none;justify-content:flex-start;}
.register-sidebar .login-logo,.register-sidebar .login-logo-default{max-width:150px;margin:0;}
.register-content .login-logo,.register-content .login-logo-default{max-width:180px;}
.register-nav{display:flex;flex-direction:column;gap:4px;}
.register-nav-step{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:10px 12px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:13.5px;font-family:inherit;cursor:default;transition:background .15s,color .15s;}
.register-nav-step--completed{color:var(--text);}
.register-nav-step--completed:not(.register-nav-step--active){cursor:pointer;}
.register-nav-step--completed:not(.register-nav-step--active):hover{background:var(--surface-sunken);}
.register-nav-step--active{background:var(--accent-soft);color:var(--accent-strong);font-weight:600;}
.register-nav-step-num{width:22px;height:22px;border-radius:50%;background:var(--border);color:var(--text-muted);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0;transition:background .15s,color .15s;}
.register-nav-step--active .register-nav-step-num{background:var(--accent);color:var(--accent-fg);}
.register-nav-step--completed .register-nav-step-num{background:var(--teal-500);color:#fff;}
.register-content{flex:1;padding:32px 36px;overflow-y:auto;display:flex;flex-direction:column;}
.register-step{display:flex;flex-direction:column;gap:12px;}
.register-step-title{font-size:20px;font-weight:700;color:var(--text-strong);margin:0 0 2px;}
.register-step-lede{color:var(--text-muted);font-size:13px;margin:0 0 8px;}
@media(max-width:700px){
  .register-shell{flex-direction:column;border-radius:0;min-height:100dvh;}
  .register-sidebar{width:100%;padding:16px;gap:16px;border-right:none;border-bottom:1px solid var(--divider);}
  .register-sidebar .login-logo,.register-sidebar .login-logo-default{max-width:120px;}
  .register-nav{flex-direction:row;gap:4px;overflow-x:auto;}
  .register-nav-step>span:last-child{display:none;}
  .register-content{padding:20px 16px;}
}

/* Tweaks panel compat */
[data-tweaks-panel]{font-family:var(--font-sans);}

/* kl-toggle (screens.css shared toggle) */
.kl-toggle{width:38px;height:21px;border-radius:999px;background:var(--border-strong);position:relative;transition:background .18s;flex-shrink:0;cursor:pointer;border:none;}
.kl-toggle.on{background:var(--accent);}
.kl-toggle .knob{position:absolute;top:2.5px;left:2.5px;width:16px;height:16px;border-radius:50%;background:#fff;transition:left .18s;box-shadow:0 1px 3px rgba(0,0,0,.3);}
.kl-toggle.on .knob{left:19.5px;}

/* Placeholder page */
.kl-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:320px;gap:16px;color:var(--text-muted);text-align:center;}
.kl-placeholder .ph-icon{width:56px;height:56px;border-radius:16px;background:var(--surface-sunken);display:none;place-items:center;color:var(--text-subtle);margin-bottom:4px;}
.kl-placeholder h2{font-size:15px;font-weight:600;color:var(--text-strong);margin:0;}
.kl-placeholder p{font-size:13px;color:var(--text-muted);max-width:40ch;margin:0;}
.kl-placeholder .badge{font-size:var(--fs-xs);}

/* ============================================================
   PRODUCTION COMPAT (ported from Tracehold production)
   Legacy .app/.sidebar class-based layout used by existing JSX.
   ============================================================ */

hr { border: 0; border-top: 1px solid var(--border); margin: 0; }

/* ---- APP SHELL (legacy class names used by app.jsx) ---- */
.app {
  display: grid;
  grid-template-columns: var(--rail-w, 248px) 1fr;
  min-height: 100vh;
  background: var(--bg);
  background-image: none;
}

.sidebar {
  position: sticky; top: 0; height: 100vh;
  background: linear-gradient(180deg, var(--rail-bg-2), var(--rail-bg) 60%);
  border-right: 1px solid var(--rail-border);
  display: flex; flex-direction: column;
  z-index: 40; color: var(--rail-text); overflow: hidden;
}
.sidebar::before {
  content: ''; position: absolute; top: -120px; left: -40px;
  width: 240px; height: 240px;
  background: radial-gradient(circle, rgba(18,177,176,.22), transparent 70%);
  pointer-events: none;
}

.main { min-width: 0; display: flex; flex-direction: column; overflow: hidden; }

.topbar {
  position: sticky; top: 0; z-index: 30;
  background: color-mix(in srgb, var(--surface) 80%, transparent);
  backdrop-filter: saturate(150%) blur(12px);
  -webkit-backdrop-filter: saturate(150%) blur(12px);
  border-bottom: 1px solid var(--border);
  padding: 0 26px; height: 56px;
  display: flex; align-items: center; gap: 14px;
}

.content { flex: 1; overflow-y: auto; }

/* ---- SIDEBAR BRAND ---- */
.sidebar-brand {
  display: flex; align-items: center; gap: 10px;
  padding: 18px 18px 14px; position: relative;
}
.badge-org {
  font-size: 10px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  padding: 2px 7px; border-radius: var(--r-pill);
  background: rgba(18,177,176,.15); color: var(--accent);
  border: 1px solid rgba(18,177,176,.25); max-width: 84px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* ---- SIDEBAR SEARCH ---- */
.sidebar-search { margin: 2px 12px 8px; position: relative; }
.sidebar-search input {
  width: 100%; height: 34px; padding: 0 30px 0 32px;
  background: rgba(255,255,255,0.045); border: 1px solid var(--rail-border);
  border-radius: var(--r); color: var(--rail-text-hi); font-size: 12.5px; outline: none;
  transition: border-color .15s, background .15s;
}
.sidebar-search input::placeholder { color: var(--rail-text-dim); }
.sidebar-search input:focus { border-color: var(--accent); background: rgba(18,177,176,.08); }
.sidebar-search .ico { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: var(--rail-text-dim); pointer-events: none; }
.sidebar-search .kbd { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); font-family: var(--font-mono); font-size: 10px; color: var(--rail-text-dim); border: 1px solid var(--rail-border); padding: 1px 5px; border-radius: 5px; }

/* ---- SIDEBAR NAV ---- */
.sidebar-nav { flex: 1; overflow-y: auto; padding: 4px 8px 16px; display: flex; flex-direction: column; gap: 1px; }
.sidebar-nav::-webkit-scrollbar { width: 6px; }
.sidebar-nav::-webkit-scrollbar-thumb { background: rgba(255,255,255,.1); }

.nav-section {
  font-size: 10px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  color: var(--rail-section); padding: 15px 12px 6px; display: flex; align-items: center; gap: 7px;
}
.nav-section::after { content: ''; flex: 1; height: 1px; background: var(--rail-border); }

.nav-item {
  display: flex; align-items: center; gap: 11px;
  padding: 8px 11px; margin: 0 2px; border-radius: var(--r-sm);
  color: var(--rail-text); font-size: 13px; font-weight: 500; cursor: pointer;
  position: relative; transition: color .14s, background .14s; white-space: nowrap;
}
.nav-item:hover { color: var(--rail-text-hi); background: var(--rail-hover); }
.nav-item .ico { flex-shrink: 0; opacity: .85; transition: opacity .14s, color .14s; }
.nav-item:hover .ico { opacity: 1; }
.nav-item .label { flex: 1; overflow: hidden; text-overflow: ellipsis; }
.nav-item.active { color: var(--rail-text-hi); background: var(--rail-active); }
.nav-item.active .ico { color: var(--accent); opacity: 1; }
.nav-item.active::before {
  content: ''; position: absolute; left: -2px; top: 7px; bottom: 7px; width: 3px;
  background: var(--accent); border-radius: 0 3px 3px 0; box-shadow: 0 0 8px rgba(var(--accent-rgb), .7);
}
.nav-item .count {
  margin-left: auto; font-family: var(--font-mono); font-size: 10.5px; font-weight: 600;
  padding: 1px 6px; border-radius: var(--r-pill); background: rgba(255,255,255,.08); color: var(--rail-text);
  min-width: 20px; text-align: center;
}
.nav-item .count.danger { background: var(--coral-500); color: #fff; }

/* ---- SIDEBAR FOOTER ---- */
.sidebar-footer {
  border-top: 1px solid var(--rail-border); padding: 10px 12px;
  display: flex; align-items: center; gap: 8px;
}
.who-trigger {
  flex: 1; display: flex; align-items: center; gap: 10px;
  padding: 8px 9px; border-radius: 9px;
  background: rgba(255,255,255,.03); border: 1px solid var(--rail-border);
  cursor: pointer; transition: background .15s, border-color .15s;
  min-width: 0;
}
.who-trigger:hover { background: var(--rail-hover); border-color: rgba(18,177,176,.4); }
.who { min-width: 0; }
.who .name { font-size: 12.5px; font-weight: 600; color: var(--rail-text-hi); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.who .meta { font-size: 10px; color: var(--rail-text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ---- TOPBAR INTERNALS ---- */
.crumbs { display: flex; align-items: center; gap: 7px; font-size: 12.5px; color: var(--text-muted); flex-shrink: 0; white-space: nowrap; }
.crumbs .sep { color: var(--text-subtle); }
.crumbs .now { color: var(--text-strong); font-weight: 600; }
.topbar-actions { margin-left: auto; display: flex; align-items: center; gap: 7px; flex-shrink: 0; }

/* Sidebar toggle button in topbar */
.sidebar-toggle-btn { flex-shrink: 0; color: var(--text-muted); }
.sidebar-toggle-btn:hover { color: var(--text-strong); }

/* Default/mark logo swap rules for old .sidebar-brand */
.sidebar-brand .brand-logo-default { max-height: 30px; max-width: 150px; margin-right: auto; }
.sidebar-brand .brand-logo-mark { display: none; align-items: center; }

/* Old page header (distinct from .kl-page-head) */
.page-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 22px; }
.page-head h1 { margin: 0; font-size: 24px; font-weight: 500; letter-spacing: -0.01em; color: var(--text-strong); }
.page-head .lede { margin-top: 4px; font-size: 13px; color: var(--text-muted); }
.page-head .actions { display: flex; gap: 8px; flex-wrap: wrap; }

/* Legacy .app sidebar-collapsed (JS-toggled, persisted in localStorage) */
.app.sidebar-collapsed { grid-template-columns: 64px 1fr; }
.app.sidebar-collapsed .sidebar-brand span:not(.logomark),
.app.sidebar-collapsed .sidebar-brand .badge-org,
.app.sidebar-collapsed .sidebar-search,
.app.sidebar-collapsed .sidebar-section-label,
.app.sidebar-collapsed .nav-item span.label,
.app.sidebar-collapsed .nav-item .count,
.app.sidebar-collapsed .sidebar-footer .who { display: none; }
.app.sidebar-collapsed .sidebar-brand .brand-logo-default { display: none; }
.app.sidebar-collapsed .sidebar-brand .brand-logo-mark { display: inline-flex; }
.app.sidebar-collapsed .sidebar-brand { justify-content: center; padding: 18px 8px; }
.app.sidebar-collapsed .nav-item { justify-content: center; padding: 9px; }
.app.sidebar-collapsed .nav-item.active::before { left: -10px; }
.app.sidebar-collapsed .sidebar-footer { justify-content: center; }

/* Responsive auto-collapse for old .app layout */
@media (max-width: 1100px) {
  .app { grid-template-columns: 64px 1fr; }
  .sidebar-brand span:not(.logomark), .sidebar-brand .badge-org, .sidebar-search, .sidebar-section-label, .nav-item span.label, .nav-item .count, .sidebar-footer .who { display: none; }
  .sidebar-brand .brand-logo-default { display: none; }
  .sidebar-brand .brand-logo-mark { display: inline-flex; }
  .sidebar-brand { justify-content: center; padding: 18px 8px; }
  .nav-item { justify-content: center; padding: 9px; }
  .nav-item.active::before { left: -10px; }
  .sidebar-footer { justify-content: center; }
}

/* Multi-tenant: hide write actions when viewing another tenant (old .app) */
.app.viewing-tenant .tenant-rw { display: none !important; }

/* Data pill loading state */
.data-pill.loading { color: var(--text-muted); }

/* ====================== UTILITY ADDITIONS ====================== */

/* stat-grid: 4-column responsive KPI grid */
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:18px;}
@media(max-width:900px){.stat-grid{grid-template-columns:repeat(2,1fr);}}
@media(max-width:540px){.stat-grid{grid-template-columns:1fr;}}

/* card-body: standard content padding inside .card when card-head is present */
.card-body{padding:16px 20px;}

/* empty-state: legacy alias for .api-empty */
.empty-state{padding:40px 24px;text-align:center;color:var(--text-muted);font-size:13px;display:flex;flex-direction:column;align-items:center;gap:12px;}
.empty-state p{margin:0;}

/* ============================================================
   USERS — Rediseño 2026
   ============================================================ */
.usr-cell{display:flex;align-items:center;gap:10px;min-width:0;}
.usr-id{min-width:0;}
.usr-name{font-size:13px;font-weight:600;color:var(--text-strong);display:flex;align-items:center;gap:7px;}
.usr-mail{font-size:11px;color:var(--text-muted);}

.usr-risk{display:flex;align-items:center;gap:9px;min-width:128px;}
.usr-risk .bar{flex:1;max-width:70px;}
.usr-risk-v{font-family:var(--font-mono);font-size:12.5px;font-weight:700;width:24px;text-align:right;}
.usr-risk-band{font-size:10px;font-weight:650;letter-spacing:.02em;}

.usr-ai{display:flex;align-items:center;gap:9px;}
.usr-ai-n{font-family:var(--font-mono);font-size:12.5px;font-weight:650;color:var(--text-strong);}
.usr-provstack{display:flex;align-items:center;}
.usr-provstack{gap:4px;}
.usr-provmore{font-size:10px;font-weight:600;color:var(--text-muted);margin-left:5px;}

.usr-th-sort{cursor:pointer;user-select:none;white-space:nowrap;}
.usr-th-sort:hover{color:var(--text-strong);}
.usr-th-sort .caret{display:inline-flex;vertical-align:-2px;margin-left:3px;opacity:0;transition:opacity .12s;}
.usr-th-sort.on .caret{opacity:1;color:var(--accent-strong);}

/* Drawer de perfil */
.sec-lbl{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--text-muted);margin-bottom:8px;}
.usr-ai-list{display:flex;flex-direction:column;gap:9px;}
.usr-ai-row{display:flex;align-items:center;gap:10px;}
.usr-ai-row .nm{font-size:12.5px;font-weight:600;color:var(--text-strong);width:84px;flex-shrink:0;}
.usr-ai-row .bar{flex:1;}
.usr-ai-row .ct{font-family:var(--font-mono);font-size:11.5px;font-weight:650;color:var(--text-muted);width:58px;text-align:right;}
.usr-ai-row .cov{width:15px;display:grid;place-items:center;flex-shrink:0;}
.usr-chips{display:flex;flex-wrap:wrap;gap:7px;}
.usr-chip{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:9px;font-size:12px;font-weight:550;background:var(--surface-sunken);border:1px solid var(--border);color:var(--text);}
.usr-chip svg{color:var(--text-subtle);}
.usr-dev{display:flex;align-items:center;gap:11px;padding:11px 12px;border:1px solid var(--border);border-radius:11px;}
.usr-dev+.usr-dev{margin-top:8px;}
.usr-dev .dico{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;background:var(--surface-sunken);color:var(--text-muted);flex-shrink:0;}
.usr-dev .grow{flex:1;min-width:0;}
.usr-dev .dname{font-size:12.5px;font-weight:650;color:var(--text-strong);font-family:var(--font-mono);}
.usr-dev .dmeta{font-size:11px;color:var(--text-muted);margin-top:2px;}
.usr-act{display:flex;align-items:center;gap:10px;padding:8px 2px;}
.usr-act+.usr-act{border-top:1px solid var(--divider);}
.usr-act .grow{flex:1;min-width:0;}
.usr-act .at{font-size:12.5px;font-weight:600;color:var(--text-strong);}
.usr-act .am{font-family:var(--font-mono);font-size:10.5px;color:var(--text-subtle);margin-top:2px;}
/* identidades relacionadas en el drawer */
.usr-identities{display:flex;flex-direction:column;gap:0;}
.usr-identity-row{display:flex;align-items:center;gap:9px;padding:6px 10px;border-radius:9px;}
.usr-identity-row:hover{background:var(--surface-hover);}
.usr-identity-row .dico{display:grid;place-items:center;flex-shrink:0;width:22px;}
.usr-identity-row .grow{flex:1;min-width:0;}

/* data-table: legacy alias — same as .tbl */
table.data-table{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-base);}
.data-table thead th{padding:9px 14px;font-size:11px;font-weight:500;text-transform:uppercase;color:var(--text-subtle);text-align:left;border-bottom:1px solid var(--border);white-space:nowrap;letter-spacing:.06em;}
.data-table tbody td{padding:10px 14px;border-bottom:1px solid var(--border);vertical-align:middle;}
.data-table tbody tr:last-child td{border-bottom:0;}
.data-table tbody tr:hover{background:var(--surface-2);}

/* ====================== ENDPOINTS (Flota · rediseño) ======================
   Master/detail de la sección Endpoints. Portado del artefacto de diseño
   (autorado en el look Clásico) y TOKENIZADO para que se adapte solo a los
   dos temas (el skin Clásico se retiró el 2026-10-01): radios literales
   → var(--r-*), gradientes/hex → var(--surface*), pulso → keyframe compartido.
   Solo geometría no tematizada (anchos, gaps, tamaños de icono) queda en px. */

/* — celda de equipo en la tabla — */
.ep-cell { display:flex; align-items:center; gap:11px; }
.ep-cell-ico { position:relative; width:32px; height:32px; border-radius:var(--r-lg); display:none; place-items:center; background:var(--surface-sunken); color:var(--text-muted); flex-shrink:0; }
.ep-cell-dot { position:absolute; right:-2px; bottom:-2px; width:9px; height:9px; border-radius:50%; background:var(--text-subtle); border:2px solid var(--surface); }
.ep-cell-dot.on { background:var(--green-500); }
.ep-id { min-width:0; }
.ep-host { font-family:var(--font-mono); font-size:12.5px; font-weight:650; color:var(--text-strong); letter-spacing:.01em; }
.ep-tag { font-family:var(--font-mono); font-size:10.5px; color:var(--text-subtle); margin-top:1px; }

/* — badge de sistema operativo — */
.ep-os { display:inline-flex; align-items:center; gap:7px; }
.ep-os-sq { width:9px; height:9px; border-radius:var(--r-xs); flex-shrink:0; }
.ep-os-lbl { font-size:12px; color:var(--text-muted); white-space:nowrap; }

/* — versión + estado del agente — */
.ep-agent { display:flex; align-items:center; gap:9px; }
.ep-ver { font-size:11.5px; font-weight:600; color:var(--text-muted); }

/* — pastilla de estado del agente (color va inline desde el catálogo) — */
.ep-status { display:inline-flex; align-items:center; gap:5px; padding:3px 9px; border-radius:var(--r-sm); font-size:11px; font-weight:650; letter-spacing:.01em; white-space:nowrap; }

/* — punto en línea / offline — */
.ep-online { display:inline-flex; align-items:center; gap:6px; font-size:11.5px; font-weight:600; color:var(--text-subtle); }
.ep-online.on { color:var(--green-600); }
.ep-online .d { width:7px; height:7px; border-radius:50%; background:currentColor; }
.ep-online.on .d { box-shadow:0 0 0 0 color-mix(in srgb, var(--green-500) 50%, transparent); animation:kl-pulse-live 2.4s infinite; }

/* — cobertura de canal (icono de estado en la ficha) — */
.ep-cov { display:inline-flex; align-items:center; gap:5px; flex-shrink:0; color:var(--text-muted); }

/* ====================== FICHA A PÁGINA ENTERA ====================== */
/* — migas + volver — */
.ep-detail-bar { display:flex; align-items:center; gap:9px; margin-bottom:16px; }
.ep-back { display:inline-flex; align-items:center; gap:4px; padding:5px 11px 5px 7px; border:1px solid var(--border-strong); border-radius:var(--r-sm); background:linear-gradient(180deg,var(--surface),var(--surface-2)); font-size:12.5px; font-weight:600; color:var(--text); cursor:pointer; }
.ep-back:hover { background:linear-gradient(180deg,var(--surface-hover),var(--surface-sunken)); border-color:var(--gray-400); }
.ep-crumb-sep { color:var(--text-subtle); }
.ep-crumb-now { font-size:12.5px; font-weight:650; color:var(--text-muted); }

/* — cuerpo en dos columnas — */
.ep-detail-grid { display:grid; grid-template-columns:1.55fr 1fr; gap:16px; align-items:start; }
.ep-col { display:flex; flex-direction:column; gap:16px; min-width:0; }

/* — acciones del equipo — */
.ep-actions { display:flex; flex-direction:column; gap:4px; }
.ep-action { display:flex; align-items:center; gap:12px; width:100%; text-align:left; padding:9px 10px; border:1px solid transparent; border-radius:var(--r-lg); background:transparent; cursor:pointer; transition:background .14s, border-color .14s; }
.ep-action:hover:not(:disabled) { background:var(--surface-2); border-color:var(--border); }
.ep-action:focus-visible { outline:none; box-shadow:var(--focus); }
.ep-action:disabled { opacity:.55; cursor:default; }
.ep-action .grow { flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
.ep-action .l { font-size:var(--text-sm); font-weight:600; color:var(--text-strong); }
.ep-action .d { font-size:var(--text-xs); color:var(--text-muted); overflow-wrap:anywhere; }
.ep-action .chev { color:var(--text-subtle); flex-shrink:0; }
.ep-action.accent .epd-act-ico { background:var(--accent-soft); color:var(--accent-strong); }
.ep-action.warn .epd-act-ico { background:var(--warn-soft); color:var(--warn-fg); }
.ep-action.danger .epd-act-ico { background:var(--danger-soft); color:var(--danger-fg); }
.ep-action.danger .l { color:var(--danger-fg); }

/* — identificadores con copiar — */
.ep-ids { display:flex; flex-direction:column; }
.ep-idrow { display:flex; align-items:center; gap:10px; padding:8px 0; border-bottom:1px solid var(--divider); }
.ep-idrow:last-child { border-bottom:0; }
.ep-idrow .k { font-size:var(--text-xs); font-weight:500; color:var(--text-subtle); width:132px; flex-shrink:0; }
.ep-idval { flex:1; min-width:0; font-family:var(--font-mono); font-size:var(--text-xs); color:var(--text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ep-copy { width:24px; height:24px; border-radius:var(--r-sm); display:grid; place-items:center; color:var(--text-subtle); border:1px solid transparent; flex-shrink:0; cursor:pointer; background:none; }
.ep-copy:hover { background:var(--surface-sunken); color:var(--accent-strong); border-color:var(--border); }

@media (max-width:1040px) { .ep-detail-grid { grid-template-columns:1fr; } }

/* ====================== AUXILIARES usr-* que faltaban ====================== */
/* — enlace de texto (acento) — */
.usr-link { display:inline-flex; align-items:center; gap:3px; font-size:11.5px; font-weight:600; color:var(--accent-strong); background:none; border:0; cursor:pointer; padding:0; }
.usr-link:hover { text-decoration:underline; }

/* — listas aplicadas (canales / módulos / política) — */
/* — Correlación controles ↔ motores de detección (Reporting → Compliance) — */
.cec-wrap { overflow-x:auto; }
.cec-table { width:100%; border-collapse:collapse; font-size:13px; }
.cec-table th, .cec-table td { padding:8px 10px; text-align:center; }
.cec-table thead th { font-size:11px; font-weight:700; color:var(--text-subtle); text-transform:uppercase; letter-spacing:.05em; border-bottom:1px solid var(--border); }
.cec-table th.cec-ctrl-h { text-align:left; }
.cec-table th.cec-tot-h { text-align:right; }
.cec-fw td { text-align:left; font-size:10.5px; font-weight:800; letter-spacing:.10em; text-transform:uppercase; color:var(--text-subtle); padding-top:14px; padding-bottom:4px; }
.cec-row { cursor:pointer; border-bottom:1px solid var(--border-subtle, var(--border)); transition:background .12s; }
.cec-row:hover { background:var(--surface-2); }
.cec-ctrl { text-align:left; }
.cec-ctrl .cec-code { font-family:var(--font-mono); font-size:11.5px; font-weight:700; color:var(--text-strong); margin-right:8px; }
.cec-ctrl .cec-name { font-size:12.5px; color:var(--text); }
.cec-tot { text-align:right; font-variant-numeric:tabular-nums; font-weight:650; color:var(--text); }
.cec-foot td { border-top:1px solid var(--border); font-size:11.5px; font-weight:650; color:var(--text-subtle); padding-top:10px; }
.cec-foot td:first-child { text-align:left; }
.cec-unmapped { margin-top:12px; font-size:12px; color:var(--text-muted); }
.cec-unmapped-i { display:inline-block; margin:0 8px 4px 0; padding:2px 8px; border:1px solid var(--border); border-radius:999px; background:var(--surface-2); }
/* drawer drill-down */
.cec-drawer-stats { display:grid; grid-template-columns:repeat(auto-fit, minmax(160px, 1fr)); gap:10px; }
.cec-stat { border:1px solid var(--border); border-radius:var(--r-lg, 10px); padding:12px; background:var(--surface-2); display:flex; flex-direction:column; gap:6px; }
.cec-stat-v { font-size:22px; font-weight:800; font-variant-numeric:tabular-nums; }
.cec-stat-sub { font-size:11px; color:var(--text-muted); }
.cec-sub { font-size:11.5px; font-weight:700; color:var(--text-subtle); text-transform:uppercase; letter-spacing:.07em; margin-bottom:8px; }

/* — Badge de ruptura de cumplimiento (marcado en cada detección/incidente) — */
.badge.cmp-breach {
  display:inline-flex; align-items:center;
  color:var(--amber-700, #9a6a00);
  background:color-mix(in srgb, var(--amber-500) 14%, transparent);
  border:1px solid color-mix(in srgb, var(--amber-500) 34%, transparent);
}

/* — Tarjetas de marco normativo (Reporting → Compliance) — */
.fw-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(240px, 1fr)); gap:14px; }
.fw-card { border:1px solid var(--border); border-radius:var(--r-lg, 12px); background:var(--surface-2); padding:14px; display:flex; flex-direction:column; gap:10px; }
.fw-card.open { grid-column:1 / -1; }
.fw-card-head { display:flex; align-items:center; justify-content:space-between; gap:10px; background:none; border:0; padding:0; cursor:pointer; width:100%; }
.fw-card-head .fw-name { font-size:14.5px; font-weight:700; color:var(--text-strong); }
.fw-stats { display:flex; gap:18px; flex-wrap:wrap; }
.fw-stat { display:flex; flex-direction:column; gap:1px; }
.fw-stat-v { font-size:17px; font-weight:800; font-variant-numeric:tabular-nums; color:var(--text-strong); }
.fw-stat-l { font-size:10.5px; color:var(--text-muted); text-transform:uppercase; letter-spacing:.04em; }
.fw-expand { align-self:flex-start; background:none; border:0; color:var(--accent); font-size:12px; font-weight:600; cursor:pointer; padding:2px 0; }
.fw-controls { margin-top:4px; border-top:1px solid var(--border); padding-top:8px; overflow-x:auto; }

/* ====================== CENTRO DE OPERACIONES — CAJONES ======================
   La portada vieja (héroe, medidor, plantilla, listas en tabla y tira de avisos) se
   retiró. La portada nueva vive en la sección `.oc-*` del final del fichero.
   Sobrevive aquí el cajón explicativo (`.xdr*`) y `.prh-apex`; el factor de un solo clic
   es el popover `.oc-pop` (sección `.oc-*`). */

/* — LOS DOS CAJONES — */
.xdr{display:flex;flex-direction:column;gap:var(--sp-5);}
.xdr-lede{margin:0;font-size:var(--fs-base);color:var(--text-muted);line-height:1.6;}
.xdr-foot{margin:0;font-size:var(--fs-sm);color:var(--text-subtle);line-height:1.6;}
.xdr-factors{display:flex;flex-direction:column;gap:var(--sp-3);}
.xdr-factor{display:flex;gap:11px;align-items:flex-start;
  padding:var(--sp-3) var(--sp-4);border:1px solid var(--border);
  border-radius:var(--r);background:var(--surface-2);}
.xdr-factor.locked{opacity:.72;border-style:dashed;}
.xdr-dot{width:9px;height:9px;border-radius:var(--r-pill);margin-top:5px;flex-shrink:0;}
.xdr-factor-text{min-width:0;}
.xdr-factor-name{display:block;font-size:var(--fs-base);font-weight:640;
  color:var(--text-strong);}
.xdr-factor-note{display:block;margin-top:3px;font-size:var(--fs-sm);
  color:var(--text-muted);line-height:1.5;}
.xdr-chart{display:flex;flex-direction:column;gap:var(--sp-1);min-width:0;}
.xdr-chart-title{font-size:var(--fs-2xs);font-weight:640;letter-spacing:.07em;
  text-transform:uppercase;color:var(--text-muted);}
.xdr-chart-note{font-size:var(--fs-xs);color:var(--text-subtle);line-height:1.5;}

/* El lienzo de ApexCharts: lo usan las dos gráficas del cajón explicativo. */
.prh-apex{min-width:0;}

/* ====================== SECTION NAV ======================
   Banda de navegación de las secciones agrupadas (Políticas, Biblioteca de
   detección…). Sustituye a la fila de píldoras que vivía como cadena de CSS
   dentro de app.jsx.

   Por qué así: esto es NAVEGACIÓN, no un filtro. Las píldoras con borde
   flotando sobre la cabecera leían como un control de la página, y encima
   añadían un quinto dialecto de pestaña a una consola que ya tenía cuatro
   (window.Tabs, .seg, .kl-tabs y esta). Se adopta el lenguaje de subrayado
   —el de window.Tabs, el más extendido— y se le da un contenedor propio con
   su antetítulo, de modo que la cabecera de la sección hija se apoya en la
   banda en lugar de pelearse con ella a base de márgenes negativos. */
.kl-secnav{
  display:flex; flex-direction:column; gap:var(--sp-2);
  /* 26px = el padding horizontal de .kl-content, para que el antetítulo y las
     pestañas queden a plomo con el h1 de la sección hija. Sin margen negativo:
     la banda es hermana de .kl-content dentro de .content, que NO tiene padding
     propio — sangrarla la sacaría del viewport. */
  padding:var(--sp-5) 26px 0;
  background:var(--surface);
  border-bottom:1px solid var(--border);
}
.kl-secnav-eyebrow{
  font-size:var(--fs-2xs); font-weight:650; letter-spacing:.09em;
  text-transform:uppercase; color:var(--text-subtle);
}
.kl-secnav-tabs{ display:flex; align-items:stretch; gap:var(--sp-5); flex-wrap:wrap; }
.kl-secnav-tab{
  position:relative;
  display:inline-flex; align-items:center; gap:7px;
  padding:9px 2px 11px;
  background:none; border:0; cursor:pointer;
  font:inherit; font-size:var(--fs-md); font-weight:540;
  color:var(--text-muted);
  transition:color .14s var(--ease);
}
/* El subrayado es un pseudo-elemento y no un border para que pueda crecer
   desde el centro: un border cambiaría la altura de la pestaña al activarse. */
.kl-secnav-tab::after{
  content:''; position:absolute; left:0; right:0; bottom:-1px; height:2px;
  border-radius:2px 2px 0 0;
  background:var(--accent);
  transform:scaleX(0); transform-origin:center;
  transition:transform .18s var(--ease-out);
}
.kl-secnav-tab:hover{ color:var(--text-strong); }
.kl-secnav-tab:hover::after{ transform:scaleX(.35); background:var(--border-strong); }
.kl-secnav-tab.on{ color:var(--text-strong); font-weight:600; }
.kl-secnav-tab.on::after{ transform:scaleX(1); background:var(--accent); }
.kl-secnav-tab:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; border-radius:var(--r-xs); }
.kl-secnav-ico{ color:var(--text-subtle); transition:color .14s var(--ease); flex-shrink:0; }
.kl-secnav-tab:hover .kl-secnav-ico{ color:var(--text-muted); }
.kl-secnav-tab.on .kl-secnav-ico{ color:var(--accent); }

/* La cabecera de la sección hija respira bajo la banda sin trucos de margen
   negativo: la banda ya cierra con su propia línea. */
.kl-secnav + .kl-content{ padding-top:var(--sp-5); }
.kl-secnav + .kl-content > .kl-page-head{ margin-top:0; }

@media (max-width:720px){
  .kl-secnav{ padding-left:var(--sp-4); padding-right:var(--sp-4); }
}
/* Con cinco pestañas (Políticas) la banda ya no cabe en una fila por debajo de ~1000 px: en vez de partirse en dos
   filas (la última queda huérfana, sin su subrayado) se desliza en horizontal, igual que la tira de vistas (DxViews). */
@media (max-width:1000px){
  .kl-secnav-tabs{ gap:var(--sp-4); overflow-x:auto; flex-wrap:nowrap; scrollbar-width:none; }
  .kl-secnav-tabs::-webkit-scrollbar{ display:none; }
  .kl-secnav-tab{ white-space:nowrap; flex-shrink:0; }
}

/* Variante ligera para pestañas DENTRO de una página (p. ej. Incidentes:
   «Incidentes» / «Observabilidad regulatoria IA»). Mismo lenguaje de
   subrayado que la banda de sección, sin antetítulo ni fondo propio: la
   jerarquía la marca el peso, no un estilo distinto. Antes eran botones
   `btn sm brand/ghost`, que leían como acciones y no como navegación. */
.kl-tabline{
  display:flex; align-items:stretch; gap:var(--sp-5); flex-wrap:wrap;
  border-bottom:1px solid var(--border);
  margin:0 0 var(--sp-5);
}
.kl-tabline > button{
  position:relative;
  display:inline-flex; align-items:center; gap:7px;
  padding:8px 2px 10px;
  background:none; border:0; cursor:pointer;
  font:inherit; font-size:var(--fs-base); font-weight:540;
  color:var(--text-muted);
  transition:color .14s var(--ease);
}
.kl-tabline > button::after{
  content:''; position:absolute; left:0; right:0; bottom:-1px; height:2px;
  border-radius:2px 2px 0 0; background:var(--accent);
  transform:scaleX(0); transform-origin:center;
  transition:transform .18s var(--ease-out);
}
.kl-tabline > button:hover{ color:var(--text-strong); }
.kl-tabline > button:hover::after{ transform:scaleX(.35); background:var(--border-strong); }
.kl-tabline > button.on{ color:var(--text-strong); font-weight:600; }
.kl-tabline > button.on::after{ transform:scaleX(1); background:var(--accent); }
.kl-tabline > button:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; border-radius:var(--r-xs); }
.kl-tabline > button svg{ color:var(--text-subtle); flex-shrink:0; }
.kl-tabline > button.on svg{ color:var(--accent); }

/* — color por banda de riesgo — */
/* Las mismas cuatro rampas que `window.riskBand`; el texto se mezcla hacia el texto
   fuerte para llegar a contraste AA en los dos temas. */
[data-band="low"]{--oc-band:var(--green-500);}
[data-band="medium"]{--oc-band:var(--amber-500);}
[data-band="high"]{--oc-band:var(--orange-500);}
[data-band="critical"]{--oc-band:var(--coral-500);}
[data-band="none"]{--oc-band:var(--text-muted);}
.oc-band-label,.oc-drv-band{color:color-mix(in srgb,var(--oc-band) 72%,var(--text-strong));font-weight:500;}
/* — gráfico de 30 días (SVG propio) — */
/* La caja se estira y los trazos no se deforman (`non-scaling-stroke`); los rótulos
   de los ejes son HTML. El grid reparte: fila 1 = el lienzo (mínimo `--oc-chart-h`,
   crece con la tarjeta), fila 2 = las fechas. */
.oc-chart{flex:1 1 auto;display:grid;grid-template-columns:auto minmax(0,1fr);grid-template-rows:minmax(var(--oc-chart-h),1fr) auto;column-gap:var(--sp-3);margin-top:var(--sp-3);min-height:0;max-height:calc(var(--oc-chart-max) + 24px);}
.oc-chart-y{grid-row:1;grid-column:1;display:flex;flex-direction:column;justify-content:space-between;text-align:right;font-size:var(--fs-2xs);line-height:1;color:var(--text-subtle);font-variant-numeric:tabular-nums;}
.oc-chart-plot{grid-row:1;grid-column:2;position:relative;min-height:0;border-bottom:1px solid var(--border);}
.oc-chart-plot svg{position:absolute;inset:0;width:100%;height:100%;display:block;overflow:visible;}
.oc-chart-x{grid-row:2;grid-column:2;display:flex;justify-content:space-between;margin-top:4px;font-size:var(--fs-2xs);color:var(--text-subtle);}
.oc-band{fill:var(--oc-band);opacity:.06;}
.oc-area{fill:var(--accent-soft);opacity:.4;stroke:none;}
.oc-line{fill:none;stroke:var(--accent);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke;}
.oc-line.dashed{stroke-dasharray:4 4;}
.oc-pt{fill:none;stroke:var(--accent);stroke-width:6;stroke-linecap:round;vector-effect:non-scaling-stroke;}
.oc-pt.rec{stroke-width:5;opacity:.55;}
.oc-guide{stroke:var(--border-strong);stroke-width:1;vector-effect:non-scaling-stroke;}
.oc-chart-empty{position:absolute;inset:0;display:grid;place-items:center;font-size:var(--fs-sm);color:var(--text-muted);}
.oc-tip{position:absolute;transform:translate(-50%,-135%);z-index:2;padding:3px 8px;border-radius:var(--r-sm);background:var(--surface-2);border:1px solid var(--border-strong);color:var(--text-strong);font-size:var(--fs-xs);white-space:nowrap;pointer-events:none;font-variant-numeric:tabular-nums;}

/* — fila central — */
.oc-mid{display:grid;grid-template-columns:minmax(0,1.85fr) minmax(0,1fr);gap:var(--sp-4);min-height:0;}
.oc-exposure,.oc-triage{display:flex;flex-direction:column;min-width:0;min-height:0;}
.oc-link{display:inline-flex;align-items:center;gap:4px;background:none;border:0;padding:0;cursor:pointer;font:inherit;font-size:13px;color:var(--accent);white-space:nowrap;}
.oc-link:hover{color:var(--accent-strong);}
.oc-link:focus-visible,.oc-drv:focus-visible,.oc-tri:focus-visible,.oc-person:focus-visible{outline:none;box-shadow:var(--focus);}

.oc-score-row{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--sp-2) var(--sp-4);}
.oc-score{font-size:clamp(32px,2.4vw,44px);font-weight:600;line-height:1;letter-spacing:-.02em;color:var(--text-strong);}
.oc-band-label{font-size:var(--fs-md);}
.oc-delta{font-size:var(--fs-sm);color:var(--text-muted);font-variant-numeric:tabular-nums;}
.oc-delta[data-dir="up"]{color:var(--danger-fg);}
.oc-delta[data-dir="down"]{color:var(--ok-fg);}
.oc-skel-stack{display:flex;flex-direction:column;gap:var(--sp-3);}
.oc-skel-num{display:block;width:96px;height:40px;}
.oc-skel-chart{display:block;height:var(--oc-chart-h);}
.oc-skel-row{display:block;height:clamp(52px,6vh,60px);}
/* — los seis factores, una línea cada uno — */
.oc-drivers{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:var(--sp-6);margin-top:var(--sp-3);}
.oc-drv{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:var(--sp-3);width:100%;min-height:clamp(26px,3.2vh,34px);padding:0 var(--sp-2);background:none;border:0;border-bottom:1px solid var(--border);border-radius:var(--r-sm);text-align:left;cursor:pointer;font:inherit;color:inherit;}
.oc-drv:nth-last-child(-n+2){border-bottom:0;}
.oc-drv:hover{background:var(--surface-2);}
.oc-drv.locked{opacity:.72;}
.oc-drv-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--fs-base);color:var(--text);}
.oc-drv-num{min-width:2ch;text-align:right;font-size:var(--fs-base);font-weight:600;color:var(--text-strong);}
.oc-drv-band{min-width:7ch;font-size:var(--fs-sm);}
.oc-drv-state{grid-column:2 / span 2;font-size:var(--fs-sm);color:var(--text-muted);}

/* — necesita revisión — */
.oc-count{margin-left:var(--sp-2);padding:1px 8px;border-radius:var(--r-sm);background:var(--accent-soft);color:var(--accent);font-size:var(--fs-sm);font-weight:500;}
.oc-tri-list{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--sp-2);min-height:0;}
.oc-tri{flex:0 0 auto;min-height:clamp(52px,6vh,60px);display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--sp-3);padding:0 var(--sp-2) 0 var(--sp-4);background:none;border:0;border-left:2px solid var(--oc-sev,var(--border-strong));border-radius:0 var(--r-sm) var(--r-sm) 0;text-align:left;font:inherit;color:inherit;position:relative;}
button.oc-tri{cursor:pointer;}
button.oc-tri:hover{background:var(--surface-2);}
.oc-tri[data-sev="critical"]{--oc-sev:var(--danger);}
.oc-tri[data-sev="high"]{--oc-sev:var(--warn);}
.oc-tri[data-sev="medium"]{--oc-sev:var(--accent);}
.oc-av{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;background:var(--surface-2);color:var(--text-muted);font-size:var(--fs-2xs);font-weight:500;letter-spacing:.02em;}
.oc-tri-main{display:flex;flex-direction:column;gap:1px;min-width:0;}
.oc-tri-who{font-size:var(--fs-base);font-weight:500;color:var(--text-strong);}
.oc-tri-what{font-size:var(--fs-sm);color:var(--text-muted);}
.oc-tri-time{font-size:var(--fs-sm);color:var(--text-subtle);white-space:nowrap;}

/* — popover de un factor (portada): discreto, anclado al factor pulsado — */
/* Ancho compacto; la posición (left/top) la escribe el JS desde el botón pulsado.
   Sin telón: es una nota junto al dato, no un cajón. */
.oc-pop{position:fixed;left:0;top:0;z-index:55;width:340px;max-width:calc(100vw - 16px);display:flex;flex-direction:column;gap:var(--sp-3);padding:var(--sp-4);background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--r);box-shadow:var(--sh-lg);}
.oc-pop:focus{outline:none;}
.oc-pop-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-3);}
.oc-pop-name{min-width:0;font-size:var(--fs-md);font-weight:500;color:var(--text-strong);}
.oc-pop-score{display:inline-flex;align-items:baseline;gap:var(--sp-2);flex-shrink:0;}
.oc-pop-num{font-size:var(--fs-md);font-weight:600;color:color-mix(in srgb,var(--oc-band) 72%,var(--text-strong));}
.oc-pop-band{font-size:var(--fs-sm);color:color-mix(in srgb,var(--oc-band) 72%,var(--text-strong));}
.oc-pop-text{margin:0;font-size:var(--fs-sm);line-height:1.5;color:var(--text-muted);}
.oc-pop-list{display:flex;flex-direction:column;border-top:1px solid var(--border);padding-top:var(--sp-2);}
.oc-pop-cap{font-size:var(--fs-2xs);font-weight:500;letter-spacing:.07em;text-transform:uppercase;color:var(--text-subtle);padding:0 var(--sp-2) var(--sp-1);}
.oc-pop-row{display:flex;flex-direction:column;gap:1px;min-width:0;width:100%;padding:var(--sp-2);background:none;border:0;border-radius:var(--r-sm);text-align:left;font:inherit;color:inherit;}
button.oc-pop-row{cursor:pointer;}
button.oc-pop-row:hover{background:var(--surface-2);}
button.oc-pop-row:focus-visible{outline:none;box-shadow:var(--focus);}
.oc-pop-row-main{font-size:var(--fs-base);font-weight:500;color:var(--text-strong);}
.oc-pop-row-sub{font-size:var(--fs-xs);color:var(--text-muted);}
.oc-pop .btn{align-self:flex-start;}

/* — fila inferior: tres listas — */
.oc-bottom{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-4);}
.oc-list{min-width:0;}
.oc-bars,.oc-people{display:flex;flex-direction:column;}
.oc-bar-row{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.2fr) 8ch;align-items:center;gap:var(--sp-3);min-height:var(--oc-row-h);}
.oc-bar-name{display:flex;align-items:center;gap:var(--sp-3);min-width:0;font-size:var(--fs-base);color:var(--text);}
.oc-bar-val{text-align:right;font-size:var(--fs-base);color:var(--text-muted);}
/* La barra es un <progress> nativo: la pista y el relleno se pintan aquí, sin
   estilo en línea. Una sola tinta (acento o neutra) por lista. */
.oc-bar{appearance:none;-webkit-appearance:none;width:100%;height:4px;border:0;border-radius:2px;background:var(--surface-sunken);overflow:hidden;}
.oc-bar::-webkit-progress-bar{background:var(--surface-sunken);border-radius:2px;}
.oc-bar::-webkit-progress-value{background:var(--accent);border-radius:2px;}
.oc-bar::-moz-progress-bar{background:var(--accent);border-radius:2px;}
.oc-bars.neutral .oc-bar::-webkit-progress-value{background:var(--bar-neutral);}
.oc-bars.neutral .oc-bar::-moz-progress-bar{background:var(--bar-neutral);}
.oc-person{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--sp-3);min-height:calc(var(--oc-row-h) * 1.35);padding:0;background:none;border:0;border-bottom:1px solid var(--border);text-align:left;font:inherit;color:inherit;}
button.oc-person{cursor:pointer;}
.oc-person:last-child{border-bottom:0;}
button.oc-person:hover{background:var(--surface-2);}
.oc-person-main{display:flex;flex-direction:column;min-width:0;}
.oc-person-name{font-size:var(--fs-base);font-weight:500;color:var(--text-strong);}
.oc-person-sub{font-size:var(--fs-xs);color:var(--text-muted);}
.oc-score-box{min-width:38px;padding:2px 8px;text-align:center;border:1px solid var(--oc-band);border-radius:var(--r-sm);color:color-mix(in srgb,var(--oc-band) 72%,var(--text-strong));font-size:var(--fs-base);font-weight:500;}

/* ====================== CENTRO DE OPERACIONES (portada) ======================
   PR2 del design system minimalista (spec 2026-10-01 §5). Una pantalla de 1920×880
   sin scroll y holgada a 2560×1300: la página es una rejilla de cuatro filas
   (cabecera · KPI · exposición + revisión · tres listas) y la tercera fila absorbe
   la altura sobrante, de modo que el gráfico y las filas de revisión crecen con la
   ventana en vez de dejar un hueco al pie. Las alturas se escalan con `vh` entre un
   mínimo y un máximo; por debajo de 1280 px de ancho todo se apila y hay scroll.
   Todo el color sale de tokens: el tema claro no necesita una hoja aparte. */
.kl-content.ops-page{
  --oc-chart-h:clamp(104px,12.5vh,190px);
  --oc-chart-max:220px;
  --oc-row-h:clamp(26px,3.3vh,38px);
  display:grid;grid-template-rows:auto auto minmax(min-content,1fr) auto;gap:var(--sp-4);
  width:100%;max-width:2240px;margin-inline:auto;min-width:0;
  padding:20px 28px 20px;
  min-height:calc(100vh - 48px);
}
.ops-note{font-size:var(--fs-sm);color:var(--text-muted);line-height:1.5;}

/* — cabecera — */
.kl-page-head.oc-head{margin-bottom:0;align-items:flex-end;}
.kl-page-head.oc-head h1{margin-top:4px;font-size:clamp(22px,1.7vw,30px);font-weight:500;line-height:1.2;}
.oc-status{margin-top:6px;font-size:var(--fs-sm);color:var(--danger-fg);}

/* — KPI — */
.oc-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--sp-6);}
.oc-kpi{padding:0;gap:6px;overflow:visible;}
.oc-kpi .k-label{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.oc-dot::before{content:"";width:6px;height:6px;border-radius:50%;flex-shrink:0;background:var(--oc-dot,var(--text-subtle));}
.oc-dot-accent{--oc-dot:var(--accent);}
.oc-dot-danger{--oc-dot:var(--danger);}
.oc-dot-warn{--oc-dot:var(--warn);}
.oc-dot-neutral{--oc-dot:var(--text-subtle);}
.oc-kpi .k-foot{min-height:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;}
.oc-kpi .oc-skel-num{height:32px;}
.oc-skel-sub{display:block;width:140px;height:12px;}
/* Con poca altura la sexta fila de las barras y la cuarta persona se ocultan: es lo
   que permite que la portada quepa en 1920×880 (se muestran desde 1000 px de alto). */
@media (max-height:999px){
  .oc-bar-row:nth-child(n+6){display:none;}
  .oc-person:nth-child(n+4){display:none;}
  .oc-tri:nth-child(n+6){display:none;}
}
/* Entre 1000 y 1199 px (p. ej. 1920×1080) caben seis incidentes; los dos últimos y el
   aire extra de los factores llegan solo en pantallas 2K, donde sobra altura. */
@media (max-height:1199px){
  .oc-tri:nth-child(n+7){display:none;}
}
@media (min-height:1260px){
  .oc-drv{min-height:62px;}
  .oc-drivers{margin-top:var(--sp-6);}
  .oc-tri{min-height:64px;}
}
@media (max-width:1280px){
  .kl-content.ops-page{grid-template-rows:none;}
  .oc-mid,.oc-bottom{grid-template-columns:minmax(0,1fr);}
  .oc-kpis{grid-template-columns:repeat(2,minmax(0,1fr));}
  .oc-drivers{grid-template-columns:minmax(0,1fr);}
  .oc-drv:nth-last-child(2){border-bottom:1px solid var(--border);}
}

/* Texto solo para lectores de pantalla (la severidad de cada fila de «Necesita revisión»). */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}

/* Guía «Primeros pasos» (pages-getting-started.jsx): checklist ilustrado, guías de instalación, opciones críticas y recorrido. Solo tokens. */
.gs-stack{display:flex;flex-direction:column;gap:var(--sp-6);max-width:1180px;}
.gs-h2{font-size:var(--text-lg);font-weight:600;color:var(--text-strong);margin:0 0 var(--sp-3);}
.gs-hero{display:grid;grid-template-columns:minmax(0,3fr) minmax(0,2fr);gap:var(--sp-5);align-items:start;}
.gs-hero-title{font-size:var(--text-xl);font-weight:600;color:var(--text-strong);margin:0 0 var(--sp-3);}
.gs-hero-main{display:flex;flex-direction:column;gap:var(--sp-2);}
.gs-progress{width:100%;height:10px;accent-color:var(--accent);}
.gs-posture{display:flex;flex-direction:column;gap:var(--sp-2);align-items:flex-start;padding-left:var(--sp-5);border-left:1px solid var(--border);}
.gs-posture p{margin:0;color:var(--text);font-size:var(--text-sm);line-height:1.5;}
.gs-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--sp-3);}
.gs-step{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:var(--sp-4);align-items:center;padding:var(--sp-4);border:1px solid var(--border);border-radius:var(--radius-xl);background:var(--surface);}
.gs-step.is-done{background:var(--surface-2);}
.gs-step.is-done .gs-illo{color:var(--ok);}
.gs-illo{width:48px;height:48px;color:var(--accent);flex:none;}
.gs-step-body h3{font-size:var(--text-base);font-weight:600;color:var(--text-strong);margin:0 0 var(--sp-1);}
.gs-step-body p{margin:0;color:var(--text);font-size:var(--text-sm);line-height:1.5;}
.gs-step-n{color:var(--text-muted);}
.gs-evidence{margin-top:var(--sp-1);}
.gs-two{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:var(--sp-4);}
.gs-card{display:flex;flex-direction:column;gap:var(--sp-3);}
.gs-card p{margin:0;font-size:var(--text-sm);line-height:1.5;}
.gs-list{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:var(--sp-2);font-size:var(--text-sm);line-height:1.5;}
.gs-options > p{margin:0 0 var(--sp-3);}
.gs-opts{list-style:none;margin:0 0 var(--sp-4);padding:0;display:flex;flex-direction:column;gap:var(--sp-3);}
.gs-opt{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--sp-4);align-items:start;}
.gs-opt.is-locked{background:var(--surface-2);}
.gs-opt.is-review{grid-template-columns:minmax(0,1fr);}
.gs-opt-body h3{font-size:var(--text-base);font-weight:600;color:var(--text-strong);margin:0 0 var(--sp-1);}
.gs-opt-body p{margin:0 0 var(--sp-1);font-size:var(--text-sm);line-height:1.5;}
.gs-tour{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:var(--sp-4);}
.gs-tour-card{display:flex;flex-direction:column;gap:var(--sp-2);}
.gs-tour-card h3{font-size:var(--text-base);font-weight:600;color:var(--text-strong);margin:0;}
.gs-tour-card p{margin:0;font-size:var(--text-sm);line-height:1.5;}
.gs-tour-card .obw-row{margin-top:auto;}
@media(max-width:760px){
  .gs-hero{grid-template-columns:1fr;}
  .gs-posture{padding-left:0;border-left:0;border-top:1px solid var(--border);padding-top:var(--sp-4);}
  .gs-step{grid-template-columns:auto minmax(0,1fr);}
  .gs-step > .btn{grid-column:1 / -1;justify-self:start;}
  .gs-two{grid-template-columns:1fr;}
}
.gs-card a{color:var(--accent-strong);text-decoration:underline;}
