/* ═══════════════════════════════════════════════
   GIL — Camada de tokens `--gx-` (2026)
   ═══════════════════════════════════════════════
   Camada NOVA e independente. Não estende `--d-` (tokens-dash.css) nem os
   tokens legados de tokens.css (§21). Adotada por #/dashboard e
   #/regras-contratuais; outras telas migram quando forem reescritas.

   ── A cena que decidiu o tema ──
   O operador abre o GIL às 6h50 numa sala de operação, persiana fechada,
   monitor grande, e deixa a tela aberta dez horas em segundo plano enquanto o
   telefone toca. A tela tem que ser fundo, não frente — e a única coisa que
   pode brilhar é dinheiro em risco. Por isso: escuro por padrão, cromo
   neutro, e cor reservada pro dado. O tema claro existe por paridade
   estrutural (o app já expõe [data-theme="light"]), não como default.

   ── Estratégia de cor: Restrained ──
   O cromo (botões, seleção, foco, gráficos) é NEUTRO puro — croma 0.000.
   É o movimento do Linear ("limited chrome usage… more neutral and timeless"),
   do Vercel e do Raycast: hierarquia por luminância e hairline, não por hue.
   Consequência: as ÚNICAS três cores saturadas da interface são semânticas —
   crit (dinheiro em risco), warn (atenção) e pos (positivo). Não existe hue
   decorativo. Isso é o §34 "cor não é decoração" levado ao pé da letra, e
   resolve a colisão clássica de dashboard financeiro: um acento colorido no
   cromo sempre compete com o vermelho de inadimplência.

   `--gx-crit` é a cor-semente da marca (hue 27, ±10° da semente 29.1). Ela
   não vira enfeite: é o vermelho de "dinheiro em risco", a informação mais
   cara do produto. Aparece pouco, e quando aparece, importa.

   ── Elevação ──
   Como no Linear: superfície sobe por LUMINÂNCIA (canvas → surface → 2 → 3) e
   hairline de 1px. Sombra é exceção, nunca decoração.

   ── Contraste (verificado, não estimado) ──
   Todos os pares medidos em sRGB, nos dois temas: ink/bg ≥ 15.7:1;
   ink-2, ink-3, crit, warn, pos ≥ 4.5:1 sobre canvas E surface; texto colorido
   sobre o próprio -soft (chips) ≥ 4.6:1. Não clarear sem re-medir.

   Regras: OKLCH sempre. Zero hex. Zero gradiente decorativo. Sentence case.
   ═══════════════════════════════════════════════ */

:root {
  /* ── Superfícies — croma 0.000, sem calor escondido ── */
  --gx-canvas: oklch(0.145 0 0);
  --gx-surface: oklch(0.185 0 0);
  --gx-surface-2: oklch(0.225 0 0); /* hover */
  --gx-surface-3: oklch(0.265 0 0); /* trilhos, avatares, fundo de barra */
  --gx-line: oklch(0.31 0 0);
  --gx-line-2: oklch(0.4 0 0);

  /* ── Tinta — 3 níveis, hierarquia por peso/tamanho ── */
  --gx-ink: oklch(0.965 0 0);
  --gx-ink-2: oklch(0.755 0 0);
  --gx-ink-3: oklch(0.62 0 0);

  /* ── Ação / seleção / foco — neutro de alto contraste ──
     Sem hue. Preenchimento = tinta, texto = canvas. Vocabulário do Linear,
     Vercel e do segmented control do Raycast. */
  --gx-action: var(--gx-ink);
  --gx-action-ink: var(--gx-canvas);
  --gx-focus: oklch(0.965 0 0);

  /* ── Semântica de DADO — as três únicas cores saturadas ──
     crit = semente da marca (hue 27). Só entra quando o valor merece. */
  --gx-crit: oklch(0.68 0.195 27);
  --gx-warn: oklch(0.81 0.145 78);
  --gx-pos: oklch(0.76 0.155 155);
  --gx-crit-soft: oklch(0.68 0.195 27 / 0.13);
  --gx-warn-soft: oklch(0.81 0.145 78 / 0.13);
  --gx-pos-soft: oklch(0.76 0.155 155 / 0.13);
  --gx-crit-line: oklch(0.68 0.195 27 / 0.34);
  --gx-warn-line: oklch(0.81 0.145 78 / 0.34);
  --gx-pos-line: oklch(0.76 0.155 155 / 0.34);

  /* ── Dado em gráfico ──
     Série principal é neutra; o contraste vem do crit na série que dói. */
  --gx-data: oklch(0.72 0 0);
  --gx-data-track: oklch(0.265 0 0);

  /* ── Raio — §34: 15–18px ── */
  --gx-r-sm: 10px;
  --gx-r: 15px;
  --gx-r-lg: 18px;
  --gx-r-pill: 999px;

  /* ── Escala tipográfica — fixa (produto), razão ~1.15–1.25, uma família.
     Piso de 12px: abaixo disso não é densidade, é ilegibilidade. ── */
  --gx-t-meta: 12px;
  --gx-t-cap: 13px;
  --gx-t-body: 14px;
  --gx-t-sub: 16px;
  --gx-t-title: 21px;
  --gx-t-metric: 27px;
  --gx-t-hero: 34px;

  /* ── Peso — nada de 700/800 em tudo ── */
  --gx-w-reg: 400;
  --gx-w-med: 500;
  --gx-w-semi: 600;

  /* ── Ritmo — escala variada de propósito; espaçamento uniforme é o tell ── */
  --gx-s1: 4px;
  --gx-s2: 8px;
  --gx-s3: 12px;
  --gx-s4: 18px;
  --gx-s5: 26px;
  --gx-s6: 38px;

  /* ── Movimento — 150–250ms, ease-out, sem bounce ── */
  --gx-ease: 150ms cubic-bezier(0.22, 0.7, 0.28, 1);
  --gx-ease-slow: 220ms cubic-bezier(0.22, 0.7, 0.28, 1);

  /* ── Sombra — croma 0, e só pra coisa que de fato flutua ── */
  --gx-shadow: 0 6px 24px oklch(0 0 0 / 0.45);

  /* ── z-index semântico — nunca 999 avulso ── */
  --gx-z-base: 1;
  --gx-z-sticky: 10;
  --gx-z-dropdown: 20;
  --gx-z-modal: 40;
  --gx-z-toast: 50;

  /* Numerais tabulares — alinha coluna de valores */
  --gx-num: "tnum" 1, "lnum" 1;
}

[data-theme="light"] {
  --gx-canvas: oklch(0.968 0 0);
  --gx-surface: oklch(1 0 0); /* branco puro — sem calor escondido */
  --gx-surface-2: oklch(0.975 0 0);
  --gx-surface-3: oklch(0.945 0 0);
  --gx-line: oklch(0.9 0 0);
  --gx-line-2: oklch(0.82 0 0);

  --gx-ink: oklch(0.22 0 0);
  --gx-ink-2: oklch(0.45 0 0);
  --gx-ink-3: oklch(0.533 0 0); /* medido contra o canvas: 4.75:1 */

  --gx-focus: oklch(0.22 0 0);

  /* Recalibrado pro fundo claro. `warn` fica bem mais fechado que no escuro:
     é o que mantém ≥1.7 de separação perceptual contra `crit` (senão os dois
     viram o mesmo alerta) e ainda passa 4.5:1 como texto de chip. */
  --gx-crit: oklch(0.52 0.2 27);
  --gx-warn: oklch(0.36 0.105 66);
  --gx-pos: oklch(0.5 0.135 152);
  --gx-crit-soft: oklch(0.52 0.2 27 / 0.13);
  --gx-warn-soft: oklch(0.36 0.105 66 / 0.13);
  --gx-pos-soft: oklch(0.5 0.135 152 / 0.13);
  --gx-crit-line: oklch(0.52 0.2 27 / 0.3);
  --gx-warn-line: oklch(0.36 0.105 66 / 0.3);
  --gx-pos-line: oklch(0.5 0.135 152 / 0.3);

  --gx-data: oklch(0.45 0 0);
  --gx-data-track: oklch(0.925 0 0);

  --gx-shadow: 0 6px 24px oklch(0 0 0 / 0.1);
}
