/* Área de membros. Só o que o design system não cobre. */
.cartoes { list-style: none; margin: 0; padding: 0; }
.cartao h3 { margin: 0 0 var(--espaco-1); }
.cartao .veredito { color: var(--tinta-cheia); }
.cartao .estado { font-family: var(--fonte-mono); font-size: var(--escala--1); }
.cartao-regua .estado { color: var(--tinta-traco); }
.selo {
  display: inline-block; padding: 0 var(--espaco-1);
  font-family: var(--fonte-mono); font-size: var(--escala--1);
  border: 1px solid var(--tinta-traco);
}
.selo-local { border-color: var(--casa); color: var(--casa); }

.rolagem { overflow-x: auto; }
.rolagem table { border-collapse: collapse; width: 100%; }
.rolagem th[scope="row"] { position: sticky; left: 0; background: var(--superficie); text-align: left; }
.resultado.nao-rodou { color: var(--tinta-traco); font-family: var(--fonte-mono); }
.ressalvas {
  border-left: 2px solid var(--casa); padding-left: var(--espaco-2);
  /* Ressalvas reais citam caminhos de arquivo sem espaço (ex.: um path de
     tool). Sem isso, uma palavra longa alarga a página inteira em telas
     estreitas — a rolagem da tabela não cobre esse caso, é texto solto. */
  overflow-wrap: anywhere;
}

/* As regras de `.peca-quadro`, `.peca-saidas` e `.paywall` moravam aqui. O
   relatório era o único consumidor das três, e ele migrou pro sítio (bloco
   no fim deste arquivo) — folha morta some junto com o último leitor. */

/* ── O enunciado de cada célula, na régua ──────────────────────────────
   Mudou de casa em 15/08/2026: era um balão `display:none` dentro de CADA
   relatório (catorze deles, 7.407 caracteres), com o mesmo texto em todos e
   nenhuma palavra sobre o modelo do relatório. `display:none` é a única
   forma de esconder que não deixa rastro nenhum pra busca do navegador —
   procurar "Canberra" ou "tribonacci" no relatório não achava nada.

   Aqui ele é texto normal, aberto, achável, escrito uma vez. Estas regras
   usam os tokens do pacote ANTIGO (`--tinta-*`, `--casa`, `--espaco-*`)
   porque a régua ainda é `class="mesa"`; as do relatório, escopadas em
   `.sitio`, estão no fim desta folha. */
.criterio-enunciado { margin: var(--espaco-2) 0; }
.criterio__bloco,
.criterio__conta {
  margin: 0;
  font-family: var(--fonte-mono);
  font-size: var(--escala--1);
  color: var(--casa);
}
.criterio__conta { color: var(--tinta-secundaria, var(--tinta-traco)); }
.criterio__lista {
  list-style: none;
  margin: var(--espaco-1) 0 0;
  padding: 0;
  display: grid;
  gap: var(--espaco-1);
}
.criterio__item {
  display: grid;
  gap: 2px;
  padding-left: var(--espaco-1);
  border-left: 1px solid var(--tinta-traco);
  overflow-wrap: anywhere;
}
.criterio__item b {
  font-family: var(--fonte-mono);
  font-size: var(--escala--1);
  font-weight: 400;
  color: var(--tinta-traco);
}
.criterio__pedido { color: var(--tinta-secundaria, var(--tinta-traco)); }
/* O gabarito é a resposta que contava como acerto — a coisa mais específica
   do enunciado, e por isso a que fica em tinta cheia. */
.criterio__acerto { color: var(--tinta-cheia); }
.criterio__sobra {
  margin: var(--espaco-1) 0 0;
  font-family: var(--fonte-mono);
  font-size: var(--escala--1);
  color: var(--tinta-traco);
}

/* #acao-membro (hub): o mesmo elemento nos dois estados — o CSS não
   distingue visitante de membro, só estiliza o que estiver dentro (Task
   8, membros.js troca o conteúdo, não o container). */
#acao-membro { text-align: center; }
.acao-membro-logado .btn { margin-inline-end: var(--espaco-1); }

/* ══════════════════════════════════════════════════════════════════════
   O RELATÓRIO, NO SÍTIO

   Tudo daqui pra baixo é escopado em `.sitio` e não alcança o hub nem a
   régua, que continuam em `.mesa` (o pacote antigo, congelado). É de
   propósito: as duas pistas declaram os MESMOS nomes de token com valores
   diferentes, então a única separação segura é a classe do <body>.

   Esta folha é a folha DA PÁGINA — carrega depois de
   ds/sitio/{tokens,sistema,elementos,elementos-sitio}.css e de
   css/sitio-web.css, nessa ordem (membros_site/pagina.py, CSS_DO_SITIO).
   Override do pacote vai aqui, escopado; o pacote é saída compilada e não
   se edita.
   ══════════════════════════════════════════════════════════════════════ */

/* ── O que a folha da home tem e esta página não pode carregar ─────────
   `.ico` e `.sitio__pular` são declarados em css/home.css, que é a folha
   DA HOME — carregá-la aqui traria junto os grids e as reescritas da home
   inteira. São poucas linhas: repetidas aqui, com o nome de origem à vista,
   em vez de uma dependência entre duas páginas que não têm nada a ver uma
   com a outra. */
.sitio .ico { width: 1em; height: 1em; flex: none; }

.sitio__pular {
  position: absolute;
  left: -9999px;
  z-index: 10;
  padding: 10px 16px;
  background-color: var(--sitio-sinal);
  color: var(--sobre-sinal);
  border-radius: var(--sitio-raio-fino);
  font-weight: 600;
}
.sitio__pular:focus { left: 16px; top: 12px; }

/* ── O cabeçalho, sem hambúrguer ───────────────────────────────────────
   A área de membros nunca importou `js/home/menu.js`, então o botão
   compacto do cabeçalho da home nunca abriu nada aqui — ele existia no
   HTML e não fazia nada, e isso não falha alto: parece um menu, some ao
   clicar em nada. Esta página não emite o botão. A navegação vira uma
   faixa que rola de lado abaixo de 900px, que funciona sem uma linha de
   JavaScript. */
@media (max-width: 900px) {
  .sitio .cromo { height: auto; }
  .sitio .cromo__miolo { flex-wrap: wrap; gap: 10px 20px; padding-block: 10px; }
  .sitio .cromo__fim { margin-left: auto; }
  .sitio .cromo__nav {
    order: 3;
    width: 100%;
    margin-left: 0;
    gap: 20px;
    overflow-x: auto;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .sitio .cromo__nav::-webkit-scrollbar { display: none; }
}
/* Abaixo de 520px os dois rótulos das ações não cabem ao lado da marca; as
   cápsulas viram só ícone. O nome continua no `aria-label` (pagina.py),
   então quem lê por leitor de tela não perde nada. */
@media (max-width: 520px) {
  .sitio .cromo__fim .acao__rotulo { display: none; }
  .sitio .cromo__fim .acao { padding: 0 12px; }
}

/* ── O rodapé ──────────────────────────────────────────────────────────
   `.rodape` (elementos-sitio.css) é uma linha só, calibrada na prancha de
   1440 e sem media query própria; quem quebra é a folha da página. Aqui:
   os três blocos empilham centralizados abaixo de 1180, mesma medida que
   css/home.css usa pra faixa dela.

   `.rodape__legal` ganha `display:flex` e vão porque nenhuma das folhas do
   pacote declara isso — sem essas duas linhas, "Privacidade", "Termos" e o
   copyright saem grudados numa palavra só. Esses dois links são exigência
   da verificação do app OAuth no Google, e um link ilegível é meio caminho
   pra um link ausente. */
.sitio .rodape__legal { display: flex; align-items: center; gap: 20px; }
@media (max-width: 1180px) {
  .sitio .rodape .sitio__miolo {
    flex-wrap: wrap;
    justify-content: center;
    text-align: center;
    row-gap: 8px;
  }
  .sitio .rodape { white-space: normal; }
  .sitio .rodape__legal { justify-content: center; flex-wrap: wrap; }
}

/* ── A voz de sistema fecha em `code`, e isso não é herança ────────────
   `code`, `kbd` e `samp` nascem com `font-family: monospace` na folha do
   AGENTE, e uma declaração do agente vence a herança do pai — não é o mesmo
   que "o pai não declarou". Então um bloco que declara `font-family:
   var(--voz-sistema)` no contêiner e só `font-size` no `code` de dentro
   entrega aquele trecho na monoespaçada do SISTEMA DO LEITOR: Courier aqui,
   Menlo no Safari do Mac, Consolas ou Courier New no Windows.

   Medido em 15/08/2026 com `CSS.getPlatformFontsForNode` (a fonte que de
   fato pintou, não a computada): **43 nós saíam em Courier** — os chips de
   `ARQUIVOS` de cada achado, os nomes de arquivo dentro do excerto anotado e
   os campos do card do harness. Ou seja, a evidência da página, que é o que
   justifica o preço dela, numa fonte que ninguém escolheu e que muda de
   máquina pra máquina, ao lado de citações em JetBrains Mono.

   Esta regra fecha a família para TODO `code` das duas páginas que carregam
   esta folha (relatório e régua). É uma varredura, e não uma lista de
   blocos, pelo mesmo motivo de sempre: lista tem buraco por construção, e
   este defeito nasceu de duas regras que esqueceram uma linha.
   `TestOCodigoNaoCaiNaMonoDoSistema` mede a fonte que pintou. */
.sitio code,
.sitio kbd,
.sitio samp { font-family: var(--voz-sistema); }

/* ── Seleção de texto ──────────────────────────────────────────────────
   Sem `::selection` declarada, o realce vem do navegador (azul do Chromium,
   a cor de acento do sistema no Safari) e a página perde a única cor que ela
   não governa. Medido em pixels de captura, selecionando texto de verdade:
   texto cheio caía de 16,15:1 para **3,81:1**, e um elo âmbar selecionado
   para **2,08:1** — quase o pior contraste da página, e justamente durante o
   gesto de copiar, que num relatório de prova cheio de nome de arquivo e
   número medido é gesto central.

   `color` é forçado nos dois blocos, então a razão independe da cor
   original: 7,87:1 no terreno escuro, 14,68:1 na faixa de papel do rodapé.
   São dois blocos porque o rodapé é claro e o mesmo âmbar mede 1,98:1 lá. */
.sitio ::selection {
  background-color: var(--sitio-sinal);
  color: var(--sobre-sinal);
}
.sitio .rodape ::selection {
  background-color: var(--sitio-papel-tinta);
  color: var(--sitio-papel);
}

/* ── Contraste: onde `--sitio-tinta-fraca` pode e onde não pode ────────
   Medido contra `--sitio-fundo` (#04080c): `--sitio-tinta-fraca` (#5b6169)
   dá **3,21:1** e `--sitio-tinta-secundaria` (#8b8f94) dá 6,18:1. O piso de
   texto é 4,5:1, então a tinta fraca não serve pra NADA que se leia — e num
   relatório desta densidade quase tudo se lê: o cabeçalho de coluna de uma
   tabela, o rótulo de um dado da ficha, o título do sumário.

   **O 3,21 corrige um 3,5 que esteve escrito aqui até 15/08/2026** e que
   também aparecia na docstring do teste de contraste. Como foi medido: a cor
   COMPUTADA de cada nó, composta contra o fundo efetivo (subindo a árvore até
   um ancestral opaco, alfa por alfa) e dobrada pela opacidade acumulada, pela
   fórmula de luminância relativa do WCAG 2.1 —
   `test_o_texto_da_pagina_passa_no_piso_de_contraste` faz exatamente isso, em
   navegador de verdade, e é de lá que sai o número. O 3,5 não vinha de
   medição nenhuma, e a diferença importa: 3,5 soa "quase lá", 3,21 não.

   Ela fica só onde o conteúdo é ordinal e redundante — o `01`/`02` ao lado
   do nome da seção no sumário e o marcador numérico da lista de provas —,
   que é o mesmo uso decorativo que ela tem no resto do sítio. Quem quiser
   conferir: `test_o_texto_da_pagina_passa_no_piso_de_contraste`, em
   `tests/test_relatorio_contrato.py`, mede a cor computada de verdade.

   ── O foco de teclado ────────────────────────────────────────────────
   Nenhum elemento desta página zera o `outline` (só `.prompt__entrada` e
   `.acesso__campo input` fazem isso no pacote, e nenhum dos dois existe
   aqui), então o anel padrão do navegador já aparece. O anel abaixo é o
   mesmo vocabulário que `css/sitio-web.css` usa na busca da home — dez
   links de sumário e uma barra de navegação merecem o indicador da casa, e
   não o do sistema operacional de cada visitante. */
.sitio .sumario__lista a:focus-visible,
.sitio .ficha__trilha a:focus-visible,
.sitio .peca__acoes a:focus-visible,
.sitio .relatorio__corpo a:focus-visible,
.sitio .provas a:focus-visible,
.sitio .placar__saida a:focus-visible,
.sitio .cromo__elo:focus-visible {
  outline: 2px solid var(--sitio-sinal);
  outline-offset: 3px;
  border-radius: 3px;
}

/* ── A ficha: quem é o modelo, e o que a bateria concluiu ──────────────
   Faixa de largura inteira, um degrau acima do terreno, com um fio de sinal
   no alto — é a única superfície da página que se anuncia; o resto é
   documento. */
.sitio .ficha-relatorio {
  position: relative;
  background-color: var(--sitio-superficie);
  border-bottom: 1px solid var(--sitio-traco);
  padding: 40px 0 44px;
}
.sitio .ficha-relatorio::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 2px;
  background: linear-gradient(90deg, var(--sitio-sinal), transparent 62%);
}
.sitio .ficha__trilha {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px 10px;
  margin: 0;
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  line-height: var(--sitio-rotulo-entrelinha);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
/* Cada degrau da trilha quebra inteiro ou não quebra: "RELATÓRIO DA / BATERIA"
   em duas linhas ao lado de um "·" solto lê como três itens, não dois. */
.sitio .ficha__trilha > * { white-space: nowrap; }
.sitio .ficha__modelo {
  margin: 18px 0 0;
  font-family: var(--voz-funcional);
  font-size: var(--sitio-manchete-corpo);
  line-height: var(--sitio-manchete-entrelinha);
  font-weight: var(--sitio-manchete-peso);
  letter-spacing: -0.022em;
  color: var(--sitio-tinta-cheia);
  text-wrap: balance;
}
/* O veredito é a frase que o relatório inteiro sustenta: entra como deck,
   não como parágrafo — quem só lê duas linhas desta página lê estas. */
/* Sem `max-width`: o veredito, a abertura e a linha do título terminam TODOS
   na mesma borda. Antes eram três bordas (980 no título, 621 no veredito por
   `46ch`, 796 na abertura por `70ch`), pelo mesmo motivo que os tutoriais
   tinham quatro: `ch` é relativo à fonte de cada elemento, e o veredito é
   deck, a abertura é corpo. Decisão do dono, a mesma que ele tomou nos
   tutoriais. */
.sitio .ficha__veredito {
  margin: 16px 0 0;
  font-size: var(--sitio-deck-corpo);
  line-height: var(--sitio-deck-entrelinha);
  color: var(--sitio-tinta-cheia);
  text-wrap: pretty;
}
.sitio .ficha__miolo { display: grid; gap: 32px; }
.sitio .ficha__dados {
  display: flex;
  flex-wrap: wrap;
  gap: 12px 32px;
  margin: 0;
  padding: 0;
}
.sitio .ficha__dado {
  display: grid;
  gap: 2px;
  padding-left: 20px;
  border-left: 1px solid var(--sitio-traco-forte);
}
.sitio .ficha__dado dt {
  font-family: var(--voz-funcional);
  font-size: 12px;
  line-height: 16px;
  color: var(--sitio-tinta-secundaria);
}
.sitio .ficha__dado dd {
  margin: 0;
  font-family: var(--voz-sistema);
  font-size: 15px;
  line-height: 22px;
  color: var(--sitio-tinta-cheia);
  font-variant-numeric: tabular-nums;
}
/* Os ativos por token andam colados ao total (`285B · 13B ativos por
   token`): são um par, e separá-los em duas entradas da ficha faria parecer
   que são duas medidas independentes. */
.sitio .ficha__ativos {
  display: block;
  color: var(--sitio-tinta-secundaria);
  font-size: 13px;
  line-height: 18px;
}
/* A procedência do que a ficha NÃO mediu. O resto do relatório é medido
   aqui; parâmetros e arquitetura são lidos de fora, e a página diz de onde. */
.sitio .ficha__nota {
  display: block;
  margin-top: 2px;
  font-family: var(--voz-funcional);
  font-size: 12px;
  line-height: 16px;
  color: var(--sitio-tinta-fraca);
  text-wrap: pretty;
}

/* O tier é um rótulo do sistema, não um selo de qualidade: a régua tem
   quatro (F, M, P, P/M) e nenhum deles significa "bom" ou "ruim" — o que
   significa é o resultado, que está no placar. Uma cor por tier seria
   inventar semântica que a fonte não tem. Ele fica em voz de sistema, na
   tinta do sinal, e mais nada. */
.sitio .ficha__tier {
  display: inline-block;
  padding: 1px 8px;
  border-radius: var(--sitio-raio-miudo);
  background-color: color-mix(in srgb, var(--sitio-sinal) 14%, transparent);
  color: var(--sitio-sinal);
}
.sitio .ficha__local {
  display: inline-block;
  padding: 1px 8px;
  border-radius: var(--sitio-raio-miudo);
  background-color: color-mix(in srgb, var(--casa) 16%, transparent);
  color: var(--casa-texto);
  font-size: 13px;
}
.sitio .ficha__abertura {
  margin-top: 28px;
  padding-top: 24px;
  border-top: 1px solid var(--sitio-traco);
}

/* A nota de um campo da ficha: procedência, ou o que o valor quer dizer.
   Mesmo papel de `.harness__nota` no card do harness. */
.sitio .ficha__nota {
  display: block;
  margin-top: 2px;
  font-family: var(--voz-corpo);
  font-size: 12px;
  line-height: 1.4;
  letter-spacing: 0;
  text-transform: none;
  color: var(--sitio-tinta-secundaria);
}
.sitio .ficha__abertura p {
  margin: 0 0 16px;
  font-size: var(--sitio-corpo-corpo);
  line-height: var(--sitio-corpo-entrelinha);
  color: var(--sitio-tinta-secundaria);
  text-wrap: pretty;
}
.sitio .ficha__abertura p:last-child { margin-bottom: 0; }

/* A ficha técnica vira coluna à parte a partir de 1024px: o veredito e a
   abertura querem medida curta (46–70 caracteres), e sem um segundo lugar
   pra pôr os dados sobrava meia tela vazia à direita de um cabeçalho que
   ocupa a largura inteira. Abaixo disso ela volta a ser uma fila. */
@media (min-width: 1024px) {
  /* 340, e não os 280 de antes: o cartão passou a ter duas colunas por
     dentro, e em 280 cada uma ficaria com 103px, onde "13B ativos por token"
     quebra em cinco linhas. E 340, e não mais: a 360 o título "DeepSeek V4
     Flash 0731" passa a quebrar em duas linhas, e a manchete inteira numa
     linha vale mais que os 20px a mais de coluna interna. */
  .sitio .ficha__miolo { grid-template-columns: minmax(0, 1fr) 340px; gap: 56px; }
  /* DUAS colunas, três fileiras. O cartão media 496px de altura contra 361
     do bloco de texto ao lado, e as duas colunas terminavam em lugares
     diferentes sem motivo visível. Empilhado em coluna única não havia
     conserto que não fosse jogar campo fora; em duas colunas os seis pares
     cabem em três fileiras e a altura cai pela metade, sem perder nada.

     `stretch` em vez de `start` para o cartão acompanhar a coluna, e
     `align-content: space-between` porque uma caixa esticada com o conteúdo
     empilhado no topo só troca o vão de lugar. */
  .sitio .ficha__tecnica {
    align-self: stretch;
    display: flex;
    flex-direction: column;
    padding: 20px 24px;
    border: 1px solid var(--sitio-traco);
    border-radius: var(--sitio-raio);
    background-color: var(--sitio-superficie-alta);
    box-shadow: var(--sitio-luz-de-bordo);
  }
  .sitio .ficha__dados {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    /* 12px, e não 16: com o título numa linha só, o cartão media 320px
       contra 307 do texto ao lado e terminava 13px abaixo dele. Cortar 4px
       de cada fileira faz o cartão ser o mais BAIXO da fileira, e aí quem
       estica é ele — que é o único jeito de os dois terminarem juntos. */
    gap: 12px 24px;
    flex: 1;
    align-content: space-between;
  }
  /* Seis pares fecham a grade. Se um relatório tiver cinco (sem vídeo, sem
     pesos), o último fica sozinho na fileira e sobra uma célula vazia com a
     divisória desenhada em volta: uma casa que ninguém preencheu, que lê
     como defeito. Ocupar a fileira inteira quando está em posição ímpar é
     exatamente quando ele estaria sozinho. */
  .sitio .ficha__dado:last-child:nth-child(odd) { grid-column: 1 / -1; }
  .sitio .ficha__dado { padding-left: 0; border-left: 0; }
  /* `+ .ficha__dado` era regra de PILHA: numa grade de duas colunas ela
     desenharia fio também no segundo item da PRIMEIRA fileira, que não tem
     nada acima dele. O fio separa FILEIRAS, então ele começa no terceiro
     par, que é onde a segunda fileira começa. */
  .sitio .ficha__dado:nth-child(n + 3) {
    padding-top: 12px;
    border-top: 1px solid var(--sitio-traco);
  }
}

/* ── O corpo do documento ─────────────────────────────────────────────── */

/* A largura mudou em 14/08/2026, a pedido do dono ("dá pra aproveitar mais
   a largura"). Era 1120 — escolhido quando a página era sumário + prosa, e
   a prosa é o que NÃO pode crescer.

   O que resolve os dois: a caixa vai a 1320 e a medida de leitura continua
   travada em 68ch nos parágrafos (ver `.relatorio__corpo p` mais abaixo).
   Quem ganha os 200px são as peças que se beneficiam de largura e antes
   sobravam espremidas — a grade de achados (que a 1320 vira duas colunas de
   verdade), as telas de terminal, as barras do placar e os iframes do bloco
   C. Nenhum parágrafo ficou mais largo do que já era.

   A ficha usa a MESMA medida, senão o título e o sumário começam em duas
   verticais diferentes, que é o tipo de desalinho que ninguém sabe nomear
   mas todo mundo vê. */
.sitio .relatorio,
.sitio .ficha__miolo { max-width: 1320px; }
.sitio .relatorio { padding-bottom: 96px; }

/* ── UMA medida de leitura, e não seis ─────────────────────────────────
   Correção de 14/08/2026, a pedido do dono ("o texto não tem a mesma largura
   de outros conteúdos, deveria"). O mesmo defeito que os tutoriais tinham, e
   pior: aqui eram SEIS declarações em `ch` espalhadas pela folha
   (`68ch` no parágrafo, `68ch` no h3, `62ch` no deck, `62ch` na legenda,
   `68ch` no veredito da peça, e nenhuma no `<h2>`).

   `ch` é relativo à fonte DE CADA ELEMENTO. Medido a 1440, a coluna de
   membro tinha SETE bordas direitas: 1146,4 no parágrafo · 1006,8 no deck ·
   1064,4 no veredito da peça · 895,6 na legenda do placar · 1316 no h2, na
   tabela e nas janelas das peças. Uma regra por elemento, e o resultado lia
   como desalinho em vez de decisão.

   O que resolve: UMA medida, calibrada no corpo do texto. `ch` da IBM Plex
   Sans é exatamente 0,6em, então `68ch` no parágrafo é `40,8em` da fonte do
   corpo — e a fonte do corpo é `--sitio-deck-corpo`. Multiplicar o token
   pelo mesmo 40,8 devolve os MESMOS 734,4px a 1440 e os mesmos 652,8px a
   1180 que o parágrafo já tinha, e faz título, deck, legenda e veredito
   pousarem na mesma vertical.

   Em px fixo (o que os tutoriais usaram) isto não funcionaria aqui: lá o
   corpo não escala, e aqui `--sitio-deck-corpo` é um `clamp()` que anda de
   16 a 18px. Uma medida fixa engordaria a linha em telas menores, que é o
   contrário do que uma medida de leitura serve pra fazer.

   A distinção que já existia continua de pé, e agora aparece: PROSA tem
   medida; PEÇA LARGA (tabela, tela de terminal, janela do bloco C, grade de
   achados, barras do placar, o gráfico da curva) ocupa a coluna toda. São
   duas bordas, e uma só quando a coluna estreita a ponto de a medida não
   morder mais. */
/* ── UMA medida, e não uma por corpo ───────────────────────────────────
   Em 15/08/2026 isto chegou a ser TRÊS medidas, uma por tamanho de corpo, a
   partir de um achado tipográfico correto: a medida de leitura é inversamente
   proporcional ao corpo, e uma constante calibrada em 18px, emprestada a
   blocos de 16px e 13px, deixa a MESMA caixa caber 22% e 111% mais
   caracteres. Medido a 1440: `.curva__metodo` a 119 CPL contra a faixa
   confortável de 45 a 75.

   **Foi revertido, e o motivo não é tipográfico.** Uma borda direita só e
   um CPL igual em corpos diferentes são objetivos que se excluem por
   aritmética: fixar a borda faz o CPL variar com a fonte, e fixar o CPL faz a
   borda variar. O dono escolheu a BORDA, explicitamente e duas vezes ("queria
   que a largura do texto fosse idêntica à largura das janelas, tabelas
   etc."), e `sites/CLAUDE.md` registra `--rel-medida` como a medida ÚNICA de
   leitura. Com três medidas a prosa voltou a ter três bordas direitas (906,
   1068 e 1146 a 1440), que é exatamente o defeito que a medida única existe
   pra impedir, e `TestUmaMedidaDeLeitura` pegou.

   Quem for reabrir isto: o CPL alto é real e continua sem solução dentro da
   restrição de uma borda. A saída, se um dia se quiser, é editorial (encurtar
   os blocos miúdos) ou de corpo (aproximar os tamanhos), nunca uma segunda
   medida.

   `.ficha__veredito` e `.ficha__abertura` continuam SEM medida, pela mesma
   decisão do dono. */
.sitio .relatorio {
  --rel-medida: calc(var(--sitio-deck-corpo) * 40.8);
}

.sitio .relatorio__grade { display: grid; gap: 40px; align-items: start; }
@media (min-width: 1024px) {
  .sitio .relatorio__grade { grid-template-columns: 232px minmax(0, 1fr); gap: 56px; }
}
.sitio .relatorio__coluna { min-width: 0; }
/* ── O FIM DA PÁGINA, e por que aqui não há uma tela vazia ─────────────
   Até 15/08/2026 esta linha era `.relatorio__coluna > :last-child {
   min-height: 100svh }`, e o motivo estava certo: o sumário acendia por
   régua de rolagem (`view-timeline`), a régua de uma seção só começa quando
   o topo dela chega ao topo da janela, e se a última seção é curta e o
   documento acaba logo depois esse ponto de rolagem NÃO EXISTE — a última
   entrada ficava apagada pra sempre, e clicar nela também não acendia.

   O preço era **855px de fundo puro no fim de TODO relatório** (medido: o
   último conteúdo terminava em y=10.237 e o rodapé começava em y=11.092),
   ou seja 7,6% da página, e crescendo com a janela do leitor — numa tela de
   1080 o vão era 1080. Uma tela inteira em branco pra resolver um caso de
   borda de scroll-spy.

   **O mesmo problema já estava resolvido de outro jeito dentro do mesmo
   produto.** `monitor_site/static/monitor.js` marca a seção corrente por uma
   linha de leitura e trata o fim do documento em quatro linhas:

       if (innerHeight + Math.ceil(scrollY) >= scrollHeight - 2)
         atual = secoes[secoes.length - 1];

   Duas soluções para o mesmo problema no mesmo produto é exatamente a
   inconsistência que a verificação de composição apontou. Ficou a do
   monitor, agora em `relatorio.js`: mesma linha de leitura, mesma regra de
   fim de página, mesmo marcador (`aria-current`, que é semântico antes de
   ser visual). Zero vazio, e o scroll-spy passou a valer também onde o
   navegador não tem `view-timeline`. */

/* ── O sumário ─────────────────────────────────────────────────────────
   O relatório tem dez mil palavras e treze seções; sem índice, a única
   forma de saber o que tem nele é rolar até o fim. Gruda na lateral a
   partir de 1024px e vira uma faixa de fichas daí pra baixo — nos dois
   casos sem uma linha de JavaScript: é lista de âncoras, e âncora é
   navegação nativa. */
.sitio .sumario { min-width: 0; }
.sitio .sumario__titulo {
  margin: 0 0 12px;
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  line-height: var(--sitio-rotulo-entrelinha);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
.sitio .sumario__lista {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  counter-reset: sumario;
}
.sitio .sumario__lista li { counter-increment: sumario; }
.sitio .sumario__lista a {
  display: block;
  padding: 6px 12px;
  border: 1px solid var(--sitio-traco);
  border-radius: var(--sitio-raio-fino);
  background-color: var(--sitio-superficie);
  color: var(--sitio-tinta-secundaria);
  font-size: 13px;
  line-height: 20px;
}
.sitio .sumario__lista a:hover {
  color: var(--sitio-tinta-cheia);
  border-color: var(--sitio-traco-forte);
}

/* ── A PROMESSA, na coluna esquerda da vitrine ─────────────────────────
   Ela existe pra que a seção que as duas versões compartilham (o placar)
   pouse no mesmo trilho e com a mesma largura nas duas — antes o placar saía
   288px mais à esquerda e 32% mais largo na vitrine, e quem entrava
   encontrava o conteúdo re-arranjado em vez de completado.

   Mesma casa da grade e mesma forma do sumário, NOME PRÓPRIO: o sumário é
   navegação de conteúdo que existe, isto é copy de conversão, e
   `test_vazamento.py` guarda o corte entre as duas versões procurando a
   palavra "sumario" na vitrine. Ver `_indice_prometido` em pagina.py.

   Os itens não são elos — é promessa, não navegação —, então não têm hover
   nem o aceso do scroll-spy. */
.sitio .promessa { min-width: 0; }
.sitio .promessa__titulo {
  margin: 0 0 12px;
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  line-height: var(--sitio-rotulo-entrelinha);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
.sitio .promessa__lista {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  counter-reset: promessa;
}
.sitio .promessa__lista li {
  counter-increment: promessa;
  display: block;
  padding: 6px 12px;
  border: 1px solid var(--sitio-traco);
  border-radius: var(--sitio-raio-fino);
  background-color: var(--sitio-superficie);
  color: var(--sitio-tinta-secundaria);
  font-size: 13px;
  line-height: 20px;
  text-wrap: pretty;
}
@media (min-width: 1024px) {
  .sitio .promessa { position: sticky; top: 24px; }
  .sitio .promessa__lista { display: block; }
  .sitio .promessa__lista li {
    display: grid;
    grid-template-columns: 26px minmax(0, 1fr);
    align-items: baseline;
    gap: 4px;
    padding: 7px 0 7px 14px;
    border: 0;
    border-left: 2px solid var(--sitio-traco);
    border-radius: 0;
    background: transparent;
  }
  .sitio .promessa__lista li::before {
    content: counter(promessa, decimal-leading-zero);
    font-family: var(--voz-sistema);
    font-size: 11px;
    color: var(--sitio-tinta-fraca);
  }
}

/* ── O ESTADO ACESO do sumário, marcado por `aria-current` ─────────────
   Quem marca é `relatorio.js`, com a régua do KavMonitor (ver o bloco do fim
   da página, acima). O atributo é `aria-current="true"` e não uma classe de
   estilo, pelo mesmo motivo que na bússola do monitor: a informação é
   semântica antes de ser visual, e quem lê por leitor de tela recebe "atual"
   junto com o nome da seção. Sem JavaScript o sumário continua o que sempre
   foi — uma lista de âncoras que funciona; nada some, só não acende.

   As duas formas do aceso (a fita do estreito e a coluna do largo) moram
   junto de cada layout, logo abaixo. */

/* ── O mapa do celular ─────────────────────────────────────────────────
   Até 15/08/2026 o sumário era `position: static` abaixo de 1024px: o
   `sticky` e o scroll-spy moravam os dois dentro de `@media (min-width:
   1024px)`. Medido no relatório completo a 375px: da primeira seção até o
   fim eram **mais de dezenove mil pixels, 23 telas, sem um único indício de
   onde o leitor estava nem de quanto faltava** — na plataforma em que a
   página é ~60% mais alta, e a única sem mapa.

   Aqui ele vira uma fita grudada no topo: uma linha, os mesmos elos, rolando
   de lado DENTRO da própria caixa (nunca a página — ver `overflow-x` na
   `.sumario__lista`). O rótulo "Neste relatório" fica só pro leitor de tela:
   ele é o nome acessível do `<nav>` (`aria-labelledby`), e uma linha inteira
   de rótulo numa fita de 40px é metade da fita.

   O fundo é opaco de propósito: sem ele o texto da página passa por baixo da
   fita grudada, e o defeito só aparece rolando — nunca num screenshot do
   topo. */
@media (max-width: 1023px) {
  .sitio .sumario {
    position: sticky;
    top: 0;
    z-index: 6;
    padding: 8px 0;
    background-color: var(--sitio-fundo);
    border-bottom: 1px solid var(--sitio-traco);
  }
  .sitio .sumario__titulo {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }
  .sitio .sumario__lista {
    flex-wrap: nowrap;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .sitio .sumario__lista::-webkit-scrollbar { display: none; }
  .sitio .sumario__lista a { white-space: nowrap; }

  /* O mesmo scroll-spy do largo, com o quadro que a fita usa: fundo e borda
     em vez da barra à esquerda. Quem marca é `relatorio.js`. */
  .sitio .sumario__lista a[aria-current="true"] {
    color: var(--sitio-tinta-cheia);
    border-color: var(--sitio-sinal);
    background-color: var(--sitio-sinal-fraco);
  }
}

@media (min-width: 1024px) {
  .sitio .sumario {
    position: sticky;
    top: 24px;
    max-height: calc(100vh - 48px);
    overflow-y: auto;
    /* O rótulo "Neste relatório" encostava na borda de cima: a caixa tinha
       folga só à direita, e a coluna da direita começa 64px abaixo do topo
       da grade, então o sumário lia como colado no teto. 24px é a mesma
       folga interna do cartão de sumário dos tutoriais (`.tut-toc-win`),
       e não um número novo. A folga de baixo existe pelo mesmo motivo do
       `overflow-y`: com a lista rolada até o fim, o último item encostava.

       **Os 5px à esquerda são o anel de foco, não respiro.** `overflow-y:
       auto` com `overflow-x: visible` COMPUTA `overflow-x: auto` (é o que a
       especificação manda), então esta caixa recorta dos dois lados. O anel
       dos elos é `outline: 2px` com `outline-offset: 3px`, ou seja 5px fora
       da caixa do elo — e a caixa do elo começava colada na borda esquerda.
       Medido: folga de **0px** para os 9 elos, e o anel saía com os dois
       cantos truncados na captura. O `margin-left` negativo devolve o
       alinhamento da coluna, então nada se move na tela. */
    padding: 24px 8px 24px 5px;
    margin-left: -5px;
  }
  .sitio .sumario__lista { display: block; }
  .sitio .sumario__lista a {
    display: grid;
    grid-template-columns: 26px minmax(0, 1fr);
    align-items: baseline;
    gap: 4px;
    padding: 7px 0 7px 14px;
    border: 0;
    border-left: 2px solid var(--sitio-traco);
    border-radius: 0;
    background: transparent;
    text-wrap: pretty;
  }
  .sitio .sumario__lista a::before {
    content: counter(sumario, decimal-leading-zero);
    font-family: var(--voz-sistema);
    font-size: 11px;
    color: var(--sitio-tinta-fraca);
  }
  .sitio .sumario__lista a:hover {
    border-left-color: var(--sitio-sinal);
    background: transparent;
  }

  /* ── Onde o leitor está ─────────────────────────────────────────────
     Um índice diz o que existe; um mapa diz onde você está. Num documento de
     dez mil pixels a diferença é grande.

     **Isto era `view-timeline` até 15/08/2026, sem uma linha de JavaScript,
     e a mecânica era bonita**: cada seção declarava a própria régua de
     rolagem e a entrada do sumário se animava ao longo DELA em vez de ao
     longo do tempo, com `view-timeline-inset: 0 100%` encolhendo a janela
     daquela régua até uma linha de altura zero no topo (que é o que faz a
     faixa medir "o topo da seção cruzou a linha" em vez de "a seção está na
     tela"). O que derrubou o desenho não foi ele: foi o preço do caso de
     borda. Uma seção final curta não tem ponto de rolagem em que o topo dela
     alcance a linha, então a última entrada nunca acendia — e o remendo era
     forçar aquela seção a UMA TELA INTEIRA de altura, o que deixava 855px de
     fundo puro no fim de todo relatório (ver o bloco do fim da página, lá
     em cima).

     Ficou a régua do KavMonitor, em `relatorio.js`: uma linha de leitura, a
     última seção que a cruzou, e quatro linhas pro fim do documento. Zero
     vazio, um mecanismo só nas duas superfícies do produto, e o scroll-spy
     passou a valer também em navegador sem `view-timeline`. */
  .sitio .sumario__lista a[aria-current="true"] {
    color: var(--sitio-tinta-cheia);
    border-left-color: var(--sitio-sinal);
  }
}

/* A seção do corpo existe pra ser alvo de âncora e régua de rolagem — não
   desenha nada por conta própria. O respiro entre seções continua vindo do
   `margin-top` do `<h2>`, como quando o corpo era plano.

   **Sem `scroll-margin-top`, e isso é decisão.** O respiro depois do clique
   já existe: o `<h2>` da seção tem 24px de `padding-top` por dentro, então o
   texto do título nunca encosta na borda de cima. Um `scroll-margin` aqui
   faria o clique parar 24px ACIMA do topo da seção — e é exatamente aí que a
   régua de rolagem dela começa. Medido: com 24px de margem, o progresso
   ficava em −5% depois do clique, ou seja, fora da faixa, e a entrada do
   sumário que a pessoa acabou de clicar era a única apagada da lista. */
.sitio .secao-do-corpo { scroll-margin-top: 0; }

/* ── Os títulos de seção (do corpo e das seções montadas aqui) ─────────
   Uma régua tipográfica só pra página inteira: o `<h2>` que vem do markdown
   da vault e o `.secao-titulo` das seções que este módulo monta (placar,
   peças, provas) leem igual — senão o leitor vê duas hierarquias
   concorrentes no mesmo documento.

   ── DUAS correções de 15/08/2026, e as duas vinham do mesmo lugar ──────
   1 · **O corpo é o papel do pacote, não um `clamp()` à mão.** A folha
   declarava `clamp(24px, 2.2vw, 32px)`, que a 1440 dá **31,68px** — 21%
   abaixo dos 40px que `--sitio-secao-corpo` daria na largura EXATA em que o
   sistema foi medido na prancha. Um papel do pacote reescrito à mão não é
   uma decisão: é um degrau a mais numa escala que já tinha dezesseis. Com o
   token, o título de seção da home, do KavMonitor e do relatório voltam a
   ser o mesmo tamanho, e a entrelinha vem junto (48px, múltiplo da unidade
   de 4 — o `1.2` de antes dava 38,02px, que não fecha em nada).

   2 · **O nome deixou de ser `.secao__titulo` a um caractere de distância.**
   O pacote do sítio tem `.secao__titulo` (com `__`); esta folha tinha
   `.secao-titulo` (com `-`). Não são o mesmo objeto — este desenha régua de
   1px, respiro de 64px e âncora de rolagem —, e um erro de digitação futuro
   trocaria um pelo outro sem erro nenhum, só apagando a régua e mudando o
   tamanho. Virou `.relatorio__secao-titulo`: nome próprio, do bloco que ele
   de fato serve. `TestOTituloDeSecaoUsaOPapelDoPacote` guarda os dois. */
.sitio .relatorio__corpo h2,
.sitio .relatorio__secao-titulo {
  margin: 64px 0 0;
  padding-top: 24px;
  border-top: 1px solid var(--sitio-traco);
  font-family: var(--voz-funcional);
  font-size: var(--sitio-secao-corpo);
  line-height: var(--sitio-secao-entrelinha);
  font-weight: var(--sitio-secao-peso);
  letter-spacing: -0.018em;
  color: var(--sitio-tinta-cheia);
  scroll-margin-top: 24px;
  text-wrap: balance;
}
/* A PRIMEIRA seção depois da ficha não tem seção anterior: sem fio em cima,
   sem o vão de 64px. Escrito por posição, e não pelo nome da seção
   (era `.placar > .secao-titulo`, e a ordem da página mudou em 15/08/2026 —
   ver `ORDEM_DA_PAGINA` em pagina.py). Assim vale pra qualquer seção que
   venha a abrir a coluna, e nunca fica apontando pra uma que desceu. */
.sitio .relatorio__coluna > :first-child > .relatorio__secao-titulo {
  margin-top: 40px;
  padding-top: 0;
  border-top: 0;
}
.sitio .secao-deck {
  margin: 10px 0 0;
  max-width: var(--rel-medida);
  font-size: var(--sitio-corpo-corpo);
  line-height: 24px;
  color: var(--sitio-tinta-secundaria);
  text-wrap: pretty;
}

/* ── As dobras ─────────────────────────────────────────────────────────
   Toda dobra da página é `<details class="dobra">` com o conteúdo num
   `.dobra__corpo[hidden="until-found"]` (ver `_dobra` em pagina.py, que
   explica por que o atributo NÃO pode ir na tag de fora).

   Esta regra é a outra metade daquele desenho: com o atributo no corpo, a
   folha do agente aplica `content-visibility: hidden` nele o tempo todo, e
   sem esta linha a dobra abriria pra nada — `<details>` aberto, corpo
   invisível, zero erro no console. Regra de autor ganha da folha do agente,
   e isso foi medido em navegador de verdade antes de virar código. */
.sitio details[open] > .dobra__corpo[hidden="until-found"] { content-visibility: visible; }
.sitio .dobra > summary {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  flex-wrap: wrap;
  font-family: var(--voz-sistema);
  font-size: 12px;
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
  cursor: pointer;
}
.sitio .dobra > summary:hover { color: var(--sitio-tinta-cheia); }
/* Quantos itens tem lá dentro. Um resumo que não declara o tamanho é um
   botão que não promete nada, e ninguém abre botão que não promete. */
.sitio .dobra__conta {
  background-color: var(--sitio-superficie-alta);
  color: var(--sitio-tinta-secundaria);
  font-variant-numeric: tabular-nums;
}
.sitio .harness__dobra,
.sitio .provas__dobra { margin-top: 20px; }
.sitio .harness__dobra[open] > .dobra__corpo,
.sitio .provas__dobra[open] > .dobra__corpo { padding-top: 16px; }
.sitio .dobra > summary:focus-visible {
  outline: 2px solid var(--sitio-sinal);
  outline-offset: 3px;
  border-radius: var(--sitio-raio-fino);
}

/* ══════════════════════════════════════════════════════════════════════
   DUAS FAMÍLIAS, E NÃO DEZ · o selo miúdo e o trilho (15/08/2026)
   ══════════════════════════════════════════════════════════════════════
   A página tinha SEIS pílulas com sete geometrias (cinco alturas, quatro
   paddings, duas curvas, quatro corpos) e QUATRO barras (3 · 4 · 6 · 8px,
   com dois fundos de trilho diferentes) — um objeto cada, inventado uma vez
   por bloco. A invenção se explica: o `.chip` do pacote tem 34px de altura,
   alto demais pra viver dentro de uma linha de texto de 20px. O que não se
   explica é ela nunca ter sido sistematizada.

   Aqui ela é. Uma geometria de selo miúdo, com UMA variação declarada — a
   cápsula, que separa CONTAGEM de RÓTULO —, e um trilho só, o do pacote.

   ── O SELO MIÚDO ────────────────────────────────────────────────────── */
.sitio .achado__marca,
.sitio .placar__marca,
.sitio .dobra__conta,
.sitio .tela__tarja,
.sitio .criterio__chip,
.sitio .placar__conta,
.sitio .placar__lugar,
.sitio .placar__grau-nome {
  padding: 0 8px;
  border-radius: var(--sitio-raio-miudo);
  font-family: var(--voz-sistema);
  font-size: 12px;
  line-height: 20px;
}
/* A cápsula é a variação, e ela carrega significado: redondo é CONTAGEM ou
   POSIÇÃO (um número), reto é RÓTULO (uma palavra). */
.sitio .dobra__conta,
.sitio .placar__conta,
.sitio .placar__lugar,
.sitio .placar__grau-nome { border-radius: var(--sitio-raio-capsula); }

/* ── O TRILHO, que é o do pacote ────────────────────────────────────────
   `.placar__trilho` já tinha a altura (8px) e o raio de `.tema__trilho` do
   pacote, e divergia em duas propriedades: o fundo (`--sitio-superficie-alta`
   em vez de `--sitio-traco`) e a ausência do rebaixo. Era a mesma barra,
   redesenhada, enquanto o KavMonitor usa a do pacote no termômetro. Agora as
   quatro barras têm o MESMO fundo de trilho e duas alturas em vez de quatro:
   8px pra barra principal (a nota da célula) e 4px pra secundária (o selo da
   fita, o ranque, o gasto da peça). */
.sitio .fita__trilho,
.sitio .placar__ranque-trilho,
.sitio .peca__gasto-trilho,
.sitio .placar__trilho {
  --trilho-vazio: var(--sitio-traco);
  border-radius: var(--sitio-raio-capsula);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.55);
}
.sitio .fita__trilho,
.sitio .placar__ranque-trilho,
.sitio .peca__gasto-trilho { height: 4px; }
.sitio .placar__trilho { height: 8px; }

/* ── A fita: as quinze células numa passada de olho ────────────────────
   O ordinal vai IMPRESSO dentro do selo, e a barrinha carrega a nota na
   escala da própria célula. Com o nome do grau na legenda logo abaixo, são
   quatro portadores e três deles sobrevivem sem enxergar cor — a mesma
   doutrina do termômetro do KavMonitor, pelo mesmo motivo (daltonismo
   vermelho-verde). A cor vem do anel de 12 matizes do design system pela
   classe `grau-*`, que declara `--materia`; nunca de um hex escrito aqui. */
.sitio .fita { margin-top: 24px; display: grid; gap: 16px; }
.sitio .fita__grupo-rotulo {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0 0 8px;
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  line-height: var(--sitio-rotulo-entrelinha);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
.sitio .fita__selos {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.sitio .fita__selo {
  min-width: 60px;
  flex: 0 0 auto;
  display: grid;
  gap: 3px;
  justify-items: center;
  padding: 7px 8px;
  border: 1px solid var(--sitio-traco);
  border-left: 3px solid var(--materia, var(--sitio-traco-forte));
  border-radius: var(--sitio-raio-fino);
  background-color: var(--sitio-superficie);
  text-decoration: none;
  color: var(--sitio-tinta-secundaria);
}
.sitio .fita__selo:hover { border-color: var(--sitio-traco-forte); }
.sitio .fita__selo:hover { border-left-color: var(--materia, var(--sitio-sinal)); }
.sitio .fita__marca {
  font-family: var(--voz-sistema);
  font-size: 10px;
  line-height: 14px;
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  white-space: nowrap;
}
/* O ordinal sai da MONO, e o motivo é métrica, não gosto. Medido em canvas
   com a fonte computada (`400 17px "JetBrains Mono"`): `1`, `º` e o ESPAÇO
   avançam exatamente 10,1998px cada — o desenho do `º` tem ~4px e os outros
   ~6px são ar da célula monoespaçada. A 17px isso é grande o bastante pro
   olho ler `1 º`, ou seja um grau, e não um ordinal. E este é o número que o
   leitor leva da fita: os quinze selos existem pra dizer em que lugar o
   modelo caiu em cada célula.

   A Plex Sans tem `º` de largura própria, e `tabular-nums` mantém o
   alinhamento de coluna que a mono dava. O corpo vira o papel de deck do
   pacote, o que mata junto o degrau de 17px (que não era papel de ninguém e
   ficava a 1,059 do de 16 — abaixo do limiar em que o olho separa dois
   tamanhos). */
.sitio .fita__ordinal {
  font-family: var(--voz-funcional);
  font-size: var(--sitio-deck-corpo);
  line-height: 22px;
  color: var(--sitio-tinta-cheia);
  font-variant-numeric: tabular-nums;
}
/* `display:block` é obrigatório: `width` num `<span>` inline é no-op, e a
   barra ficaria com a largura do nada que ela contém. Mesmo defeito, mesma
   correção, do termômetro do KavMonitor. */
.sitio .fita__trilho {
  display: block;
  width: 100%;
  background: linear-gradient(
    to right,
    var(--materia, var(--sitio-sinal)) var(--parte, 0%),
    var(--trilho-vazio) var(--parte, 0%));
}
.sitio .fita__trilho--vazio { background: var(--trilho-vazio); }
/* Só pra leitor de tela: o ordinal e a marca são `aria-hidden` no selo, e
   sem isto a fita seria quinze links chamados "1º". */
.sitio .fita__lido {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
.sitio .fita__legenda {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 6px 20px;
  font-size: 12px;
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
}
.sitio .fita__chave { display: flex; align-items: center; gap: 6px; }
.sitio .fita__chave b { color: var(--sitio-tinta-cheia); font-weight: 500; }
.sitio .fita__amostra {
  width: 12px;
  height: 12px;
  flex: none;
  border-radius: var(--sitio-raio-miudo);
  background-color: var(--materia, var(--sitio-superficie-alta));
  border: 1px solid var(--sitio-traco-forte);
}

/* ── O placar: onde ele caiu na régua ─────────────────────────────────── */
.sitio .placar__grupo { margin-top: 32px; }
.sitio .placar__grupo-rotulo {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0 0 4px;
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  line-height: var(--sitio-rotulo-entrelinha);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-sinal);
}
.sitio .placar__conta {
  background-color: color-mix(in srgb, var(--sitio-sinal) 14%, transparent);
  color: var(--sitio-sinal);
  letter-spacing: 0;
}
.sitio .placar__lista { margin: 0; }
.sitio .placar__linha {
  display: grid;
  gap: 4px 24px;
  padding: 12px 0;
  border-top: 1px solid var(--sitio-traco);
}
/* Duas colunas só quando a da esquerda cabe sem quebrar o nome da célula em
   três linhas — abaixo disso o rótulo vai POR CIMA do resultado, que é como
   um dado longo se lê num celular. A tabela de duas colunas que existia
   antes fazia o contrário em qualquer largura. */
@media (min-width: 760px) {
  .sitio .placar__linha { grid-template-columns: 268px minmax(0, 1fr); }
}
.sitio .placar__celula {
  display: flex;
  align-items: baseline;
  gap: 10px;
  min-width: 0;
}
.sitio .placar__marca {
  flex: none;
  border: 1px solid var(--sitio-traco-forte);
  color: var(--sitio-tinta-secundaria);
  white-space: nowrap;
}
.sitio .placar__nome {
  font-size: var(--sitio-corpo-corpo);
  line-height: var(--sitio-corpo-entrelinha);
  color: var(--sitio-tinta-cheia);
  text-wrap: pretty;
}
.sitio .placar__resultado {
  margin: 0;
  font-size: var(--sitio-corpo-corpo);
  line-height: 24px;
  color: var(--sitio-tinta-secundaria);
  font-variant-numeric: tabular-nums;
  text-wrap: pretty;
  /* Resultados citam caminhos e códigos sem espaço; sem isto uma palavra
     longa alarga a coluna e a página inteira junto. */
  overflow-wrap: anywhere;
}
/* ── A medida: a nota, e a nota desenhada ──────────────────────────────────
   A nota é o começo LITERAL do resultado da régua (`10/10`, `32/60`, `✓ × 6`),
   posta em voz de sistema e em tinta cheia. Ela cai sempre no mesmo x, e ao
   lado dela a mesma nota vira barra na escala da própria célula. É o que
   transforma quinze frases longas em matriz: a forma do modelo — cheio no
   núcleo, furado na camada hard — se lê numa passada de olho.

   Onde a régua não dá gabarito numérico não existe barra, e a linha declara
   isso em vez de desenhar um palpite. */
/* Grade, e não flex: com flex a barra começa depois da nota, e uma nota mais
   larga (`18/18 × 6`) empurra a barra dela pra direita — as barras deixam de
   partir do mesmo x e a escala comum, que é a razão de existir do gráfico,
   vira ilusão de ótica. A primeira trilha é fixa; nota mais longa que ela
   transborda pro vão, e a barra fica onde está. */
.sitio .placar__medida {
  display: grid;
  grid-template-columns: 96px minmax(0, 260px);
  align-items: center;
  margin: 0;
}
.sitio .placar__sem-escala,
.sitio .placar__trilho { grid-column: 2; }
/* O qualificador da leitura, quando a régua escreveu DUAS pra mesma célula
   (`0/6 exato · 4/6 "alternativa declarada"`). Sem ele as duas barras seriam
   dois números sem critério, que é pior do que uma barra mentindo.

   Ele vai numa LINHA própria, e não numa terceira coluna: cada `.placar__medida`
   é uma grade sozinha, então uma coluna `auto` é dimensionada pelo conteúdo
   DAQUELA linha — e as barras passavam a ter larguras diferentes por linha
   (medido a 390px: 182, 146 e 87), que destrói a escala comum, que é a razão
   de existir do gráfico. */
.sitio .placar__criterio-da-nota {
  grid-column: 2;
  font-family: var(--voz-sistema);
  font-size: 12px;
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
  text-wrap: pretty;
}
.sitio .placar__nota {
  grid-column: 1;
  font-family: var(--voz-sistema);
  font-weight: 500;
  font-size: 15px;
  line-height: 24px;
  color: var(--sitio-tinta-cheia);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.sitio .placar__trilho {
  position: relative;
  background-color: var(--trilho-vazio);
  overflow: hidden;
}
/* O degradê é o de `.tema__barra` do pacote — a mesma barra do termômetro do
   KavMonitor, e é o que dá volume ao preenchimento sobre o rebaixo. */
.sitio .placar__parte {
  position: absolute;
  inset: 0 auto 0 0;
  width: var(--parte, 0%);
  border-radius: inherit;
  background-color: var(--sitio-sinal);
  background-image: linear-gradient(180deg, rgba(255, 255, 255, .13) 0, rgba(0, 0, 0, .2) 100%);
}
/* O tique é onde CADA um dos outros modelos caiu na mesma célula. Sem ele a
   nota não tem contra o quê: 32/60 pode ser um modelo ruim ou uma célula dura
   pra todo mundo, e a diferença é a única coisa que a régua sabe responder. */
.sitio .placar__tique {
  position: absolute;
  top: 0;
  bottom: 0;
  left: var(--em, 0%);
  width: 2px;
  margin-left: -1px;
  background-color: color-mix(in srgb, var(--sitio-tinta-cheia) 45%, transparent);
}
.sitio .placar__sem-escala {
  font-family: var(--voz-sistema);
  font-size: 12px;
  line-height: 20px;
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
.sitio .placar__legenda {
  margin: 12px 0 0;
  max-width: var(--rel-medida);
  font-size: var(--sitio-mono-corpo);
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
}

/* ── O grau, o lugar, e o achado que fala daquela célula ───────────────
   As três coisas que o portão acrescenta à linha, e as únicas que sobraram
   visíveis nela: o resultado escrito da régua (byte-idêntico ao da vitrine)
   desceu pra dentro da dobra. */
.sitio .placar__leitura,
.sitio .placar__pe {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 2px 20px;
}
.sitio .placar__pe { margin-top: 4px; }
/* A dobra fica na MESMA linha dos elos de achado. Sozinha ela custava uma
   linha inteira por célula, quinze vezes. */
.sitio .placar__pe .placar__outros { margin-top: 0; }
.sitio .placar__grau {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 4px 10px;
  margin: 0;
  font-family: var(--voz-sistema);
  font-size: 12px;
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
}
.sitio .placar__grau-nome {
  background-color: color-mix(in srgb, var(--materia, var(--sitio-traco-forte)) 22%, transparent);
  border: 1px solid color-mix(in srgb, var(--materia, var(--sitio-traco-forte)) 60%, transparent);
  color: var(--sitio-tinta-cheia);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  white-space: nowrap;
}
.sitio .placar__ordinal { font-variant-numeric: tabular-nums; }
.sitio .placar__achados {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 16px;
  margin: 0;
  font-size: var(--sitio-mono-corpo);
  line-height: 20px;
}
/* A seta declara que o elo vai pra outro lugar DESTA página. O achado e a
   célula são a mesma medida lida duas vezes, e antes nada dizia isso. */
.sitio .placar__achado::before { content: "→ "; color: var(--sitio-tinta-fraca); }
.sitio a.achado__marca:hover, .sitio a.achado__marca:focus-visible {
  border-color: var(--sitio-sinal);
  color: var(--sitio-sinal);
}
.sitio .placar__detalhe {
  margin: 0 0 12px;
  font-size: var(--sitio-corpo-corpo);
  line-height: var(--sitio-corpo-entrelinha);
  color: var(--sitio-tinta-secundaria);
  text-wrap: pretty;
  overflow-wrap: anywhere;
}
.sitio .placar__destaque {
  margin: 20px 0 0;
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  line-height: var(--sitio-rotulo-entrelinha);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
.sitio .placar__topo { margin-top: 24px; }
.sitio .placar__topo[open] > .dobra__corpo { padding-top: 4px; }
.sitio .placar__topo .placar__grupo { margin-top: 20px; }
.sitio .placar__regras { margin-top: 28px; }
.sitio .placar__regras p {
  margin: 10px 0 0;
  max-width: var(--rel-medida);
  font-size: var(--sitio-mono-corpo);
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
}

/* ── A comparação, fechada por padrão ──────────────────────────────────────
   Nasce em `<details>`: a comparação é a segunda pergunta de quem lê, e aberta
   por padrão ela viraria quinze listas de onze linhas — parede, não gráfico. */
.sitio .placar__outros { margin-top: 10px; }
.sitio .placar__ranque {
  margin: 10px 0 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 6px;
}
/* A primeira coluna é a CLASSIFICAÇÃO, não o número da linha — por isso o
   `<ol>` acima está sem marcador: o contador do navegador diria 1, 2, 3 e
   desmentiria a coluna em silêncio, que é o defeito que ela veio consertar. */
.sitio .placar__ranque-linha {
  display: grid;
  grid-template-columns: 38px 76px minmax(0, 1fr);
  align-items: center;
  gap: 4px 12px;
}
@media (min-width: 760px) {
  .sitio .placar__ranque-linha {
    grid-template-columns: 38px 76px minmax(0, 1fr) 120px;
  }
}
/* A tinta é a SECUNDÁRIA, e não a fraca, porque esta coluna é DADO.
   Ela mediu 3,21:1 em 108 instâncias até 15/08/2026, contra um piso de
   4,5:1 — e o comentário logo acima é o que condena a escolha: a tinta fraca
   fica "só onde o conteúdo é ordinal e redundante", e a classificação não é
   redundante, ela não está escrita em nenhum outro lugar da linha. Com
   `--sitio-tinta-secundaria` o número mede 6,18:1 e fica igual à nota e ao
   nome do modelo ao lado, que já usavam essa tinta e já passavam. */
.sitio .placar__ranque-lugar {
  font-family: var(--voz-sistema);
  font-weight: 400;
  font-size: var(--sitio-mono-corpo);
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
/* O `=` do empate é o quarto portador da informação, junto do número
   repetido, da regra escrita abaixo da lista e da legenda do placar. Ele
   existe porque três "1º" seguidos leem como erro de renderização. */
.sitio .placar__ranque-empate {
  margin-left: 1px;
  color: var(--sitio-tinta-secundaria);
}
/* Só pra leitor de tela: o `=` é `aria-hidden`, e sem isto o empate seria
   portado por um glifo mudo. Mesmo padrão do `.fita__lido` da fita. */
.sitio .placar__ranque-lido {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
/* O vão declarado (`—`) fica mais apagado que um número: ele não é uma
   posição ruim, é a ausência de posição.

   **0,85, e não 0,65.** Sobre a tinta fraca que esta coluna usava, 0,65 dava
   `#3d4248` e **1,98:1** — o pior contraste de texto da página inteira, em 46
   instâncias, e sobre um glifo de um traço só, sem forma de letra pro olho
   reconstruir. Medido em captura: a coluna sumia, e catorze linhas ficavam
   sem primeira coluna. Sobre a tinta secundária (ver a regra do
   `.placar__ranque-lugar`), 0,85 compõe `#777b80` = **4,70:1**, e a
   hierarquia que a regra queria continua de pé: 4,70 contra 6,18. O que some
   é o degrau de 1,98. */
.sitio .placar__ranque-lugar.e-sem-lugar { opacity: 0.85; }
.sitio .placar__ranque-nota {
  font-family: var(--voz-sistema);
  font-weight: 400;
  font-size: var(--sitio-mono-corpo);
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.sitio .placar__ranque-modelo {
  font-size: var(--sitio-corpo-corpo);
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
  overflow-wrap: anywhere;
}
.sitio .placar__ranque-trilho {
  grid-column: 1 / -1;
  background: linear-gradient(
    to right,
    color-mix(in srgb, var(--sitio-tinta-cheia) 45%, transparent) var(--parte, 0%),
    var(--trilho-vazio) var(--parte, 0%));
}
@media (min-width: 760px) {
  .sitio .placar__ranque-trilho { grid-column: 4; }
}
.sitio .placar__saida { margin: 28px 0 0; font-size: var(--sitio-corpo-corpo); }
.sitio .placar__saida-nota { color: var(--sitio-tinta-secundaria); }

/* ── O texto do relatório ──────────────────────────────────────────────
   O corpo vem da vault como HTML de markdown: h2/h3, parágrafos, tabelas,
   listas, `code` e as chamadas de nota. Nada aqui reescreve esse HTML — só
   dá a ele uma medida de leitura e uma voz. */
.sitio .relatorio__corpo {
  font-size: var(--sitio-deck-corpo);
  line-height: var(--sitio-deck-entrelinha);
  color: var(--sitio-tinta-secundaria);
}
.sitio .relatorio__corpo h3 {
  margin: 40px 0 0;
  max-width: var(--rel-medida);
  font-family: var(--voz-funcional);
  font-size: clamp(18px, 1.5vw, 21px);
  line-height: 1.35;
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--sitio-tinta-cheia);
  scroll-margin-top: 24px;
  text-wrap: pretty;
}
.sitio .relatorio__corpo p,
.sitio .relatorio__corpo ul,
.sitio .relatorio__corpo ol {
  max-width: var(--rel-medida);
  margin: 20px 0 0;
  text-wrap: pretty;
}
.sitio .relatorio__corpo li { margin-top: 8px; }
.sitio .relatorio__corpo li::marker { color: var(--sitio-tinta-fraca); }
.sitio .relatorio__corpo strong { color: var(--sitio-tinta-cheia); font-weight: 600; }
.sitio .relatorio__corpo em { color: var(--sitio-tinta-cheia); }
.sitio .relatorio__corpo hr {
  height: 0;
  margin: 40px 0 0;
  border: 0;
  border-top: 1px solid var(--sitio-traco);
}
/* `code` marca nome de arquivo, chave de JSON e número medido — é dado, e
   dado se lê na voz de sistema. O fundo é um degrau, não uma caixa: quinze
   trechos de código num parágrafo viram confete se cada um ganhar moldura. */
.sitio .relatorio__corpo code,
.sitio .provas code {
  font-family: var(--voz-sistema);
  font-size: 0.86em;
  padding: 0.1em 0.35em;
  border-radius: 5px;
  background-color: var(--sitio-superficie-alta);
  color: var(--sitio-tinta-cheia);
  overflow-wrap: anywhere;
}

/* As tabelas do corpo carregam o resultado célula a célula — são o dado
   mais denso da página. `display:block` + rolagem própria é o que impede
   uma tabela larga de empurrar a página inteira na horizontal (a versão
   anterior desta página estourava o viewport de 390 em 46px). */
/* ── UMA tipografia de tabela para as três tabelas ─────────────────────
   Correção de 15/08/2026. A página tinha três tabelas de resultado com três
   tipografias de célula, em seções vizinhas: `.curva__tabela` (13px mono),
   a tabela do markdown (célula em **16px IBM Plex Sans**, cabeçalho em 11px
   caixa alta) e `.harness__tabela` (13px Plex Sans, com o `<th>`
   TIPOGRAFICAMENTE IDÊNTICO ao `<td>` — mesmo corpo, mesma voz, mesmo peso,
   mesma entrelinha; o cabeçalho só existia pela borda). Três corpos, duas
   vozes, três entrelinhas, três cabeçalhos, para o mesmo trabalho: mostrar
   número medido. Rolando, a diferença aparece — os números de uma são
   monoespaçados e os da outra não.

   A régua única: CÉLULA em voz de sistema 13px/20px com figuras tabulares,
   CABEÇALHO em rótulo (11px, caixa alta, tinta secundária). O readme do
   design system é quem decide: a JetBrains Mono carrega "metadado" e "todo
   número que muda", e a tabela do markdown, a mais densa das três, era
   justamente a que saía na voz proporcional. Ela encolhe de 16 pra 13px, o
   que também alivia o transbordo lateral que o `overflow-x: auto` segurava.
   `TestUmaTipografiaDeTabela` mede as três juntas. */
.sitio .relatorio__corpo table,
.sitio .curva__tabela,
.sitio .harness__tabela {
  font-family: var(--voz-sistema);
  font-size: var(--sitio-mono-corpo);
  line-height: 20px;
  font-variant-numeric: tabular-nums;
}
/* Só o `<th>` de CABEÇALHO DE COLUNA vira rótulo. O `<th>` de cabeçalho de
   LINHA (a curva e o harness têm os dois) é o nome da linha, texto que se lê
   na mesma voz da célula — pôr caixa alta nele transformaria dado em rótulo. */
.sitio .relatorio__corpo thead th,
.sitio .curva__tabela thead th,
.sitio .harness__tabela thead th {
  font-family: var(--voz-sistema);
  font-size: 11px;
  line-height: 16px;
  font-weight: 400;
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
.sitio .relatorio__corpo table {
  display: block;
  width: 100%;
  max-width: 100%;
  overflow-x: auto;
  border-collapse: collapse;
  margin: 28px 0 0;
}
.sitio .relatorio__corpo thead th {
  text-align: left;
  padding: 10px 20px 10px 0;
  border-bottom: 1px solid var(--sitio-traco-forte);
  white-space: nowrap;
}
.sitio .relatorio__corpo tbody td {
  padding: 12px 20px 12px 0;
  border-top: 1px solid var(--sitio-traco);
  vertical-align: top;
}
.sitio .relatorio__corpo tbody tr:hover td { background-color: var(--sitio-superficie); }
.sitio .relatorio__corpo tbody td:first-child { color: var(--sitio-tinta-cheia); }

/* A chamada de nota: um alvo de clique de verdade, não um número de 9px
   colado na palavra anterior.

   **O alvo continua 18px; o AR ótico voltou ao normal.** O `padding: 0 4px`
   pagava o alvo de clique em espaço tipográfico: medido, um espaço no corpo
   de 18px da Plex Sans avança 4,2px, então o chip abria **0,95 espaço** de
   cada lado de si. O resultado visível eram as cinco chamadas soltando a
   pontuação da palavra (`… na terceira ⁴ ⁵ .`), com o ponto final sozinho.
   Agora o padding cresce na VERTICAL (a caixa de acerto sobe de 16 pra 20px
   de altura) e a margem negativa devolve a métrica: 2px de ar antes (0,48
   espaço) e 1px depois. A largura da caixa de acerto não muda. */
.sitio .relatorio__corpo sup a,
.sitio .provas .footnote-backref {
  display: inline-block;
  min-width: 18px;
  padding: 2px 4px;
  margin-inline: 2px -3px;
  border-radius: 4px;
  background-color: color-mix(in srgb, var(--sitio-sinal) 12%, transparent);
  font-family: var(--voz-sistema);
  font-size: 11px;
  line-height: 16px;
  text-align: center;
  text-decoration: none;
}
/* A setinha de volta não leva margem, e a regra acima leva. A margem existe
   pra CHAMADA de nota, que fica no meio da frase e precisa de ar antes e de
   um encosto depois pra pontuação não se soltar (`… na terceira ⁴ ⁵ .`). A
   setinha encerra o parágrafo: não há pontuação depois dela, e os 2px da
   frente custam caro. Ela é `inline-block`, então conta como bloco atômico de
   18px mais 2px de margem, e margem PODE transbordar a linha em vez de forçar
   a quebra. Medido a 390px: a linha da prova saía 2px além da coluna (272
   contra 270), e só ali, porque é a largura em que sobram exatamente 18px no
   fim da última linha. Zerar a margem devolve a quebra. */
.sitio .provas .footnote-backref { margin-inline: 0; }

.sitio .relatorio__corpo sup { line-height: 0; }

/* ── As peças, na janela do sistema ────────────────────────────────────
   `.janela` é o componente do pacote (elementos.css + elementos-sitio.css):
   cromo com o sinal da marca, título e campo. Aqui o campo é o `<iframe>` da
   peça — o que muda é só o miolo, nunca a moldura. */
.sitio .peca { margin-top: 32px; }
.sitio .peca__janela { overflow: hidden; }
.sitio .janela__cromo .peca__acoes {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 4px;
  flex: none;
}
/* Especificidade: `.acao--fantasma` sozinha (0,1,0) perde de `.sitio a`
   (0,1,1) — a armadilha documentada em css/sitio-web.css, e é por isso que
   estes dois links saíam âmbar. Escopado com o elemento pra valer. O âmbar
   já é o sinal do YouTube no cabeçalho e das chamadas de nota no texto:
   gastar ele de novo em duas ações de moldura seria a terceira aparição do
   "um sinal por vista" na mesma tela. */
.sitio .peca__acoes a.acao { height: 26px; font-size: 12px; padding: 0 10px; color: var(--janela-tinta-secundaria); }
.sitio .peca__acoes a.acao:hover { color: var(--janela-tinta-cheia); }
.sitio .peca__quadro {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 10;
  border: 0;
  /* O campo vazio da janela do sistema (--janela-campo), e não branco nem
     uma superfície do sítio: a peça é um documento inteiro escrito por
     outro autor, com o próprio fundo — a moldura não pode apostar em qual.
     Enquanto ela carrega, o que se vê é uma janela vazia, que é o que é. */
  background-color: var(--janela-campo);
}
.sitio .peca__veredito {
  margin: 12px 0 0;
  max-width: var(--rel-medida);
  font-size: var(--sitio-corpo-corpo);
  line-height: 24px;
  color: var(--sitio-tinta-secundaria);
}
/* O rótulo é BLOCO, e a página já tinha o padrão certo três blocos acima:
   `.tela__criterio span` faz o mesmo par rótulo+texto e as três linhas dele
   saem todas no mesmo x. Aqui o rótulo era inline, e o resultado medido eram
   três linhas em x=484 · 412 · 412: a primeira empurrada 72px pra dentro e
   as outras duas soltas embaixo dela. Não é recuo de parágrafo nem rótulo
   pendurado, é um rótulo que ocupa o começo de uma linha e some nas
   seguintes. Duas soluções para o mesmo problema na mesma página; ficou a
   que já estava certa. */
.sitio .peca__rotulo {
  display: block;
  font-family: var(--voz-sistema);
  font-size: 11px;
  line-height: 16px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
@media (max-width: 560px) {
  /* No celular o título da janela fica com a barra inteira e as ações
     descem pra uma segunda linha DENTRO da mesma barra — três coisas numa
     barra de 38px viram três coisas ilegíveis. Descer é melhor que sumir:
     "abrir em tela cheia" é justamente o que mais se usa num celular, onde
     o iframe é a menor tela da página. */
  .sitio .janela__cromo .peca__acoes {
    margin: 0;
    width: 100%;
    order: 3;
  }
  .sitio .peca__janela .janela__cromo { height: auto; flex-wrap: wrap; padding: 8px 12px; }
  .sitio .peca__quadro { aspect-ratio: 4 / 5; }
}

/* ── As provas ─────────────────────────────────────────────────────────
   O bloco que a extensão `footnotes` do markdown emite. Ele já vem como
   `<hr>` + `<ol>`; o `<hr>` sai (a seção agora tem título próprio) e a
   lista vira um registro: um arquivo bruto por linha, em voz de sistema. */
.sitio .provas .footnote > hr { display: none; }
.sitio .provas ol { margin: 24px 0 0; padding: 0 0 0 32px; }
.sitio .provas li {
  padding: 12px 0;
  border-top: 1px solid var(--sitio-traco);
  scroll-margin-top: 24px;
}
.sitio .provas li::marker {
  font-family: var(--voz-sistema);
  font-size: 12px;
  color: var(--sitio-tinta-fraca);
}
.sitio .provas li p {
  margin: 0;
  font-size: var(--sitio-corpo-corpo);
  line-height: 24px;
  color: var(--sitio-tinta-secundaria);
  overflow-wrap: anywhere;
}
.sitio .provas li:target { background-color: var(--sitio-superficie); }

/* ── O portão, na vitrine ──────────────────────────────────────────────
   A metade pública termina aqui. O que a lista promete é copy fixa
   (pagina.py, `_O_QUE_TEM_LA_DENTRO`) — nada que descreva ESTE relatório
   em particular passa por este bloco. */
/* 32px, e não 36. O 36 era o ÚNICO 36 de toda a folha e criava um terceiro
   trilho na vitrine (x=161), que não existe em lugar nenhum da página paga —
   um recuo sem origem declarada. 32 é degrau da escala, e os 4px a mais de
   largura resolvem junto a única caixa que ainda transbordava a 375px (a
   cápsula "Entrar com o YouTube", medida em 218px numa caixa de 213). */
.sitio .portao {
  margin-top: 56px;
  padding: 32px;
  border: 1px solid var(--sitio-traco-forte);
  border-radius: var(--sitio-raio);
  background-color: var(--sitio-superficie);
  box-shadow: var(--sitio-relevo), var(--sitio-luz-de-bordo);
}
.sitio .portao__rotulo {
  margin: 0;
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  line-height: var(--sitio-rotulo-entrelinha);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-sinal);
}
.sitio .portao__titulo {
  margin: 10px 0 0;
  font-family: var(--voz-funcional);
  font-size: clamp(26px, 2.6vw, 34px);
  line-height: 1.2;
  font-weight: 400;
  letter-spacing: -0.018em;
  color: var(--sitio-tinta-cheia);
}
.sitio .portao__deck {
  margin: 12px 0 0;
  max-width: 54ch;
  font-size: var(--sitio-corpo-corpo);
  line-height: 24px;
  color: var(--sitio-tinta-secundaria);
}
.sitio .portao__lista {
  list-style: none;
  margin: 28px 0 0;
  padding: 0;
  display: grid;
  gap: 12px;
}
@media (min-width: 760px) {
  .sitio .portao__lista { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px 32px; }
}
.sitio .portao__lista li {
  padding-left: 18px;
  border-left: 2px solid var(--sitio-traco-forte);
  font-size: var(--sitio-corpo-corpo);
  line-height: 24px;
  color: var(--sitio-tinta-secundaria);
  text-wrap: pretty;
}
.sitio .portao__lista b { display: block; color: var(--sitio-tinta-cheia); font-weight: 600; }
.sitio .portao__acao { margin: 32px 0 0; }
.sitio .portao__espera {
  margin: 32px 0 0;
  font-family: var(--voz-sistema);
  font-size: 13px;
  color: var(--sitio-tinta-secundaria);
}

/* ── As telas de terminal ───────────────────────────────────────────────
   Prompt real e resposta real de uma execução, do `resultados/*.json` que o
   harness escreveu. A moldura é a `.janela` do pacote (o mesmo componente
   que as peças do bloco C usam) — aqui só o campo muda: em vez de um
   `<iframe>`, um `<pre>` com o texto literal.

   `white-space: pre-wrap` não é estética: a resposta do modelo tem quebras
   de linha e recuos que fazem parte do que ele escreveu. Normalizar isso
   seria reescrever a prova. */
.sitio .tela { margin: 32px 0 0; }
.sitio .tela__janela { box-shadow: var(--sitio-luz-de-bordo); overflow: hidden; }
.sitio .tela__cromo {
  height: 44px;
  padding-inline: 16px;
  gap: 10px;
  justify-content: flex-start;
}
.sitio .tela__cromo .janela__sinal { width: 18px; height: 18px; }
.sitio .tela__cromo .janela__titulo {
  margin-left: 6px;
  font-size: 13px;
  line-height: 20px;
  color: var(--janela-tinta-cheia);
}
/* O caminho do arquivo é a procedência da tela, e por isso está NA tela e
   não na legenda: quem duvidar do trecho tem o nome do arquivo junto dele.
   Some abaixo de 560px — ali o título já ocupa a barra inteira. */
.sitio .tela__arquivo {
  margin-left: auto;
  font-family: var(--voz-sistema);
  font-size: 11px;
  line-height: 20px;
  color: var(--janela-tinta-secundaria);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
@media (max-width: 560px) { .sitio .tela__arquivo { display: none; } }

/* `white-space: normal` é OBRIGATÓRIO, e a herança é traiçoeira.
   `.tela__campo` é um `.janela__campo` do pacote, e o pacote declara
   `white-space: pre` nele (`elementos-sitio.css`, onde o campo é um terminal
   e a decisão está certa). Aqui o campo carrega PROSA: rótulo, resumo de
   dobra, aviso de vazio. `membros.css` já corrigia o `<pre>` de dentro
   (`.tela__texto { white-space: pre-wrap }`) e deixava a prosa em `pre`.

   Medido a 375px: o resumo da dobra pedia 324px numa caixa de 197 e saía
   cortado no meio da palavra — o leitor via `a resposta inteira, 1.491 cara`
   e precisava arrastar o campo pro lado pra ler o rótulo do próprio recorte.
   Quinze caixas transbordando a 375, três a 1180, e nenhum erro em lugar
   nenhum: `body.sitio { overflow-x: clip }` apara o que sai.

   A declaração fica no CAMPO, e não numa lista dos quatro blocos que hoje
   sofrem, porque a lista tem buraco por construção — qualquer bloco de prosa
   que entre no campo amanhã nasceria cortado. Quem precisa de `pre` é o
   `<pre>`, e ele declara o próprio (`pre-wrap`, logo abaixo).
   `TestOTextoDaTelaCabeNoEstreito` mede as caixas, não os seletores.

   O `gap` caiu de 18 pra 12px pelo defeito vizinho: a parede é 20px e os
   blocos ficavam a 18px uns dos outros — razão 1,11×, que não agrupa nada.
   Os três blocos liam como pilha indiferenciada em vez de três coisas dentro
   de uma moldura. Com 12px a razão vira 1,67× e a moldura volta a agrupar
   (e a página encolhe 12px por tela, cinco telas). */
.sitio .tela__campo { padding: 20px; display: grid; gap: 12px; white-space: normal; }
/* `min-width: 0` em toda a cadeia de grades da tela, e isso não é enfeite.
   Item de grade nasce com `min-width: auto`, ou seja NÃO encolhe abaixo do
   próprio min-content — e o min-content de uma citação longa é maior que a
   coluna a 375px. O resultado era o texto passando da caixa, e ele NÃO
   aparecia como rolagem de página nenhuma: `body.sitio { overflow-x: clip }`
   apara o que sai, então o que sobrava era uma frase cortada no meio e nada
   mais. Medido a 375px: campo de 237px com 364px de conteúdo. */
.sitio .tela__bloco,
.sitio .tela__trechos,
.sitio .tela__trecho,
.sitio .tela__citacao { min-width: 0; }
.sitio .tela__rotulo {
  margin: 0 0 6px;
  font-family: var(--voz-sistema);
  font-size: 11px;
  line-height: 16px;
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--janela-tinta-secundaria);
}
.sitio .tela__texto {
  margin: 0;
  max-height: 22em;
  overflow: auto;
  overscroll-behavior: contain;
  font-family: var(--voz-sistema);
  font-size: 13px;
  line-height: 21px;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  color: var(--janela-tinta-cheia);
}
/* O prompt é o que o harness pediu; a resposta é o que o modelo devolveu. A
   diferença tem que ser visível numa passada de olho, senão a tela é um bloco
   de texto só. O prompt fica recuado atrás de um fio, em tinta secundária. */
.sitio .tela__bloco--prompt {
  padding-left: 12px;
  border-left: 2px solid color-mix(in srgb, var(--janela-tinta-secundaria) 45%, transparent);
}
.sitio .tela__bloco--prompt .tela__texto {
  color: var(--janela-tinta-secundaria);
  max-height: 12em;
}
.sitio .tela__bloco--raciocinio { padding-left: 12px; border-left: 2px dotted var(--sitio-realce-roxo); }
.sitio .tela__bloco--raciocinio .tela__texto {
  color: var(--janela-tinta-secundaria);
  max-height: 12em;
}
/* ── O excerto anotado ─────────────────────────────────────────────────
   O recorte literal, numerado, com a tarja que diz o que aquele pedaço é.
   Substituiu a parede de monoespaçada: cinco delas custavam 2.503px e
   escondiam, dentro de mil e quinhentos caracteres, as três coisas que a
   legenda ao lado já afirmava.

   Três portadores sem cor: o ORDINAL à esquerda, a PALAVRA na tarja e a
   POSIÇÃO em coluna. A cor da tarja é o quarto, e sozinha ela não carrega
   nada. */
.sitio .tela__trechos {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 10px;
}
.sitio .tela__trecho {
  display: grid;
  grid-template-columns: 18px minmax(0, 1fr);
  align-items: baseline;
  gap: 2px 8px;
}
@media (min-width: 760px) {
  .sitio .tela__trecho { grid-template-columns: 18px minmax(0, 1fr) 132px; }
}
.sitio .tela__ordinal {
  font-family: var(--voz-sistema);
  font-size: 12px;
  font-weight: 400;
  line-height: 21px;
  color: var(--janela-tinta-secundaria);
  font-variant-numeric: tabular-nums;
}
.sitio .tela__citacao {
  font-family: var(--voz-sistema);
  font-size: 13px;
  line-height: 21px;
  color: var(--janela-tinta-cheia);
  text-wrap: pretty;
  overflow-wrap: anywhere;
}
.sitio .tela__citacao strong { font-weight: 600; }
/* A tarja desce pra linha de baixo no estreito, alinhada à esquerda,
   mantendo a palavra e o ordinal — os dois portadores que importam. */
.sitio .tela__tarja {
  grid-column: 2;
  justify-self: start;
  border: 1px solid color-mix(in srgb, var(--sitio-realce-coral) 70%, transparent);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-realce-coral);
  white-space: nowrap;
}
@media (min-width: 760px) {
  .sitio .tela__tarja { grid-column: 3; justify-self: end; }
}
/* No estreito a tarja divide a coluna do texto, e ali `nowrap` não cabe:
   medido a 375px, "A ISCA, RECUSADA" na geometria do selo miúdo pede ~178px
   numa coluna de 157. Duas linhas de tarja num celular são melhores que uma
   tarja saindo da janela — e sair da janela aqui não aparece como rolagem
   nenhuma, porque `body.sitio { overflow-x: clip }` apara o que passa. */
@media (max-width: 759px) {
  .sitio .tela__tarja { white-space: normal; }
}
.sitio .tela__bloco--excerto .dobra { margin-top: 14px; }
.sitio .tela__bloco--excerto .dobra > summary { color: var(--janela-tinta-secundaria); }
.sitio .tela__bloco--excerto .dobra > summary:hover { color: var(--janela-tinta-cheia); }
/* A folga do corpo só vale ABERTO. Padding num `.dobra__corpo` fechado
   ainda desenha caixa — `content-visibility: hidden` pula o CONTEÚDO, não a
   caixa —, e medido eram 4 a 16px de vão fantasma por dobra, quinze delas na
   página. Nada aparecia errado: só sobrava espaço embaixo de um controle
   fechado. Vale pra toda dobra desta folha, e é por isso que a regra é uma
   só. */
.sitio .tela__bloco--excerto .dobra[open] > .dobra__corpo { padding-top: 10px; }

.sitio .tela__corte,
.sitio .tela__vazio {
  margin: 8px 0 0;
  font-family: var(--voz-sistema);
  font-size: 11px;
  line-height: 16px;
  color: var(--janela-tinta-secundaria);
}
.sitio .tela__vazio {
  padding: 10px 12px;
  border: 1px dashed color-mix(in srgb, var(--janela-tinta-secundaria) 55%, transparent);
  border-radius: var(--sitio-raio-fino);
  font-size: 13px;
  line-height: 20px;
}

.sitio .tela__pe { margin: 12px 0 0; display: grid; gap: 8px; }
/* O critério é o que separa "olha que engraçado" de prova: sem ele, o leitor
   não sabe o que contava como acerto naquela execução. */
.sitio .tela__criterio {
  margin: 0;
  padding: 10px 14px;
  border-left: 2px solid var(--sitio-sinal);
  background-color: var(--sitio-superficie);
  font-size: var(--sitio-mono-corpo);
  line-height: 20px;
  color: var(--sitio-tinta-cheia);
}
.sitio .tela__criterio span {
  display: block;
  font-family: var(--voz-sistema);
  font-size: 11px;
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-sinal);
}
.sitio .tela__nota {
  margin: 0;
  font-size: var(--sitio-corpo-corpo);
  line-height: var(--sitio-corpo-entrelinha);
  color: var(--sitio-tinta-secundaria);
  text-wrap: pretty;
}
.sitio .tela__medidas {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 6px 18px;
}
.sitio .tela__medida {
  display: flex;
  align-items: baseline;
  gap: 6px;
  font-family: var(--voz-sistema);
  font-size: 12px;
  line-height: 20px;
  /* Não `--sitio-tinta-fraca`: "tempo", "custo" e "finish" são texto que se
     lê, e a tinta fraca dá 3,5:1 contra a mesa. Ver o bloco de contraste no
     topo desta folha. */
  color: var(--sitio-tinta-secundaria);
}
.sitio .tela__medida b {
  font-weight: 400;
  color: var(--sitio-tinta-cheia);
  font-variant-numeric: tabular-nums;
}

/* ── Os achados ─────────────────────────────────────────────────────────
   Cartões, não parágrafos. Cada um abre pelo número — que é o que se lembra
   de um achado — e fecha com a execução que o sustenta.

   A grade é `auto-fit` com piso de 320px: em 1440 dá duas colunas, e abaixo
   de ~700 vira uma só sem media query. O cartão com tela força a linha
   inteira (`grid-column: 1 / -1`), porque uma tela de terminal em meia
   coluna vira duas palavras por linha. */
/* O vão entre cartões é MAIOR que a parede de dentro deles, e não menor.
   Ele era 20px contra 24px de padding: o conteúdo ficava mais longe da
   própria borda do que os cartões ficavam uns dos outros, ou seja o sinal de
   espaço dizia o contrário do que a forma dizia. A borda de 1px e o fundo
   salvavam a leitura, mas a proximidade estava invertida. 32px devolve a
   ordem; a trilha cai de 442 pra 436px, seis pixels por cartão. */
.sitio .achados__grade {
  margin-top: 28px;
  display: grid;
  gap: 32px;
  grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr));
}
/* O último cartão de uma sequência ÍMPAR de cartões estreitos ocupa a fileira
   inteira, em vez de ficar órfão com meia fileira vazia ao lado. Medido antes:
   a seção terminava com o cartão "D5 · 2,5×" sozinho e um buraco de 442×439px
   à direita dele. Quem decide é `_achados` em pagina.py, que conhece a
   contagem — o CSS sozinho não consegue, porque `:nth-child` conta TODOS os
   irmãos e os cartões largos entram na conta. É o mesmo remendo que
   `.harness__par:last-child:nth-child(odd)` já faz três blocos acima, pelo
   mesmo motivo e com o mesmo resultado: nenhuma casa da grade fica vazia. */
.sitio .achado--fecha-fileira { grid-column: 1 / -1; }
.sitio .achado {
  min-width: 0;
  padding: 24px;
  border: 1px solid var(--sitio-traco);
  border-radius: var(--sitio-raio);
  background-color: var(--sitio-superficie);
}
/* ── O cartão largo: o que se lê à esquerda, a prova à direita ─────────
   O cartão com tela ocupa a linha inteira da grade, e ATÉ 15/08/2026 ele
   empilhava as duas metades: ~320px de texto mais ~450px de tela, 800px de
   cartão, cinco vezes. Lado a lado a altura vira o maior dos dois, e a seção
   inteira devolve cerca de 1.700px sem perder uma palavra.

   Uma coluna abaixo de 1024px: a tela precisa de largura pra que a citação
   não vire duas palavras por linha, que é o mesmo motivo pelo qual o cartão
   é largo. */
.sitio .achado--largo { grid-column: 1 / -1; }
.sitio .achado--largo .tela { margin-top: 20px; }
@media (min-width: 1024px) {
  .sitio .achado--largo {
    display: grid;
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    align-items: start;
    gap: 24px;
  }
  .sitio .achado--largo .tela { margin-top: 0; }

  /* ── A JANELA TROCA DE LADO, e é a correção mais barata do relatório ──
     Medido em 15/08/2026: a seção "Achados" tem **4.210px, 37,6% da página**,
     e CINCO dos oito cartões eram o mesmo `.achado--largo` — texto numa
     trilha de 346px à esquerda, janela escura numa de 484px à direita, cinco
     vezes seguidas. Em miniatura, duas fatias inteiras da prancha ficavam
     indistinguíveis uma da outra: **3,8 telas de 1440×1100 sem uma mudança
     de forma**, o maior deserto que sobrou na página.

     O miolo do documento é a prova de que o remédio é forma, e não corte:
     gráfico → tabela → prosa → iframe vivo → fita de selos são cinco formas
     em ~4.500px, e é o trecho que funciona. Aqui a alternância dá o mesmo
     efeito sem tirar uma palavra e sem custar um pixel de altura: os cartões
     ímpares leem texto→janela, os pares leem janela→texto, e a proporção
     inverte junto (5/7 vira 7/5), então a dobra vertical do cartão anda de
     lado a cada leitura. O olho passa a ter onde se apoiar.

     `nth-of-type`, e não `nth-child`: todos os cartões são `<article>`, mas
     `nth-child` contaria posição na grade e mudaria de alvo se um cartão
     estreito entrasse no meio. E é `order` no texto, não reordenação no
     HTML: a ORDEM DO DOCUMENTO continua texto→prova, que é a ordem em que se
     lê e a que o leitor de tela recebe. A contrapartida conhecida é o
     percurso de Tab dentro de um cartão par ir da direita pra esquerda —
     custo aceitável dentro de uma caixa só, e é por isso que a inversão para
     no cartão e nunca atravessa a seção. */
  .sitio .achado--largo:nth-of-type(even) {
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  }
  .sitio .achado--largo:nth-of-type(even) .achado__dizer { order: 2; }
}
/* GRADE, e não flex com `wrap`. Com `flex-wrap`, o numeral de 40px — o maior
   tipo da página — tinha a posição decidida pela CONTAGEM DE CARACTERES da
   sigla ao lado: `"D4"` (dois caracteres) cabia na linha da marca e o numeral
   começava a 151px do canto do cartão; `"A1-HARD"` (sete) forçava a quebra e
   o numeral voltava pros 25px. Medido nos oito cartões: seis a 25px, dois a
   148 e 151. E, entre os dois cartões estreitos que ficam LADO A LADO na
   mesma fileira, o numeral saía a y=25 num e y=67 no outro — 42px de
   desalinho, sem nada de errado no HTML pra achar. É o mesmo "cartão torto"
   que o KavMonitor já registra em `TestMetaNaUltimaLinha`.

   Com a grade a marca fica sempre na própria linha e os oito numerais pousam
   no mesmo eixo. Custa ~26px de altura nos dois cartões de sigla curta.
   `TestOsOitoNumeraisComecamNoMesmoEixo` mede os oito. */
.sitio .achado__cabeca {
  display: grid;
  justify-items: start;
  gap: 8px;
}
.sitio .achado__marca {
  display: inline-block;
  text-decoration: none;
  border: 1px solid var(--sitio-traco-forte);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
/* O número é a manchete do cartão: entra na voz editorial e no corpo de
   manchete do pacote, porque é ele que o leitor leva embora. */
.sitio .achado__numero {
  margin: 0;
  display: flex;
  align-items: baseline;
  gap: 10px;
  flex-wrap: wrap;
}
.sitio .achado__numero b {
  font-family: var(--voz-editorial);
  font-size: clamp(28px, 3vw, 40px);
  line-height: 1.05;
  font-weight: var(--sitio-manchete-peso);
  letter-spacing: -0.02em;
  color: var(--sitio-sinal);
  font-variant-numeric: tabular-nums;
}
.sitio .achado__numero span {
  max-width: 26ch;
  font-family: var(--voz-sistema);
  font-size: 12px;
  line-height: 18px;
  color: var(--sitio-tinta-secundaria);
  text-wrap: pretty;
}
.sitio .achado__titulo {
  margin: 16px 0 0;
  max-width: 46ch;
  font-family: var(--voz-funcional);
  font-size: clamp(18px, 1.5vw, 21px);
  line-height: 1.3;
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--sitio-tinta-cheia);
  text-wrap: pretty;
}
.sitio .achado__texto {
  margin: 12px 0 0;
  max-width: 68ch;
  font-size: var(--sitio-corpo-corpo);
  line-height: 24px;
  color: var(--sitio-tinta-secundaria);
  text-wrap: pretty;
}
/* A dica é o que o dono chamou de ouro: o que fazer com o achado. Ela tem
   marcação própria porque é a linha que alguém copia pro próprio código. */
/* A entrelinha é a do PACOTE (24px), e não os 22 de antes. O par pior da
   página estava aqui: `.achado__texto` logo acima lê 16/24 e a dica lia
   16/22, mesmo corpo, mesma coluna de 346px, dentro do mesmo cartão. Nada
   erra alto — o cartão só fica mais denso no pé, e o olho lê "acabou o
   assunto" onde deveria ler "atenção", justamente na linha que o dono chama
   de ouro. */
.sitio .achado__dica {
  margin: 20px 0 0;
  padding: 12px 14px;
  border-radius: var(--sitio-raio-fino);
  background-color: var(--sitio-superficie-alta);
  border-left: 2px solid var(--sitio-realce-ambar);
  font-size: var(--sitio-corpo-corpo);
  line-height: var(--sitio-corpo-entrelinha);
  color: var(--sitio-tinta-cheia);
  text-wrap: pretty;
}
.sitio .achado__dica span {
  display: block;
  font-family: var(--voz-sistema);
  font-size: 11px;
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-realce-ambar);
}

.sitio .achado__provas {
  margin: 14px 0 0;
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 4px 10px;
  font-family: var(--voz-sistema);
  font-size: 11px;
  line-height: 18px;
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
.sitio .achado__provas code {
  padding: 1px 6px;
  border-radius: 5px;
  background-color: var(--sitio-superficie-alta);
  font-size: 11px;
  letter-spacing: 0;
  text-transform: none;
  color: var(--sitio-tinta-cheia);
  overflow-wrap: anywhere;
}

/* ── O ranque da célula: onde ESTE modelo caiu ──────────────────────────
   A linha dele fica na lista, marcada. Antes ele era removido e o leitor
   tinha que adivinhar em que altura a própria nota entraria. */
.sitio .placar__ranque-linha.e-este .placar__ranque-lugar,
.sitio .placar__ranque-linha.e-este .placar__ranque-nota,
.sitio .placar__ranque-linha.e-este .placar__ranque-modelo {
  color: var(--sitio-tinta-cheia);
}
.sitio .placar__ranque-linha.e-este .placar__ranque-modelo { font-weight: 600; }
.sitio .placar__ranque-linha.e-este .placar__ranque-trilho {
  background: linear-gradient(
    to right,
    var(--sitio-sinal) var(--parte, 0%),
    var(--trilho-vazio) var(--parte, 0%));
}
/* O fecho já entrega a resposta curta — quem só quer a posição não abre. */
.sitio .placar__lugar {
  background-color: color-mix(in srgb, var(--sitio-sinal) 16%, transparent);
  color: var(--sitio-sinal);
  font-variant-numeric: tabular-nums;
  /* A cápsula é UMA palavra ("1º de 14"). Sem isto ela quebra em três
     linhas a 375px, porque o fecho ao lado dela ficou mais longo quando
     passou a declarar o empate. */
  white-space: nowrap;
}
/* `display: inline-flex` no summary apaga o marcador do Chromium, e sobrava
   só `cursor: pointer` pra dizer que aquilo abre. O triângulo é desenhado
   aqui e gira no `[open]`. Vale pra TODA dobra da página desde 15/08/2026 —
   antes era só a do ranque, e as dobras novas nasceriam sem sinal de que
   abrem. */
.sitio .dobra > summary::before {
  content: "";
  width: 0;
  height: 0;
  align-self: center;
  border-left: 5px solid currentColor;
  border-block: 4px solid transparent;
  transition: transform 120ms ease;
}
.sitio .dobra[open] > summary::before { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) {
  .sitio .dobra > summary::before { transition: none; }
}
.sitio .dobra > summary::-webkit-details-marker { display: none; }

/* ── O gasto de raciocínio de cada peça ─────────────────────────────────
   O único número que a peça carrega sem alguém digitar: sai dos tokens do
   arquivo de execução dela. */
.sitio .peca__gasto {
  margin: 10px 0 0;
  display: flex;
  align-items: center;
  gap: 6px 12px;
  flex-wrap: wrap;
  font-family: var(--voz-sistema);
  font-size: 12px;
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
}
.sitio .peca__gasto-trilho {
  display: block;
  flex: 1 1 120px;
  max-width: 220px;
  background-color: var(--trilho-vazio);
  overflow: hidden;
}
.sitio .peca__gasto-trilho span {
  display: block;
  width: var(--parte, 0%);
  height: 100%;
  background-color: var(--sitio-realce-roxo);
}
.sitio .peca__gasto-valor {
  font-weight: 400;
  color: var(--sitio-tinta-cheia);
  font-variant-numeric: tabular-nums;
}

/* ── O `?` e os chips de cada célula ────────────────────────────────────
   Era um `<button>` com um painel `display:none` revelado no hover/foco. O
   painel virou página (`/membros/regua/#<célula>`, ver `_criterio` em
   pagina.py) e o que sobra na linha é o que MUDA de modelo pra modelo: dois
   chips (quantos itens, de que bloco) e um elo.

   Elo, e não botão: ele funciona nos três jeitos de alcançar um controle
   sem precisar dos três estados de CSS, sobrevive ao "abrir em nova aba",
   ao link salvo, e a busca do navegador alcança o destino — coisa que
   `display:none` nunca deixou acontecer. */
.sitio .criterio {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}
.sitio .criterio__chip {
  background-color: var(--sitio-superficie-alta);
  color: var(--sitio-tinta-secundaria);
  white-space: nowrap;
}
.sitio .criterio__elo {
  width: 18px;
  height: 18px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  border: 1px solid var(--sitio-traco-forte);
  border-radius: 50%;
  font-family: var(--voz-sistema);
  font-size: 11px;
  line-height: 1;
  color: var(--sitio-tinta-secundaria);
  text-decoration: none;
}
.sitio .criterio__elo:hover,
.sitio .criterio__elo:focus-visible {
  border-color: var(--sitio-sinal);
  color: var(--sitio-sinal);
}

/* ══════════════════════════════════════════════════════════════════════
   O QUE ENTROU EM 14/08/2026, A PEDIDO DO DONO
   Cinco peças novas do relatório: a identidade no cabeçalho (com o slot da
   marca), o porte escrito por extenso, o card do harness, as abas do bloco
   C e o gráfico da curva de contexto.
   ══════════════════════════════════════════════════════════════════════ */

/* ── §1 · A identidade, e o slot da marca ──────────────────────────────
   VAZIO DECLARADO. Não há arte de marca no repositório, e ela não vai ser
   desenhada aqui: o sistema prefere o vão anunciado ao desenho inventado, e
   logo de empresa é marca registrada de terceiro. O que a página faz é
   reservar o espaço, dimensioná-lo e dizer o que falta — em voz de sistema,
   discreto, do tamanho exato que a imagem vai ter quando existir. Trocar o
   `--vaga` por um `<img>` não move mais nada de lugar. */
.sitio .ficha__identidade {
  display: flex;
  align-items: center;
  gap: 20px;
  margin-top: 18px;
}
.sitio .ficha__identidade .ficha__modelo { margin-top: 0; min-width: 0; }
.sitio .ficha__marca {
  flex: none;
  width: 72px;
  height: 72px;
  display: grid;
  place-items: center;
  border-radius: var(--sitio-raio-fino);
  overflow: hidden;
}
.sitio .ficha__marca img { width: 100%; height: 100%; object-fit: contain; }
.sitio .ficha__marca--vaga {
  border: 1px dashed var(--sitio-traco-forte);
  background-color: var(--sitio-rebaixo);
}
.sitio .ficha__marca-vazio {
  font-family: var(--voz-sistema);
  font-size: 10px;
  line-height: 13px;
  text-align: center;
  letter-spacing: 0.06em;
  color: var(--sitio-tinta-secundaria);
}
@media (max-width: 560px) {
  .sitio .ficha__marca { width: 52px; height: 52px; }
}

/* ── §2 · O porte, escrito ─────────────────────────────────────────────
   "Tier F" virou "F frontier" a pedido do dono: numa escala de tier, F lê
   como fundo do poço, e aqui F não é nota nenhuma — é onde o modelo roda.
   A letra fica, rebaixada a abreviação (`<abbr>` com o rótulo inteiro no
   `title`); quem carrega o sentido é o nome ao lado. Sem sublinhado
   pontilhado no `abbr`, que é o padrão do navegador e aqui viraria ruído
   dentro de um selo. */
.sitio abbr.ficha__tier { text-decoration: none; cursor: help; }
.sitio .ficha__porte-nome {
  margin-left: 8px;
  font-family: var(--voz-funcional);
  color: var(--sitio-tinta-cheia);
}
.sitio .ficha__porte-definicao {
  display: block;
  margin-top: 2px;
  font-family: var(--voz-sistema);
  font-size: 12px;
  line-height: 16px;
  color: var(--sitio-tinta-secundaria);
}

/* ── §3 · O card do harness ────────────────────────────────────────────
   Chave e valor, e nada mais. Duas colunas quando cabem duas, uma quando
   não; a chave é rótulo de sistema, o valor é o dado. Ele é PEÇA LARGA (usa
   a coluna toda), não prosa — o que tem medida de leitura aqui é só o deck
   da seção e o pé do card. */
.sitio .harness__pares {
  display: grid;
  gap: 1px;
  margin: 24px 0 0;
  padding: 0;
  border: 1px solid var(--sitio-traco);
  border-radius: var(--sitio-raio);
  background-color: var(--sitio-traco);
  overflow: hidden;
}
@media (min-width: 720px) {
  .sitio .harness__pares { grid-template-columns: repeat(2, minmax(0, 1fr)); }

  /* O número de pares vem do dado, então ele pode ser ímpar. Quando é, o
     último par fica sozinho na fileira e sobra uma célula vazia ao lado
     dele. A célula vazia não é o fundo da página: o `gap: 1px` sobre o
     fundo de traço desenha a divisória em volta dela, então ela aparece
     como uma casa da grade que ninguém preencheu, e lê como defeito.
     O último par ocupa a fileira inteira quando está em posição ímpar,
     que é exatamente quando ele estaria sozinho. */
  .sitio .harness__par:last-child:nth-child(odd) { grid-column: 1 / -1; }
}
.sitio .harness__par {
  display: grid;
  gap: 4px;
  min-width: 0;
  padding: 14px 18px;
  background-color: var(--sitio-superficie);
}
.sitio .harness__par dt {
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  line-height: var(--sitio-rotulo-entrelinha);
  letter-spacing: var(--sitio-rotulo-espacamento);
  text-transform: uppercase;
  color: var(--sitio-tinta-secundaria);
}
.sitio .harness__par dd {
  margin: 0;
  min-width: 0;
  font-size: var(--sitio-corpo-corpo);
  line-height: var(--sitio-corpo-entrelinha);
  color: var(--sitio-tinta-cheia);
}
/* `overflow-wrap`, e não `word-break`: o fingerprint tem 44 caracteres sem
   espaço nenhum e estoura a coluna em 375px. `anywhere` só quebra o que não
   cabe de outro jeito, e deixa o resto quebrando por palavra. */
.sitio .harness__par dd code {
  overflow-wrap: anywhere;
  font-size: var(--sitio-mono-corpo);
}
.sitio .harness__par dd a { overflow-wrap: anywhere; }
/* A tabelinha de um par (hoje: entrada, saída e cache do preço). Rótulo à
   esquerda, número à direita, e a coluna dos números com largura própria —
   é o alinhamento da vírgula decimal que faz a tabela valer mais que a
   frase que ela substituiu (`0,0028` embaixo de `0,14`). */
.sitio .harness__tabela { width: 100%; margin: 4px 0 0; border-collapse: collapse; }
.sitio .harness__tabela th,
.sitio .harness__tabela td {
  padding: 4px 0;
  border: 0;
  font-weight: 400;
  vertical-align: baseline;
}
.sitio .harness__tabela th {
  text-align: left;
  color: var(--sitio-tinta-secundaria);
  padding-right: 12px;
}
.sitio .harness__tabela td {
  text-align: right;
  white-space: nowrap;
  color: var(--sitio-tinta-cheia);
}
.sitio .harness__tabela tr + tr th,
.sitio .harness__tabela tr + tr td {
  border-top: 1px solid var(--sitio-traco);
}
.sitio .harness__nota {
  display: block;
  margin-top: 4px;
  font-size: var(--sitio-mono-corpo);
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
}
/* O pé do card: a ressalva do custo, que não é um ajuste do harness e sim um
   aviso sobre como ler todo número em dólar da página. Prosa, então medida
   de leitura. */
.sitio .harness__rodape {
  margin: 14px 0 0;
  max-width: var(--rel-medida);
  padding-left: 14px;
  border-left: 2px solid var(--sitio-sinal);
  font-size: 13px;
  line-height: 20px;
  color: var(--sitio-tinta-secundaria);
}

/* ── §4 · As abas do bloco C ───────────────────────────────────────────
   Três peças que antes empilhavam três iframes altos. A fita rola na
   horizontal no estreito em vez de quebrar em duas linhas: uma fita de abas
   que quebra deixa de parecer uma fita. */
.sitio .pecas__abas { margin-top: 28px; }
.sitio .pecas__fita {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  scrollbar-width: none;
  padding-bottom: 2px;
  border-bottom: 1px solid var(--sitio-traco);
}
.sitio .pecas__fita::-webkit-scrollbar { display: none; }
/* No estreito a fita QUEBRA, e é o contrário do que o comentário acima diz.
   Medido a 375px: as três abas somam 429px numa caixa de 287, então a
   terceira começava em x=371 — inteiramente fora da tela. E `scrollbar-width:
   none` tira o único indício de que ela existe: sem barra, sem esmaecimento
   de borda, sem corte parcial de aba, a página simplesmente diz que há duas
   peças. Uma peça paga invisível é pior que uma fita que deixou de parecer
   fita. Com `wrap`, 161+8+102 = 271px cabem na primeira fileira e a de 150
   desce pra segunda; as três ficam visíveis sem gesto nenhum. */
@media (max-width: 560px) {
  .sitio .pecas__fita { flex-wrap: wrap; overflow-x: visible; }
}
.sitio .pecas__aba {
  flex: none;
  display: grid;
  gap: 2px;
  justify-items: start;
  margin-bottom: -1px;
  padding: 12px 18px;
  border: 1px solid transparent;
  border-bottom: 2px solid transparent;
  border-radius: var(--sitio-raio-fino) var(--sitio-raio-fino) 0 0;
  background: none;
  text-align: left;
  cursor: pointer;
  color: var(--sitio-tinta-secundaria);
}
.sitio .pecas__aba-id {
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  line-height: var(--sitio-rotulo-entrelinha);
  letter-spacing: var(--sitio-rotulo-espacamento);
  color: var(--sitio-tinta-secundaria);
}
.sitio .pecas__aba-nome {
  font-family: var(--voz-funcional);
  font-size: var(--sitio-acao-corpo);
  line-height: 20px;
  font-weight: 600;
  color: inherit;
}
.sitio .pecas__aba-slot {
  font-family: var(--voz-sistema);
  font-size: 11px;
  line-height: 15px;
  color: var(--sitio-tinta-secundaria);
}
.sitio .pecas__aba:hover { color: var(--sitio-tinta-cheia); }
/* A aba selecionada não se distingue só pela cor: ela ganha o fio grosso
   embaixo e o fundo de superfície. Cor sozinha some pra quem não a vê. */
.sitio .pecas__aba[aria-selected="true"] {
  border-color: var(--sitio-traco);
  border-bottom-color: var(--sitio-sinal);
  background-color: var(--sitio-superficie);
  color: var(--sitio-tinta-cheia);
}
.sitio .pecas__aba[aria-selected="true"] .pecas__aba-id { color: var(--sitio-sinal); }
.sitio .pecas__aba:focus-visible {
  outline: 2px solid var(--sitio-sinal-forte);
  outline-offset: -2px;
}
/* O painel recebe foco pelo `tabindex="0"` (é o que leva o teclado da fita
   pra dentro da peça); sem isto o anel de foco nasceria colado no iframe. */
.sitio .peca[role="tabpanel"] { padding-top: 4px; }
.sitio .peca[role="tabpanel"]:focus-visible {
  outline: 2px solid var(--sitio-sinal-forte);
  outline-offset: 4px;
}
.sitio .peca__titulo {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 4px 12px;
  margin: 20px 0 12px;
  font-family: var(--voz-funcional);
  font-size: clamp(18px, 1.5vw, 21px);
  line-height: 1.3;
  font-weight: 600;
  color: var(--sitio-tinta-cheia);
}
.sitio .peca__id {
  font-family: var(--voz-sistema);
  font-size: var(--sitio-rotulo-corpo);
  letter-spacing: var(--sitio-rotulo-espacamento);
  color: var(--sitio-sinal);
}
.sitio .peca__slot {
  font-family: var(--voz-sistema);
  font-size: var(--sitio-mono-corpo);
  font-weight: 400;
  color: var(--sitio-tinta-secundaria);
}
/* Com as abas operantes o `<h3>` da peça repete palavra por palavra o rótulo
   da aba que acabou de ser clicada, dois centímetros abaixo dela. Sai da
   TELA e fica no documento: o painel já se nomeia pelo `aria-labelledby` da
   aba, e quem lê por leitor de tela continua ouvindo o título.

   A classe vem do script (`relatorio.js`), NUNCA do servidor, e é por isso
   que ela resolve: sem JavaScript ela não existe, os três títulos aparecem, e
   eles são o único jeito de saber qual peça é qual num empilhamento sem
   abas. Um seletor de irmão (`.pecas__fita ~ .peca`) não serviria — a fita
   está no HTML mesmo quando o `<noscript>` a esconde. */
.sitio .pecas__abas.com-abas .peca__titulo {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* ── §5 · A curva de contexto ──────────────────────────────────────────
   PEÇA LARGA: o gráfico usa a coluna inteira, como tabela e iframe. O que
   tem medida de leitura são os textos em volta.

   A leitura que o desenho tem que sustentar é "a variância dentro de um
   ponto engole a diferença entre pontos", então a FAIXA (pior a melhor
   repetição) é a tinta forte e grossa, e a linha das médias é fina e
   tracejada. Desenhar a linha cheia e a faixa apagada contaria a história ao
   contrário, com os mesmos números. */
.sitio .curva__figura { margin: 24px 0 0; }
.sitio .curva__desenho {
  display: block;
  width: 100%;
  height: auto;
  border: 1px solid var(--sitio-traco);
  border-radius: var(--sitio-raio);
  background-color: var(--sitio-superficie);
}
.sitio .curva__grade { stroke: var(--sitio-traco); stroke-width: 1; }
.sitio .curva__eixo {
  fill: var(--sitio-tinta-secundaria);
  font-family: var(--voz-sistema);
  font-size: 12px;
}
.sitio .curva__linha {
  fill: none;
  stroke: var(--sitio-tinta-fraca);
  stroke-width: 1.5;
  stroke-dasharray: 5 4;
}
/* 0,62, e não 0,55. A faixa está NOMEADA na legenda ("faixa entre a pior e a
   melhor repetição"), então é objeto gráfico exigido pra entender o conteúdo,
   e o piso dele é 3:1. A 0,55 ela compunha `#31616f` sobre a superfície e
   media **2,83:1**: numa tela de brilho baixo o gráfico virava cinco bolinhas
   âmbar, sem a única marca que mostra a dispersão — que é o achado do
   gráfico. Ponto de virada medido: 0,58 (3,03:1). 0,62 dá **3,30:1**, margem
   sem clarear a ponto de competir com os pontos de repetição. */
.sitio .curva__faixa {
  stroke: var(--casa);
  stroke-width: 8;
  stroke-linecap: round;
  opacity: 0.62;
}
.sitio .curva__repeticao { fill: var(--casa-texto); opacity: 0.9; }
.sitio .curva__media {
  fill: var(--sitio-superficie);
  stroke: var(--sitio-sinal);
  stroke-width: 2.5;
}
.sitio .curva__legenda {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 24px;
  margin-top: 12px;
  font-family: var(--voz-sistema);
  font-size: var(--sitio-mono-corpo);
  color: var(--sitio-tinta-secundaria);
}
.sitio .curva__chave { display: flex; align-items: center; gap: 8px; }
.sitio .curva__chave::before {
  content: "";
  width: 16px;
  height: 4px;
  border-radius: 999px;
  flex: none;
}
.sitio .curva__chave--media::before {
  height: 10px;
  width: 10px;
  background-color: var(--sitio-superficie);
  border: 2.5px solid var(--sitio-sinal);
}
.sitio .curva__chave--faixa::before {
  height: 8px;
  background-color: var(--casa);
  opacity: 0.62;   /* a mesma da faixa no desenho — a chave tem que ser a marca */
}
/* O achado é a frase que o gráfico existe pra sustentar, e por isso ele lê
   com peso de citação, não de legenda. */
.sitio .curva__achado {
  margin: 24px 0 0;
  max-width: var(--rel-medida);
  padding-left: 16px;
  border-left: 2px solid var(--sitio-sinal);
  font-size: var(--sitio-deck-corpo);
  line-height: var(--sitio-deck-entrelinha);
  color: var(--sitio-tinta-cheia);
  text-wrap: pretty;
}
.sitio .curva__leitura,
.sitio .curva__metodo {
  margin: 16px 0 0;
  max-width: var(--rel-medida);
  font-size: var(--sitio-corpo-corpo);
  line-height: var(--sitio-corpo-entrelinha);
  color: var(--sitio-tinta-secundaria);
  text-wrap: pretty;
}
/* A nota de método é 13px e por isso tem a medida miúda: na medida de 18px
   ela media 119 CPL, o pior número de leitura da página inteira. */
.sitio .curva__metodo {
  max-width: var(--rel-medida);
  font-size: var(--sitio-mono-corpo);
  line-height: 20px;
}
.sitio .curva__tabela { width: 100%; margin-top: 24px; border-collapse: collapse; }
.sitio .curva__tabela caption {
  margin-bottom: 8px;
  text-align: left;
  color: var(--sitio-tinta-secundaria);
}
.sitio .curva__tabela th,
.sitio .curva__tabela td {
  padding: 8px 12px 8px 0;
  border-bottom: 1px solid var(--sitio-traco);
  text-align: left;
  color: var(--sitio-tinta-secundaria);
}
.sitio .curva__tabela thead th {
  border-bottom-color: var(--sitio-traco-forte);
  font-weight: 400;
}
.sitio .curva__tabela tbody th { color: var(--sitio-tinta-cheia); }
