/* ============================================================
   HORIZON DARK — "Night Watch"

   El modo oscuro del producto. La paleta NO es nueva: es la que
   ya tenia la estetica anterior (2050/horizon_*_dark.html, tema
   "Dawn over deep water" / dark = night watch), portada a los
   tokens del kit 2026.

   Como funciona: se activa con data-theme="dark" en <html>. El
   selector html[data-theme="dark"] tiene especificidad (0,1,1),
   mayor que el :root (0,1,0) con que el diseñador declara los
   tokens, asi que la capa 1 gana sin importar el orden de carga.
   Para las reglas de elemento si importa: esta hoja va ULTIMA en
   el <head> de cada pagina.

   Es hoja NUESTRA, no del diseñador: por eso vive aca y no dentro
   de horizon-skin.css ni de cloudbeach.css, que se recopilan
   enteras desde hrzn-finops/ con cada entrega. Mismo criterio que
   hrzn-viewswitch.css. Hay que reponerla en compilar-horizon-2026.sh
   (pasos 0 y 7.5) y el <link> lo inyecta rewrite.pl.

   De donde salen los colores. Las TINTAS y los ESTADOS vienen de la
   estetica anterior (2050/horizon_*_dark.html), leidos de sus
   computed styles:

     --ink      #EAF2FF  ->  --hz-ink, --ink
     --muted    #9AADC9  ->  --hz-ink-3, --muted
     --faint    #8093B3  ->  --hz-ink-4
     --stroke   rgba(148,184,255,.09)  ->  --hz-line-soft
     --stroke-2 rgba(148,184,255,.16)  ->  --hz-line
     --high     #3DDC97  ->  --hz-ok
     --med      #FFB224  ->  --hz-warn
     --low      #FF5C7A  ->  --hz-bad, pero aclarado a #FF8A9E (ver
                             la nota del coral en los tokens)
     --sky-text #7FBAFF  ->  --hz-sky
     --on-brand #06121C  ->  --hz-on-accent

   Las SUPERFICIES no: salen del navy del propio sidebar (#011A3B).
   La paleta vieja las tenia en otro tono — un azul casi negro,
   #070D18 el fondo y #0D1626 la tarjeta — y el efecto era que
   ninguna pantalla combinaba con su rail. Ahora es un solo color en
   cuatro intensidades; ver el bloque de tokens abajo.

   Secciones:
     1  Tokens
     2  Shell: rail, header, canvas
     3  El hero se hace de noche
     4  Superficies: tarjetas, paneles, KPI
     5  Controles: botones, pills, inputs, tablas
     6  Estados y badges
     7  Capa cockpit (horizon-skin.css)
     8  Paginas: adoption, score, score-config
     9  Bridge
    10  Flotantes: modales, menus, bot
    11  Transicion e impresion
   ============================================================ */

/* ============================================================
   1 · TOKENS
   ============================================================ */

html[data-theme="dark"] {
  /* --- Superficies: TODAS derivadas del navy del sidebar ---

     El punto de partida es el rail, #011A3B, que ya existia en modo
     claro. De ahi salen los cuatro niveles: el fondo es ese mismo
     navy apenas bajado, y arriba se abren dos escalones mas claros
     en el mismo tono para el contenido.

     Antes cada nivel venia de la paleta vieja (canvas #070D18, un
     azul casi negro de otro tono que el rail), y el resultado era
     que ninguna pantalla combinaba con su propio sidebar. Ahora el
     tema entero es UN color en cuatro intensidades.

     Ojo que es al REVES del light, donde la tarjeta es blanca y la
     bandeja gris: en dark lo que se acerca al ojo es mas CLARO.

       fondo    #011530   apenas mas oscuro que el rail (1.05:1),
                          lo justo para que se distinga
       [rail]   #011A3B   no se toca, viene de cloudbeach-assets.css
       bandeja  #062240   1.14:1 sobre el fondo
       tarjeta  #0E3058   1.37:1 sobre el fondo, 1.31:1 sobre el rail
       elevado  #153B69   panel dentro de panel

     No hay un quinto nivel a proposito: mas claro que #153B69 la
     tinta tenue (--hz-ink-4, 9-11px) baja de 4.5:1 y hay que
     empezar a parchear texto. Dos escalones de contenido alcanzan
     y ademas dejan todas las pantallas mas parejas. --- */
  --hz-canvas: #011530;
  --hz-sunken: #062240;
  --hz-surface: #0E3058;
  --hz-panel-2: #153B69;

  /* El rail NO tiene token de tema, a proposito: no se toca. Es la
     fuente de la que sale todo lo de arriba. Ver la seccion 2. */

  /* Tinta. El light tiene cuatro niveles y los cuatro se usan;
     se mapean a ink / (interpolado) / muted / faint. */
  --hz-ink: #EAF2FF;
  --hz-ink-2: #C6D6EE;
  --hz-ink-3: #9AADC9;
  /* El --faint de la paleta vieja era #8093B3, pero ahi vivia sobre
     el canvas. Aca el mismo texto cae dentro de tarjetas, que son
     mas claras, y quedaba en 3.03:1 — por debajo de AA justo en el
     tamaño en que se usa (eyebrows y timestamps de 9-11px). Se
     aclara lo necesario: 5.75:1 sobre la tarjeta, 4.89:1 sobre el
     panel elevado. Es el token que fija cuan claro puede ser el
     escalon mas alto de superficie. */
  --hz-ink-4: #99ACC9;

  /* Tinta para lo que se apoya SOBRE un acento. En light los
     rellenos de marca son oscuros y el texto va blanco; en dark el
     acento se aclara y el blanco encima queda en 2.7:1. Es el
     --on-brand de la paleta vieja. */
  --hz-on-accent: #06121C;

  /* Lineas. En dark no se dibuja con negro mas oscuro sino con
     azul claro translucido: sobre #0E3058 un borde negro no
     existe. Son los --stroke de la paleta vieja. */
  --hz-line: rgba(148, 184, 255, .16);
  --hz-line-soft: rgba(148, 184, 255, .09);

  /* Marca y semantica. Los tonos del light estan calculados para
     contraste sobre blanco (--hz-ok-ink #127A45 y compañia) y
     sobre #0E3058 quedan casi ilegibles. En dark el par se
     colapsa: el color de texto ES el color del estado, igual que
     hacia la hoja vieja (--high-text == --high). */
  --hz-blue: #6BADFF;
  --hz-sky: #7FBAFF;
  --hz-orange: #FF8A4C;
  --hz-ok: #3DDC97;
  --hz-warn: #FFB224;

  /* El coral sube de #FF5C7A (el --low de la paleta vieja) a #FF8A9E.
     Con las superficies en el tono del navy, el original quedaba en
     4.46:1 como texto — por debajo de AA — y aparecia en diez
     lugares: los badges "3 OPEN", el boton Reconnect, las cifras
     proyectadas, los avisos de sobregiro.

     Se sube el token en vez de cambiar cada uso a --hz-bad-ink
     porque el coral hace de relleno y de texto a la vez, y como
     relleno lleva tinta oscura encima (--hz-on-accent), asi que
     aclararlo mejora los dos roles. Mismo criterio que --hz-blue,
     que por lo mismo paso de #4D9FFF a #6BADFF.

     Por eso los tres pares *-ink quedan colapsados con su estado: ya
     no hace falta un tono aparte para texto. */
  --hz-bad: #FF8A9E;
  --hz-ok-ink: #3DDC97;
  --hz-warn-ink: #FFB224;
  --hz-bad-ink: #FF8A9E;

  /* Sombras. La hoja vieja ponia --card-shadow:none en dark: sin
     fondo claro no hay nada que ensombrecer, y una sombra negra
     sobre casi negro solo ensucia. Lo que si conserva sombra es
     lo que FLOTA de verdad (pastilla de utilidad, menus, modal),
     y ahi es negra y profunda en vez de azulada. */
  --hz-sh-hair: 0 1px 2px rgba(0, 0, 0, .34);
  --hz-sh-soft: 0 10px 28px -14px rgba(0, 0, 0, .62);
  --hz-sh-deep: 0 26px 64px -22px rgba(0, 0, 0, .78);

  /* Recetas de tarjeta de estado. Se conserva la gramatica del
     light — radial de color en la esquina superior derecha sobre
     un gradiente de superficie — con el tinte subido de .12 a .16
     porque sobre oscuro un velo de color al 12% no se ve, y el
     interior en un panel apenas teñido en vez de blanco. */
  --hz-card-blue-line: #4D9FFF;
  --hz-card-blue-border: rgba(77, 159, 255, .30);
  --hz-card-blue-bg: radial-gradient(circle at 92% 0, rgba(77, 159, 255, .16), transparent 36%), linear-gradient(145deg, #123A66, #0E3058 64%);
  --hz-card-orange-line: #FF8A4C;
  --hz-card-orange-border: rgba(255, 138, 76, .32);
  --hz-card-orange-bg: radial-gradient(circle at 92% 0, rgba(255, 138, 76, .16), transparent 36%), linear-gradient(145deg, #26355F, #0E3058 64%);
  --hz-card-red-line: #FF8A9E;
  --hz-card-red-border: rgba(255, 138, 158, .32);
  --hz-card-red-bg: radial-gradient(circle at 92% 0, rgba(255, 138, 158, .15), transparent 36%), linear-gradient(145deg, #25325C, #0E3058 64%);
  --hz-card-green-line: #3DDC97;
  --hz-card-green-border: rgba(61, 220, 151, .28);
  --hz-card-green-bg: radial-gradient(circle at 92% 0, rgba(61, 220, 151, .14), transparent 36%), linear-gradient(145deg, #0F3B5E, #0E3058 64%);
  --hz-card-neutral-line: #93A8CC;
  --hz-card-neutral-border: rgba(147, 168, 204, .24);
  --hz-card-neutral-bg: radial-gradient(circle at 92% 0, rgba(147, 168, 204, .12), transparent 36%), linear-gradient(145deg, #183866, #0E3058 64%);
  --hz-card-state-shadow: none;

  /* --- Tokens de cloudbeach.css (el shell). Nombres cortos y
     genericos, del diseñador; se redefinen igual.

     --navy y --navy-deep quedan afuera: son del rail, que no se
     toca. (De paso: cloudbeach.css los declara y despues no los
     consume — no hay un solo var(--navy) en todo el proyecto.) --- */
  --ink: #EAF2FF;
  --muted: #9AADC9;
  --blue: #4D9FFF;
  --blue-2: #7FBAFF;
  --sky: #9DC4FF;
  --surface: #0E3058;
  --page: #011530;
  --line: rgba(148, 184, 255, .16);
  --red: #FF8A9E;
  --orange: #FF8A4C;
  --shadow: 0 8px 24px rgba(0, 0, 0, .55);

  /* --- Tokens de bridge.css. Ya eran oscuros en light (el Bridge
     es una pantalla nocturna de por si), asi que solo se los
     alinea al canvas del tema para que no floten en otro azul. --- */
  --bridge-navy: #011530;
  --bridge-navy-2: #0E3058;
  --bridge-line: rgba(148, 184, 255, .16);
  --bridge-text: #EAF2FF;
  --bridge-muted: #9AADC9;

  /* Atmosfera. Los dos radiales que la hoja vieja ponia sobre el
     canvas para que el negro no fuera plano. */
  --hz-atmo:
    radial-gradient(1200px 420px at 62% -8%, rgba(77, 159, 255, .10), transparent 62%),
    radial-gradient(900px 360px at 30% -6%, rgba(47, 230, 200, .07), transparent 60%);

  color-scheme: dark;
}

/* ============================================================
   2 · SHELL: RAIL, HEADER, CANVAS
   ============================================================ */

[data-theme="dark"] body {
  background-color: var(--hz-canvas);
  color: var(--hz-ink);
}

/* El canvas no es negro plano: lleva los dos radiales de
   atmosfera, fijos, para que el scroll no los arrastre. */
[data-theme="dark"] body::before {
  content: "";
  position: fixed;
  z-index: 0;
  inset: 0;
  background: var(--hz-atmo);
  pointer-events: none;
}

[data-theme="dark"] .app-shell,
[data-theme="dark"] main {
  position: relative;
  z-index: 1;
}

/* ------------------------------------------------------------
   EL RAIL NO SE TOCA

   No hay ni una regla de tema para el rail, y es deliberado: el
   sidebar ya es navy oscuro en modo claro, con texto blanco, el
   faro, el pill azul del activo y las tarjetas de empresa y
   perfil. Es la unica parte del producto que nacio nocturna, asi
   que en modo oscuro se queda EXACTAMENTE igual — no hay dos
   versiones que mantener.

   Lo que habia antes aca (rail en #0A1220, tinta remapeada a
   --hz-ink-*, tarjetas del pie translucidas, faro atenuado al 50%,
   avatar con el degrade profundizado) se saco entero. El rail
   volvia a inventarse una version nocturna de algo que ya era
   nocturno, y quedaba mas apagado que en claro.

   Consecuencia a tener presente: sobre el canvas oscuro el navy
   del rail (#011A3B, lo pone cloudbeach-assets.css) queda a 1.12:1
   del fondo — se distingue por el tinte azul, no por la
   luminancia. En claro esa separacion la hacia la sombra
   `8px 0 26px`, que sobre fondo oscuro no se ve. Si hace falta
   marcar el limite, alcanza con un `border-right` de 1px en
   --hz-line-soft; se saco a proposito para que el rail quede
   identico al claro, como se pidio.

   Tampoco se tocan las piezas del rail plegable que trajo la
   entrega del 2026-08-13 (.sidebar-toggle, los rotulos flotantes,
   el flyout del grupo AI): misma razon, ya estan pintadas sobre
   navy.
   ------------------------------------------------------------ */

/* "No tocar" no alcanza con no escribir reglas: el rail CONSUME
   tokens que el tema si mueve, asi que cambiaba solo. El caso que
   lo delato es .profile-avatar, que hrzn-sidebar.css pinta con
   var(--hz-blue): al aclarar el azul para el contenido, el avatar
   se iba con el, y con las iniciales blancas encima quedaba en
   2.3:1 — peor que en claro.

   La salida no es parchear ese avatar, porque el rail usa mas
   tokens (--hz-sh-* en las tarjetas del pie, --hz-blue tambien en
   el activo del submenu) y el diseñador puede sumar consumos
   nuevos en cualquier entrega. En vez de enumerarlos, el rail se
   declara ISLA DE TEMA CLARO: los tokens vuelven a sus valores de
   modo claro para todo lo que viva adentro. Cualquier regla que
   entre despues los resuelve como en claro sin que haya que
   acordarse de nada.

   Los valores son los del :root de horizon-pages.css, no
   aproximados. Los radios no estan porque no son de color y no
   cambian con el tema. */
[data-theme="dark"] .sidebar {
  --hz-ink: #0A1E46;
  --hz-ink-2: #24365C;
  --hz-ink-3: #3A4A66;
  --hz-ink-4: #55668A;
  --hz-blue: #2450E4;
  --hz-sky: #58A9F4;
  --hz-orange: #F97435;
  --hz-ok: #1FA95C;
  --hz-warn: #F59E0B;
  --hz-bad: #E5484D;
  --hz-ok-ink: #127A45;
  --hz-warn-ink: #A05F02;
  --hz-bad-ink: #C4272C;
  --hz-canvas: #F1F5FB;
  --hz-surface: #FFFFFF;
  --hz-sunken: #EAF0FB;
  --hz-panel-2: #FBFCFE;
  --hz-line: #DCE4F5;
  --hz-line-soft: #E9EEF9;
  --hz-sh-hair: 0 1px 2px rgba(10, 30, 70, .06);
  --hz-sh-soft: 0 10px 28px -14px rgba(10, 30, 70, .20);
  --hz-sh-deep: 0 26px 64px -22px rgba(10, 30, 70, .34);

  /* Y los de cloudbeach.css, por lo mismo. */
  --ink: #071f49;
  --muted: #536b96;
  --blue: #0864ee;
  --blue-2: #2b8bff;
  --sky: #cbe6ff;
  --surface: #fff;
  --page: #f2f6fc;
  --line: #d9e3f0;
  --red: #f1392f;
  --orange: #ff681c;
  --shadow: 0 8px 24px rgba(23, 66, 119, .08);
}

/* El atajo de teclado que salta al contenido. Mismo bug de tema
   que el aviso emergente: cloudbeach.css lo escribe como
   `background: white` con `color: var(--ink)`, y en dark --ink es
   claro. Solo se ve al tabular, asi que no aparece en ninguna
   captura — pero es el primer elemento que toca quien navega con
   teclado. */
[data-theme="dark"] .skip-link {
  color: var(--hz-on-accent);
  background: var(--hz-sky);
}

/* Franja de estado (la barra fina bajo el hero de las paginas
   de skin+pages). */
[data-theme="dark"] .hz-strip {
  color: var(--hz-ink-3);
  background: rgba(6, 34, 64, .94);
  border-bottom: 1px solid var(--hz-line-soft);
}

[data-theme="dark"] .hz-strip b { color: var(--hz-ink-2); }
[data-theme="dark"] .hz-strip small {
  color: var(--hz-ink-3);
  border-left-color: var(--hz-line);
}
[data-theme="dark"] .hz-strip button { color: var(--hz-ink-3); }
[data-theme="dark"] .hz-strip button:hover { color: var(--hz-sky); }

/* ============================================================
   3 · EL HERO SE HACE DE NOCHE

   El hero no es una imagen: es una escena costera dibujada en
   CSS — cielo (.hero-coast), sol (.sunset), agua (.coast-water),
   montañas (.mountains i/b/em) y nubes (.hero-cloud). El dark
   viejo ya tenia la idea, con --sun-opacity como perilla.

   Aca se repinta capa por capa en vez de tirarle un filtro
   encima: un invert/brightness sobre el hero entero tambien
   voltea el texto y la pastilla de utilidad, que son hijos.
   ============================================================ */

/* El cielo: del amanecer celeste-durazno a azul profundo, con el
   horizonte apenas mas claro. */
[data-theme="dark"] .hero-coast {
  background: linear-gradient(178deg, #010F26 0%, #011733 46%, #04264A 74%, #032040 100%);
  border-bottom: 1px solid var(--hz-line-soft);
}

/* La linea de rompiente al pie del hero. */
[data-theme="dark"] .hero-coast::after {
  background:
    repeating-linear-gradient(180deg, rgba(148, 184, 255, .10) 0 1px, transparent 1px 4px),
    linear-gradient(180deg, rgba(4, 38, 74, .72), rgba(1, 21, 48, .88));
}

/* El sol se pone: queda una luna fria y chica, sin el halo
   ambar. Es la misma pieza, no se oculta — el hero perderia su
   punto de fuga. */
[data-theme="dark"] .sunset {
  background: radial-gradient(circle, #EAF2FF 0 35%, rgba(200, 224, 255, .58) 58%, rgba(125, 169, 218, .16) 72%, transparent 73%);
  box-shadow: 0 0 38px rgba(157, 196, 255, .34);
  opacity: .82;
}

[data-theme="dark"] .coast-water {
  background: linear-gradient(180deg, rgba(20, 74, 128, .30), rgba(6, 44, 84, .58));
}

[data-theme="dark"] .coast-water::before {
  background: repeating-linear-gradient(180deg, rgba(148, 184, 255, .16) 0 1px, transparent 1px 3px);
}

/* Las tres cordilleras: mismo escalonado de claro a oscuro que
   el light, corrido a la gama nocturna. */
[data-theme="dark"] .mountains i { background: #0E3A63; }
[data-theme="dark"] .mountains b { background: #092C51; }
[data-theme="dark"] .mountains em { background: #05203D; opacity: .9; }

[data-theme="dark"] .hero-cloud {
  background: rgba(148, 184, 255, .13);
}

/* Texto del hero. */
[data-theme="dark"] .hero-copy > p:first-child { color: var(--hz-ink-3); }
[data-theme="dark"] .hero-copy > p:first-child strong { color: var(--hz-ink); }
[data-theme="dark"] .hero-copy h1,
[data-theme="dark"] .bridge-page .hero-copy h1 { color: var(--hz-ink-2); }
[data-theme="dark"] .bridge-page .hero-copy h1 > span { color: var(--hz-ink); }
[data-theme="dark"] .bridge-page .hero-copy h1 > small { color: var(--hz-ink-2); }
[data-theme="dark"] .hero-sub,
[data-theme="dark"] .bridge-page .hero-sub,
[data-theme="dark"] .bridge-page .hero-copy > p { color: var(--hz-ink-2); }
[data-theme="dark"] .hero-sub strong,
[data-theme="dark"] .bridge-page .hero-sub strong { color: var(--hz-bad); }

/* --- El otro hero: .hz-hero ---
   Las paginas de skin+pages (Insights, Users, Automations,
   Settings, Classic View) no dibujan la costa: la filman. El hero
   es un <video> — o su poster, .hz-hero-still — con dos velos
   claros encima: .hz-hero-wash de izquierda a derecha y un ::after
   que desvanece el pie. Los dos velos se invierten y el video se
   atenua; asi la costa sigue ahi, de noche, en vez de desaparecer.

   Es el fondo claro mas grande del producto (236.000 px² en
   Insights): sin esta regla el saludo, el reloj y el veredicto
   quedan en 1.1:1 — texto claro sobre celeste. */
[data-theme="dark"] .hz-hero {
  background-color: #021B36;
  border-bottom-color: var(--hz-line-soft);
}

[data-theme="dark"] .hz-hero video,
[data-theme="dark"] .hz-hero .hz-hero-still {
  filter: brightness(.42) saturate(.75);
}

[data-theme="dark"] .hz-hero .hz-hero-wash {
  background: linear-gradient(90deg,
    rgba(1, 21, 48, .93) 0%,
    rgba(2, 27, 54, .78) 46%,
    rgba(2, 27, 54, .30) 78%,
    transparent 100%);
}

[data-theme="dark"] .hz-hero::after {
  background: linear-gradient(rgba(1, 21, 48, 0), rgba(1, 21, 48, .88));
}

[data-theme="dark"] .hz-hero-greeting { color: var(--hz-ink); }
[data-theme="dark"] .hz-hero-headline em { color: var(--hz-ink-2); }
[data-theme="dark"] .hz-hero-signals { color: var(--hz-ink-3); }
[data-theme="dark"] .hz-hero-signals span + span::before { background: rgba(148, 184, 255, .30); }
[data-theme="dark"] .hz-hero-signals i { box-shadow: 0 0 0 4px rgba(61, 220, 151, .16); }

/* La pastilla de utilidad flota sobre la escena: en light es
   blanco translucido con blur, en dark el mismo vidrio pero
   oscuro. Aca la sombra SI queda, es lo unico que la separa.
   .hz-utility es la de skin+pages; .utility-pill la del Bridge. */
[data-theme="dark"] .hz-utility,
[data-theme="dark"] .utility-pill,
[data-theme="dark"] .bridge-page .utility-pill {
  color: var(--hz-ink-2);
  background: rgba(14, 48, 88, .82);
  border: 1px solid var(--hz-line);
  box-shadow: var(--hz-sh-deep);
}

[data-theme="dark"] .utility-pill b,
[data-theme="dark"] .bridge-page .utility-pill b,
[data-theme="dark"] .bridge-page .period-button b,
[data-theme="dark"] .bridge-page .clock-state b {
  color: var(--hz-ink);
}

[data-theme="dark"] .hz-utility .hz-rule,
[data-theme="dark"] .utility-rule { background: var(--hz-line); }

[data-theme="dark"] .hz-clock b { color: var(--hz-ink); }
[data-theme="dark"] .hz-clock small,
[data-theme="dark"] .hz-viewers small { color: var(--hz-ink-3); }
[data-theme="dark"] .hz-period { color: var(--hz-ink-2); }

[data-theme="dark"] .live-state { color: var(--hz-ink-2); }
[data-theme="dark"] .live-state span,
[data-theme="dark"] .hz-live span {
  background: var(--hz-ok);
  box-shadow: 0 0 0 7px rgba(61, 220, 151, .12);
}

/* Los avatares apilados: el aro que los separa entre si es del
   color de la superficie que tienen debajo, no blanco. */
[data-theme="dark"] .hz-viewers > span,
[data-theme="dark"] .viewers > span {
  color: var(--hz-on-accent);
  background: var(--hz-blue);
  border-color: var(--hz-surface);
}

/* ============================================================
   4 · SUPERFICIES: TARJETAS, PANELES, KPI
   ============================================================ */

[data-theme="dark"] .hz-panel,
[data-theme="dark"] .hz-card,
[data-theme="dark"] .card,
[data-theme="dark"] .hz-sheet {
  color: var(--hz-ink);
  background:
    linear-gradient(180deg, rgba(255, 255, 255, .022), rgba(255, 255, 255, 0)),
    var(--hz-surface);
  border-color: var(--hz-line-soft);
  box-shadow: none;
}

[data-theme="dark"] .hz-panel__head,
[data-theme="dark"] .hz-panel-head,
[data-theme="dark"] .hz-panel > header {
  border-bottom-color: var(--hz-line-soft);
}

[data-theme="dark"] .hz-lede,
[data-theme="dark"] .hz-sub,
[data-theme="dark"] .hz-meta,
[data-theme="dark"] .hz-note,
[data-theme="dark"] .hz-foot {
  color: var(--hz-ink-3);
}

[data-theme="dark"] .hz-eyebrow,
[data-theme="dark"] .hz-kicker,
[data-theme="dark"] .hz-stamp {
  color: var(--hz-ink-4);
}

[data-theme="dark"] .hz-h1,
[data-theme="dark"] .hz-h2,
[data-theme="dark"] .hz-h3,
[data-theme="dark"] .hz-title,
[data-theme="dark"] h1,
[data-theme="dark"] h2,
[data-theme="dark"] h3,
[data-theme="dark"] h4 {
  color: var(--hz-ink);
}

/* KPI. El light los tiñe con un radial de color al 6% sobre
   blanco; en dark el blanco se cambia por el panel y el tinte
   sube, porque el 6% sobre #0E3058 no se distingue. */
[data-theme="dark"] .hz-kpi {
  color: var(--hz-ink);
  background: var(--hz-surface);
  border-color: var(--hz-line-soft);
}

[data-theme="dark"] .hz-kpi.is-lead { background: linear-gradient(155deg, rgba(77, 159, 255, .14) 0%, var(--hz-surface) 62%); }
[data-theme="dark"] .hz-kpi.is-warn { background: linear-gradient(160deg, rgba(255, 178, 36, .13) 0%, var(--hz-surface) 62%); }
[data-theme="dark"] .hz-kpi.is-bad { background: linear-gradient(160deg, rgba(255, 138, 158, .13) 0%, var(--hz-surface) 62%); }
[data-theme="dark"] .hz-kpi.is-ok { background: linear-gradient(160deg, rgba(61, 220, 151, .12) 0%, var(--hz-surface) 62%); }

[data-theme="dark"] .hz-kpi b,
[data-theme="dark"] .hz-kpi strong,
[data-theme="dark"] .hz-kpi .hz-kpi__value { color: var(--hz-ink); }
[data-theme="dark"] .hz-kpi small,
[data-theme="dark"] .hz-kpi span { color: var(--hz-ink-3); }

/* El hover que levanta la tarjeta clickeable: en dark no se
   levanta con sombra (no hay fondo claro donde proyectarla) sino
   aclarando el panel y el borde. */
[data-theme="dark"] a.hz-kpi:hover,
[data-theme="dark"] a.hz-panel:hover {
  background: var(--hz-panel-2);
  border-color: rgba(148, 184, 255, .30);
  box-shadow: none;
}

/* Bandejas hundidas. */
[data-theme="dark"] .hz-tray,
[data-theme="dark"] .hz-sunken,
[data-theme="dark"] .hz-well {
  background: var(--hz-sunken);
  border-color: var(--hz-line-soft);
}

/* --- La superficie interior ---
   El sistema tiene una tercera profundidad para "panel dentro de
   panel", que en light es #FBFCFE (un blanco apenas frio sobre el
   blanco puro de la tarjeta). Aparece con seis nombres distintos
   porque cada pantalla la bautizo a su modo, pero es la misma cosa:
   .hz-subcard en el kit, y .ev-in (Insights), .team-card (Users),
   .rule-history-in (Automations), .intg (Settings) y .cv-panel-in
   (Classic View) en los <style> de cada pagina.

   En dark no puede ir mas clara que la tarjeta ni igual: se
   perderia el escalon. Va a --hz-panel-2, un paso arriba. */
[data-theme="dark"] .hz-subcard,
[data-theme="dark"] .ev-in,
[data-theme="dark"] .team-card,
[data-theme="dark"] .rule-history-in,
[data-theme="dark"] .intg,
[data-theme="dark"] .cv-panel-in {
  background: var(--hz-panel-2);
  border-color: var(--hz-line-soft);
  box-shadow: none;
}

[data-theme="dark"] .hz-subcard-foot { border-top-color: var(--hz-line-soft); }

/* ============================================================
   5 · CONTROLES: BOTONES, PILLS, INPUTS, TABLAS
   ============================================================ */

[data-theme="dark"] .hz-btn,
[data-theme="dark"] .hz-iconbtn {
  color: var(--hz-ink-2);
  background: rgba(255, 255, 255, .03);
  border-color: var(--hz-line);
}

[data-theme="dark"] .hz-btn:hover,
[data-theme="dark"] .hz-iconbtn:hover {
  color: var(--hz-ink);
  background: rgba(255, 255, 255, .06);
  box-shadow: none;
}

[data-theme="dark"] .hz-btn.is-primary {
  color: #06121C;
  background: var(--hz-blue);
  border-color: var(--hz-blue);
}

[data-theme="dark"] .hz-btn.is-primary:hover {
  background: #7FBAFF;
  border-color: #7FBAFF;
}

[data-theme="dark"] .hz-btn.is-danger {
  color: var(--hz-bad);
  background: rgba(255, 138, 158, .12);
  border-color: rgba(255, 138, 158, .30);
}

[data-theme="dark"] .hz-btn.is-danger:hover { background: rgba(255, 138, 158, .20); }

/* Pills de filtro. */
[data-theme="dark"] .hz-pill,
[data-theme="dark"] .hz-switchbar > button,
[data-theme="dark"] .hz-seg > button,
[data-theme="dark"] .set-seg > button {
  color: var(--hz-ink-3);
  background: transparent;
  border-color: var(--hz-line);
}

[data-theme="dark"] .hz-pill:hover,
[data-theme="dark"] .hz-switchbar > button:hover,
[data-theme="dark"] .hz-seg > button:hover,
[data-theme="dark"] .set-seg > button:hover {
  color: var(--hz-ink);
  background: rgba(255, 255, 255, .05);
}

/* Ojo con el segmento de Settings: su activo es .is-on, no
   .is-active como el resto del sistema. */
[data-theme="dark"] .hz-pill.is-active,
[data-theme="dark"] .hz-switchbar > button.is-active,
[data-theme="dark"] .hz-seg > button.is-active,
[data-theme="dark"] .set-seg > button.is-active,
[data-theme="dark"] .set-seg > button.is-on,
[data-theme="dark"] .hz-pill[aria-pressed="true"] {
  color: #06121C;
  background: var(--hz-blue);
  border-color: var(--hz-blue);
}

[data-theme="dark"] .hz-pillbar,
[data-theme="dark"] .hz-switchbar,
[data-theme="dark"] .hz-controlbar {
  background: var(--hz-sunken);
  border-color: var(--hz-line);
}

/* El activo de los segmentos lleva tinta oscura, no blanca: su
   relleno es --hz-blue, que en dark es claro. */
[data-theme="dark"] .hz-switchbar button.is-active,
[data-theme="dark"] .set-seg button.is-on,
[data-theme="dark"] .finops-range-switch button.is-active {
  color: var(--hz-on-accent) !important;
  background: var(--hz-blue);
}

/* La barra de control (el bloque de filtros de cada pantalla): en
   light es un vidrio casi blanco. */
[data-theme="dark"] .hz-control {
  background: linear-gradient(135deg, var(--hz-panel-2), var(--hz-surface));
  border-color: var(--hz-line-soft);
  box-shadow: none;
}

[data-theme="dark"] .hz-control-title strong { color: var(--hz-ink); }
[data-theme="dark"] .hz-control-title small,
[data-theme="dark"] .hz-field > span,
[data-theme="dark"] .hz-formfield label { color: var(--hz-ink-3); }

/* El chevron de los <select> viene como SVG embebido en un data:
   URI, con el trazo pintado en #3A4A66 — invisible sobre oscuro.
   Se reemplaza la URI entera; no hay forma de tocar solo el color. */
[data-theme="dark"] .hz-field select,
[data-theme="dark"] .hz-select {
  color: var(--hz-ink);
  background: rgba(255, 255, 255, .03) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239AADC9' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") no-repeat right 8px center / 13px;
  border-color: var(--hz-line);
  box-shadow: none;
}

/* El interruptor: en light el riel es --hz-sunken y la perilla
   --hz-surface. En dark esos dos valores estan a 3 puntos de
   luminancia uno del otro, asi que la perilla desaparece. Se la
   sube a tinta clara, que es lo que la hace legible como perilla. */
[data-theme="dark"] .hz-switch {
  background: var(--hz-sunken);
  border-color: var(--hz-line);
}

[data-theme="dark"] .hz-switch::after {
  background: var(--hz-ink-3);
  box-shadow: none;
}

[data-theme="dark"] .hz-switch.is-on {
  background: var(--hz-ok);
  border-color: var(--hz-ok);
}

[data-theme="dark"] .hz-switch.is-on::after { background: var(--hz-on-accent); }

/* Inputs. */
[data-theme="dark"] .hz-input,
[data-theme="dark"] .hz-select,
[data-theme="dark"] .hz-search,
[data-theme="dark"] input[type="text"],
[data-theme="dark"] input[type="search"],
[data-theme="dark"] input[type="email"],
[data-theme="dark"] input[type="number"],
[data-theme="dark"] select,
[data-theme="dark"] textarea {
  color: var(--hz-ink);
  background: rgba(255, 255, 255, .03);
  border-color: var(--hz-line);
}

[data-theme="dark"] .hz-input::placeholder,
[data-theme="dark"] input::placeholder,
[data-theme="dark"] textarea::placeholder {
  color: var(--hz-ink-4);
}

/* El foco. El anillo del light es rgba(88,169,244,.32); sobre
   oscuro necesita mas opacidad para leerse. */
[data-theme="dark"] .hz-btn:focus-visible,
[data-theme="dark"] .hz-iconbtn:focus-visible,
[data-theme="dark"] .hz-pill:focus-visible,
[data-theme="dark"] .hz-input:focus-visible,
[data-theme="dark"] .hz-select:focus-visible,
[data-theme="dark"] .hz-search:focus-visible,
[data-theme="dark"] a.hz-kpi:focus-visible,
[data-theme="dark"] .hz-viewswitch > a:focus-visible {
  box-shadow: 0 0 0 3px rgba(127, 186, 255, .52);
}

[data-theme="dark"] button:focus-visible,
[data-theme="dark"] a:focus-visible,
[data-theme="dark"] input:focus-visible {
  outline-color: rgba(127, 186, 255, .62);
}

/* Tablas. */
[data-theme="dark"] .hz-table { color: var(--hz-ink-2); }

[data-theme="dark"] .hz-table thead th {
  color: var(--hz-ink-4);
  background: var(--hz-sunken);
  border-bottom-color: var(--hz-line-soft);
}

[data-theme="dark"] .hz-table tbody td,
[data-theme="dark"] .hz-table tbody th {
  border-bottom-color: var(--hz-line-soft);
}

[data-theme="dark"] .hz-table tbody tr:hover { background: rgba(255, 255, 255, .035); }
[data-theme="dark"] .hz-table tbody tr:nth-child(even) { background: transparent; }
[data-theme="dark"] .hz-table b,
[data-theme="dark"] .hz-table strong { color: var(--hz-ink); }

/* Filas marcadas de Users y la cabecera del Classic View: en light
   son lavados azul palido. */
[data-theme="dark"] .hz-table tbody tr.is-flagged {
  background: linear-gradient(90deg, rgba(77, 159, 255, .14), transparent 62%);
}

[data-theme="dark"] .hz-table tbody tr.is-focus { background: rgba(77, 159, 255, .16); }
[data-theme="dark"] .cv-head:hover { background: rgba(255, 255, 255, .04); }

/* Los avatares de iniciales van sobre un relleno semantico
   (--hz-ok-ink y compañia). En light ese relleno es oscuro y las
   iniciales van blancas; en dark el relleno se aclara y el blanco
   encima cae a 2.7:1. Se invierte la tinta. */
[data-theme="dark"] .u-avatar,
[data-theme="dark"] .op-avatar {
  color: var(--hz-on-accent);
}

[data-theme="dark"] .team-stack .u-avatar,
[data-theme="dark"] .team-stack .more {
  border-color: var(--hz-panel-2);
}

/* Barras y rieles de progreso. */
[data-theme="dark"] .hz-bar,
[data-theme="dark"] .hz-track,
[data-theme="dark"] .hz-meter {
  background: rgba(148, 184, 255, .10);
}

[data-theme="dark"] hr,
[data-theme="dark"] .hz-rule,
[data-theme="dark"] .hz-divider {
  border-color: var(--hz-line-soft);
  background: var(--hz-line-soft);
}

/* El switch de vista Bridge <-> Classic (hoja nuestra). */
[data-theme="dark"] .hz-viewswitch {
  background: rgba(14, 48, 88, .78);
  border-color: var(--hz-line);
  box-shadow: 0 1px 2px rgba(0, 0, 0, .34);
}

[data-theme="dark"] .hz-viewswitch > a { color: var(--hz-ink-3); }
[data-theme="dark"] .hz-viewswitch > a:hover { color: var(--hz-sky); background: rgba(255, 255, 255, .06); }
[data-theme="dark"] .hz-viewswitch > a.is-active,
[data-theme="dark"] .hz-viewswitch > a.is-active:hover {
  color: #06121C;
  background: var(--hz-blue);
}

/* ============================================================
   6 · ESTADOS Y BADGES

   Los badges del light son texto oscuro (--hz-*-ink, calculado
   sobre blanco) sobre un velo del color al 10%. En dark el texto
   pasa a ser el color pleno y el velo sube a .14.
   ============================================================ */

[data-theme="dark"] .hz-badge {
  color: var(--hz-ink-3);
  background: rgba(148, 184, 255, .10);
}

[data-theme="dark"] .hz-badge.is-ok { color: var(--hz-ok); background: rgba(61, 220, 151, .14); }
[data-theme="dark"] .hz-badge.is-warn { color: var(--hz-warn); background: rgba(255, 178, 36, .14); }
[data-theme="dark"] .hz-badge.is-bad { color: var(--hz-bad); background: rgba(255, 138, 158, .14); }
[data-theme="dark"] .hz-badge.is-blue { color: var(--hz-sky); background: rgba(77, 159, 255, .14); }

[data-theme="dark"] .hz-tag,
[data-theme="dark"] .hz-chip {
  color: #9DC4FF;
  background: rgba(77, 159, 255, .10);
  border-color: rgba(77, 159, 255, .20);
}

[data-theme="dark"] .hz-hero .hz-verdict.is-warn { color: var(--hz-warn); }
[data-theme="dark"] .hz-hero .hz-verdict.is-bad { color: var(--hz-bad); }
[data-theme="dark"] .hz-hero .hz-verdict.is-ok { color: var(--hz-ok); }

/* Los puntos de estado laten (cloudbeach-assets.css). El halo
   del light es del color al 12-14%; en dark se mantiene, que es
   lo que la hoja vieja hacia con --glow-*. */
[data-theme="dark"] .hz-strip.is-ok i { box-shadow: 0 0 0 4px rgba(61, 220, 151, .16); }
[data-theme="dark"] .hz-strip.is-warn i { box-shadow: 0 0 0 4px rgba(255, 178, 36, .18); }
[data-theme="dark"] .hz-strip.is-bad i { box-shadow: 0 0 0 4px rgba(255, 138, 158, .18); }

/* ============================================================
   7 · CAPA COCKPIT (horizon-skin.css)

   horizon-skin.css no estiliza componentes propios: reviste las
   clases utilitarias tipo Tailwind que trae el build del cockpit
   (.bg-white, .text-slate-*, .border-sky-200, …) y lo hace casi
   todo con !important. Por eso esta seccion tambien lo usa: es
   la unica forma de ganarle sin subir la especificidad a mano.
   ============================================================ */

[data-theme="dark"] .bg-white,
[data-theme="dark"] .bg-white\/80,
[data-theme="dark"] .bg-white\/90,
[data-theme="dark"] .bg-white\/95 {
  background-color: var(--hz-surface) !important;
}

[data-theme="dark"] .bg-slate-50,
[data-theme="dark"] .bg-slate-50\/80,
[data-theme="dark"] .bg-slate-100 {
  background-color: var(--hz-sunken) !important;
}

[data-theme="dark"] .bg-slate-800,
[data-theme="dark"] .bg-slate-900 {
  background-color: var(--hz-panel-2) !important;
}

[data-theme="dark"] .text-slate-900,
[data-theme="dark"] .text-slate-800 { color: var(--hz-ink) !important; }
[data-theme="dark"] .text-slate-700,
[data-theme="dark"] .text-slate-600 { color: var(--hz-ink-2) !important; }
[data-theme="dark"] .text-slate-500 { color: var(--hz-ink-3) !important; }
[data-theme="dark"] .text-slate-400 { color: var(--hz-ink-4) !important; }
[data-theme="dark"] .navigation-helm-bar .text-slate-300 { color: var(--hz-ink-3) !important; }
[data-theme="dark"] .navigation-helm-bar .text-slate-200 { color: var(--hz-ink-2) !important; }

[data-theme="dark"] .border-slate-200,
[data-theme="dark"] .border-slate-300,
[data-theme="dark"] .border-sky-200,
[data-theme="dark"] .border-sky-200\/80,
[data-theme="dark"] .border-sky-200\/90,
[data-theme="dark"] .border-violet-200,
[data-theme="dark"] .border-purple-200 {
  border-color: var(--hz-line) !important;
}

[data-theme="dark"] .bg-emerald-50 { background-color: rgba(61, 220, 151, .14) !important; }
[data-theme="dark"] .border-emerald-200,
[data-theme="dark"] .border-emerald-300 { border-color: rgba(61, 220, 151, .30) !important; }
[data-theme="dark"] .text-emerald-700,
[data-theme="dark"] .text-emerald-600 { color: var(--hz-ok) !important; }

[data-theme="dark"] .bg-amber-50 { background-color: rgba(255, 178, 36, .14) !important; }
[data-theme="dark"] .border-amber-200,
[data-theme="dark"] .border-amber-300 { border-color: rgba(255, 178, 36, .32) !important; }
[data-theme="dark"] .text-amber-700,
[data-theme="dark"] .text-amber-600 { color: var(--hz-warn) !important; }

[data-theme="dark"] .bg-rose-50,
[data-theme="dark"] .bg-rose-50\/90 { background-color: rgba(255, 138, 158, .14) !important; }
[data-theme="dark"] .border-rose-200,
[data-theme="dark"] .border-rose-200\/90,
[data-theme="dark"] .border-rose-300 { border-color: rgba(255, 138, 158, .30) !important; }
[data-theme="dark"] .text-rose-700,
[data-theme="dark"] .text-rose-600 { color: var(--hz-bad) !important; }

[data-theme="dark"] .bg-sky-50,
[data-theme="dark"] .bg-sky-100 { background-color: rgba(77, 159, 255, .12) !important; }
[data-theme="dark"] .text-sky-700,
[data-theme="dark"] .text-sky-600 { color: var(--hz-sky) !important; }

/* FinOps. El hero del cockpit y las tarjetas de estado; los
   valores del light estan con !important en la hoja del
   diseñador, asi que se repiten aca. */
[data-theme="dark"] .finops-hero { background-color: #021B36 !important; }
[data-theme="dark"] .finops-kpi--projected { background: linear-gradient(160deg, rgba(255, 138, 158, .13) 0%, var(--hz-surface) 62%) !important; }
[data-theme="dark"] .finops-kpi--watch { background: linear-gradient(160deg, rgba(255, 178, 36, .13) 0%, var(--hz-surface) 62%) !important; }
[data-theme="dark"] .systems-load-card { background: var(--hz-surface) !important; }
[data-theme="dark"] .finops-range-switch button.is-active { color: #06121C !important; }

/* El plotter dibuja con atributos de color en el SVG; la hoja
   del diseñador ya los remapea a tokens, asi que el cambio de
   token lo arrastra. Lo unico propio es el fondo de la grilla. */
[data-theme="dark"] .chartplotter-svg rect[fill="#e4edf7"] { fill: var(--hz-sunken); }
[data-theme="dark"] .chartplotter-svg line[stroke="#c4d6e9"],
[data-theme="dark"] .chartplotter-svg line[stroke="#bcd0e6"] { stroke: rgba(148, 184, 255, .22); }

/* El radar de riesgo ya tiene modo oscuro propio en la hoja del
   diseñador (.radar-risk-map.is-dark). En tema dark se fuerza
   ese modo para las dos variantes, asi el mapa no queda claro
   dentro de una pagina oscura. */
[data-theme="dark"] .radar-risk-map:not(.is-dark) {
  border-color: rgba(88, 169, 244, .55) !important;
  background:
    radial-gradient(circle at 50% 50%, rgba(64, 164, 255, .18) 0 7%, transparent 8%),
    radial-gradient(circle at 50% 50%, #0B3567 0%, #082952 55%, #051D40 100%) !important;
}

[data-theme="dark"] .radar-risk-map:not(.is-dark) .radar-scale-key span,
[data-theme="dark"] .radar-risk-map:not(.is-dark) .radar-axis-caption {
  color: rgba(205, 229, 255, .70);
}

/* Las tarjetas de la bandeja de carga: el light las pone en
   #F5F9FF con !important. */
[data-theme="dark"] .systems-load-card .load-row,
[data-theme="dark"] .load-item {
  background: var(--hz-panel-2) !important;
  border-color: var(--hz-line-soft) !important;
}

/* ------------------------------------------------------------
   7b · EL COCKPIT REESTRUCTURADO (entrega del 2026-08-13)

   horizon-skin.css paso de 43 a 99KB y cierra con el bloque
   "ALINEACION CON EL SISTEMA DE USERS", que revierte a proposito
   las capas animadas, la foto de fondo y el vidrio de las cards,
   y deja el cockpit en superficies planas y opacas. Ese bloque va
   ultimo en su hoja y gana por orden — asi que es EL que hay que
   invertir; los bloques de vidrio que quedaron arriba ya no
   pintan nada.

   Lo bueno es que saco cuatro tokens (--u-page, --u-surface,
   --u-line, --u-shadow), y redefinirlos cubre la pagina, el
   spend feed, la barra de control, los filtros y todas las
   cards de un golpe. Lo que queda debajo son los literales que
   ese bloque escribio a mano, todos con !important.
   ------------------------------------------------------------ */

html[data-theme="dark"] {
  --u-page: #011530;
  --u-surface: #0E3058;
  --u-line: rgba(148, 184, 255, .16);
  --u-shadow: none;
}

/* El bloque apaga las capas animadas con content:none y fija el
   fondo de pagina; aca solo se corrige el color, no se reviven.
   Ojo con el primer selector: el atributo del tema vive EN <html>,
   asi que va pegado (html[data-theme]) y no como descendiente —
   `[data-theme="dark"] html` no matchea nunca. */
html[data-theme="dark"]:has(.finops-dashboard),
[data-theme="dark"] .finops-dashboard {
  background-color: var(--hz-canvas) !important;
}

/* El hero del cockpit: mismo tratamiento que .hz-hero, porque es
   la misma escena filmada. El <video> se atenua y los dos velos
   se invierten — sus gradientes son inline en el HTML del dump de
   React, asi que se los pisa por selector de posicion. */
[data-theme="dark"] .finops-dashboard .finops-hero {
  background-color: #021B36 !important;
}

[data-theme="dark"] .finops-hero video {
  filter: brightness(.42) saturate(.75);
}

[data-theme="dark"] .finops-hero > div[class*="absolute inset-0"],
[data-theme="dark"] .finops-hero > div[class*="absolute inset-x-0"] {
  background: linear-gradient(90deg,
    rgba(1, 21, 48, .93) 0%,
    rgba(2, 27, 54, .78) 46%,
    rgba(2, 27, 54, .30) 78%,
    transparent 100%) !important;
}

[data-theme="dark"] .finops-hero > div[class*="bottom-0"] {
  background: linear-gradient(rgba(1, 21, 48, 0), rgba(1, 21, 48, .88)) !important;
}

/* La tira de telemetria y el feed de gasto: bandas de chrome. */
[data-theme="dark"] .finops-dashboard .finops-feedback-strip {
  background: rgba(6, 34, 64, .94) !important;
  border-bottom-color: var(--hz-line-soft) !important;
}

[data-theme="dark"] .finops-dashboard .finops-spend-feed {
  background: var(--hz-surface) !important;
  border-color: var(--hz-line-soft) !important;
}

/* Barra de control y sus piezas. */
[data-theme="dark"] .finops-dashboard .finops-control-bar {
  background: linear-gradient(135deg, var(--hz-panel-2), var(--hz-surface)) !important;
  border-color: var(--hz-line-soft) !important;
  box-shadow: none !important;
}

[data-theme="dark"] .finops-dashboard .finops-range-switch {
  background: var(--hz-sunken) !important;
  border-color: var(--hz-line) !important;
}

[data-theme="dark"] .finops-dashboard .finops-filter-field select,
[data-theme="dark"] .finops-dashboard .finops-filter-reset {
  color: var(--hz-ink) !important;
  background: rgba(255, 255, 255, .03) !important;
  border-color: var(--hz-line) !important;
}

/* Las KPI conservan su tinte de categoria; lo que cambia es el
   blanco opaco en que resolvian al 62%. */
[data-theme="dark"] .finops-dashboard .finops-kpi--projected {
  background-image: linear-gradient(155deg, rgba(255, 138, 158, .13) 0%, var(--hz-surface) 62%) !important;
}
[data-theme="dark"] .finops-dashboard .finops-kpi--secondary {
  background-image: linear-gradient(155deg, rgba(77, 159, 255, .13) 0%, var(--hz-surface) 62%) !important;
}
[data-theme="dark"] .finops-dashboard .finops-kpi--watch {
  background-image: linear-gradient(155deg, rgba(255, 178, 36, .13) 0%, var(--hz-surface) 62%) !important;
}

[data-theme="dark"] .finops-dashboard .chartplotter-card,
[data-theme="dark"] .finops-dashboard .spend-radar-card,
[data-theme="dark"] .finops-dashboard .systems-load-panel,
[data-theme="dark"] .finops-dashboard .systems-load-card,
[data-theme="dark"] .finops-dashboard .budgets-panel {
  background-color: var(--hz-surface) !important;
  border-color: var(--hz-line-soft) !important;
  box-shadow: none !important;
}

[data-theme="dark"] .finops-dashboard .finops-kpi {
  border-color: var(--hz-line-soft) !important;
  box-shadow: none !important;
}

/* La pastilla del reloj, la unica excepcion de vidrio que el
   bloque se permite. Conserva el blur; cambia el vidrio. */
[data-theme="dark"] .finops-dashboard .finops-hero .utility-pill {
  background: rgba(14, 48, 88, .82) !important;
  border-color: var(--hz-line) !important;
  box-shadow: var(--hz-sh-deep) !important;
}

/* ------------------------------------------------------------
   7c · EL RAIL PLEGABLE (entrega del 2026-08-13) — SIN REGLAS

   hrzn-sidebar.css triplico de tamaño: el rail se plega y el
   estado vive en html[data-sidebar]. Trajo tres piezas nuevas —
   .sidebar-toggle, los rotulos flotantes del rail angosto y el
   flyout del grupo AI — y ninguna lleva regla de tema, por lo
   mismo que el resto del rail: ya estan pintadas sobre navy.

   Los rotulos y el flyout son el unico caso discutible, porque
   salen del borde y flotan sobre el canvas. Se dejan como en
   claro igual: son parte del rail y la consistencia con el resto
   del bloque pesa mas que ajustarlos al fondo que tienen detras.

   La tormenta del faro (hrzn-storm.js) dibuja en un canvas con
   estilos inline y no toca CSS: lluvia y relampagos sobre una
   escena nocturna funcionan tal cual, sin traducir nada.
   ------------------------------------------------------------ */

/* ============================================================
   8 · PAGINAS: ADOPTION, SCORE, SCORE-CONFIG
   ============================================================ */

/* --- AI Adoption --- */
[data-theme="dark"] .adoption-main {
  background: var(--hz-canvas);
  scrollbar-color: #24365C var(--hz-sunken);
}

[data-theme="dark"] .adoption-main::-webkit-scrollbar-track { background: var(--hz-sunken); }
[data-theme="dark"] .adoption-main::-webkit-scrollbar-thumb {
  background: #24365C;
  border-color: var(--hz-sunken);
}

/* El hero de Adoption si es una foto (hrzn-header-coast.png) con
   un velo claro encima. El velo se oscurece y la foto se apaga:
   asi la costa sigue ahi, de noche. */
[data-theme="dark"] .adoption-hero {
  background-color: #021B36;
  border-bottom-color: var(--hz-line-soft);
}

[data-theme="dark"] .adoption-hero > img,
[data-theme="dark"] .adoption-hero::before {
  filter: brightness(.42) saturate(.72);
}

[data-theme="dark"] .adoption-hero__veil { background: rgba(1, 21, 48, .62); }
[data-theme="dark"] .adoption-hero::after { background: rgba(1, 21, 48, .84); }

[data-theme="dark"] .adoption-hero__signals { color: var(--hz-ink-2); }
[data-theme="dark"] .adoption-hero__signals span + span::before { background: rgba(148, 184, 255, .28); }

[data-theme="dark"] .adoption-utility {
  color: var(--hz-ink-2);
  background: rgba(14, 48, 88, .88);
  border-color: var(--hz-line);
}

[data-theme="dark"] .adoption-viewers span {
  border-color: var(--hz-surface);
  color: #06121C;
}

[data-theme="dark"] .adoption-card,
[data-theme="dark"] .adoption-panel,
[data-theme="dark"] .adoption-team-card,
[data-theme="dark"] .adoption-band {
  color: var(--hz-ink);
  background: var(--hz-surface);
  border-color: var(--hz-line-soft);
  box-shadow: none;
}

[data-theme="dark"] .adoption-team-card:hover {
  background: var(--hz-panel-2);
  border-color: rgba(148, 184, 255, .30);
}

[data-theme="dark"] .adoption-live-feed,
[data-theme="dark"] .adoption-feed {
  background: var(--hz-sunken);
  border-color: var(--hz-line-soft);
}

/* Tinta sobre acento por HERENCIA. generar-dark-ai.pl invierte la
   tinta cuando la misma regla pinta el texto y el relleno, pero no
   cuando el color baja del padre y el fondo lo pone el hijo: son dos
   reglas distintas y desde el CSS no se ve la relacion. Son tres
   casos en todo el producto y van a mano.

   El badge del launcher de Horizon hereda color:#fff del boton y su
   relleno es var(--hz-blue), que en dark es claro. */
[data-theme="dark"] .adoption-guide__launcher > i,
[data-theme="dark"] .score-guide__launcher > i {
  color: var(--hz-on-accent);
}

/* La barra de bandas del score son tres celdas de color pleno con la
   tinta heredada del contenedor. La del medio ya trae su propia
   tinta oscura (#3E2A00) porque el ambar siempre fue claro; las
   otras dos la necesitan ahora que el coral y el verde tambien lo
   son. */
[data-theme="dark"] .score-band-preview span:nth-child(1),
[data-theme="dark"] .score-band-preview span:nth-child(3) {
  color: var(--hz-on-accent);
}

/* --- AI Score y su configuracion --- */
[data-theme="dark"] .score-main { background: var(--hz-canvas); }

[data-theme="dark"] .score-hero {
  background-color: #021B36;
  border-bottom-color: var(--hz-line-soft);
}

[data-theme="dark"] .score-card,
[data-theme="dark"] .score-panel,
[data-theme="dark"] .score-subject,
[data-theme="dark"] .score-measurement-table,
[data-theme="dark"] .score-objective {
  color: var(--hz-ink);
  background: var(--hz-surface);
  border-color: var(--hz-line-soft);
  box-shadow: none;
}

[data-theme="dark"] .score-subject__button { color: var(--hz-ink-2); }
[data-theme="dark"] .score-subject:hover,
[data-theme="dark"] .score-subject.is-active {
  background: var(--hz-panel-2);
  border-color: rgba(148, 184, 255, .30);
}

[data-theme="dark"] .score-live-rail,
[data-theme="dark"] .score-tray {
  background: var(--hz-sunken);
  border-color: var(--hz-line-soft);
}

[data-theme="dark"] .score-measurement-table thead th {
  color: var(--hz-ink-4);
  background: var(--hz-sunken);
}

[data-theme="dark"] .score-measurement-table td,
[data-theme="dark"] .score-measurement-table th {
  border-color: var(--hz-line-soft);
}

/* ============================================================
   9 · BRIDGE

   El Bridge ya era una pantalla nocturna en light, asi que no se
   invierte: se lo alinea al canvas del tema para que el iframe no
   sea un rectangulo de otro azul dentro de la pagina.
   ============================================================ */

[data-theme="dark"] .bridge-page .antigravity-frame,
[data-theme="dark"] .antigravity-host,
[data-theme="dark"] .bridge-main {
  background: var(--hz-canvas);
}

[data-theme="dark"] .bridge-shell,
[data-theme="dark"] .bridge-panel {
  background: var(--hz-surface);
  border-color: var(--hz-line-soft);
}

/* ============================================================
   10 · FLOTANTES: MODALES, MENUS, BOT

   Lo unico del sistema que conserva sombra fuerte, porque es lo
   unico que de verdad esta por encima de la pagina.
   ============================================================ */

[data-theme="dark"] .hz-modal,
[data-theme="dark"] .hz-dialog,
[data-theme="dark"] dialog,
[data-theme="dark"] .modal-card {
  color: var(--hz-ink);
  background: var(--hz-surface);
  border: 1px solid var(--hz-line);
  box-shadow: 0 30px 100px rgba(0, 0, 0, .78);
}

[data-theme="dark"] .hz-scrim,
[data-theme="dark"] .modal-scrim,
[data-theme="dark"] dialog::backdrop {
  background: rgba(1, 10, 26, .72);
}

/* El velo de las pantallas de skin+pages es rgba(10,30,70,.28):
   un azul claro al 28% que sobre el canvas oscuro casi no oscurece
   nada, y el panel de atras se sigue leyendo through. */
[data-theme="dark"] .hz-overlay { background: rgba(1, 10, 26, .66); }

/* El aviso emergente traia un bug de tema, no de contraste: su
   receta es `color:#fff` sobre `background: var(--hz-ink)`. En dark
   --hz-ink es #EAF2FF, asi que quedaba blanco sobre blanco —
   ilegible del todo. Pasa a panel elevado con borde, que es como
   se resuelve el resto de lo que flota en este tema. */
[data-theme="dark"] .hz-toast {
  color: var(--hz-ink);
  background: var(--hz-panel-2);
  border: 1px solid var(--hz-line);
  box-shadow: 0 18px 46px rgba(0, 0, 0, .70);
}

/* El cajon lateral. */
[data-theme="dark"] .hz-drawer {
  background: var(--hz-surface);
  border-left-color: var(--hz-line);
}

[data-theme="dark"] .hz-drawer-head,
[data-theme="dark"] .hz-drawer-foot {
  border-color: var(--hz-line-soft);
}

[data-theme="dark"] .period-menu,
[data-theme="dark"] .hz-menu,
[data-theme="dark"] .hz-dropdown {
  background: var(--hz-surface);
  border-color: var(--hz-line);
  box-shadow: var(--hz-sh-deep);
}

[data-theme="dark"] .period-menu button,
[data-theme="dark"] .hz-menu button { color: var(--hz-ink-2); }
[data-theme="dark"] .period-menu button:hover,
[data-theme="dark"] .hz-menu button:hover { color: var(--hz-ink); background: rgba(255, 255, 255, .06); }

/* El bot ya es oscuro en light (horizon-skin.css lo dibuja en
   navy). Solo se lo lleva al canvas del tema. */
[data-theme="dark"] .horizon-bot-panel {
  background:
    radial-gradient(circle at 17% 12%, rgba(77, 159, 255, .28), transparent 34%),
    linear-gradient(135deg, #010F26 0%, #0C2C5C 58%, #01152E 100%);
  border-color: var(--hz-line);
}

/* ============================================================
   11 · EL CONMUTADOR DEL RAIL — ELIMINADO
   ------------------------------------------------------------
   El boton del rail se saco: el tema se cambia desde Settings y
   ademas ese boton se montaba encima del link Settings con
   viewport bajo. El detalle esta en la cabecera de
   js/horizon-theme.js.

   Se conserva el numero 11 para no mover las secciones de abajo.
   ============================================================ */

/* ============================================================
   12 · TRANSICION E IMPRESION
   ============================================================ */

/* El cambio de tema se cruza en 180ms en vez de saltar. Va sobre
   una clase que el JS pone y saca, no sobre * permanente: una
   transicion global de background/color le pega a cada hover del
   producto. */
.hz-theme-crossfade,
.hz-theme-crossfade *,
.hz-theme-crossfade *::before,
.hz-theme-crossfade *::after {
  transition:
    background-color .18s ease,
    border-color .18s ease,
    color .18s ease !important;
}

@media (prefers-reduced-motion: reduce) {
  .hz-theme-crossfade,
  .hz-theme-crossfade *,
  .hz-theme-crossfade *::before,
  .hz-theme-crossfade *::after {
    transition: none !important;
  }
}

/* En papel siempre light: el canvas oscuro se come el toner y el
   texto claro desaparece. */
@media print {
  html[data-theme="dark"] {
    --hz-canvas: #fff;
    --hz-surface: #fff;
    --hz-sunken: #fff;
    --hz-ink: #000;
    --hz-ink-2: #222;
    --hz-ink-3: #444;
    --hz-ink-4: #555;
    --page: #fff;
    --surface: #fff;
    --ink: #000;
  }

  [data-theme="dark"] body::before { display: none; }
}
