/* Tokens de la casa (R37): el ÚNICO :root del panel, el login y el portal. Cada página enlaza
   esta hoja ANTES de la suya. Antes eran tres copias —app.css, login.css y portal.css— que
   coincidían valor por valor (medido al mudarlas), justo hasta el día en que dejaran de hacerlo.
   El CI (verificar-sistema.py) falla si una hoja usa un var(--x) que no está declarado. */
:root{
  /* el tema es claro permanente (decisión JD): declararlo evita que macOS en oscuro pinte los
     controles nativos —<select>, scrollbars, ::backdrop— en oscuro sobre el crema */
  color-scheme:light;
  /* Tema claro estilo casa: crema (fondo) + azul profundo (letras) + botones azules a juego (paleta de la presentación: crema FBF3E3, azul 17284D, dorado B08A2E) */
  --bg:oklch(0.964 0.023 88); --surface:oklch(0.995 0.006 88); --surface-2:oklch(0.945 0.021 84);
  --border:oklch(0.88 0.018 82); --border-2:oklch(0.80 0.028 78);
  /* Contrastes MEDIDOS (canvas + fórmula WCAG) sobre las 2 superficies reales, no estimados:
     ink 11.9 · muted 7.0 · faint 5.2 (bg) / 5.7 (surface). El «~4:1» que este archivo declaraba
     para faint era pesimista; se bajó L una muesca (0.53→0.51) solo para dejar margen. */
  --ink:oklch(0.31 0.072 264); --muted:oklch(0.44 0.058 264); --faint:oklch(0.51 0.042 264);
  --accent:oklch(0.36 0.10 264); --accent-dim:oklch(0.36 0.10 264 / .10); --accent-ink:oklch(0.985 0.02 88); /* navy profundo (se retiró el azul genérico 0.45 0.13 262) */
  /* Semánticos: la TINTA va más oscura que su -dim a propósito. El texto de una pill se lee sobre
     su propio fondo teñido, y ahí «verde» medía 4.24 sobre tarjeta y 3.93 sobre crema — por debajo
     de AA (4.5) siendo la pill más frecuente del panel (LAFT de cada fila). Bajar L de la tinta y
     DEJAR el -dim como estaba sube el contraste sin aclarar el fondo. Medido: ok 5.0/4.6 ·
     warn 5.2/4.8 · danger 5.2/4.9 (tarjeta/crema). */
  --ok:oklch(0.48 0.14 150); --ok-dim:oklch(0.52 0.14 150 / .13);
  --warn:oklch(0.48 0.12 72); --warn-dim:oklch(0.50 0.12 72 / .16); --warn-border:oklch(0.72 0.13 82 / .36); /* unifica los dos ámbar ad-hoc de .docs-warn y .sol-chip */
  --danger:oklch(0.50 0.20 27); --danger-dim:oklch(0.52 0.20 27 / .12); /* rojo profundo para AA sobre crema */
  --overlay:oklch(0.30 0.06 264 / .38);
  --paper:#fff; /* visor de documentos: PDF/imágenes se leen sobre papel */
  --accent-border:oklch(0.36 0.10 264 / .28);
  /* dorado de la marca (B08A2E): hairlines, indicador activo, marca, íconos — NUNCA texto de cuerpo (no pasa AA sobre crema) */
  --gold:oklch(0.66 0.10 84); --gold-dim:oklch(0.66 0.10 84 / .14); --gold-border:oklch(0.60 0.10 84 / .42); --gold-ink:oklch(0.49 0.088 80);
  /* sombras cálidas con tinte navy (reemplazan el negro puro) */
  --shadow-sm:0 1px 2px oklch(0.31 0.07 264 / .06), 0 2px 8px oklch(0.31 0.07 264 / .07);
  --shadow-md:0 8px 24px oklch(0.31 0.07 264 / .12);
  --shadow-lg:0 24px 60px oklch(0.31 0.07 264 / .22);
  --font-sans:'Albert Sans',-apple-system,system-ui,"Segoe UI",Roboto,sans-serif;
  --font-num:var(--font-sans); /* alias de la sans: JD abandonó el mono para cifras 2026-07-03; la alineación de dígitos va por tabular-nums */
  --font-serif:'Newsreader',Georgia,'Times New Roman',serif; /* SOLO masthead: marca + título de vista. Las cifras van en la sans tabular (el dato es el protagonista) */
  --font-code:ui-monospace,"SF Mono","JetBrains Mono","Cascadia Code",monospace; /* solo comandos copiables */
  /* ── Escala tipográfica REAL del panel (Ronda 19) ────────────────────────────
     No es la escala teórica rem 1.2 que este archivo prometía y nunca tuvo: son los
     valores que el panel usa de verdad, medidos (11px×27 · 12px×26 · 12.5px×21 · 13px×12),
     agrupados en una rampa monótona. Cambiar la densidad del panel = mover estos 9 valores.
     Los tamaños de display (15/15.5/16/17/19/22/23/26px) quedan literales A PROPÓSITO:
     cada uno se usa UNA vez (título de vista, cifra del héroe, KPI) y un token de un solo
     consumidor es indirección sin pago.
     Sí, la rampa es PLANA (pasos de ~4%, no del 25% que pide un sistema editorial). Es
     deliberado y no es deuda: en una consola operativa densa la jerarquía la cargan el PESO
     (400→800), el COLOR (ink 11.9:1 → muted 7.0 → faint 5.2), la caja alta con tracking de
     .sect-h y los tamaños de display; la banda de 10-14.5px es toda «cromo» del mismo rango
     (etiqueta, metadato, celda, pill) y estirarla separaría cosas que son pares. Si algún día
     el panel se vuelve un documento para leer, la jerarquía se rehace con los display, no
     inflando esta banda. */
  --fs-3xs:10px;   /* micro-etiquetas: contador de bitácora, gate del paso, jurisdicción */
  --fs-2xs:11px;   /* metadatos: cabeceras de tabla, sellos, hint del dropzone */
  --fs-xs:11.5px;  /* pills, kickers */
  --fs-sm:12px;    /* etiquetas de UI, .sect-h, notas al pie */
  --fs-md:12.5px;  /* cuerpo denso: celdas, ficha, tarjetas de gate */
  --fs-lg:13px;    /* texto normal: tabla, botones, resúmenes */
  --fs-xl:13.5px;  /* controles y valores: nav, campos de diálogo */
  --fs-2xl:14px;   /* cuerpo del panel (= body), títulos de tarjeta */
  --fs-3xl:14.5px; /* superficie de lectura: burbuja del chat, marca */
  /* radios: 6 pasos (antes 14 valores ad-hoc; los snaps fueron ≤2px) */
  --r-xs:4px; --r-sm:6px; --r:9px; --r-lg:12px; --r-xl:16px; --r-pill:999px;
  /* espaciado (gap): rejilla de 2px que el panel ya usaba de facto */
  --sp-0:2px; --sp-1:4px; --sp-2:6px; --sp-3:8px; --sp-4:10px; --sp-5:12px; --sp-6:14px; --sp-7:16px; --sp-8:18px;
  /* motion: tempo y curva de la casa en UN sitio (antes 35 copias de var(--t) y 9 del bezier).
     R37: --t-fast para lo que sigue a un dato en vivo (la barra de subida) y --t-long para lo que
     recorre una distancia (barras de avance, entrada escalonada). Todo movimiento vive bajo
     prefers-reduced-motion:no-preference o se anula en reduce (app.css); la física del grafo y el
     countUp lo comprueban en JS. */
  --t-fast:.12s; --t:.15s; --t-slow:.18s; --t-long:.4s; --ease:cubic-bezier(.22,1,.36,1);
  --t-cam:.25s; /* la cámara del grafo y su vista ampliada (espejo de CAM_MS en app.js) */
  --z-scrim:9; --z-nav:10; --z-sticky:20; --z-toast:60;
}
