/* ══════════════════════════════════════════════════════════════
   KACHAI · Contrato tipográfico

   Una sola familia para toda la interfaz:
     UI      → Instrument Sans
     Marca   → Geist
     Código  → JetBrains Mono

   El objetivo es que sidebar, conversación, dashboard, workspace, cuenta,
   administración, diálogos y módulos compartan el mismo ritmo tipográfico.
   La fuente monoespaciada queda reservada a contenido técnico real.
   ══════════════════════════════════════════════════════════════ */

:root {
  --font-ui: 'Instrument Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --font-brand: 'Geist', 'Avenir Next', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-code: 'JetBrains Mono', ui-monospace, SFMono-Regular, Consolas, 'Liberation Mono', monospace;

  /* Alias históricos. La interfaz usa Instrument Sans; los alias realmente
     monoespaciados conservan JetBrains Mono para no degradar código/logs. */
  --fuente: var(--font-ui);
  --fuente-serif: var(--font-ui);
  --fuente-mono: var(--font-code);
  --interface-font: var(--font-ui);
  --sans: var(--font-ui);
  --serif: var(--font-ui);
  --mono: var(--font-code);
  --code-font: var(--font-code);
}

html,
body,
button,
input,
textarea,
select,
optgroup {
  font-family: var(--font-ui);
}

:where(.chat-shell, .p-shell, .admin-surface, .monitoring-shell,
       .mod-cuerpo, .kachai-dialog, .context-panel, .graf-body,
       .workshop, .workspace) {
  font-family: var(--font-ui);
}

/* Elementos con declaraciones tipográficas directas en las capas históricas.
   Se normalizan sin tocar tamaños, pesos o jerarquías visuales. */
:where(
  .brand__sub,
  .side-context,
  .side-label,
  .proyecto-item,
  .proyecto-item__rol,
  .conv-item,
  .ctx-head,
  .ctx-note,
  .ctx-head__value,
  .user-card,
  .user-card__plan,
  .status-pill,
  .mode-switch__btn,
  .btn-nodo,
  .cap-select,
  .welcome,
  .welcome__meta,
  .msg__turn,
  .msg__time,
  .msg__name,
  .msg__badge,
  .msg__text,
  .stream-bar__label,
  .stream-bar__timer,
  .dash,
  .dash-eyebrow,
  .dash-greeting,
  .dash-meta,
  .dash-clock,
  .dash-card,
  .dash-card__head,
  .dash-news__item,
  .dash-news__topic,
  .dash-tool,
  .workshop,
  .workshop__title,
  .workshop__subtitle,
  .ws-bar,
  .ws-tab,
  .ws-dev,
  .ws-btn,
  .ws-files,
  .ws-file,
  .ws-file__name,
  .ws-file__meta,
  .file-card,
  .file-card__name,
  .file-card__meta,
  .context-panel .ws-body,
  .context-panel .ws-stage,
  .context-stage,
  .context-stage__head,
  .context-stage__eyebrow,
  .context-action,
  .context-storage,
  .context-file,
  .context-file__name,
  .context-file__meta,
  .context-run-state,
  .context-event__title,
  .context-event__detail,
  .context-event__time,
  .context-terminal,
  .context-terminal__badge,
  .p-shell,
  .p-nav,
  .p-btn,
  .p-card,
  .p-panel,
  .p-table,
  .a-appearance,
  .a-appearance-mode,
  .a-skin-card,
  .admin-surface,
  .monitoring-shell,
  .kachai-dialog,
  .mod-cuerpo,
  .mod-panel,
  .mod-btn
) {
  font-family: var(--font-ui) !important;
}

/* Las respuestas y sus encabezados comparten la familia de la interfaz. */
:where(.msg__text, .msg__text.md, .md,
       .md h1, .md h2, .md h3, .md h4, .md h5, .md h6,
       .md p, .md li, .md blockquote, .md table, .md th, .md td) {
  font-family: var(--font-ui) !important;
}

/* Reloj y cifras compactas mantienen números tabulares, pero no cambian de
   familia: así el dashboard no parece provenir de otra aplicación. */
.dash-clock time,
:where(.ctx-head__value, .p-card__value, .p-meter__value, .num) {
  font-family: var(--font-ui) !important;
  font-variant-numeric: tabular-nums;
}

/* Marca: única excepción editorial. */
:where(.kachai-brand__word, .sidebar .kachai-brand__word,
       .auth-modal__brand, .p-brand .kachai-brand__word) {
  font-family: var(--font-brand) !important;
}

/* Código y salidas técnicas: única excepción monoespaciada. */
:where(
  code,
  pre,
  kbd,
  samp,
  .md code,
  .md pre,
  .code-card__pre,
  .code-card__lang,
  .code-card__meta,
  .context-panel .ws-code,
  .diff-line,
  .console-line,
  .terminal-line,
  .log-line,
  .json-viewer
) {
  font-family: var(--font-code) !important;
}

/* Material Symbols necesita su propia fuente para no mostrar palabras en vez
   de iconos. */
.ms,
.material-symbols-rounded {
  font-family: 'Material Symbols Rounded' !important;
}

/* Tracking unificado para categorías pequeñas. El uppercase se conserva sólo
   como jerarquía; se reduce la separación excesiva heredada. */
:where(.side-label, .dash-eyebrow, .dash-meta__label,
       .msg__name, .ws-tab, .ws-dev, .settings-side__label,
       .context-stage__eyebrow) {
  letter-spacing: .075em !important;
}

/* `chat-lumius.css` conserva selectores `:root .msg__text` con `!important`.
   Esta regla explícita tiene la misma o mayor especificidad y se carga después,
   de modo que el contenido renderizado no vuelva a Geist. Código y pre quedan
   fuera y conservan JetBrains Mono por el contrato técnico anterior. */
:root .msg__text,
:root .msg__text.md,
:root .msg__text.md p,
:root .msg__text.md li,
:root .msg__text.md blockquote,
:root .msg__text.md table,
:root .msg__text.md th,
:root .msg__text.md td,
:root .msg__text.md h1,
:root .msg__text.md h2,
:root .msg__text.md h3,
:root .msg__text.md h4,
:root .msg__text.md h5,
:root .msg__text.md h6 {
  font-family: var(--font-ui) !important;
}

/* Evita que navegadores utilicen síntesis falsa al no encontrar un peso. */
body {
  font-synthesis: none;
  text-rendering: optimizeLegibility;
}
