/* Os componentes do produto do cliente, sobre o design system.
 *
 * `styles.css` é o design system do console, copiado do sistema atual sem
 * alteração, e o aceite do M5 depende de um operador reconhecê-lo. O que entra
 * aqui não existe lá: barra de idioma, popover de conta, gaveta do celular. Não
 * são duas descrições da mesma coisa — quando a coisa já existe no design
 * system, ela é acrescentada lá, e foi o que a D-210 fez com a caixa de texto.
 *
 * As regras vêm do desenho da jornada numerada (D-205), copiadas dele. Entram à
 * medida que cada etapa constrói a tela que as usa: CSS de componente que
 * ninguém desenhou ainda é código inalcançável, e a regra 11 não o quer aqui.
 */

/* ===== barra superior ===== */
.mk-burger { display: none; background: none; border: 0; padding: 6px; margin-right: 6px; cursor: pointer; color: inherit }
.mk-burger svg { width: 24px; height: 24px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round }
/* ⚠️ `color` DECLARADA, e é a única coisa que esta regra ganhou. O elo do
   logotipo estava com `rgb(0, 0, 238)` — o azul de omissão do navegador — nas
   28 telas do produto. Medido em 04/09/2026.

   ⭐ E digo o que NÃO consegui provar: que ele chegue a pintar. O elo não tem
   texto próprio (leva dois `<img>`), não usa `currentColor`, e o
   `outline-style` computado é `none`. Procurei uma regra de `:focus` que o
   apanhasse e não há nenhuma. Portanto isto é inconsistência LATENTE e não
   defeito visível — corrige-se porque custa uma linha e tira um valor de
   fábrica de 28 telas, não porque alguém o esteja a ver. */
.site-header .logo-box { flex: 0 1 auto; margin-right: auto; color: var(--acento-escuro) }
/* 168px de largura e altura automática: a prancha desenha-o assim, e a caixa
   do SVG segue a proporção sozinha. */
.site-header .logo-box img { width: 168px; height: auto }

/* ── A BARRA DE TOPO MEDE 64px, FILETE INCLUÍDO (prancha S13) ──────────────
   Media 69: `min-height: 68px` na faixa mais o `border-bottom: 1px` do
   cabeçalho. A prancha dá-lhe `height: 64px` com o filete DENTRO — e como ela
   usa `box-sizing: border-box`, os 64 já contam a linha.

   ⚠⚠ ESTE NÚMERO NÃO ESTÁ SÓ AQUI. Três medidas dependiam dos 68/69, e mudar
   uma sem as outras deixaria a lateral a começar 4px abaixo do cabeçalho e a
   moldura a reservar altura a mais:
     · o topo da lateral fixa
     · a altura da moldura, `calc(100vh - N)`
   As três mudam JUNTAS, e é por isso que estão comentadas uma à outra.

   Os 63 são deliberados: 63 da faixa mais 1 do filete = os 64 da prancha. */
.site-header .brand-row {
  /* O logotipo anda colado no hambúrguer, e não no meio da barra.
  O `space-between` do console centraliza o item do meio quando há três, e
  abaixo de 800px a folha dele ainda dá `flex:1 1 auto` ao logotipo — os dois
  juntos empurravam a marca para longe do menu justamente nas larguras
  intermediárias, que é onde ela some do canto que a pessoa procura. */
  justify-content: flex-start;
  /* ⚠ A barra ATRAVESSA a moldura, com 28px de recuo — medido na prancha
  `Passo1Enviar`. Ela herda `.wrap`, que a prende a 1240px centrados: numa
  janela de 1450 isso punha o logótipo a começar em x=105, e não em 28. É a
  «posição do logótipo» que o Alan viu — a marca não estava no canto que se
  procura, estava a um décimo da largura dele.

  `width: 100%` e não `auto`: `.wrap` dá uma largura calculada, e sem a
  anular explicitamente o `padding` só encolheria o conteúdo dentro dos
  mesmos 1240. */
  width: 100%;
  max-width: none;
  margin-inline: 0;
  padding: 0 28px;
  min-height: 63px;
}

.mk-pop { position: relative }
.mk-pop-alvo {
  display: inline-flex; align-items: center; gap: 7px; border: 1px solid var(--line);
  background: var(--surface-solid); border-radius: 999px; padding: 5px 10px;
  cursor: pointer; font: inherit; font-size: .85rem; line-height: 1
}
.mk-pop-alvo:hover { border-color: var(--accent) }
/* AS DUAS PEÇAS DAS TELAS DE ENTRADA — botão de tema e seletor de idioma.
   As medidas são as do site institucional, lidas do `localhost:3000`:
   `gap 8`, botão `28×28` com ícone de 24 e traço 1,4, gatilho de altura 32 com
   `padding 0 6`, raio 9, `gap 5` e texto 13/500.

   ⚠️ A COR NÃO É A DO SITE. Ele usa `rgb(41,63,113)`, que é a paleta dele. Aqui
   é `--texto`, e a escolha é medida: o `--marinho` do desenho anterior dá 15,33
   sobre o papel claro e **não tem par escuro** — sobre o papel escuro daria
   1,15, que é o número que fez os preços sumirem hoje. O `--texto` dá 15,85 e
   17,59, e no claro ele É um marinho escuro (`#101B3A`). */
.hd-acoes { display: flex; align-items: center; gap: 8px }
.hd-tema { display: flex; margin: 0 }
/* As duas formas do botão de tema — mesma técnica de `.logo-claro`/`.logo-escuro`
   mais abaixo. São TRÊS estados a caber em duas formas: o `dark` e o `light`
   explícitos vêm do `data-theme` na raiz, e o ausente («Sistema») cai na
   consulta de media. Sem isto o botão mentia a quem chegava sem cookie com o
   sistema no escuro: ícone, rótulo e valor enviado, os três trocados. */
.hd-tema-escuro { display: none }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .hd-tema-claro { display: none }
  :root:not([data-theme="light"]) .hd-tema-escuro { display: flex }
}
:root[data-theme="dark"] .hd-tema-claro { display: none }
:root[data-theme="dark"] .hd-tema-escuro { display: flex }
.hd-tema-botao {
  width: 28px; height: 28px; display: grid; place-items: center;
  padding: 0; border: 0; background: none; cursor: pointer; color: var(--texto)
}
.hd-tema-botao svg { width: 24px; height: 24px; display: block }
/* O gatilho do idioma não leva a borda arredondada do `.mk-pop-alvo` do
   produto: o site desenha-o sem borda e com raio 9. */
/* ⚠️ O gatilho da entrada NÃO leva a classe `mk-pop-alvo`, e por isso esta
   regra é só de classe. Medido: `#pop-idioma .mk-pop-alvo` existe mais abaixo
   nesta folha e ganhava da minha — mesma especificidade, e vence a última. A
   saída não foi subir a minha para id: foi tirar do gatilho uma classe que ele
   não precisava. **Quem abre o menu é o `data-pop`, não a classe.** */
.hd-idioma {
  /* `inline-flex` + `align-items`: sem eles o `gap` não tem em que agir e a
     bandeira (que é `display: block`) EMPILHA sobre a sigla. Foi o que o Alan
     viu na tela de entrada em produção em 05/09/2026 — o `display` vinha da
     classe `mk-pop-alvo`, que saiu do gatilho de propósito (ver acima), e
     ninguém o repôs aqui. */
  display: inline-flex; align-items: center;
  height: 32px; padding: 0 6px; gap: 5px; border: 0; border-radius: 9px;
  background: none; font-size: 13px; font-weight: 500; color: var(--texto)
}
.hd-idioma .fl { width: 20px; height: 20px; display: block; object-fit: cover }

/* ── O AVATAR SOLTO, sem o embrulho ────────────────────────────────────────
   O que se via como «borda irregular branca» à volta das iniciais NÃO era do
   avatar: era o BOTÃO que o embrulha. E a irregularidade tem causa exata —
   `border-radius: 999px` numa caixa de 52×42 não dá círculo, dá CÁPSULA: o
   raio satura no lado curto e as laterais ficam retas. Um círculo de 30px
   dentro de uma cápsula concêntrica lê-se como uma borda mal desenhada.

   As duas pranchas desenham o avatar solto: círculo, letra, e nada em volta.

   ⚠ POR SÍTIO E NÃO NA CLASSE. `.mk-pop-alvo` tem DOIS usos — este e o
   seletor de idioma de quem ainda não entrou, que é uma pílula com bandeira e
   seta e PRECISA da borda. Corrigir a classe acertaria um e partiria o outro,
   que é a forma do `--accent` que virou ciano em 696 sítios de uma vez.

   ⚠ O ALVO NÃO ENCOLHE: os 7px de recuo dão 44×44 à volta do círculo de 30.
   Tirei a decoração, não a área de clique — é ela que abre o menu da conta.

   ⚠ E O FOCO GANHA ANEL PRÓPRIO: hoje a borda fazia esse trabalho por
   acidente, e sem ela quem navega por teclado perderia o sinal de onde está.
   O anel é o mesmo de `.module-tab`, que é o que o sistema já usa. */
#pop-usuario .mk-pop-alvo {
  border: 0; background: none; padding: 7px; border-radius: 999px
}
#pop-usuario .mk-pop-alvo:hover { border-color: transparent }
#pop-usuario .mk-pop-alvo:focus-visible {
  outline: 2px solid var(--foco); outline-offset: 2px
}
.mk-caret { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; opacity: .55 }
/* ⚠ 30px, fundo `--marinho`, letra BRANCA — e as DUAS pranchas concordam:
   `Passo1Enviar` e `Passo19Conta` trazem o mesmo `background: var(--marinho);
   color: #fff; font-size: 11.5px; font-weight: 500`. Medi as duas antes de
   escolher, porque me foi dito que divergiam.

   O que estava aqui era branco... não: era `--marinho` sobre ciano, e o
   problema é o mesmo de sempre — a razão de contraste. O ciano de fundo com
   tinta marinho dá 5,63:1; o marinho com branco dá 16,38:1. Nenhum dos dois
   reprova, mas só um está desenhado. */
.mk-avatar {
  width: 30px; height: 30px; border-radius: 999px; background: var(--primario); color: var(--sobre-primario);
  display: grid; place-items: center; font-size: 11.5px; font-weight: 500
}   /* a prancha não dá entreletras às iniciais */
.mk-pop-menu {
  display: none; position: absolute; right: 0; top: calc(100% + 8px); min-width: 186px; z-index: 60;
  background: var(--surface-solid); border: 1px solid var(--line); border-radius: 14px;
  box-shadow: none; padding: 6px; overflow: hidden
}
.mk-pop.aberto .mk-pop-menu { display: block }
.mk-pop-menu button, .mk-pop-menu a {
  display: flex; width: 100%; align-items: center; gap: 10px; background: none; border: 0;
  padding: 9px 11px; border-radius: 9px; cursor: pointer; font: inherit; font-size: .88rem;
  text-align: left; color: inherit; text-decoration: none
}
/* ⚠ O HOVER É PARDO E A SELEÇÃO É AZUL: separam-se por MATIZ e não por
   claridade. O intervalo azul não dava para três degraus — dava dois de 1,07,
   que é o mesmo defeito com mais um nome. Com o hover noutra rampa, a
   competição acabou, e o `--acento-lavado` voltou a servir a seleção.

   ⭐ Isto é o pardo a fazer a distinção OUTRA VEZ — o mesmo que ele fazia antes
   por acidente, e que eu apaguei de manhã sem saber que estava a apagar. A
   diferença é que agora está escrito, e tem dono. */
.mk-pop-menu button:hover, .mk-pop-menu a:hover,
.module-tab:hover, .module-sidebar-toggle:hover { background: var(--sobrevoo) }
.mk-pop-menu button.on { font-weight: 700 }
.mk-pop-menu hr { border: 0; border-top: 1px solid var(--line); margin: 6px 4px }
.mk-pop-menu svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; opacity: .6 }
.mk-pop-saldo {
  display: flex; flex-direction: column; align-items: stretch; gap: 9px; margin: 2px 4px 6px;
  padding: 12px 13px; border: 1px solid var(--line); border-radius: 11px;
  font-size: .88rem; font-variant-numeric: tabular-nums
}
.mk-pop-saldo > span { font-weight: 600 }
.mk-pop-saldo .button { width: 100%; min-height: 34px; font-size: .84rem }

/* A bandeira é imagem, e o círculo é daqui. O arquivo é o quadrado 1x1 do
   flag-icons, sem recorte dentro — recortar no CSS deixa os três arquivos
   servíveis e cacheáveis, e o do espanhol sozinho tem 93 KB de brasão. */
/* Item 31: bandeira e avatar um degrau maiores. Eram os dois únicos alvos
   do cabeçalho e os dois menores da tela. */
.fl { width: 25px; height: 25px; display: block; flex: none; border-radius: 50%; object-fit: cover }
#pop-idioma .mk-pop-alvo { padding: 4px 8px 4px 4px }

/* ===== gaveta do celular ===== */
.mk-gaveta { display: none; position: fixed; inset: 0; z-index: 90; background: #0006 }
.mk-gaveta.aberta { display: block }
.mk-gaveta-painel {
  position: absolute; left: 0; top: 0; bottom: 0; width: min(84vw, 310px);
  background: var(--surface-solid); padding: 18px 16px; overflow: auto;
  display: flex; flex-direction: column; gap: 6px
}
.mk-gaveta-painel a {
  display: flex; align-items: center; gap: 11px; padding: 11px 12px; border-radius: 11px;
  text-decoration: none; color: inherit; font-size: .95rem
}
.mk-gaveta-painel a.on { background: var(--light-blue); font-weight: 700 }
.mk-gaveta-painel svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round }
.mk-gaveta-saldo {
  border: 1px solid var(--line); border-radius: 12px; padding: 11px 13px;
  margin: 4px 0 8px; font-size: .9rem;
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px
}
.mk-gaveta-painel hr { border: 0; border-top: 1px solid var(--line); margin: 10px 4px }

@media (max-width: 860px) {
  .mk-burger { display: inline-flex }
  .header-right-group { display: flex }
  /* ⚠ O menu da conta DEIXA de ser escondido no celular (prancha
     `Passo19Conta`, variante de 390px): ele é o mesmo painel, com o
     «Comprar» dentro. Escondê-lo aqui era o que fazia a variante de celular
     não existir — a gaveta continua a levar a NAVEGAÇÃO, e a duplicação dos
     itens de conta que ela ainda tem está declarada no relato desta frente,
     por ser decisão de produto e não minha. */
}

/* ===== conteúdo ===== */
.mk-meta { color: var(--muted); font-size: .88rem; margin: 5px 0 0 }
.app-content h1 { font-size: 1.55rem; letter-spacing: -.01em; margin: 0 }
/* No console o título fica à direita; aqui ele começa na margem esquerda. */
/* ⚠ `flex` e não `block`, e é esta regra que decide: `.app-content
   .page-heading` (0,2,0) ganha da `.page-heading` de `styles.css`. Com a
   trilha agora dentro do cabeçalho, um bloco empilhava-a por baixo do título
   e qualquer `justify-content` escrito noutro sítio ficava inerte — que é o
   mesmo defeito do rodapé, a folha a afirmar o que o navegador não faz. */
.app-content .page-heading {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 32px; margin-bottom: 18px
}

/* ===== a jornada de envio: trilha, zona de solta e cartões =====
 *
 * Copiado do desenho da jornada numerada (D-205). A trilha marca o passo do
 * tipo como `opcional` desde a primeira tela — é isso que a faz nunca crescer
 * no meio do caminho, que era o defeito do contador antigo, e por isso a classe
 * existe já aqui, com o passo ainda longe.
 */
.mk-sub { font-size: .95rem; font-weight: 700; margin: 26px 0 10px }

/* ── A ZONA DE LARGAR, medida na prancha `Passo1Enviar` ────────────────────
   Borda de 1px e raio 14 — eram 2px e 18. O tracejado grosso desenhava uma
   caixa que compete com o conteúdo; o fino diz «largue aqui» sem gritar. */
/* ⚠ O recuo cede ANTES do robô. Os 60px são os da prancha e ficam sempre que
   houver altura; numa janela baixa eles são 120px de espaço vazio a disputar
   lugar com a ilustração, e espaço vazio perde essa disputa. */
.mk-solta {
  border: 1px dashed var(--tinta-300); border-radius: 14px;
  padding: clamp(14px, 5vh, 60px) 24px;
  text-align: center; background: var(--surface-solid)
}
/* ⚠ VAZIA, ela ocupa a altura que sobra e centra o conteúdo nos DOIS eixos.
   Era uma caixa de 76px encostada ao topo, com o resto da tela em branco por
   baixo — e o robô de 260px não caberia lá dentro de maneira nenhuma. O
   `:has()` limita isto ao estado vazio: com documentos, a moldura é a faixa
   fina de cima e a grade fica com a altura. */
/* ⚠ `flex: 1 0 auto` — CRESCE mas NÃO encolhe. Com `1 1 auto` o cartão era a
   peça que cedia: numa janela de 699px ele ficava com 219 e os botões saíam
   por baixo da borda tracejada. Agora ele mantém a altura do que tem dentro e
   é o MIOLO que rola — que é o ponto: nada desaparece, muda quem tem a barra. */
.mk-solta:has(> [data-moldura-vazia]:not([hidden])) {
  display: flex; flex: 1 0 auto
}
/* `overflow: auto` é a última linha de defesa: numa janela baixa de mais para
   o robô mínimo e os botões, a zona rola por dentro em vez de os empurrar para
   fora da moldura tracejada — que foi o que eu vi antes de pôr o piso. */
.mk-solta > [data-moldura-vazia] {
  display: flex; flex-direction: column; gap: 14px;
  align-items: center; justify-content: center; flex: 1 1 auto
}
/* O miolo tem de ser coluna para que o `flex: 1 1 auto` acima tenha de que
   crescer: sem isto a zona mede o conteúdo e o «ocupa a altura» não acontece,
   por mais que se peça. */
.app-content { display: flex; flex-direction: column; min-height: 0 }
/* ⚠⚠ O `flex: 1 1 auto` SÓ NO ESTADO VAZIO, e o seletor tem de dizer isso.

   Eu escrevi-o para a zona vazia poder ocupar a altura que sobra — e estava
   certo PARA ESSE ESTADO. Com documentos, a moldura vira a faixa fina de 74px
   e o formulário continuava a crescer: medido a 1450, ele ficava com 238px de
   altura para 74 de conteúdo, e os 164 restantes eram um vão morto entre o
   cartão de envio e a grade.

   Foi o que o Alan viu: «o carregamento não está a começar a partir da parte
   de cima da tela». O vão não estava ENTRE as peças — estava DENTRO do
   formulário, que é porque a medida do espaço entre elas dava zero.

   📌 Mesma família do `align-items` e do filete: a regra certa para um estado,
   herdada por outro onde já não faz o mesmo trabalho. Agora a condição está no
   seletor, e não na cabeça de quem a escreveu. */
/* ⚠⚠ `flex: none` POR PADRÃO — sem isto o formulário ENCOLHE abaixo do próprio
   conteúdo e ele escreve por cima do que vem a seguir.

   `.app-content` é coluna flex, e um filho de coluna flex tem `flex-shrink: 1`
   de graça. Com o `min-height: 0` que eu pus para o estado vazio poder ceder, o
   formulário passou a poder encolher até 74px enquanto o conteúdo dele media
   mais — e a contagem «7 documentos · arraste para reordenar» aparecia POR CIMA
   de «Mande mais documentos», medido: a zona em 200–274 e a contagem em 226.

   📌 O `min-height: 0` é a autorização para encolher. Escrevi-a para um estado e
   ela ficou a valer nos dois — sexta vez com esta forma. */
.app-content > form:has(.mk-solta) { display: flex; flex-direction: column; flex: none }
/* `1 0 auto` e não `1 1 auto`: cresce para ocupar a altura, mas continua a não
   encolher — a autorização para crescer não é autorização para espremer. */
.app-content > form:has(.mk-solta > [data-moldura-vazia]:not([hidden])) {
  min-height: 0;
  flex: 1 0 auto;
}

/* ⚠ A ALTURA DO ROBÔ E A DA CAIXA SÃO DUAS MEDIDAS, e eu tinha-as feito uma.
   O robô fica nos 260px FIXOS — uma medida relativa mudá-lo-ia conforme a
   janela, e nenhuma das larguras resultantes é a desenhada. A CAIXA é o
   contrário: ela recebe o que sobra da moldura, e não um número.

   Com o número na caixa, a tela media 880px numa janela de 699 e ganhava barra
   de rolagem: a soma das partes decidia a altura, quando é a janela que decide
   e as partes é que cedem. */
/* ⚠ 260px é o TAMANHO DESENHADO, e não um piso. Com `flex-shrink: 0` ele
   honrava-se sempre — e numa janela de 699px a caixa recebia 219, o robô
   continuava com 260 e ele e os botões saíam por baixo da moldura tracejada.
   Medido: o número dizia que a tela cabia e a captura mostrava-a a transbordar.

   Com `max-height: 100%` ele fica nos 260 sempre que houver 260, e cede antes
   de a tela quebrar. `object-fit: contain` guarda a proporção enquanto cede. */
/* Volta aos 260 FIXOS, sem encolher: com a rolagem dentro do miolo, já não é
   ele que tem de ceder para a tela caber. O piso de 96px e o `max-height` eram
   remendos de quando o cartão encolhia — e um robô de 96px não é o desenho. */
/* ⚠️⚠️ E A DECISÃO ACIMA CAI, com a razão dela escrita porque ERA BOA.
   «Já não é ele que tem de ceder» valia enquanto a rolagem do miolo fosse
   resposta suficiente. Não é: o Alan viu no MacBook 13" dele que os BOTÕES
   ficam por baixo da dobra, e rolar para chegar ao botão principal da primeira
   tela é o defeito, não o remédio.

   📌 O que a decisão antiga não previu: os botões estão POR BAIXO da
   ilustração. Com ela em altura fixa, quem sai da tela quando a janela baixa
   não é a ilustração — são eles.

   Medido a 1440 de largura, com a ilustração em 260 fixos:
       900  botões terminam em 663   ✅ e a tela não rola
       790                     633   ✅
       700                     628   ✅
       620                     624   ⛔ FORA da janela por 4px
       560                     621   ⛔ por 61px

   ⭐ `calc(100vh - 400px)` e não uma fracção da altura: os 400 são o que o
   resto do cartão ocupa acima e abaixo da ilustração, medido. Uma fracção
   (`32vh`) encolhia-a a 790 e a 700, onde ela cabia inteira — este teto só age
   onde o defeito existe:
       900 · 790 · 700   ficam nos 260, intactos
       620               220, com 36px de folga
       560               160, com 39px

   ⚠️ `height: auto` com `max-height`, e não `height` com `width`: assim a
   proporção mantém-se ao ceder. Medido — a largura acompanha a altura.

   ⛔⛔ E O PISO DE 96px VOLTA, contra a decisão que o tirou — porque sem ele a
   conta CHEGA A ZERO. Medido a 390×390 (telefone deitado, ou teclado aberto):
   `calc(100vh - 400px)` dá -10, o `max-height` resolve para 0, e a ilustração
   DESAPARECE — não encolhe, some, e ainda ocupa as margens de um `<img>` de
   altura nula.

   📌 A objeção antiga — «um robô de 96px não é o desenho» — continua verdadeira,
   e é por isso que 96 é PISO e não alvo: acima de ~500px de janela ele nunca é
   alcançado. O que a decisão de o tirar não previu foi a janela em que a conta
   fica negativa.

   ⚠️ E fica uma pergunta que é de desenho e não minha: abaixo de ~500px de
   altura, a ilustração deve ficar em 96 ou sair de vez? Um piso é o menos mau
   que eu podia escolher sozinha; sair de vez seria uma decisão. */
.jn-robo {
  width: auto; height: auto;
  max-height: min(260px, max(96px, calc(100vh - 400px)));
  object-fit: contain; flex-shrink: 0; display: block
}
main.app-shell:has(> .mk-rodape-legal) .app-content {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  padding: 32px 32px 46px 96px
}

/* ⚠⚠ OS FILHOS DO MIOLO NÃO ENCOLHEM, e sem isto a tela escreve por cima de si
   mesma.

   O miolo é uma coluna flex de altura fixa que ROLA. Mas encolher acontece
   ANTES de rolar: com sete documentos, medido, o cabeçalho passava de 82px para
   52, o formulário de 74 para ZERO — e o conteúdo dele, que continua a medir 74,
   escrevia por cima da contagem do bloco seguinte. Foi o que o Alan viu:
   «7 documentos · arraste para reordenar» por cima de «Mande mais documentos».

   📌 `flex-shrink: 1` é o padrão de qualquer filho de flex, e num contentor que
   rola ele é sempre errado: o que não cabe tem de sair pela barra, não de ser
   espremido. */
main.app-shell:has(> .mk-rodape-legal) .app-content > * { flex-shrink: 0 }

/* ⚠⚠ A BARRA DE AÇÕES ACOMPANHA A COLUNA DO CONTEÚDO, e não a janela.

   Ela é irmã do `.app-content` dentro do `main`, e por isso NÃO herda o recuo
   dele. Sem isto os botões encostam às bordas da janela e o «Voltar» sai por
   baixo da lateral — que foi o que o Alan viu no computador quando a barra
   saiu do miolo.

   ⭐ E o efeito de a pôr aqui, e não dentro do que rola, é o que ele pediu: o
   `main` tem altura fixa, só o `.app-content` rola, e a barra fica onde está
   por cima do rodapé. Sem `position: fixed` e sem uma altura escrita. */
main.app-shell:has(> .mk-rodape-legal) > .jn-pe {
  flex: 0 0 auto; margin-top: 0;
  /* ⚠ 96px À ESQUERDA, e é o MESMO número do `.app-content` — não uma margem
     escolhida. A lateral recolhida ocupa esse espaço, e um recuo menor põe a
     barra POR BAIXO dela: foi o que o Alan viu, com o «Descartar» cortado ao
     meio pela lateral. O par é `32px 96px` no `.app-content` e o mesmo aqui;
     se um mudar, mudam os dois.

     ⚠️⚠️ E O PAR TEM QUATRO ESTADOS, não dois — a regra acima é só o primeiro:

         base .......................................  96   ambos
         min-width 1080 + `barra-presa` .............  268  ambos
         min-width 1080 e max-width 1239 + presa ....  96   ambos
         max-width 1079 (celular) ...................  16   ambos

     ⛔ Dois deles estavam partidos e foi este comentário que os denunciou: ele
     manda mover os dois e só um se mexeu. O celular ficou com 96 na barra e 16
     no conteúdo; a janela estreita ficou com 268 na barra e 96 no conteúdo.
     ⭐ O `@media (min-width: 1080px)` logo abaixo prova a forma do engano: quem
     escreveu pensou o caso GRANDE e o MAIOR, e não escreveu o menor.
     📌 Guarda em `cliente/tests_recuo_da_barra.py`. */
  padding: 18px 32px 18px 96px; border-top: 1px solid var(--linha)
}
@media (min-width: 1080px) {
  body.barra-presa main.app-shell:has(> .mk-rodape-legal) > .jn-pe { padding-left: 268px }
}
/* ⚠ O RECUO MUDOU DE DONO: era da moldura, e passou a ser do miolo. Na moldura
   ele empurrava também o RODAPÉ, e o rodapé tem de atravessar a largura toda,
   por baixo da lateral — na prancha a lateral acaba onde o rodapé começa. */
@media (min-width: 1080px) {
  body.barra-presa main.app-shell:has(> .mk-rodape-legal) .app-content { padding-left: 268px }
  .app-content { transition: padding-left .16s ease }
}

/* 19px/500 para a chamada e 13px para o preço — a prancha. Eram 1,05rem/600 e
   a cor fraca de `small`, que faziam o par ler como rótulo de formulário. */
.mk-solta p { margin: 0; font-size: 19px; font-weight: 500 }
.mk-solta > [data-moldura-vazia] small { font-size: 13px; color: var(--texto-fraco) }
.mk-solta small { color: var(--muted) }
.mk-solta-acoes { display: flex; gap: 10px; justify-content: center; margin-top: 6px; flex-wrap: wrap }
/* O botão é `<label>` com o campo escondido dentro: o campo de arquivo do
   navegador não se veste, e a etiqueta que o embrulha abre o mesmo seletor. */
.mk-solta label.button { cursor: pointer }

.mk-grade { display: grid; grid-template-columns: repeat(auto-fill, minmax(196px, 1fr)); gap: 14px }
.mk-card {
  position: relative; border: 1px solid var(--line); border-radius: 14px;
  padding: 9px; background: var(--surface-solid)
}
.mk-card > img {
  width: 100%; height: 184px; object-fit: cover; object-position: top; border-radius: 10px;
  /* ⚠ `#f2f2f4` é a caixa vazia por trás da fotografia, e era um cinzento
     FRIO que não invertia: medido em 05/09, `rgb(242,242,244)` no claro E no
     escuro, nas duas telas onde aparece.
     ⭐ O degrau escolhido é o `--tinta-50` e a escolha é por medida, não por
     gosto: dos sete tons da rampa é o que fica mais perto em luminância
     (ΔL 0,068 contra 0,145 do `--tinta-100`), e contra o papel dá 1,13 onde
     hoje dá 1,05 — a caixa continua a ser uma caixa e não passa a ser um
     bloco. ⛔ E não é o `#EEE8DB` da §0.1: aquele é o PAPEL DESENHADO dentro
     da miniatura, conteúdo e não superfície. */
  display: block; background: var(--tinta-50)
}
/* O `z-index` não é enfeite: a miniatura leva um `transform` para o giro, e
   elemento transformado é pintado no mesmo passo dos posicionados, na ordem do
   DOM — como ela vem DEPOIS do selo e dos botões, cobria os dois. E cobria em
   silêncio: `display`, `visibility` e `opacity` respondiam "visível", o
   retângulo estava no lugar certo, e mesmo assim não se via nada. Quem conta a
   verdade é o `elementFromPoint`, que no ponto do selo devolvia `IMG`. */
.mk-selo {
  position: absolute; top: 17px; left: 17px; z-index: 1; background: #000000a8; color: #fff;
  line-height: 1.5;
  border-radius: var(--radius-md); padding: 2px 8px; font-size: .75rem; font-weight: 700;
  font-variant-numeric: tabular-nums
}
/* Pegar e o número, juntos e à esquerda: a mão pega o cartão pelo canto onde o
   número diz qual ele é. O selo perde a posição própria e passa a ser item da
   fila — duas âncoras absolutas para dois elementos vizinhos brigariam por um
   pixel a cada mudança de tamanho. */
.mk-card-esq { position: absolute; top: 15px; left: 15px; z-index: 1;
  display: flex; align-items: center; gap: 5px }
.mk-card-esq .mk-selo { position: static }
/* A dica não pode ser cortada pelo cartão nem passar por baixo do vizinho. */
.mk-card [data-tooltip]::after { z-index: 3 }
.mk-mini-bt {
  /* ⚠⚠ Era `#ffffffe8` sobre `#333`, dois cravados. Não falhava por pouco
     contraste — media 18,8 — mas era uma PASTILHA BRANCA colada numa página
     escura. 📌 A sonda de contraste dava-o por bom: quem o apanhou foi o
     olho, e é por isso que a captura fica ao lado do número. */
  width: 28px; height: 28px; border-radius: var(--radius-md); background: var(--tinta-50);
  border: 1px solid var(--line); display: grid; place-items: center;
  cursor: pointer; color: var(--texto); padding: 0
}
.mk-mini-bt svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round }
.mk-mini-bt.mk-arrasta { cursor: grab }
.mk-card-nome {
  font-size: .82rem; color: var(--muted); margin: 9px 2px 7px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis
}
.mk-rotulo {
  width: 100%; font-size: .85rem; padding: 7px 10px; border: 1px solid var(--line);
  border-radius: 9px; background: var(--surface-solid)
}

/* ── A TRILHA, medida na prancha `Passo1Enviar` ────────────────────────────
   Passo e fio ALTERNAM numa linha só, e o rótulo fica AO LADO da bola — não
   por baixo. A ordem que o desenho quer é: bola, rótulo, fio, bola, rótulo…

   ⚠ O HTML não a dá nessa ordem: cada `.jn-col` traz `<i>bola<i>` dentro de
   `.jn-linhas`, e o rótulo é irmão dessa caixa. `display: contents` dissolve
   a caixa intermédia — os três filhos passam a ser filhos diretos da linha —
   e o `order` põe-nos na ordem do desenho SEM tocar no HTML, que é partilhado
   por quatro telas.

   O fio da FRENTE de cada passo desaparece: senão haveria dois fios entre
   cada par de bolas, com uma emenda visível a meio. Fica um só, depois do
   rótulo, com os 20px fixos da prancha — e sem o `.on` verde, que pintava o
   fio dos passos já feitos com um literal fora da paleta. */
.jn-trilha { display: flex; align-items: center; padding: 0 }
.jn-col { display: flex; align-items: center; gap: 8px; padding: 0 11px; flex: none; min-width: 0 }
.jn-linhas { display: contents }
.jn-linhas i { order: 3; width: 20px; flex: none; height: 1px; background: var(--tinta-200); display: block }
/* O da frente e o do fim da trilha não se desenham: o primeiro duplicaria o
   fio do passo anterior, e o último apontaria para fora da trilha. */
.jn-linhas i:first-child, .jn-linhas i.vazio { display: none }
.jn-bola {
  order: 1;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  flex: none;
  display: grid;
  place-items: center;
  font-size: 11px;
  font-weight: 400;
  border: 1px solid var(--tinta-300);
  background: none;
  color: var(--tinta-500);
}
.jn-bola svg { width: 14px; height: 14px; fill: none; stroke: var(--sobre-primario); stroke-width: 3; stroke-linecap: round; stroke-linejoin: round }
/* ⚠ O verde literal `#1b7f43` SAIU: não está na paleta, e a §2.1 já dizia
   «branco sobre marinho» ao lado de uma regra que pintava ciano — a folha
   afirmava a intenção e o navegador fazia outra coisa. O concluído fica
   marinho como o ativo; quem os separa é o glifo de visto, que só o concluído
   tem, e não uma cor que ninguém decidiu.

   E sem borda tracejada no opcional: a prancha desenha-o igual aos outros.
   Um tracejado ali lê-se como «incompleto», e não como «facultativo». */
/* ⚠️ E O PASSO SALTADO É OUTRO ESTADO, e ganha pontilhado por pedido do Alan.
   *«o passo 3 saltado fique com a bolinha em linha PONTILHADA»* (02/09/2026).

   ⭐ Isto NÃO contraria a decisão logo acima — completa-a. Ela diz que
   «facultativo» não se desenha com tracejado, porque tracejado lê-se como
   «incompleto». **O saltado É incompleto**: a pessoa passou por ele e não o
   fez. A razão antiga é a que justifica a nova, e é por isso que só acende
   quando o passo é opcional E não foi feito E não é o atual.

   ⚠️ Pontilhado e não tracejado, como ele pediu: são duas coisas diferentes, e
   a decisão de cima recusa a segunda por nome. Só `border-style` muda — a cor
   continua a ser o `--tinta-300` da bola normal, que já tem par nos dois modos,
   e a geometria não se mexe, o que o faz valer nos três tamanhos (22px, 26px no
   médio, 20px no pequeno) sem uma regra por tamanho. */
.jn-col.opcional:not(.feito):not(.agora) .jn-bola { border-style: dotted }

/* ⚠️ E AS DUAS REGRAS ABAIXO CHEGARAM DE OUTRA FRENTE, NO MESMO DIA, E NÃO SE
   contradizem com a de cima: o pontilhado é do passo SALTADO, e o filete que
   sai aqui é o das bolas CHEIAS. O `:not(.feito):not(.agora)` acima já as
   separa. Juntei as duas à mão na fusão — cada lado tinha razão sobre a sua
   metade, e ficar com um dos lados perdia a outra. */
/* ⚠ A bola CHEIA não leva filete, e a prancha nunca lho deu: só as vazias têm
   contorno. O que estava aqui era `border-color` igual ao fundo — invisível ao
   olho e presente no código, e por isso o comparador acusava-o volta após
   volta como uma diferença que ninguém conseguia ver.

   ⚠⚠ E eu tinha resolvido isto com `border-color: transparent`, a dividir a
   diferença: invisível ao olho e PRESENTE no código. O comparador continuou a
   acusá-lo, e tinha razão — o campo que ele lê é espessura+estilo, sem cor.

   📌 Uma borda transparente não é «sem borda»: é uma borda que não se vê. Se o
   desenho não a tem, o código não a tem — senão fica uma diferença permanente
   que ninguém consegue ver e ninguém consegue fechar, e é assim que uma lista
   deixa de chegar a zero por razões que já não são do produto.

   `border-style: none` com `box-sizing: border-box` e largura fixa mantém os
   22px; medi-o. */
.jn-col.feito .jn-bola { background: var(--primario); border-style: none; color: var(--sobre-primario) }
/* Passo concluído é link, e link de trilha não é frase: sem sublinhado, e com
   o cursor dizendo que dá para voltar por ali. */
a.jn-rot, a.jn-bola { text-decoration: none; cursor: pointer }
a.jn-rot:hover, .jn-col.feito:has(a:hover) .jn-rot { color: var(--accent) }
.jn-col.feito:has(a:hover) .jn-bola { background: var(--tinta-800); border-color: var(--tinta-800) }
/* ⚠ O PESO vem da prancha; a COR fica como está, e a divisão é deliberada.
   A `Passo2OQueFazer` dá ao rótulo do passo atual peso 500 e `--marinho`.
   O peso é geometria e aplica-se. A cor não: `--marinho` não inverte, e no
   escuro esta linha assenta no papel — 1,15. A tela 1, conferida nos quatro
   modos, já usa `--texto` aqui, e é ela que responde pelo escuro. */
.jn-col.agora .jn-rot { color: var(--text); font-weight: 500 }
.jn-risca { height: 1px; background: var(--line); margin: 12px 0 22px }
/* Botão não é frase: o sublinhado do `<a>` pertence a uma palavra dentro de um
   texto, e num botão só empurra a atenção para a palavra em vez do gesto. A
   seta diz para que lado o gesto leva, e é a do Feather, no traço fino do
   resto — a de trás à esquerda do texto, a da frente à direita, porque a seta
   fica do lado para onde ela aponta. */
.button, .button:hover, .button:focus { text-decoration: none }
.jn-seta { width: 15px; height: 15px; flex: none; fill: none; stroke: currentColor;
  stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round }
.jn-pe .button { display: inline-flex; align-items: center; gap: 7px }

/* O par da jornada: branco à esquerda, azul à direita, em todas as telas (etapa
   6½, item 13). Com um botão só ele fica à direita, que é onde a mão procura o
   "seguinte"; com dois, o que desfaz vai para o canto oposto do que avança — a
   mesma razão da D-257, em escala de tela. */
/* ⚠ O RODAPÉ DO PASSO: filete de 1px por cima e 18px de recuo, e ele vai ao
   FUNDO da coluna. As duas pranchas dão-lhe a mesma forma — a `Passo1Enviar` e a
   `Passo2OQueFazer` —, e é o que o separa do conteúdo sem desenhar uma caixa.

   `margin-top: auto` e não um valor: numa tela curta ele encosta ao fundo, e
   numa tela que rola o `auto` resolve-se a zero e ele fica logo a seguir ao
   conteúdo. Um valor fixo daria o primeiro caso errado. */
.jn-pe {
  display: flex; justify-content: space-between; align-items: center; gap: 12px;
  margin-top: auto; padding-top: 18px; border-top: 1px solid var(--linha)
}
/* ── O DESCARTAR: palavra no computador, lixeira no celular ──────────────
 *
 * ⭐ O ícone é `lucide-trash-2`, desenhado à mão no mesmo `viewBox="0 0 24 24"`
 * com o `stroke-width: 1.4` da casa. Não entra biblioteca nem arquivo novo: os
 * `lucide-moon`, `lucide-sun` e `lucide-chevron-down` do `_barra.html` já são
 * desta família e desta geometria, e a guarda de estáticos existe para não
 * deixar entrar recurso externo sem manifesto.
 *
 * ⚠️ O `.jn-lixo` nasce ESCONDIDO e a palavra nasce à vista: o computador é o
 * caso comum desta folha, e um botão que aparece com as duas coisas enquanto o
 * CSS carrega é pior do que um que aparece com a certa.
 *
 * ⛔ E o degrau é 700 e não 1079: é o que a `REGRA-DO-CELULAR.md` fixa por
 * escrito — «a 700 ainda é telefone, a 701 não». O aperto que esta troca
 * resolve é de telefone; num tablet de 900 a palavra cabe e é melhor. */
/* ⚠ E NÃO reaproveitei o par `.mk-so-largo`/`.mk-so-estreito` que a casa já
 * tem, apesar de fazer exactamente esta troca. O degrau dele é **620px** —
 * está escrito na regra dele, para o contador do paginador — e o desta é 700.
 * Vestir o botão com uma classe que significa «some abaixo de 620» e depois
 * mudá-la a 700 é uma mentira silenciosa: entre 620 e 700 a folha diria uma
 * coisa e faria outra, e a próxima pessoa a ler `.mk-so-largo` acreditaria no
 * nome. Um par novo com o degrau certo é mais barato que um par partilhado com
 * dois degraus. */
.jn-lixo { display: none; width: 20px; height: 20px; flex: none }

/* O azul se empurra para a direita sozinho. Perguntar por `:only-child` levaria
   um Voltar solitário para a direita também, que é o contrário do combinado. */
.jn-pe .primary { margin-left: auto }

@media (max-width: 700px) {
  /* ⭐ A LIXEIRA NO LUGAR DA PALAVRA (Alan, 04/09/2026), e os 44px são a
     altura de controle que ele fixou no mesmo dia: um botão só-de-ícone não
     tem palavra que o alargue, e é o caso em que aquela decisão faz trabalho.
     Quadrado e não `padding`, para o alvo não depender do tamanho do glifo. */
  .jn-pe #limpar-tudo > .jn-pe-palavra { display: none }
  .jn-pe #limpar-tudo > .jn-lixo { display: block }
  .jn-pe #limpar-tudo {
    flex: 0 0 44px; width: 44px; min-width: 44px; min-height: 44px;
    padding: 0; justify-content: center
  }

  .jn-rot { font-size: 11px; padding: 0 2px }
  .jn-bola { width: 26px; height: 26px; font-size: 11.5px }
  /* Os dois na MESMA linha, e não empilhados.
     Empilhado, o azul ficava por cima do branco: a ordem visual invertia entre
     o computador e o telefone, e o botão que avança passava a ser o primeiro
     que a mão encontra subindo do fim da página. Numa linha só, a geometria é
     a mesma nas duas larguras — nada troca de lugar quando a janela encolhe.
     O Voltar vira só a seta, com o nome no `aria-label` para quem lê a tela em
     voz alta, e mantém os 44px da D-257. O que avança fica com o resto. */
  /* 44px de altura pela D-257: a regra vale para o rodapé como vale para os
     botões do cartão, e o Voltar reduzido à seta é justamente o alvo que mais
     precisa dela. */
  .jn-pe .button { min-height: 44px }
  .jn-pe .jn-voltar { flex: 0 0 20%; min-width: 56px; padding-left: 0; padding-right: 0;
    justify-content: center; gap: 0 }
  .jn-pe .jn-voltar span { display: none }
  .jn-pe .primary { flex: 1 1 auto; justify-content: center }
}

/* No telefone estreito os cinco rótulos não cabem lado a lado e se encavalam —
   "Documentos" e "O que fazer" viravam uma linha só de letras. Fica o do passo
   atual, que é a única informação que a pessoa precisa ali: as bolas continuam
   dizendo onde ela está e quanto falta. */
@media (max-width: 480px) {
  .jn-col:not(.agora) .jn-rot { display: none }
  .jn-col.agora .jn-rot { white-space: nowrap }
}
/* ⚠ A2 · era `#8a6d00` cravado: 4,60 no claro e 3,82 no ESCURO, abaixo do
   piso de 4,5. O par do aviso dá 6,00 e 5,75 sobre o papel. */
.mk-card-nota { font-size: .74rem; line-height: 1.35; color: var(--aviso-tinta); margin: -3px 2px 7px }
.tpc:hover{border-color:var(--line-strong)}
/* ⚠ `#f8fbff` é um azul-gelo quase branco que não inverte: no escuro o cartão
   ESCOLHIDO ficava o mais claro da tela. O `--acento-lavado` é a superfície
   que a casa já reservou ao estado (§1.1) e é a que a `.module-tab.active`
   já computa — medido: `rgb(223,235,242)` no claro e `rgb(14,38,73)` no
   escuro. Duas peças com o mesmo papel passam a ter o mesmo tom. */
.tpc.on{border-color:var(--accent);background:var(--acento-lavado)}
.tpc-ico{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;
  background:var(--light-blue);color:var(--accent);flex:none}
.tpc-ico svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
.tpc b{display:block;font-size:.86rem;font-weight:650}
.tpc small{display:block;font-size:.76rem;color:var(--muted);line-height:1.45;margin-top:2px}   /* .05em → .13em, e o peso 600 → 500: os dois da prancha */   /* 600 → 500: a prancha diz 500 */
.tp-grupo:first-child{margin-top:0}
/* As seções estavam encavaladas: o rótulo do grupo seguinte nascia colado na
   última fileira de cartões. O respiro é o que faz "meus tipos" e "tipos do
   sistema" serem lidos como dois grupos e não como uma lista só. */
.tp-grupo {
  font-size:10.5px;
  letter-spacing:.13em;
  text-transform:uppercase;
  color:var(--muted);
  font-weight:500;
  margin:28px 0 12px;
}
/* O rótulo do grupo pertence ao que vem DEPOIS dele, e por isso fica mais perto
   dos cartões de baixo do que da seção de cima. Com o filtro na mesma linha, a
   caixa cresceu e empurrou o rótulo para o meio do vão — alinhar pelo fim
   devolve a proximidade que diz de quem é o título. */
.tp-grupo-linha{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;
  margin-top:34px}
/* ⚠⚠ O VÃO DE 95px ENTRE O LEAD E «MEUS TIPOS», que o Alan viu e mandou
   ajustar (04/09/2026) — e a causa NÃO era o que parecia.
   Medido, e são TRÊS espaçamentos a SOMAR-SE:

       20px   o `gap` do `.app-content`, que é `flex-direction: column`
     + 22px   o `margin-bottom` do lead
     + 34px   o `margin-top` desta regra
     ───────
       76px   entre as duas CAIXAS
     + 19px   dentro desta fila: ela mede 31px porque o FILTRO a estica,
              e o rótulo é `align-items: flex-end` — o que é deliberado e
              está explicado três linhas acima
     ───────
       95px   até à palavra «Meus tipos», que é o que ele vê

   ⛔ NÃO era sobra da seção «Criar» removida, nem uma `.tpc-grade` fantasma:
   medi o DOM entre os dois elementos e ele está VAZIO — zero elementos.

   📌 O 34 foi escrito quando `.app-content` ainda não era flex: aí as margens
   de irmãos COLAPSAVAM e 34 era o vão inteiro. Com flex, margem não colapsa e
   o `gap` ainda se soma por cima. A regra não mudou de valor — mudou de mundo.

   ⭐ Anula-se SÓ na primeira fila, a que segue o lead: as outras continuam a
   precisar do 34 para se separarem da grade de cima. Fica 42px de vão (20+22),
   e 61 até à palavra. */
.mk-sub-tela + .tp-grupo-linha { margin-top: 0 }
.tp-grupo-linha .tp-grupo{margin:0;flex:1}
/* ⚠⚠ E QUANDO O FILTRO EXISTE, O RÓTULO NÃO ESTICA — ordem do Alan, 04/09/2026:
   «ajuste o filtro também».

   ⛔ O que ele via não era o filtro fora do sítio: medido, ele está ALINHADO
   com a borda direita da grade — com três cartões na fila, o terceiro acaba
   exactamente onde ele acaba (1408). O que se lia mal era a distância entre as
   PALAVRAS: o rótulo tem `flex: 1`, a caixa dele estica até 1205px, e o texto
   fica agarrado à esquerda enquanto o filtro fica à direita. Os dois estão a
   16px um do outro COMO CAIXAS e a meia tela um do outro COMO TEXTO.

   ⭐ O `flex: 1` NÃO SAI, e a razão dele está três linhas acima: na JORNADA o
   filtro não existe, sobra um filho só, e sem o `flex` o rótulo encolhia para
   78px onde os outros dois medem a largura do miolo. Essa razão continua
   verdadeira — e é por isso que a anulação é condicional ao filtro estar lá.

   📌 `:has()` e não uma classe nova: a condição é «esta fila TEM filtro», que
   é exactamente o que o seletor diz. Uma classe obrigaria o template a saber
   duas vezes o que ele já sabe uma. */
.tp-grupo-linha:has(.tp-filtro) { justify-content: flex-start }
.tp-grupo-linha:has(.tp-filtro) .tp-grupo { flex: 0 0 auto }
/* ⚠ `flex: 1` no rótulo. A fila é `space-between` e na JORNADA o filtro não
   existe — sobra um filho só, que encolhe ao tamanho da palavra: «Meus tipos»
   media 78px onde os outros dois rótulos medem a largura do miolo, e a prancha
   dá-lhes a mesma. Não era uma largura errada: era o rótulo a ser o único
   embrulhado numa fila, e a fila a apertá-lo por não ter com quem o repartir. */
.tp-filtro{margin:0}
/* ⚠⚠ `background-color:` e NUNCA o atalho `background:` — em toda a regra que
   apanha um `<select>`.

   A seta do `select` é uma imagem de fundo (`appearance:none` apaga a do
   sistema, e nós redesenhamo-la). O atalho `background:` reinicia TODAS as
   propriedades de fundo, incluindo `background-repeat` e `background-position`
   — e uma regra de classe ganha da regra de elemento onde a seta é declarada.

   📌 O efeito é assimétrico e por isso engana: no modo CLARO o atalho apaga
   também a IMAGEM e não se vê nada de errado; no ESCURO a regra do modo
   devolve a imagem e ela sai LADRILHADA, dezenas de setas pela caixa toda.
   Uma vez consertado no `styles.css` e reaparecido aqui — a guarda
   `NenhumAtalhoDeFundoNumSelectTest` existe para não haver terceira vez. */
.tp-filtro select{padding:7px 10px;border:1px solid var(--line);border-radius:9px;
  font-size:.85rem;background-color:var(--surface-solid)}
.tp-grupo-linha + .tpc-grade{margin-top:12px}
.mk-sub-tela{margin:-12px 0 22px}
.tp-campo b{font-size:.92rem}
.tp-campo span{font-size:.88rem;color:var(--muted)}
.tp-campo i{font-style:normal;font-size:.76rem;color:var(--muted);text-align:right}
/* A régua fina entre as linhas é o que faz a tabela ser lida como tabela — sem
   ela, quatro pares de rótulo e descrição viram um parágrafo. É a pontilhada do
   desenho, na nossa cor de linha. */
.tp-campos{display:flex;flex-direction:column}
.tp-campo {
  display:grid;
  grid-template-columns:160px 1fr 96px;
  gap:14px;
  align-items:baseline;
  padding-bottom:10px;
  padding:9px 0;
  border-bottom:1px dotted var(--line);
}
.tp-campo:last-child {
  border-bottom:0;
}
.mk-conta{border:1px solid var(--line);border-radius:16px;background:var(--surface-solid);
  padding:16px 20px;margin-top:20px;max-width:430px}
.mk-conta table{width:100%;border-collapse:collapse;font-size:.9rem}
.mk-conta td{padding:5px 0}
.mk-conta td:last-child{text-align:right;font-variant-numeric:tabular-nums}
.mk-conta tr.tot td{border-top:1px solid var(--line);padding-top:10px;font-weight:700;font-size:1.05rem}
.mk-conta tr.sal td{color:var(--muted);font-size:.85rem}
/* ⚠⚠ O `max-width: 700px` e o `.72rem` saem JUNTOS, e a razão é medida.
   A `Passo4Confirmar` (01/09) desenha as três frases do aviso em três linhas,
   cada uma inteira, com 12,5px e a largura do miolo. O produto tinha 11,52 e
   estreitava a 700 — e as três frases cabiam, uma por linha, por pouco.

   ⛔ Subir só a fonte teria PIORADO. Medido nas três combinações:
       700  @ 11,52 ...  3 linhas, 55   (o que estava)
       700  @ 12,50 ...  4 linhas, 80   (só a fonte: a primeira frase quebra)
      1140  @ 12,50 ...  3 linhas, 60   (as duas: uma frase por linha)
   As duas emendas são uma só: a fonte da prancha não cabe na largura antiga.

   📌 E o sinal que trouxe aqui — «1150×19 → 700×55» — era par FALSO: o
   comparador casou o `<p>` da PRIMEIRA frase da prancha com o bloco INTEIRO do
   produto, que traz as três separadas por `<br>`. O número estava errado e a
   divergência por baixo dele era verdadeira. */
.jn-aviso{margin:0;width:100%;font-size:12.5px;line-height:1.6;
  color:var(--muted);text-align:center}
.jn-pe.centro{flex-direction:column;align-items:center;gap:14px}
/* ⭐ Duas frentes acharam este defeito por caminhos independentes, em telas
   diferentes (resultado e acompanhar), e chegaram ao mesmo token. As duas
   medicoes batem: e isso que faz o conserto ser seguro. */
/* ⛔ O «← Meus pedidos» NÃO TINHA COR NENHUMA, e caía no azul do navegador.
   Medido em 04/09/2026 na `Passo5Acompanhar`: a prancha pede `#00679C` e o
   produto entregava `rgb(0, 0, 238)` — que é o `#0000EE` da folha do próprio
   navegador, o valor que aparece quando NINGUÉM declarou a cor.

   ⚠ E a razão de ninguém a ter declarado: as duas regras de `.table-link` são
   de CONTEXTO — `.compact-datatable td .table-link` no `styles.css` e
   `.jn-pe .jn-pe-aviso .table-link` aqui. Um `<a class="mk-volta table-link">`
   fora dessas caixas não casa com nenhuma, e o `.mk-volta` só tinha caixa e
   tamanho. **A classe estava lá, a regra dela não.**

   ⚠⚠ E o dano é do modo escuro, não do claro:

       #0000EE sobre o papel claro ....  8,79   feio, mas legível
       #0000EE sobre o papel ESCURO ...  2,00   ⛔
       --acento-escuro, que tem par ...  5,75 e 6,46

   `--acento-escuro` é o token que a casa já mediu para isto — `#00679C` no
   claro e `#009FF0` no escuro. Não cunhei cor nenhuma.

   São QUATRO telas: acompanhar, resultado, tipo_novo, tipo_detalhe. */
.mk-volta{display:inline-block;margin-bottom:10px;font-size:.88rem;
  color:var(--acento-escuro)}
.mk-volta:hover{text-decoration:underline}
/* A numeração dos campos. Ela existe porque uma lista de campos sem número é
   uma pilha — e a ordem dos campos é a ordem em que o modelo os devolve, então
   ela conta.

   ⛔⛔ E A PRIMEIRA FRASE DESTE COMENTÁRIO ERA FALSA DESDE O INÍCIO. Dizia «a
   numeração é a FICHA DO DESENHO: número branco em círculo cheio da cor
   primária» — e essa ficha NÃO EXISTE (D-1576). O desenho não a pede; quem a
   pediu foi o Alan, em 04/09/2026, com estas palavras:

     «a bolacha azul dos números deve permanecer como está no produto,
      não como está na prancha»

   ⭐ A REGRA NÃO MUDOU: mudou o comentário, que atribuía a uma prancha uma
   decisão que é do dono. É a D-1556 pelo avesso — ali quem muda a regra muda o
   comentário; aqui a regra ficou e o comentário é que estava a mentir. Uma
   frase que inventa uma fonte é pior do que nenhuma: a próxima pessoa vai
   procurar a ficha, não a encontra, e desconfia do produto em vez do texto.

   📌 O produto fica e a correção é da prancha — é a quinta decisão dele hoje
   no mesmo sentido. */
.mk-num{width:26px;height:26px;flex:none;border-radius:50%;display:grid;place-items:center;
  /* ⚠ Era `--accent`: branco sobre ciano dá 2,91 nos DOIS modos — falhava
     no claro também, e ninguém tinha olhado. O Alan mandou marinho, e o
     número mede 16,38 nos dois.

     ⚠⚠ E O CÍRCULO CONTINUA A MEDIR 1,15 SOBRE O PAPEL ESCURO — o número
     lê-se, a bolacha não se vê. Isso NÃO foi decidido: o Alan decidiu a
     FORMA da bolacha em 04/09/2026, não o contraste dela. Fica a medida, e o
     alcance, que era o que faltava para alguém poder decidir:

       claro ....  bolacha contra o chão  15,33  ✅
       escuro ...  bolacha contra o chão   1,15  ⛔
       o número dentro dela ..........   16,38  ✅ nos dois

     ⭐ E o alcance é PEQUENO: varridas as 30 telas nos dois modos, a bolacha
     aparece em UMA — a `tipo_novo` —, porque só vive no EDITOR de campos
     (`_campos_do_tipo.html`). A tabela de leitura (`_campos_lidos.html`) não
     a usa. O número de bolachas acompanha o número de campos em edição.

     📌 Está levado ao Alan como defeito à parte, com este alcance na mão. */
  background:var(--marinho);color:var(--sobre-primario);font-size:.78rem;font-weight:700;
  font-variant-numeric:tabular-nums}
.mk-num-mini{width:22px;height:22px;font-size:.72rem}
.mk-campo-bloco + .mk-campo-bloco{margin-top:16px;padding-top:16px;
  border-top:1px solid var(--line)}
.mk-campo-linha{display:grid;grid-template-columns:26px 1fr 2fr 140px 38px;gap:10px;
  align-items:center;margin-bottom:9px}
/* O X tem a altura da linha, e não uma altura própria: menor, ele flutuava
   dentro dela; maior, esticava a linha inteira no telefone. A largura acompanha
   para o botão não sair quadrado. */
.mk-tira{width:38px;height:38px;align-self:stretch;min-height:0}
.mk-teto{margin:8px 0 0;font-size:.78rem}
/* As duas ações da tela de leitura, no alto e à direita do nome. */
.tp-cabeca{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;
  margin-top:6px}
.tp-acoes{display:flex;gap:8px;flex:none}
.mk-acao{width:38px;height:38px;border-radius:10px}
.mk-acao svg{width:18px;height:18px}
.jn-titulo .chip{margin-left:10px;vertical-align:middle}

/* O modal de confirmação e o aviso de salvo. */
.mk-modal{position:fixed;inset:0;z-index:130;background:#0b0b0c8c;display:grid;place-items:center;
  padding:20px}
.mk-modal[hidden]{display:none}
.mk-modal-caixa{width:min(420px,100%);background:var(--surface-solid);border-radius:16px;
  padding:22px 24px;box-shadow: none}
.mk-modal-texto{margin:0 0 18px;font-size:.98rem;line-height:1.5}
.mk-modal-pe{display:flex;justify-content:flex-end;gap:10px}
.mk-aviso{position:fixed;left:50%;bottom:26px;transform:translateX(-50%);z-index:140;
  display:flex;align-items:center;gap:9px;
  padding:12px 20px;border-radius:12px;background:var(--certo-lavado);color:var(--certo-tinta);
  border:1px solid var(--certo-tinta);font-size:.9rem;font-weight:600;
  box-shadow: none;transition:opacity .4s ease}
.mk-aviso[hidden]{display:none}
.mk-aviso.saindo{opacity:0}
.mk-aviso svg{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
.mk-rotulo-g{max-width:460px;font-size:1.02rem;padding:11px 14px}
.mk-titulo-campo label{display:block;font-size:.82rem;font-weight:600;margin-bottom:6px}
.mk-bloco{background:var(--surface-solid);border:1px solid var(--line);
  border-radius:16px;padding:20px 24px;margin-bottom:18px}
.mk-titulo-linha{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;flex-wrap:wrap}
/* No telefone a linha de campo vira bloco: nome e descrição ocupam a largura,
   e o tipo divide a última linha com o botão de tirar. Empilhando os quatro, o
   X ficava sozinho num degrau e parecia botão de outra coisa. A régua entre um
   campo e outro é o que impede que três linhas virem uma mancha. */
@media(max-width:700px){
  /* No telefone o X sobe para a linha do número, à direita, e encolhe para a
     altura dele: embaixo, do tamanho do `select`, ele pesava mais que o campo
     que apaga. */
  .mk-campo-linha{grid-template-columns:26px 1fr;gap:8px}
  .mk-campo-linha > input, .mk-campo-linha > select{grid-column:1 / -1}
  .mk-campo-linha > .mk-tira{grid-column:2;grid-row:1;justify-self:end;
    width:26px;height:26px;border-radius:var(--radius-md)}
  .mk-campo-linha > .mk-tira svg{width:14px;height:14px}
  /* ⭐ E o SECUNDÁRIO segue o principal, caixa e glifo. Sem esta linha ele
     ficava com os 44 e o glifo de 18 que o `.mk-mini-bt` lhe dá no celular —
     maior que o principal, que é a metade da inversão que o Alan viu. */
  .mk-opcao-linha .mk-tira{width:26px;height:26px;border-radius:var(--radius-md)}
  .mk-opcao-linha .mk-tira svg{width:14px;height:14px}
  .mk-campo-cab{display:none}
}
@media(max-width:640px){
  .tp-campo{grid-template-columns:1fr;gap:2px}
  .tp-campo i{text-align:left}
  .tp-opcoes{grid-column:1}
}
/* O cartão é `<a>` na tela do menu e `<button>` no passo da jornada — o mesmo
   desenho servindo aos dois (D-205). O `<a>` traz sublinhado de link, que num
   ladrilho não quer dizer nada. */
.tpc, .tpc:hover { text-decoration: none }
.tp-grupo + .mk-meta { margin-top: 0 }
/* ══ TODO `<select>` DO PRODUTO ═══════════════════════════════════════════
   ⚠⚠ ISTO NÃO É UMA COR QUE FALTAVA: É A FOLHA A NÃO SER OBEDECIDA.

   Medido no navegador, com o valor calculado:

     claro ....  appearance auto · fundo rgb(255,255,255) · tinta rgb(0,0,0)
     escuro ...  appearance auto · fundo rgb(59,59,59)    · tinta rgb(255,255,255)
     o `input` ao lado, no escuro:  fundo --papel · tinta --texto  ✅

   📌 Um `<select>` sem `appearance: none` pinta-se COM AS CORES DO SISTEMA e
   ignora tudo o que a folha diz sobre fundo e tinta. A regra abaixo declarava
   borda e raio — que ele obedece — e não declarava fundo nem tinta, que é
   exatamente onde ele decide sozinho.

   ⚠ E a previsão com que cheguei aqui estava certa no essencial e ERRADA no
   detalhe: eu esperava branco no escuro, e é `rgb(59,59,59)`. O sistema honra
   o `color-scheme` e dá o cinzento escuro dele — que não é o nosso `--papel`,
   e continua a ser dele e não nosso.

   ⚠⚠ E A VARREDURA DE CONTRASTE NÃO O ACUSAVA. Ela lê o que a folha DECLARA;
   aqui a folha não estava a ser obedecida, e o elemento pintava-se por baixo
   do instrumento. É a terceira peça hoje a fazer isso.

   ⚠ A regra é GLOBAL de propósito. Há `<select>` em seis telas — pedidos,
   créditos, o filtro dos tipos, a entrada — e todos têm este defeito pela
   mesma razão. Consertar só o desta tela seria tratar o sintoma no sítio onde
   ele foi reportado e deixá-lo vivo nos outros cinco. */
select {
  appearance: none; -webkit-appearance: none;
  background-color: var(--papel); color: var(--texto);
  /* A seta redesenhada, porque `appearance: none` apaga a do sistema. Vai em
     dois ficheiros e não num com `currentColor`: um `data:` não herda a tinta
     de quem o usa, e uma seta que não inverte seria trocar um defeito por
     outro mais pequeno. */
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23475A85' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center;
  padding-right: 30px
}
select:disabled { color: var(--texto-fraco); opacity: 1 }

/* Os dois botões de ação do tipo — «Editar» e «Clonar» — levam o glifo à
   ESQUERDA da palavra, e levam-no igual: eles ocupam o mesmo lugar e trocam
   entre si conforme o dono do tipo. */
.tp-acao-ico {
  width: 15px; height: 15px; margin-right: 7px; flex: none;
  fill: none; stroke: currentColor; stroke-width: 1.6;
  stroke-linecap: round; stroke-linejoin: round
}
/* A seta escura, nos dois carimbos do modo — o do sistema e o da escolha
   explícita —, como o resto da folha faz. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) select { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23CBC8C3' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E") }
}
:root[data-theme="dark"] select { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23CBC8C3' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E") }

/* O seletor combinado do desenho — a extração por regra exata não o pegou
   porque ele nomeia dois elementos de uma vez. */
.mk-campo-linha input, .mk-campo-linha select {
  width: 100%; padding: 8px 11px; font-size: .88rem;
  border: 1px solid var(--line); border-radius: var(--radius-md)
}
.mk-campo-cab { font-size: .78rem; font-weight: 600; color: var(--muted) }
/* ⚠⚠ O TETO DE 900px SAIU, e ele é a razão de a «largura total» ter sido pedida
   TRÊS vezes sem entrar.

   A classe veste as DUAS tabelas do tipo de documento — a de leitura
   (`_campos_lidos.html`) e a de edição (`_campos_do_tipo.html`) —, e cada vez
   que alguém alargava o cartão à volta, o teto continuava aqui e a tabela
   ficava a 900 no meio de um cartão largo. Quem media o cartão via a largura
   certa; quem olhava a tela via a tabela estreita.

   📌 É a mesma forma do rodapé com a cor decidida duas vezes: a peça que manda
   não é a que se está a olhar. Um limite numa classe partilhada não aparece no
   sítio onde o defeito se vê. */
.mk-bloco-campos { max-width: none }
.mk-ajuda { margin: -2px 0 12px }
/* A sub-tabela de opções fica recuada sob o campo a que pertence: sem o recuo,
   ela parece uma lista de campos e não uma lista de valores daquele campo. */
/* Sem régua horizontal entre o tipo e as opções: elas são do MESMO campo, e a
   linha as fazia parecer outra seção. O recuo com a barra à esquerda já diz que
   uma coisa pertence à outra. */
.mk-opcoes { margin: 2px 0 4px 36px; padding-left: 14px;
  border-left: 2px solid var(--line) }
.mk-oculto { display: none }
.mk-opcoes-titulo { margin: 0 0 8px; font-size: .78rem; font-weight: 600 }
.mk-opcoes-titulo span { font-weight: 400 }
/* A opção é duas linhas, e não duas colunas: a descrição precisa da largura
   toda para caber, e alinhada com a caixa do rótulo ela se lê como continuação
   da mesma opção. O X fica na primeira linha, à direita do rótulo. */
.mk-opcao-linha { display: grid; grid-template-columns: 22px 1fr 32px; gap: 8px 10px;
  align-items: center; margin-bottom: 12px }
.mk-opcao-linha .mk-opcao-descricao { grid-column: 2 / 4 }
/* ⚠⚠ O X DA OPÇÃO DEIXA DE TER TAMANHO PRÓPRIO — ordem do Alan, 05/09/2026:
   «iguale o tamanho do botão X da lista de campos e da lista de segundo nível
   … Deixe sempre do mesmo tamanho do X principal».

   ⭐ E a inversão que ele descreveu está MEDIDA, nos quatro cruzamentos:

       1440   principal 38 (glifo 15)  ·  secundario 32 (glifo 15)  -> MENOR
        390   principal 26 (glifo 14)  ·  secundario 32 (glifo 18)  -> MAIOR

   📌 A causa é que havia TRÊS regras a mandar e nenhuma nos dois: os 32 aqui,
   os 26 do `.mk-campo-linha > .mk-tira` no celular — que só alcança o
   PRINCIPAL —, e os 44 do `.mk-mini-bt` que alcançava o secundário mas era
   depois desfeito no principal. O secundário ficava sozinho no meio.

   ⛔ E «igualar» aqui NÃO É 44: o X principal do celular mede 26, e esse 26 é
   uma das trinta e duas medidas que o Alan viu e mandou ficar («mesmo o menor
   está bom de usar, pq fica isolado na tela»). Igualar ao principal é descer o
   secundário para 26 no celular, não subir os dois para 44 — o que
   contrariaria a decisão dele de ontem sobre a mesma peça. */
.mk-opcao-linha input { width: 100%; padding: 7px 10px; font-size: .85rem;
  border: 1px solid var(--line); border-radius: var(--radius-md) }
/* As fichas da lista fechada, na tela de leitura. */
.tp-opcoes { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 7px }
@media (max-width: 700px) { .mk-opcao-linha { grid-template-columns: 22px 1fr 32px } }
/* O tipo desativado continua na tela do menu, apagado: ele some da jornada mas
   não do mundo, senão não haveria como reativá-lo. */
.tpc-off { opacity: .55 }
.tpc-off b::after { content: ' ·'; }

/* ===== meus pedidos e acompanhamento, do desenho da jornada (D-205) ===== */
/* ⚠️ A FACE E DECLARADA E NAO HERDADA, e a razao e a mesma do `--tinta-500`
   que passa no papel e reprova no cartao: uma peca que herda a face de onde
   calha estar muda de aspeto conforme o vizinho.

   O `.chip` do `tipo_detalhe` vive DENTRO de um `<h1>`, e o titulo de tela e
   Newsreader (§2 do sistema). Sem esta linha o badge «Ativo» saia em serifada.

   ⭐ E o defeito NAO era so a familia — era a tinta ficar alta na capsula.
   Medido pelas metricas da fonte, com o recheio de 3px e entrelinha 16,5:

                       folga acima   folga abaixo   desvio
       Newsreader          5,9          10,6        −4,8   ⛔ tinta ALTA
       Manrope             7,7           8,6        −0,9   ✅ centrada

   A serifada de leitura tem descida grande: a linha de base cai mais baixo
   na caixa e a tinta sobe. A troca de face conserta as DUAS coisas, e por
   isso NAO ha `vertical-align` aqui — ele moveria a capsula sem precisar.

   ⚠️ E medir isto exigiu a segunda pergunta: pela caixa do texto o desvio
   dava −0,5 nos tres casos, porque a CAIXA estava centrada. Era a tinta
   dentro dela que nao estava.

   ⭐ INERTE nos outros cinco sitios onde a familia vive (resultado,
   _cartao_de_pedido, _campos_do_tipo, suporte): la ela ja herdava Manrope do
   corpo, e a medida com e sem a linha e a mesma. Uma linha curativa num
   lugar e inerte em cinco — medido, e nao «por precaucao». */
/* ── O AR ENTRE A CÁPSULA E O TÍTULO, na tela de RESULTADO ──────────────
 *
 * Ordem do Alan, 04/09/2026: «coloque um pequeno espaçamento entre o badge
 * "Pronto" e o texto título "Pedido NYYACJ1" na tela de resultado».
 *
 * ⛔ E O SELETOR É ESTREITO DE PROPÓSITO, porque a mesma cápsula vive em três
 * arranjos diferentes e só UM está colado. Medido nas três, a 1440 e a 390:
 *
 *     resultado ......  a cápsula e o `<h1>` dentro do MESMO `<div>` interno
 *                       vão entre eles: **0px**, nas duas larguras  ⛔
 *     acompanhar .....  a cápsula é filha DIRETA do `.page-heading`, que é
 *                       flex: a 1440 ela fica AO LADO do título, e um
 *                       `margin-top` no `<h1>` empurrava-o 8px para baixo
 *                       sem razão. A 390 já tem 24px.
 *     tipo_detalhe ...  a cápsula vive DENTRO do `<h1>`, e o par
 *                       `.chip + h1` nem sequer lá casa.
 *
 * ⚠️ Um `.page-heading .chip + h1` apanhava as DUAS primeiras. O `> div >`
 * é o que separa o arranjo colado do que já tem ar.
 *
 * ⭐ E os 8px não são um degrau novo: é o que o próprio `.page-heading h1` já
 * usa por baixo (`margin: 5px 0 8px`), e o que a `.mk-pedido .mk-barra` usa
 * para se afastar. A cápsula não leva margem nenhuma — quem a leva é o
 * título, porque a cápsula aparece noutros sítios onde a margem não serve. */
.page-heading > div > .chip + h1 { margin-top: 8px }
/* ⚠⚠ TRÊS LITERAIS FRIOS NUMA LINHA, e nenhum deles inverte (D-1505).
   O `#e8f6ed` é da família do `#EAF7F1` que a D-1345 reprovou, e no escuro
   a pílula inteira ficava uma mancha clara sobre o cartão:

       pilula #e8f6ed contra o cartao   claro  1,04   escuro 16,86  ⛔
       --certo-lavado                   claro  1,14   escuro  1,12  ✅

   📌 E a D-1345 lia-se ao contrário: eu fui declará-la e os valores não
   batiam. As pranchas ADOTARAM os tokens do sistema — doze delas, a
   `Passo13Listas` entre elas —, e quem ficou para trás foi o produto. Quando
   a lista de divergências e a folha discordam, a que se mede é a folha.

   ⚠ A BORDA é escolha minha e vai declarada: a prancha não desenha borda
   nenhuma. Mas a pílula sozinha mede 1,14 contra o cartão nos dois modos —
   o seu contorno não existe —, e o literal que lá estava media 1,34 no claro,
   o que é o mesmo que não ter. `--certo-tinta` dá 5,66 e 5,51: é o único
   valor do par que inverte e que se vê. ⭐ Geometria da prancha, cor da regra,
   e a PRESENÇA da borda fica à espera de quem desenha. */
.chip-ok{color:var(--certo-tinta);background:var(--certo-lavado);border-color:var(--certo-tinta)}
/* ⚠⚠ E as OUTRAS TRÊS eram o mesmo defeito do `.chip-ok`, com outras cores —
   nove literais frios, nenhum a inverter, todos a virar mancha clara sobre o
   cartão escuro:

       chip-run   pilula/cartao   claro 1,06   ESCURO 14,96  ⛔
       chip-wait                  claro 1,06   ESCURO 14,99  ⛔
       chip-err                   claro 1,07   ESCURO 14,79  ⛔

   ⛔ E eu não as consertei quando as achei, porque faltava o que faltava no
   verde: TOKENS. Trocar um literal por outro literal não conserta nada — e o
   guarda que escrevi para o verde nem os apanhava, porque só conhecia verde.
   Os três pares vieram do SISTEMA-DE-DESIGN §1.0, derivados por RAZÃO e não
   por coordenada.

   ⭐ O erro fica com `--selo` na tinta: ele já inverte sozinho, e um token que
   já resolve não se duplica. */
/* ⛔ E o `.chip-run` NÃO entra aqui, apesar de o §1.0 lhe dar um par. Ele já
   tem dono: há uma regra mais abaixo nesta folha, `#andamento-do-pedido`, que
   o resolveu a partir da `Passo5Acompanhar` com `--acento-lavado` e `--texto`
   — e SEM borda, porque aquela prancha não lhe desenha contorno.

   ⚠️ Escrevi aqui a versão do §1.0, corri, e a pílula não mudou: a regra de
   baixo ganha. Duas regras para o mesmo chip, com tokens diferentes e vindas
   de duas pranchas diferentes, é a divergência que ninguém desfaz depois — e a
   segunda tinha razão escrita e prancha por trás. Fica com uma só.

   📌 E a resposta veio, e é melhor do que «duas pranchas»: o `--acento-lavado`
   já está RESERVADO ao chip de estado — está no §1 da tabela do sistema, e no
   comentário da própria definição dele. O par `--andamento-*` era duplicação
   de um token que já resolvia, e saiu. São quatro valores novos na família e
   não oito: o par da espera e o lavado do erro. */
.chip-wait{color:var(--espera-tinta);background:var(--espera-lavado);border-color:var(--espera-tinta)}
.chip-err{color:var(--selo);background:var(--erro-lavado);border-color:var(--selo)}
.mk-filtros{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:16px}
.mk-filtros select,.mk-filtros input{padding:8px 11px;border:1px solid var(--line);border-radius:9px;
  font-size:.87rem;background-color:var(--surface-solid)}
/* ⚠⚠ A TINTA ESTAVA EM PRETO PURO, e não por escolha de ninguém: o `font:
   inherit` não leva a cor, e um `<button>` sem `color` cai no `buttontext` do
   navegador, que é `#000`.

   ⛔ E o preto não inverte. Sobre o chão escuro dá 1,12 — o botão de ordenar a
   lista de pedidos era ilegível no escuro, e ninguém o escreveu assim.

       preto puro    claro 19,65  ·  escuro  1,12  ⛔
       --tinta-800   claro 12,48  ·  escuro 15,14  ✅

   📌 É o único preto que encontrei nas cinco telas desta frente, e é a mesma
   família dos literais frios: uma cor que não inverte num lugar onde o chão
   inverteu. A diferença é que este não foi escrito — foi HERDADO, e por isso
   nenhuma varredura de literais na folha o encontraria.

   `--tinta-800` é o que a prancha desenha. */
/* ⚠ A LARGURA deste botão diverge da prancha nos TRÊS estados da lista —
   109 lá, 135 aqui — e fica. Razão do Alan, 04/09/2026: largura de botão
   segue o TEXTO dentro dele, e o texto é traduzido. Uma largura fixa numa
   casa de três línguas é um defeito à espera. */
.mk-ord-bt{display:inline-flex;align-items:center;gap:7px;padding:8px 12px;border:1px solid var(--line);
  border-radius:9px;background:var(--surface-solid);color:var(--tinta-800);cursor:pointer;font:inherit;font-size:.87rem}
.mk-ord-bt svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
/* O cartão inteiro é o link — é o alvo grande, e é o que o dedo acerta no
   telefone. Mas cartão não é frase: o sublinhado e o azul de link pertencem a
   uma palavra dentro de um texto, e aqui empurrariam a atenção para o número do
   pedido em vez do estado dele. Mesmo motivo do `.tpc`. */
.mk-pedido{display:grid;grid-template-columns:1fr auto;gap:14px;align-items:center;
  border:1px solid var(--line);border-radius:14px;padding:14px 18px;margin-bottom:10px;
  background:var(--surface-solid);cursor:pointer;text-decoration:none;color:inherit}
.mk-pedido:hover h3{color:var(--accent)}
.mk-pedido:hover{border-color:var(--accent)}
.mk-pedido h3{margin:7px 0 3px;font-size:.86rem;font-weight:600}
.mk-pedido .mk-meta{margin:0}
.mk-pedido .mk-barra{margin-top:8px;max-width:280px}
.mk-icos{display:flex;gap:6px;align-items:center}
.mk-ico{width:36px;height:36px;border-radius:10px;border:1px solid var(--line);
  background:var(--surface-solid);display:grid;place-items:center;cursor:pointer;color:var(--muted)}
.mk-ico svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
.mk-ico:hover{color:var(--accent);border-color:var(--accent)}
.mk-contagem{font-size:1.2rem;font-weight:700;margin:0}
.mk-barra{height:7px;border-radius:99px;background:var(--line);overflow:hidden}
.mk-barra span{display:block;height:100%;background:var(--accent)}
.mk-busca{position:relative;max-width:420px;margin-bottom:12px}
.mk-busca>svg{position:absolute;left:12px;top:50%;transform:translateY(-50%);width:16px;height:16px;
  fill:none;stroke:var(--muted);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;pointer-events:none}
.mk-busca input{width:100%;padding:10px 38px;border:1px solid var(--line);border-radius:10px;
  font-size:.9rem;background:var(--surface-solid);color:inherit}
.mk-busca input:focus{outline:none;border-color:var(--accent)}
/* ⚠⚠ O CARTÃO RECUSADO NÃO TINHA METADE ESCURA — tinha um só valor a fingir
   que servia os dois. `#e8b4b0` e `#fdf6f5` são literais, e um literal é o
   mesmo número no claro e no escuro enquanto o chão por baixo vira: no papel
   escuro o cartão de falha ficava uma mancha rosa quase branca, mais clara
   que o cartão que deu certo ao lado dele.

   ⭐ A família já existe e tem nome — `tinta sobre lavado`, com o contorno da
   própria tinta (§1.0 do sistema, na nota do `--erro-lavado` em `styles.css`).
   Então não entra cor nova: entra o par que a casa já resolveu.

   ⚠ E O CLARO MUDA DE PROPÓSITO, o que é diferente de mudar por acaso:
   `#e8b4b0` era um rosa de contorno, e `--selo` (`#B3271B`) é a tinta do erro.
   O cartão recusado passa a ter o mesmo contorno que a frase que o explica —
   que é o que a família diz, e o que o `.mk-erro` já fazia duas regras acima. */
.mk-card-erro{border-color:var(--selo);background:var(--erro-lavado)}
/* ⚠ `#9a2b2b` À MÃO, e é o MESMO literal que a `.mk-erro` já trocou por
   `--selo` — a irmã dela ficou para trás na volta anterior. Medido lá:
   claro desce de 7,13 para 6,10 e escuro sobe de 2,47 para 5,27; o Alan
   escolheu com os dois números à vista (opção 4, 04/09/2026). A escolha já
   está tomada: o que faltava era aplicá-la aqui. */
.mk-card-erro-txt{font-size:.8rem;line-height:1.45;color:var(--selo);margin:8px 2px 0}
.ev{display:flex;flex-direction:column;align-items:center;text-align:center;gap:9px;
  padding:44px 24px;border-radius:16px;background:var(--surface-solid);border:1px solid var(--line)}
/* ⚠⚠ O CHÃO DO ÍCONE ERA UM LITERAL FRIO QUE NÃO INVERTIA — e no escuro isto
   não estava mal: estava INVISÍVEL.

   `#f4f5f7` é o cinzento-azulado da paleta antiga (o mesmo que a D-1299
   reduziu a um valor). Sendo literal, ele fica o MESMO nos dois modos, e a
   tinta por cima inverte:

       claro    --texto-fraco #475A85 sobre #f4f5f7 ....   6,27  ✅
       escuro   --texto-fraco #D5D2CD sobre #f4f5f7 ....   1,38  ⛔

   📌 O Alan chamou-lhe «ciano» ao ver a tela de Meus pedidos. O que ele viu foi
   o CASTO FRIO num chão quente — a cor certa em si mesma e errada na relação,
   que é a mesma frase que já está escrita a três lugares desta folha. Foi ver o
   tom e apanhou, sem medir, uma peça ilegível no escuro.

   ⭐ O `--tinta-50` é o bege que ele pediu E inverte, que é o que fecha o
   defeito de baixo:

       claro    #475A85 sobre #F0E9DF ....   5,68  ✅
       escuro   #D5D2CD sobre #0C1B3E ....  11,22  ✅

   E contra o papel ele mede 1,13 no claro e 1,11 no escuro — uma superfície
   que se nota sem se impor, que é o «círculo semitransparente» do pedido. */
.ev-ico{width:52px;height:52px;border-radius:14px;display:grid;place-items:center;
  background:var(--light-blue);color:var(--accent)}
/* ⚠⚠ 32 E NÃO 25, e é ordem do Alan de 04/09/2026 — «faça como sugeriu».
   A prancha `Passo13Listas` desenha o ícone do estado vazio a 32×32, medido
   directamente nas duas variantes vazias dela (v1, filtro sem resultado; v2,
   primeiro uso). O produto tinha 25.

   ⭐ A razão que ele aceitou: NAQUELAS TELAS O ÍCONE É O ELEMENTO PRINCIPAL.
   A tela está vazia — não há lista, não há dados —, e é ele que carrega o
   sentido. Um quarto mais pequeno é a peça a falhar o trabalho dela.

   ⚠️ E FICA DITO O QUE **NÃO** MUDOU, porque ele não o decidiu e eu não o
   medi a tempo de lho levar: a BOLHA à volta continua 52×52 com raio 14 — um
   quadrado arredondado —, e a prancha desenha-a **64×64 e redonda**. Com o
   ícone a 32 dentro de 52, a proporção passa a 0,62; na prancha é 0,50. Está
   levado como pergunta separada. */
.ev-ico svg{width:32px;height:32px;fill:none;stroke:currentColor;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}
.ev-ico.neutro{background:var(--tinta-50);color:var(--texto-fraco)}
/* ⚠ 600 E NÃO 500, e diverge da prancha DE PROPÓSITO. A `Passo13Listas`
   desenha o título dos estados vazios em 500. Alan, 04/09/2026: «faça como sugeriu, e deixe o baixar do tamanho
   que está» — e dos sete que lhe levei, este ficou. A razão que ele deu para
   os três pesos juntos: UM DEGRAU DE PESO NÃO SE VÊ, e são quatro lugares.
   Mexer neles é movimento sem retorno. */
.ev h3{margin:4px 0 0;font-size:1.12rem;font-weight:600}
.ev p{margin:0;font-size:.92rem;line-height:1.6;max-width:400px;color:var(--muted)}
.jn-titulo{font-size:1.35rem;font-weight:680;letter-spacing:-.01em;margin:0}
.jn-op:hover{border-color:var(--line-strong)}
/* O rádio de verdade fica escondido e continua sendo ele quem guarda a escolha:
   o `:has(:checked)` só pinta o que ele já decidiu. Assim a tela responde no
   clique sem JavaScript, e o teclado continua andando entre as opções. */
.jn-opcoes{display:flex;flex-direction:column;gap:18px;margin-top:22px}   /* 18 na prancha; 9 colava os dois cartões */
.jn-op input{position:absolute;opacity:0;width:0;height:0}
/* ⚠⚠ ESTA LINHA SAIU, e não foi coberta. Ela dizia
     `background:var(--light-blue); border-color:var(--accent); color:var(--accent)`
   e produzia QUATRO queixas do Alan que ele reportou como quatro coisas: o
   fundo ciano, a borda ciana, o título ciano e a descrição ciana.

   📌 Eram uma. Um seletor, quatro sintomas — e tratá-los um a um teria dado
   quatro regras a tapar uma. A pergunta a fazer diante de uma lista de
   sintomas é se algum deles partilha seletor.

   ⚠ E a `Passo2OQueFazer` diz o que selecionar faz: MUDA SÓ A CAIXA. O fundo
   do cartão fica `--papel`, a borda fica tracejada em `--tinta-400`, e a tinta
   não muda. O sinal de escolha é a caixa a encher-se — que é o que uma caixa
   de seleção faz em qualquer sítio. */
.jn-op:has(input:focus-visible){outline:3px solid var(--foco);outline-offset:2px}
.jn-op:has(input:checked) .jn-marca{background:var(--marinho);border-color:var(--marinho)}
.jn-op:has(input:checked) .jn-marca svg{display:block}
/* ⚠ O título do cartão é peso 500 na prancha e estava a 400. Ele não tem
   classe — é o `<span style="flex:1">` que embrulha o título e a descrição —,
   e por isso o peso vai no span e volta a 400 no `<small>`. Sem a segunda
   linha, a descrição engordava com o título. */
.jn-op > span:not([class]) { font-weight: 500 }
.jn-op small{display:block;opacity:.75;font-size:.84rem;margin-top:2px;font-weight:400}
/* A marca é sempre desenhada; o visto dentro dela só aparece na escolhida.
   Sem esta regra o `display:none` não existe e o visto aparece nas duas. */
.jn-marca{width:21px;height:21px;border-radius:50%;flex:none;display:grid;place-items:center;
  border:1.5px solid var(--line-strong);background:transparent}
/* ⚠ O `#fff` aqui é do tique DENTRO da marca escolhida, e a superfície dele é
   o `--marinho` da regra `:has(input:checked)` acima. O caso `.jn-op.on` tem
   regra própria mais abaixo (`stroke: var(--texto)`) e não passa por aqui —
   conferido antes de trocar, porque as duas superfícies são diferentes. */
.jn-marca svg{width:13px;height:13px;fill:none;stroke:var(--sobre-primario);stroke-width:3.2;stroke-linecap:round;
  stroke-linejoin:round;display:none}
.jn-op.on .jn-marca{background:var(--accent);border-color:var(--accent)}
.jn-op.on .jn-marca svg{display:block}
/* ⚠ O `opacity: .75` saiu. A prancha dá `--texto-fraco` ao preço, e o produto
   dava `--texto-fraco` MAIS um véu — o que produzia rgb(125,138,169), que é
   outra cor e não é token nenhum. Um véu sobre um token de tinta é uma cor
   nova sem nome e sem par: no escuro ele desloca-se para onde ninguém mediu. */
/* ⚠ 12,5px e não `.82rem`. Medido na `Passo2OQueFazer` (01/09): o preço é
   12,5px, e `.82rem` dá 13,12 — meio pixel a mais que empurrava a largura de
   118 para 126. Em `px` e não em `rem` porque é o que a prancha declara, e
   porque a escala tipográfica desta tela já está toda em `px`. */
.jn-preco{font-size:12.5px;color:var(--texto-fraco);white-space:nowrap}
.mk-bloco-topo{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px}
.mk-bloco-topo h3{margin:0;font-size:.98rem}
/* ⚠⚠ ERA `#9a2b2b` À MÃO, e media 2,47 sobre o papel escuro — a frase que diz
   à pessoa que o arquivo foi recusado, que é a única da tela que ela precisa de
   ler, não se lia. Um literal não inverte, e este não invertia.

   ⭐ O `--selo` é o token que a casa já tem para isto e JÁ INVERTE sozinho, e a
   nota dele no `styles.css` diz por escrito que «o `--erro-tinta` não existe:
   quem serve é o `--selo`». Então não entrou vermelho novo nem token novo:
   entrou o que já lá estava.

   ⚠ E O CLARO DESCE, de 7,13 para 6,10 — dito ao Alan com o número à vista
   antes de ele escolher (opção 4, 04/09/2026). Continua bem acima de 4,5, e o
   que se ganha é o escuro, que passa de 2,47 para 5,27. *Nem toda a correção
   sobe um número*, que é a mesma conclusão a que o `--acento-escuro` chegou.

   ⛔ E a regra `.jn-pe .jn-pe-aviso.mk-erro` continua a mandar no aviso da
   barra: lá o vermelho não é a coisa certa, e está escrito por quê. Esta troca
   não a toca. */
.mk-erro{font-size:.8rem;color:var(--selo);margin:6px 0 0}
/* A mensagem de saldo alinha com o botão que ela explica, e não com o texto
   acima: ela é a legenda daquele botão, e legenda fica debaixo da coisa.
   No telefone o botão ocupa a linha quase inteira, e aí o centro é o alinhamento
   do próprio botão — nada a corrigir. */
.mk-falta{text-align:right;font-size:.8rem;max-width:none}
@media(max-width:700px){ .mk-falta{text-align:center} }
/* O nome do pedido, no bloco próprio do desenho (tela 6). */
/* O título de seção usa o mesmo corpo do título da tela, e ganha o respiro que
   separa uma seção da anterior. */
.jn-titulo-secao{margin-top:26px}
.jn-titulo-secao + .mk-bloco{margin-top:12px}
.mk-rotulo-pedido label{display:block;font-size:.88rem;font-weight:650;margin-bottom:9px}
.mk-rotulo-pedido label span{font-weight:400;color:var(--muted);font-size:.82rem}

/* ===== alvo de dedo e distância do destrutivo (D-257) =====
   Regra, e não conserto desta tela: todo controle tocável tem 44px no celular,
   e ação que perde trabalho não fica adjacente a ação de uso repetido. Aqui as
   duas coisas eram o mesmo defeito — girar e tirar com 28px e 5px entre eles,
   no aparelho que é a população deste produto. */
.mk-tirar{position:absolute;top:15px;right:15px;z-index:1}
.mk-tirar span{display:none}
.mk-card-bts {
  position: absolute;
  top: 15px;
  z-index: 1;
  display: flex;
  gap: 5px;
  right:48px;
}
@media(max-width:700px){
  .mk-mini-bt{width:44px;height:44px;border-radius:11px}
  .mk-mini-bt svg{width:18px;height:18px}
  /* Apagar volta para DENTRO da miniatura, no mesmo arranjo do computador —
     decisão do Alan, e a moldura passa a ser a mesma nas duas larguras.
     O que fica da D-257 é o que dá para manter aqui: os 44px de alvo e uma
     distância real entre girar e apagar. Antes eram 28px com 5 de folga, um
     roçar de dedo; agora são 44 com 14, e os centros ficam a 58px em vez de
     33. É menos separação do que o botão embaixo dava, e é a troca que o
     arranjo único custa. */
  .mk-tirar{right:15px}
  .mk-card-bts{right:73px}
}

/* ===== enviar: o desenho da jornada, telas 1 e 2 (D-205) ===== */
.mk-solta-fina{padding:16px 20px;text-align:left}
.mk-solta-fina .mk-solta-acoes{margin-top:0}
.mk-solta-linha{display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap}
.mk-solta-linha p{margin:0}
.mk-camera{width:17px;height:17px;flex:none;fill:none;stroke:currentColor;stroke-width:1.4;
  stroke-linecap:round;stroke-linejoin:round;margin-right:7px;vertical-align:-3px}
@media(max-width:480px){
  /* Os dois na mesma linha: o ícone carrega o sentido, então o texto perde a
     palavra genérica e fica com a que distingue — "Arquivos" e "Foto". Empilhar
     custava uma rolagem inteira antes de a pessoa ver o primeiro documento. */
  /* A segunda tela empilha o convite e os botões, como a primeira: em linha, os
     botões ficavam com a sobra da largura, o texto encostava na borda e o par
     deixava de ser o mesmo par da tela anterior. */
  .mk-solta-linha{flex-direction:column;align-items:stretch;gap:14px}
  .mk-solta-acoes{flex-wrap:nowrap;gap:8px}
  .mk-solta-acoes .button{flex:1 1 0;min-width:0;padding:12px 10px;font-size:.9rem;
    justify-content:center;white-space:nowrap}
  .mk-solta-acoes .mk-so-largo{display:none}
  .mk-solta-acoes .mk-so-estreito{display:inline}
  .mk-camera{margin-right:6px}
}
/* Arrastar o arquivo para cima da área precisa dizer que ela recebe: sem o
   realce, soltar no lugar certo vira sorte. */
.mk-solta.sobre{border-color:var(--accent);background:var(--light-blue)}
.mk-solta-andamento{margin-top:14px}
.mk-solta-andamento small{display:block;margin-top:7px;color:var(--muted)}

/* A lupa: o documento em tela cheia, com zoom. */
.mk-lupa{display:flex;position:fixed;inset:0;background:#0b0b0ceb;z-index:120;flex-direction:column}
.mk-lupa[hidden]{display:none}
.mk-lupa-barra{display:flex;align-items:center;justify-content:space-between;gap:16px;flex:none;
  padding:12px 18px;color:#fff;font-size:.88rem;background:#00000059}
.mk-lupa-bts{display:flex;align-items:center;gap:6px}
.mk-lupa-bts b{font-size:.8rem;font-weight:600;min-width:64px;text-align:center;opacity:.85}
.mk-lupa-bts button{width:34px;height:34px;border-radius:9px;border:1px solid #ffffff2e;
  background:transparent;color:#fff;display:grid;place-items:center;cursor:pointer}
.mk-lupa-bts button:hover{background:#ffffff1f}
.mk-lupa-bts svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.5;
  stroke-linecap:round;stroke-linejoin:round}
/* `touch-action: pinch-zoom` deixa o navegador entregar os dois ponteiros em
   vez de sequestrar o gesto para dar zoom na página inteira — e mantém a
   rolagem de um dedo, que é como se percorre a imagem ampliada. */
/* `place-items:center` centraliza, e ao mesmo tempo torna INALCANÇÁVEL o que
   transborda para a esquerda e para cima: a rolagem não vai abaixo de zero, e
   metade da imagem ampliada fica atrás da borda. `margin:auto` centraliza do
   mesmo jeito e sem esse efeito. Medido: com o `place-items`, o ponto sob os
   dedos escorregava 5% na horizontal no primeiro gesto.

   `touch-action: pinch-zoom` deixa o navegador entregar os dois ponteiros em
   vez de sequestrar o gesto para dar zoom na página inteira. */
.mk-lupa-palco{flex:1;overflow:auto;display:grid;place-items:start;padding:20px;
  touch-action:pinch-zoom}
.mk-lupa-palco img {
  margin:auto;
  display:block;
  border-radius:6px;
  background:var(--papel);
  max-width:calc(100vw - 40px);
  max-height:calc(100vh - 100px);
}
.mk-lupa-palco img.real{max-width:none;max-height:none}
/* O cursor promete o que a superfície FAZ, e as duas grades não fazem o mesmo.
   Medido: na tela de ENVIO o clique na miniatura abre a lupa (`envio.js`), e o
   `zoom-in` é honesto; na de ACOMPANHAR o único ligado à lupa é o botão
   `[data-lupa-cartao]` — a imagem não responde a clique nenhum, e a regra sem
   escopo prometia uma lupa que não vinha. O Alan passou o mouse, viu o cursor,
   clicou, e não aconteceu nada.
   Ampliar continuar sendo botão ali é decisão e está certa: o cartão inteiro
   vira link para o resultado, e um mesmo toque que às vezes amplia e às vezes
   navega é um toque que a pessoa não pode prever. O defeito era o cursor, não
   a ação. */
#grade .mk-card > img { cursor: zoom-in }
.mk-card [data-lupa-cartao] { cursor: zoom-in }

/* O cartão que ainda está subindo: um arco girando NO MEIO da miniatura, e
   nenhum texto. O texto vivia embaixo do cartão e era vermelho — a MESMA cor
   da recusa, que é o outro estado desta mesma tela. Duas coisas diferentes com
   a mesma cor ensinam a pessoa a não confiar na cor, e a cor da recusa é a que
   precisa ser acreditada. */
.mk-subindo {
  position: absolute; top: 9px; left: 9px; right: 9px; height: 184px;
  display: grid; place-items: center; border-radius: 10px;
  background: #ffffff73; z-index: 2
}
.mk-subindo i {
  display: block; width: 26px; height: 26px; border-radius: 50%;
  border: 2.5px solid #0000001c; border-top-color: var(--accent);
  animation: mk-gira .8s linear infinite
}
@keyframes mk-gira { to { transform: rotate(360deg) } }
/* Quem pediu para não ver movimento não vê: o arco para e vira um anel, que
   continua dizendo "isto ainda não terminou" sem girar. */
@media (prefers-reduced-motion: reduce) {
  .mk-subindo i { animation: none; border-top-color: #0000001c }
}
@media(max-width:700px){
  .mk-lupa-bts button{width:44px;height:44px}
}

/* A tela de resultado. Os valores são os do mockup da jornada (D-205), que é a
   única referência deste marco — não reinterpretados. */
.mk-res {
  display: grid; grid-template-columns: minmax(0, 1fr) 290px; gap: 24px; align-items: start
}
.mk-res > * { min-width: 0 }
.mk-res .mk-bloco { min-width: 0 }
/* Imagem à esquerda, texto à direita, e as duas com a mesma largura: o par é a
   defesa (D-245), e dar mais espaço a um dos lados convida a ler só ele. */
.mk-res-doc { grid-template-columns: 1fr 1fr }
/* A imagem acompanha a rolagem do texto. Sem isso, conferir o fim de uma
   transcrição longa é conferir contra o vazio — a imagem já subiu. */
.mk-res-img { position: sticky; top: 14px }
.mk-res-img .mk-mini {
  max-height: calc(100vh - 150px); object-fit: contain; object-position: top; background: var(--tinta-50)
}
/* O pé da imagem: o nome do arquivo à esquerda, a lupa à direita.
   **`nowrap` e não `wrap`, e a troca é medida** (defeito visto em produção pelo
   Alan, com um nome de 129 caracteres): o `wrap` fazia a lupa cair para a linha
   de baixo, e o nome — que vem com underscores em vez de espaços, e por isso é
   UMA palavra que não quebra — vazava 229px para fora do cartão, por cima da
   coluna da transcrição. *Medido no navegador com a página real: com `wrap`, a
   lupa desce 29px e o nome vaza; sem ele e com a truncagem abaixo, os dois
   ficam na mesma linha em 375px e em 1440px.*
   O `wrap` fazia sentido quando esta linha tinha DOIS botões (o baixar morava
   aqui antes de subir para o cabeçalho do bloco ao lado); com um só, ele só
   servia para esconder o defeito da truncagem que faltava. */
.mk-res-img-pe {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin-top: 10px; flex-wrap: nowrap
}
/* A mesma forma do `.mk-card-nome`, que é o padrão desta casa para nome de
   arquivo — e o `min-width: 0` porque um item flex NÃO encolhe abaixo do
   conteúdo sem ele, e sem encolher não há o que truncar. */
/* ⚠️ E a COR está INVERTIDA em relação à prancha: o produto põe o nome do
   ficheiro em `--texto` (forte) e a `Passo6Resultado` desenha-o fraco. Ele é
   metadado — quem lê a tela quer a transcrição, não o nome do JPG —, e estava
   a competir com ela em peso visual.

   ⭐ Escopado a `.mk-res-img-pe`, e não à regra partilhada `.mk-card-nome,
   .mk-res-nome`: essa veste também a `acompanhar` e os `_documentos`, que eu
   NÃO medi. Mudar o que não se mediu é trocar um defeito visto por dois
   por ver. */
.mk-res-img-pe .mk-res-nome {
  min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  color: var(--texto-fraco)
}
/* A lupa não encolhe: ela é o alvo do clique, e um alvo espremido é pior do
   que um nome curto. */
.mk-res-img-pe .mk-icos { flex: none }
.mk-mini {
  width: 100%; border-radius: 12px; border: 1px solid var(--line);
  display: block; cursor: zoom-in
}
.mk-nav {
  display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap;
  background: var(--surface-solid); border: 1px solid var(--line);
  border-radius: 14px; padding: 10px 16px; margin-bottom: 18px
}
.mk-nav-botoes { display: flex; align-items: center; gap: 8px }
.mk-nav .button { min-width: 40px }
/* ⭐ A lista de campos lidos, medida na `Passo6Resultado`: ela não é uma grade
   com folga entre células — é uma TABELA de linhas, cada uma com 9px de
   respiro em cima e em baixo e um traço por baixo. O produto tinha `gap: 8px
   16px` e nenhum traço, e por isso a linha media 21 de altura contra os 38 da
   prancha.

       prancha   dt e dd  padding 9px 0 · border-bottom 1px --linha
                 dt 12,5px peso 400 --texto-fraco
                 dd 14px   peso 400 --texto
       produto   sem padding, sem traco, dd a peso 600

   ⚠ E o peso do valor desce de 600 para 400 porque a prancha o distingue por
   COR e por TAMANHO, não por gordura: o rótulo é 12,5 em `--texto-fraco` e o
   valor é 14 em `--texto`. Somar o negrito a isso é dizer a mesma coisa três
   vezes. */
/* ⚠ O afastamento entre as colunas é PADDING do valor e não `gap` da grade —
   e a diferença vê-se: com `gap`, o traço de cada linha parte-se ao meio e a
   tabela ganha uma coluna de buracos. O `border-bottom` acompanha o padding,
   então o inset de 40px da prancha entra no valor e a linha fica inteira. */
.mk-chave { display: grid; grid-template-columns: 150px 1fr; gap: 0; font-size: .94rem; margin: 0 }
.mk-chave dt, .mk-chave dd { padding: 9px 0; border-bottom: 1px solid var(--line) }
.mk-chave dt { color: var(--muted); font-size: 12.5px }
/* ⚠ E o valor precisa da COR escrita: sem ela ele herda o corpo e fica com a
   mesma tinta do rótulo — e aí a tabela deixa de ter dois níveis. A prancha
   separa-os por cor e por tamanho: rótulo 12,5 em `--texto-fraco`, valor 14 em
   `--texto`. */
.mk-chave dd { margin: 0; padding-left: 40px; font-weight: 400; font-size: 14px; color: var(--texto) }
.mk-chave dd:empty::after { content: '—'; color: var(--muted); font-weight: 400 }
.mk-switch { display: inline-flex; align-items: center; gap: 9px; font-size: .87rem; color: var(--muted); cursor: pointer }
.mk-switch input { position: absolute; opacity: 0; pointer-events: none }
.mk-switch i {
  /* ⚠ O trilho DESLIGADO do interruptor. `#cbd5e1` é frio e não inverte; o
     `--tinta-200` é o degrau que mede quase exactamente o mesmo no claro
     (ΔL 0,005; 1,40 contra o papel onde hoje dá 1,39) e que ganha metade
     escura. ⛔ Não é o `--tinta-300`/`--line-strong`: esse é token de
     CONTORNO de controle, e isto é o PREENCHIMENTO dele. */
  width: 38px; height: 21px; border-radius: 99px; background: var(--tinta-200);
  position: relative; display: inline-block; flex: none; transition: background .15s ease
}
.mk-switch i::after {
  content: ''; position: absolute; top: 2px; left: 2px; width: 17px; height: 17px;
  border-radius: 50%; background: var(--papel); transition: transform .15s ease
}
.mk-switch input:checked + i { background: var(--accent) }
.mk-switch input:checked + i::after { transform: translateX(17px) }
.mk-switch-linha {
  margin: 0 0 14px; padding-bottom: 14px;
  border-bottom: 1px solid var(--line); width: 100%
}

@media (max-width: 940px) {
  .mk-res { grid-template-columns: 1fr }
  .mk-res-doc { grid-template-columns: 1fr }
  /* Empilhado, a imagem grudada no topo cobriria o texto que ela existe para
     confrontar. */
  .mk-res-img { position: static }
  .mk-res-img .mk-mini { max-height: 60vh }
  .mk-chave { grid-template-columns: 130px 1fr }
  .mk-nav-botoes { flex-wrap: wrap }
}
/* Passo de navegação sem destino. Ele fica na fileira para que os quatro
   botões não dancem de posição a cada documento — some-lo faria o "próximo"
   pular para onde estava o "primeiro". */
.desativado { opacity: .38; pointer-events: none }

/* O esqueleto: a área da imagem existe antes da imagem, e não pula quando ela
   chega. Sem isso o texto ao lado dança para baixo no meio de uma leitura. */
/* A caixa NÃO reserva a forma do documento. Reservá-la pela proporção gravada
   deixava uma faixa branca embaixo sempre que o `max-height` da imagem
   apertava mais que a proporção — a caixa guardava espaço que a imagem não ia
   ocupar. Ela cresce com a imagem, e o brilho cobre o vazio enquanto isso. */
/* ⚠ O ESQUELETO ERA CINZENTO FRIO NOS DOIS MODOS. `#ececed` é o degrau mais
   próximo do `--tinta-50` em luminância de toda a rampa (ΔL 0,018), e por
   isso a troca no claro é quase invisível — que é o que se quer: o que muda
   é o escuro, onde um `#ececed` sobre `#05102C` era um retângulo branco a
   piscar antes de a imagem chegar. */
.mk-esqueleto { position: relative; border-radius: 12px; overflow: hidden; background: var(--tinta-50) }
.mk-esqueleto:not(.pronta) { min-height: 220px }
.mk-esqueleto::after {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  /* ⚠⚠ O BRILHO ERA `#ffffffb0`, e o argumento de que ele estava certo é o
     mesmo do `.jn-selo`: num desenho que só tem modo claro, `#fff` e
     `--papel` são a mesma cor, e o que o desenho queria dizer era «a cor da
     página a passar por cima do vazio». `--papel` diz isso nos dois modos —
     no escuro o brilho passa a ser mais ESCURO que a base, e continua a ser
     um brilho porque o que o faz ver é a diferença, não a claridade. */
  background: linear-gradient(100deg, #0000 20%,
                              color-mix(in srgb, var(--papel) 69%, transparent) 50%, #0000 80%);
  background-size: 220% 100%;
  animation: brilho 1.25s linear infinite;
}
/* Some quando a grande chega — inclusive para quem pediu menos movimento. */
.mk-esqueleto.pronta::after { content: none }
.mk-esqueleto.pronta {
  overflow: visible;
  background: none;
}
@keyframes brilho { from { background-position: 140% 0 } to { background-position: -40% 0 } }
@media (prefers-reduced-motion: reduce) { .mk-esqueleto::after { animation: none } }

/* O contador do paginador em duas versões. `display:none` e não recorte no
   script: a palavra tem comprimentos diferentes nos três idiomas. */
.mk-so-estreito {
  /* Os dois ícones dos botões de anexar — o clipe e a câmera. No telefone eles
  são o que a mão procura antes de ler, e é por isso que o texto pode encolher
  sem o botão perder o sentido. */
  display: none;
}
@media (max-width: 620px) {
  .mk-so-largo { display: none }
  .mk-so-estreito { display: inline }
}
/* Bandeja e seta dentro do MESMO alvo, sem divisória. O alvo cresce para
   caber os dois sem apertar o toque. É a forma que serve aos dois botões de
   baixar — o do pedido inteiro e o do documento da tela. */
.mk-ico-seta { width: auto; gap: 2px; padding: 0 7px; display: inline-flex; align-items: center }
.mk-ico-seta .mk-caret { width: 12px; height: 12px }
#pop-baixar, #pop-baixar-um { position: relative }


/* Meus dados. O avatar grande é o mesmo da barra, três vezes maior. */
/* ⭐ A ÚNICA medida de linha que uma prancha manda: 675 dentro de 1150, na
   `Passo13Listas`. Fica no parágrafo e não na classe de família, e a razão
   é medida: fui aplicar `max-width: 68ch` ao `.md-lead` e à `.md-nota` de
   uma vez, e o número de Meus dados SUBIU de 24 para 28.

       «Alem da sua senha, mandamos um codigo de seis digitos...»
           prancha  567 · UMA linha      produto 1090 · UMA linha
           com 68ch 518 · DUAS linhas    ⛔ afastou-se da prancha

   ⛔ E a premissa não se sustentava. Medindo a caixa contra o PAI em cada
   prancha, só uma das três está constrangida:

       Passo13Listas   «Toda vez que um resultado»   675 · pai 1150  ⭐
       Passo14MeusDados «Alem da sua senha»          567 · pai  567
       Passo8Faturamento «Dados necessarios»        1150 · pai 1150

   📌 Nos outros dois, o produto e a prancha estão AMBOS a não escolher, e o
   que os separa é a largura do contentor. «1140 não é uma escolha, é a
   ausência de uma» está certo como argumento e descreve UM caso.

   ⚠ E as duas pranchas discordam sobre o `.md-lead`: a de Listas constrange,
   a de Faturamento não. Enquanto discordarem, isto não pode subir a regra —
   uma regra de sistema obriga o desenho antes de obrigar o código. */
.md-lead-medido { max-width: 675px }
.md-nota { margin: -4px 0 16px }
/* ⛔ A NOTA DO BLOCO FICA EM `--texto-fraco`, e eu cheguei a trocá-la.
   ⚠⚠ AS DUAS PRANCHAS DISCORDAM, e é a mesma peça:

       Passo14MeusDados ....  rgb(71, 90, 133)  --texto-fraco   4 ocorrências,
                              nas DUAS variantes
       Passo8Faturamento ...  rgb(92, 108, 147) --tinta-500     nas duas

   Segui a de Faturamento e o número dela caiu 9 → 8. E o de Meus dados SUBIU
   25 → 29, porque a mesma regra veste as duas. Uma peça, duas fontes, e
   consertar por uma quebra a outra.

   ⭐ Quem desempata é o SISTEMA-DE-DESIGN: «meta / legenda … --texto-fraco».
   A prancha de Meus dados concorda com ele em quatro elementos; a de
   Faturamento é a única das duas a dizer outra coisa. O produto já estava
   certo, e a diferença que eu ia consertar era a PRANCHA.

   📌 É o caso que a guarda «duas pranchas dão números diferentes para o mesmo
   caso» foi escrita para apanhar, e este passou. Vai à frente de desenho. */
/* O círculo e o botão na primeira linha, alinhados pelo CENTRO; a palavra
   numa linha própria embaixo dos dois. Com ela na mesma coluna do botão, o
   botão subia junto e o meio dele deixava de coincidir com o meio do
   círculo — que foi o que o Alan viu. */
.md-foto {
  display: grid; grid-template-columns: auto 1fr; align-items: center;
  gap: 0 18px;
}
/* O botão herda `margin-top` de `.button`, e dentro de uma célula de grade
   isso o empurra 6px abaixo do centro — a olho é o botão "quase" alinhado com
   o círculo, que é pior do que claramente desalinhado. */
/* E não estica: numa coluna `1fr` o botão ocupava a largura toda do
   cartão, e um botão de largura de página para uma ação opcional pesa
   mais do que a ação vale. */
.md-foto > .button { margin-top: 0; justify-self: start }
.md-opcional, .md-erro-foto { grid-column: 2; margin: 5px 0 0; font-size: .72rem; color: var(--muted) }
.md-erro-foto { color: var(--danger) }
.mk-avatar-g { width: 64px; height: 64px; font-size: 1.3rem; flex: none }
.md-acoes { justify-content: flex-start; margin-top: 4px }
/* A foto no lugar das iniciais: mesmo círculo, e cortada no centro para não
   deformar quem mandou uma foto que não é quadrada. O corte de verdade é no
   servidor; este é o que sobra. */
/* ⭐⭐ E SEM FUNDO, que é a bola azul que o Alan viu: «no fundo claro aparece
   uma bola azul marinho e depois carrega a foto».

   O `<img>` da foto leva também `.mk-avatar`, e `.mk-avatar` traz o disco
   `--primario` que é o chão das INICIAIS. Enquanto os bytes não chegam, o
   `<img>` mostra o fundo dele — e o fundo dele é o disco de quem não tem foto.

   ⭐ E a distinção não precisa de truque nenhum, porque o servidor já a faz: com
   foto o gabarito escreve `<img class="… md-retrato">`, sem foto escreve
   `<span class="mk-avatar">` com as iniciais. O `.md-retrato` SÓ existe onde
   há foto — então tirar-lhe o fundo é invisível num caso e intacto no outro,
   que foi o que ele pediu com essas palavras: «não mexa na cor do que usa as
   iniciais».

   ⚠️ Duas das três fotos da tela tinham o disco; a terceira — a grande de Meus
   dados — já era transparente, por o `.mk-avatar-g` não trazer fundo. Era por
   isso que a bola aparecia na barra e não no cartão. */
.md-retrato { border-radius: 50%; object-fit: cover; display: block; background: transparent }

/* O avatar da GAVETA, que é o do celular: 40px porque ali ele fica ao lado do
   nome e do e-mail, e 26px ao lado de duas linhas de texto desaparece. */
.mk-avatar-m { width: 40px; height: 40px; font-size: .95rem; flex: none }

/* Com foto e em tela de computador, a conta deixa de ser pílula e vira só o
   retrato. A foto já diz de quem é a conta; a moldura em volta dela competia
   com a bandeira do idioma ao lado, que é o mesmo tipo de botão.
   O corte é o mesmo em que a conta some da barra e vai para a gaveta. */
@media (min-width: 861px) {
  .mk-pop-alvo-foto {
    padding: 0; border: 0; background: none; border-radius: 50%;
  }
  .mk-pop-alvo-foto:hover { border-color: transparent }
  /* 40px, medido no avatar da gaveta do celular e aplicado igual aqui:
     é o tamanho em que um rosto de 256px ainda se reconhece. A pílula
     do idioma ao lado tem 35 de altura, então o retrato passa cinco
     pixels dela — e é assim de propósito: sem moldura em volta, ele
     precisa de um pouco mais de diâmetro para ter o mesmo peso. */
  .mk-pop-alvo-foto .mk-avatar { width: 40px; height: 40px }
}

/* O recorte do avatar. O palco é quadrado e a máscara é um anel opaco por
   cima — o buraco redondo é o que vai virar a foto. */
.rc-caixa { width: min(380px, 92vw) }
.rc-palco { position: relative; width: 100%; aspect-ratio: 1; margin: 0 auto 14px; background: #1d1d1f; border-radius: 12px; overflow: hidden; touch-action: none }
.rc-tela { width: 100%; height: 100%; display: block; cursor: grab }
.rc-tela:active { cursor: grabbing }
/* A sombra de fora e o círculo, numa sombra só: `box-shadow` gigante com o
   elemento redondo no meio. Dois elementos dariam uma borda serrilhada entre
   eles em telas de densidade fracionada. */
.rc-mascara {
  position: absolute; inset: 0; margin: auto; width: 78%; aspect-ratio: 1;
  border-radius: 50%; pointer-events: none;
  box-shadow: 0 0 0 9999px rgba(0, 0, 0, .55); border: 2px solid rgba(255, 255, 255, .85);
}
.rc-zoom { display: flex; align-items: center; gap: 10px; margin: 0 2px 8px }
.rc-zoom svg { width: 17px; height: 17px; flex: none; fill: none; stroke: var(--muted); stroke-width: 1.8; stroke-linecap: round }
.rc-zoom input { flex: 1; accent-color: var(--accent); min-height: 24px }
.rc-dica { text-align: center; margin: 0 0 14px; font-size: .78rem }
/* A foto do bloco de Meus dados é clicável: clicar nela reabre o recorte. */
.rc-alvo { cursor: pointer }

/* O X que apaga a foto, no canto dela. */
.md-foto-alvo { position: relative; display: inline-block; flex: none }
.md-tirar {
  position: absolute; top: -2px; right: -2px; width: 24px; height: 24px;
  display: grid; place-items: center; padding: 0; cursor: pointer;
  border: 1px solid var(--line); border-radius: 50%;
  background: var(--surface-solid); color: var(--muted);
}
.md-tirar:hover { color: var(--danger); border-color: currentColor }
.md-tirar svg { width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round }

/* ===== a tabela do extrato e a dos chamados, que são a MESMA (D-327) =====
   O canvas desenhou as duas com os mesmos atributos e só as larguras de coluna
   diferentes — por isso as colunas saem da regra e vêm da tela, em `--cols`.
   Duas famílias de classe para uma tabela é o que a poda do M8 encontraria viva
   nas duas pontas, e é a divergência que ninguém desfaz depois.

   Alinhamento de célula NÃO mora aqui: é do conteúdo, não do esqueleto. O
   extrato alinha duas colunas à direita e os chamados alinham uma, e generalizar
   isso faria a terceira tela herdar o alinhamento da segunda. */
.tabela-cab {
  display: grid; grid-template-columns: var(--cols); gap: 14px;
  padding: 12px 0 9px; border-bottom: 1px solid var(--line);
  font-size: .72rem; font-weight: 750; letter-spacing: .03em;
  text-transform: uppercase; color: var(--muted);
}
.tabela-linhas { display: flex; flex-direction: column }
.tabela-linha {
  display: grid; grid-template-columns: var(--cols); gap: 14px;
  align-items: baseline; padding: 13px 0;
  border-bottom: 1px dotted var(--line);
}
/* A última linha não leva régua: a régua separa duas linhas, e embaixo da
   última não há o que separar — ela vira um segundo traço logo acima da borda
   do bloco. */
.tabela-linha:last-child { border-bottom: 0 }


/* ===== Créditos. Canvas `Créditos e Suporte`, pranchetas Main e Celular =====
 *
 * O que já existe no design system é reusado e não redesenhado: o cartão do
 * extrato é `.mk-bloco` — branco, borda `--line`, raio 16, mesmo respiro —, a
 * ficha de "em andamento" é `.chip .chip-run`, cujas três cores são as do
 * canvas, e o botão é `.button.primary`, cujo raio de 8px vem da segunda regra
 * de `.button` no `styles.css`. Escrever raio aqui reintroduziria a pílula que
 * aquela regra tirou. */
.cr-topo { margin-bottom: 26px; display: flex; align-items: flex-end;
  justify-content: space-between; gap: 24px; flex-wrap: wrap }
.cr-carrinho { width: 17px; height: 17px; fill: none; stroke: currentColor;
  stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round }

.cr-caixas { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-bottom: 24px }
/* Recuo e raio medidos na `Passo10Creditos`: `20px 22px` e raio 14. Estavam
   `20px 24px` e 16 — dois pixéis em cada, e nenhum dos dois veio de desenho. */
.cr-caixa { background: var(--surface-solid); border: 1px solid var(--line);
  border-radius: 14px; padding: 20px 22px }
/* ⚠⚠ O RÓTULO MAIÚSCULO, medido na `Passo10Creditos`: 11px, peso 500,
   `uppercase`, 1,1px entre as letras, `--texto-fraco`.

   Estava 12px peso 750 em caixa normal — nem o papel «rótulo maiúsculo» do
   SISTEMA §.., nem coisa nenhuma. Peso 750 num texto de 12px é o que fazia
   «DISPONÍVEL / RESERVADO / CONSUMIDO» disputar com o número que está por
   baixo, quando o papel deles é justamente nomeá-lo e sair da frente.

   ⚠ O SISTEMA e a PRANCHA discordam nos valores exactos deste papel — a
   tabela diz 10,5px e `--tinta-400`, a prancha desenha 11px e
   `--texto-fraco`. Sigo a PRANCHA, que é contra o que esta tela é medida, e a
   diferença vai como pergunta para a frente de desenho. Não é escolha de
   gosto: é escolher a régua que decide se esta tela passa. */
.cr-caixa > span {
  display: block; font-size: 11px; font-weight: 500; letter-spacing: 1.1px;
  text-transform: uppercase; color: var(--texto-fraco)
}
.cr-caixa > strong { display: block; margin: 6px 0 2px; font-size: 2.1rem; line-height: 1;
  letter-spacing: -.03em; font-variant-numeric: tabular-nums }
/* A linha pequena de cada caixa, medida na prancha: 13px em `--tinta-500`.
   Estava 12px em `--texto-fraco` — mais pequena e mais escura do que o
   desenho, que e a combinacao que a faz parecer nota de rodape quando ela e a
   pergunta que o numero responde. */
.cr-caixa > small { font-size: 13px; color: var(--tinta-500) }
/* A caixa do disponível é a única com fundo, e é a resposta à pergunta que traz
   a pessoa aqui. As outras duas explicam o número dela. */
.cr-caixa-forte { background: var(--light-blue); border-color: var(--foco-borda) }
/* ⚠⚠ As TRÊS linhas da caixa do saldo eram azuis cravados sobre
   `--acento-lavado`, e no escuro mediam 1,82 · 1,43 · 2,81. Não é um rótulo
   de canto: é o número que traz a pessoa a esta tela, ilegível.
   `--texto` dá 13,96/14,12 e `--texto-fraco` dá 5,64/10,01. */
/* ⚠ O ROTULO volta ao `--texto-fraco` dos outros dois, e isto MEXE na correcao
   das tres linhas ilegiveis — por isso vai MEDIDO e nao deduzido.

   A correcao existia porque as tres eram azuis cravados sobre
   `--acento-lavado`: 1,82 · 1,43 · 2,81 no escuro. O `--texto` resolveu-as. Mas
   o ROTULO nao precisa do `--texto` para passar: sobre este mesmo chao o
   `--texto-fraco` da 5,64 no claro e 10,01 no escuro, e e o que a prancha
   desenha nos TRES rotulos.

   📌 O `strong` e o `small` ficam como estao. O que sai e so a excecao do
   rotulo — a caixa forte deixa de ter um rotulo diferente das irmas por um
   motivo que ja nao se aplica a ele. Conferido com a sonda de contraste nos
   dois modos DEPOIS da troca, e nao pelo comentario que estava aqui. */
.cr-caixa-forte > strong { color: var(--texto) }
/* ⛔ O `small` da caixa forte FICA em `--texto-fraco`, e eu tentei tirá-lo.
   A prancha desenha as três linhas pequenas iguais, em `--tinta-500`, e o
   rótulo desta caixa já tinha saído da exceção — parecia a mesma limpeza.

   ⚠⚠ NÃO É. Eu medi o `--tinta-500` contra o PAPEL e deu 4,89. Mas esta caixa
   tem chão próprio, o `--acento-lavado`, e contra ELE dá 4,30 — reprova por
   0,20. A sonda apanhou-me no minuto seguinte:

       --tinta-500   sobre --papel #FAF7F2 .........  4,89  ✅
       --tinta-500   sobre --acento-lavado #DFEBF2 .  4,30  ⛔
       --texto-fraco sobre --acento-lavado .........  5,64  ✅

   📌 A exceção não era resto de nada: é o que impede esta linha de voltar a ser
   uma das TRÊS ilegíveis que já foram consertadas aqui. Medir a tinta contra o
   chão errado é como elas nasceram.

   ⚠ E é diferença declarada contra a prancha, não descuido — fica com razão
   escrita em vez de sair da folha. */
.cr-caixa-forte > small { color: var(--texto-fraco) }

.cr-extrato-topo { display: flex; justify-content: space-between; align-items: center;
  gap: 14px; flex-wrap: wrap; margin-bottom: 4px }
/* ⚠⚠ SEM TIPOGRAFIA PRÓPRIA — ele é um título de bloco e passa a sê-lo pela
   regra dos outros, lá em baixo. Aqui ficava só o tamanho, e o PESO e a COR
   caíam no padrão do navegador: `h3` nasce negrito, e a cor vinha por herança.
   Dava Manrope 16px peso 700 em `--texto-fraco`, contra os 15px peso 500 em
   `--texto` de «Conta», «Endereço» e «Faturamento».

   📌 É a mesma família do logotipo azul de link: um elemento sem regra não
   fica sem aparência — fica com a que sobrar. E ninguém escreveu «negrito»
   em lado nenhum. */
.cr-extrato-topo h3 { margin: 0 }
.cr-filtros { display: flex; align-items: center; gap: 8px }
.cr-filtros select { padding: 0 11px; min-height: 38px; border: 1px solid var(--line-strong);
  border-radius: 10px; background-color: var(--surface-solid); color: inherit;
  font: inherit; font-size: .85rem; cursor: pointer }



/* No computador o invólucro dos números não existe como caixa: ele se desfaz
   em duas colunas da grade, que é onde o cabeçalho as nomeia. */
.cr-numeros { display: contents }
.cr-num { text-align: right }
.cr-quando { font-size: .85rem; color: var(--muted) }
.cr-oque { font-size: .9rem }
.cr-sub { display: block; margin-top: 2px; font-size: .82rem; color: var(--muted) }
/* O valor do lancamento, medido na prancha: 13px peso 500 em `--texto`.
   Estava 15px peso 650 e a herdar `--texto-fraco` — maior e mais gordo do que
   o desenho, e mais claro. Peso 650 aqui competia com o saldo ao lado, que e a
   coluna que fecha a conta. */
.cr-valor { font-size: 13px; font-weight: 500; color: var(--texto);
  text-align: right; font-variant-numeric: tabular-nums }
.cr-entrada { color: var(--certo-tinta) }   /* era --certo: 3,52 no escuro. Ver o token. */
.cr-saldo { font-size: .92rem; text-align: right; color: var(--muted);
  font-variant-numeric: tabular-nums }
/* No computador a data tem coluna e o saldo tem cabeçalho, então o duplicado e
   o rótulo ficam fora da tela. No telefone é o contrário — ver abaixo. */
.cr-quando-junto, .cr-saldo-rotulo { display: none }
/* O vazio do extrato, medido na `Passo10Creditos` variante 1: caixa de traço
   interrompido a `--tinta-300`, 54px de respiro em cima e em baixo, a frase a
   14px em `--texto-fraco`, e 14px até ao botão.

   ⚠ O traço INTERROMPIDO é o que o distingue de um cartão: uma caixa de traço
   contínuo aqui leria como conteúdo, e isto é a ausência dele. */
.cr-vazio { margin: 18px 0 4px; font-size: .88rem; color: var(--muted) }

/* ⚠ CLASSE PRÓPRIA, e não o `.cr-vazio` — ele é PARTILHADO por três telas:
   o extrato, as exportações e a tabela de preços por publicar. Vesti-lo aqui
   punha caixa de traço interrompido e 54px de respiro nas outras duas, que
   não foi o que o Alan pediu e que eu não teria visto: nenhuma delas é minha.

   📌 O item 18 é sobre o extrato. Uma classe partilhada é o caminho mais curto
   para consertar uma tela e mexer em três. */
.cr-vazio-bloco {
  display: flex; flex-direction: column; align-items: center; gap: 14px;
  margin: 18px 0 4px; padding: 54px 24px;
  border: 1px dashed var(--tinta-300); border-radius: 14px
}
.cr-vazio-bloco p { margin: 0; font-size: 14px; color: var(--texto-fraco) }
/* A seta do botão, medida na prancha: 22px de intervalo até ao texto. Ela é a
   marca de «sai desta tela», e não um enfeite — por isso tem `aria-hidden` e o
   rótulo do botão é que diz para onde. */
.cr-seta { margin-left: 22px }
/* ⭐ A MEDIDA DE LINHA, e esta a prancha ESCREVE-A: na `Passo9Compra` o `.cr-pe`
   tem `max-width: 428px` declarado, dentro de um contentor de 1150. Não é
   caixa que abraça o texto — é uma largura posta de propósito, e vê-se na
   altura: 45 de altura na prancha (duas linhas) contra 21 no produto (uma).

   ⚠ E é diferente do caso que eu recusei ontem. Lá eu ia aplicar `68ch` a três
   parágrafos porque UM deles estava constrangido; medi a caixa contra o pai e
   só um estava. Aqui a prancha não deixa dúvida: o `max-width` está escrito
   no elemento, nos quatro estados em que ele aparece. */
.cr-pe { margin: 18px 2px 0; max-width: 428px; font-size: .86rem; color: var(--muted); line-height: 1.55 }
/* ⚠⚠ O ELO DENTRO DESTA FRASE NÃO TINHA COR NENHUMA, e saía com o azul de
   omissão do navegador: `rgb(0,0,238)` no claro e `rgb(158,158,255)` no escuro.

   📌 Ele vive DENTRO de um `{% blocktrans %}` e por isso não leva classe —
   quem escreve a frase não escreve o elo. Nenhuma regra o alcançava: as regras
   de elo desta folha são todas por contexto, e este contexto não tinha a sua.

   ⭐ Achado em 05/09/2026 pela sonda 1 das três perguntas, DEPOIS de ela ganhar
   as assinaturas do modo escuro — antes disso ela era cega ali. */
/* ⚠⚠ O ELO DA LINHA DA COMPRA, no extrato, NÃO TINHA COR NENHUMA — saía no
   azul de omissão do navegador, `#0000EE`. A sonda das três perguntas apanhou-o
   em 05/09/2026, duas vezes na mesma tela.

   ⛔ E a razão de ninguém o ter visto é ESTRUTURAL: ele é o único `<a>` sem
   classe da família dos créditos. Varri os cinco gabaritos dela —
   `creditos`, `exportacoes`, `faturamento`, `minha_compra`, `precos` — e são
   19 elos, dos quais SÓ DOIS não levam classe: este e um na `exportacoes`.
   Um elo sem classe não é alcançado por regra nenhuma, e o navegador preenche
   o vazio com um azul que não é da casa.

   ⭐ A emenda é de CONTEXTO e não de classe, como a linha de baixo já é: o
   `.cr-pe a` resolve o mesmo problema no rodapé da mesma tela pela mesma
   forma. Assim o gabarito não muda — e ele é de outra frente.

   ⚠️ E cobre o FUTURO: qualquer elo que apareça numa linha do extrato passa a
   ter cor, incluindo os que ainda não existem. Era essa a fresta. */
.cr-extrato .tabela-linha a { color: var(--acento-escuro) }
.cr-extrato .tabela-linha a:hover { color: var(--marinho) }

.cr-pe a { color: var(--acento-escuro) }
.cr-pe a:hover { color: var(--marinho) }

@media (max-width: 700px) {
  /* O botão fica NA MESMA LINHA do título, e não vira barra de largura cheia:
     barra fina lê-se como aviso, e comprar crédito é a ação principal desta
     tela. Quem cede é a fonte do título. */
  .cr-topo { align-items: center; gap: 12px; margin-bottom: 20px }
  .cr-caixas { grid-template-columns: 1fr 1fr; gap: 10px }
  /* A do disponível ocupa a linha inteira porque é a que a pessoa veio ver; as
     outras duas dividem a seguinte, e cabem, porque os números são curtos. */
  .cr-caixa-forte { grid-column: 1 / -1 }
  .cr-caixa { padding: 14px 16px }
  .cr-caixa > strong { font-size: 1.4rem; margin: 4px 0 2px }
  .cr-caixa-forte > strong { font-size: 2rem }
  /* AS COLUNAS DEIXAM DE EXISTIR, e por isso o cabeçalho some: cada lançamento
     vira um bloco de dois lados — o que aconteceu à esquerda, os números à
     direita — e nada rola para o lado.

     Isto fica preso ao EXTRATO e não sobe para o esqueleto, ao contrário do
     resto: a lista de chamados do M7.4 recolhe de outro jeito no telefone —
     conferi a prancheta dela e a linha é centrada, com outro respiro. O que se
     generaliza é o que foi medido igual, não o que parece parecido. */
  .cr-extrato .tabela-cab { display: none }
  .cr-extrato .tabela-linha { display: flex; justify-content: space-between;
    align-items: flex-start; gap: 12px; padding: 14px 0 }
  .cr-quando { display: none }
  .cr-quando-junto { display: inline }
  /* Os números viram o lado direito do bloco, empilhados. */
  .cr-numeros { display: block; flex: none; text-align: right }
  .cr-valor { font-size: .95rem }
  .cr-saldo { display: block; margin-top: 3px; font-size: .78rem }
  .cr-saldo-rotulo { display: inline }
  /* A ficha desce para DEPOIS da sub-linha: no telefone ela é a última coisa
     do bloco, e não um aposto no meio do título. */
  .cr-oque {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 3px;
  }
  .cr-oque .cr-sub { order: 1; margin-top: 0 }
  .cr-oque .chip { order: 2; margin-top: 3px }
}

/* ===== o suporte: abrir um chamado, a lista, e o chamado aberto (M7.4) ===== */

/* O formulário ocupa a COLUNA ESTREITA e não a largura toda. Campo de texto com
   mil pixels convida a escrever um parágrafo por linha, e quem lê do outro lado
   é uma pessoa. */
/* O bloco de cima é UM bloco para quem lê, mesmo sendo dois cartões: por isso
   o respiro que o separa da lista é o mesmo `18px` que separa qualquer par de
   blocos do produto, e não o zero que sobrava.

   O cartão de dentro perde a margem própria: dentro de uma grade, a margem do
   item SOMA com o `gap`, e o formulário ficava a 34px do aviso enquanto o aviso
   ficava colado na lista — dois respiros diferentes numa tela só. */
/* «O que acontece a seguir» já NÃO é coluna: é o segundo momento da tela, e
   aparece depois de enviar (ver `suporte.html`). A grade de duas colunas que
   vivia aqui — `.sp-topo`, 640px + 1fr — saiu junto com ela, e é isso que
   devolve a largura inteira ao formulário: ele estava espremido a 640px por
   causa de uma coluna que respondia a uma pergunta que ninguém tinha feito
   ainda.

   A largura acompanha a do aviso porque os dois são o mesmo momento. */
.sp-depois {
  max-width: var(--medida-de-leitura); margin-top: 18px;
  background: var(--light-blue); border: 1px solid var(--foco-borda);
  border-radius: 16px; padding: 20px 24px;
}
.sp-depois h3 { margin: 0 0 10px; font-size: .95rem; color: var(--texto) }   /* era #0a3f78: 1,43 no escuro */
.sp-depois p { margin: 0 0 12px; font-size: .86rem; color: var(--texto); line-height: 1.6 }
.sp-depois p:last-child { margin-bottom: 0 }

/* Depois de enviar, o aviso SUBSTITUI o formulário. */
/* O aviso não usa a largura da página. Ele tem três linhas de texto, e uma
   linha de 1150px obriga o olho a varrer a tela inteira para ler "ficou com o
   código X" — que é a única coisa dali que a pessoa pode precisar repetir. */
.sp-enviado { max-width: var(--medida-de-leitura) }
.sp-enviado h2 { margin: 0 0 8px; font-size: 1.35rem; line-height: 1.25; letter-spacing: -.03em }
.sp-enviado p { margin: 0 0 6px; font-size: .95rem; line-height: 1.6 }
/* TERCEIRO EFEITO MEU, e não da prancha — assinado como os outros dois.
   O disco era `background: #e8f6ed`, hexadecimal cravado, e o defeito não é o
   que se procura: é o INVERSO dele.

   Medido contra o `--papel` dos dois modos:

       claro    1,04    tinta suave, que é a intenção do desenho
       escuro  16,86    disco quase branco furando o chão escuro

   A mesma cor que no claro quase não se vê torna-se, no escuro, o elemento
   mais gritante da tela — e a intenção do desenho inverte de sentido. Uma
   varredura que procure razão BAIXA não acha isto: 16,86 é razão alta. Foi por
   isso que sobreviveu.

   E não inventei cor nenhuma: `--certo-lavado` é «a superfície de confirmação»
   que esta folha já declara, e a tinta dela é `--certo-tinta`. Reproduzi as
   contas que estão escritas ao lado dos tokens antes de as usar — 4,95 no
   claro e 4,93 no escuro, e o disco volta a 1,14 / 1,12, que é a tinta suave
   nos DOIS modos.

   ⚠ `--success` (isto é, `--certo`) NÃO serve aqui: sobre o lavado escuro dá
   2,78. É cor de ESTADO, não tinta sobre chão — a folha separa os dois papéis
   em dois tokens de propósito, e usar o primeiro aqui era o atalho fácil. */
.sp-feito {
  width: 48px; height: 48px; border-radius: 13px; display: grid; place-items: center;
  background: var(--certo-lavado); color: var(--certo-tinta); margin-bottom: 16px;
}
.sp-feito svg { width: 24px; height: 24px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round }
.sp-acoes { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 22px }
/* ESTA REGRA É MINHA E NÃO DA PRANCHA — assinada de propósito. Um efeito não
   pedido que fica sem assinatura vira, mais tarde, "a prancha manda assim".
   O envio fica à direita, como na prancha e como na tela do chamado. Era
   `width: 100%` numa coluna de 640px; à largura inteira isso seria um botão
   de ponta a ponta. */
.sp-acoes-fim { justify-content: flex-end; border-top: 1px solid var(--line); padding-top: 18px }

/* A lista. O alinhamento à direita é da última coluna e mora aqui, e não no
   esqueleto da tabela: alinhamento de célula é do conteúdo (D-327). */
.sp-dir { text-align: right }
.sp-codigo { font-size: .88rem; font-weight: 650 }
/* A LINHA INTEIRA é o link, e ela continua com a CARA do canvas: tinta do
   texto, sem sublinhado. Azul sublinhado no meio de uma coluna de códigos
   lê-se como "um destes é diferente dos outros" — e a linha inteira sublinhada
   seria pior ainda. O que informa que ali se clica é o realce da linha ao
   passar o ponteiro, que é o mesmo gesto do cartão de pedido. */
.sp-linha { color: inherit; text-decoration: none }
.sp-linha:hover { background: var(--light-blue) }
.sp-linha:hover .sp-codigo { text-decoration: underline }
.sp-sob { display: block; margin-top: 2px; font-size: .82rem; color: var(--muted) }

/* A faixa de quem ainda não tem chamado. Ela é DISCRETA de propósito: some no
   instante em que o primeiro chamado nascer, então não pode ocupar o tamanho de
   uma seção de verdade. Não é o `.ev`, que é o estado vazio grande e
   centralizado — aqui o vazio é passageiro, e lá ele é o assunto da tela. */
.sp-vazio {
  display: flex; align-items: center; gap: 14px; padding: 22px 24px;
  border: 1px dashed var(--line-strong); border-radius: 16px;
  background: var(--papel);
}
.sp-vazio-ico {
  width: 42px; height: 42px; flex: none; border-radius: 11px; display: grid;
  place-items: center; background: var(--light-blue); color: var(--accent);
}
.sp-vazio-ico svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round }
.sp-vazio b { display: block; font-size: .92rem }

/* ===== o chamado aberto ===== */

/* ⭐ O «TODOS os itens dessa tela» do Alan. O link de volta é o ÚNICO que mora
   FORA da `.sp-coluna` — é irmão dela, não filho — e por isso era o único que o
   teto não alcançava: 1312 contra os 820 de tudo o resto.

   Ele é uma linha curta e não texto corrido, então o teto não lhe serve de
   medida de leitura; serve de ALINHAMENTO, que é a razão do próprio pedido —
   a borda esquerda já coincidia, a direita passa a coincidir também. */
.sp-volta { margin-bottom: 12px; max-width: var(--medida-de-leitura) }
/* ⚠⚠ `--acento-escuro` E NÃO `--accent`, e a troca é do USO e não do token.
 *
 * O `--accent` é o `--ciano`, que é A MARCA — e a casa já decidiu que marca não
 * serve de tinta (D-1550). Aqui ele pintava TEXTO: «Meus chamados» a 14px media
 * **2,72** sobre o papel claro, e o piso é 4,5.
 *
 * ⭐ E O TOKEN NÃO SE TROCA, porque medi o alcance dele ANTES de mexer:
 *
 *     ciano como FUNDO ....  31 elementos   ✅ e o uso certo
 *     ciano como TRAÇO ....  35 elementos   ✅
 *     ciano como TINTA ....  no CLARO, UM elemento — este
 *                            no ESCURO, 25 telas, mas lá ele é o
 *                            `--acento-escuro` e mede 6,46
 *
 * 📌 Trocar o token partia 66 usos certos para arranjar um errado. O que passou
 * a outro foi o USO — e o outro já existia: TODOS os outros links de voltar do
 * produto usam `.mk-volta`, com `--acento-escuro`. Este era o único fora da
 * família. Medido depois: 5,75 no claro, 6,46 no escuro. Alan, 04/09/2026. */
.sp-volta a { display: inline-flex; align-items: center; gap: 6px; font-size: .86rem; color: var(--acento-escuro); text-decoration: none }
.sp-volta a:hover { text-decoration: underline }
.sp-volta svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round }
/* A coluna é UMA SÓ e tudo mora dentro dela. Com o cabeçalho na largura inteira
   da página, a ficha de situação ia parar na beira da tela, a duzentos pixels da
   borda direita dos balões.

   ⭐⭐ E o teto é agora o TOKEN da casa, o `--medida-de-leitura` (D-1563), e não
   um 820 literal. A volta inteira está escrita porque ela ensina mais do que a
   regra:

   1 · O Alan mandou tirar o teto (04/09/2026): *«as caixas no modo computador
       não estão ocupando a largura inteira da tela, corrija»*. Tirei.
   2 · Medi o que se perdia e levei-lhe o número: a linha do balão passava de
       103 a 145 caracteres com a barra aberta, 168 com ela presa, e 208 a 1920.
       A medida confortável é ~65-73.
   3 · Ele desfez o próprio pedido com o número na mão: *«eu estava errado.
       Mude a largura de TODOS os itens dessa tela também para limitar na
       largura de leitura de 820px»*.

   ⭐ E a razão que ele deu é MELHOR do que o pedido original, e virou regra da
   casa: *«é preciso sempre uniformizar — quando houver uma caixa limitando na
   largura de leitura, a outra logo abaixo ou acima dela NÃO PODE ser tela
   inteira»*. ⭐ O desconforto dele nunca foi o vazio à direita: era a
   INCOERÊNCIA entre duas caixas vizinhas. *«isso parece bug.»*

   📌 A razão antiga desta regra — a de ALINHAMENTO, escrita no topo — fica
   duplamente confirmada: agora há as duas, alinhamento E medida.

   ⚠⚠ E fica a armadilha de medir esta tela: a largura tem DOIS valores certos,
   porque a barra lateral prende-se e solta-se e o miolo muda 172px com ela. A
   minha primeira medição dizia 1392 e a segunda 1140, e eu ia apagar uma — as
   duas estavam certas, para estados diferentes. **Um número de largura medido
   sem dizer o estado da barra é medida certa sobre a tela errada.** */
.sp-coluna { max-width: var(--medida-de-leitura) }

.sp-cabeca { display: flex; align-items: flex-start; justify-content: space-between; gap: 20px; flex-wrap: wrap; margin-bottom: 22px }
.sp-cabeca h1 { margin: 6px 0; font-size: 2rem; line-height: 1.05; letter-spacing: -.04em }
.sp-etiqueta { display: block; font-size: .8rem; font-weight: 750; letter-spacing: .03em; text-transform: uppercase; color: var(--muted) }

/* O que veio de nós tem o fundo azul-claro e o do cliente tem fundo branco: é a
   mesma distinção que o e-mail faz, e é o que dispensa um rótulo "você"/"nós"
   repetido em cada bloco. */
.sp-conversa { display: flex; flex-direction: column; gap: 12px }
.sp-balao {
  padding: 16px 18px; border: 1px solid var(--line);
  border-radius: 14px; background: var(--surface-solid);
}
.sp-balao-nosso { border-color: var(--foco-borda); background: var(--light-blue) }
.sp-balao-nosso .sp-balao-topo b { color: var(--texto) }   /* mesma cravada, mesmo 1,43 */
.sp-balao-topo { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 8px; font-size: .86rem }
.sp-balao-topo .mk-meta { margin: 0; font-size: .78rem }
.sp-balao p { margin: 0; font-size: .9rem; line-height: 1.6 }
.sp-responder { margin-top: 18px }
.sp-responder .sp-acoes { justify-content: space-between; margin-top: 16px }

/* No telefone as duas colunas viram uma, e os dois botões do rodapé do chamado
   ocupam a linha inteira: lado a lado num aparelho estreito, "Está resolvido,
   pode fechar" quebra em três linhas e encosta no botão de enviar. */
@media (max-width: 720px) {
  .sp-acoes { flex-direction: column; align-items: stretch }
  .sp-acoes .button { width: 100% }
  /* TAMBÉM MINHA, e não da prancha. O título deixa de ser escondido no
     telefone, e a razão é que a causa desapareceu: ele era escondido porque, sem a coluna ao lado, o bloco virava
     «continuação do botão» e título + duas frases pesavam demais para uma nota
     ao lado de um formulário. Agora o bloco só existe DEPOIS de enviar, onde é
     a única coisa da tela e onde a prancha lhe dá título em todas as larguras.
     Esconder o título aqui seria compensar uma coisa que já não acontece. */
  .sp-depois { padding: 14px 16px; border-radius: 12px }

  /* O cabeçalho do chamado encolhe: dois rem de título num aparelho de 390px
     ocupam três linhas antes de a conversa começar, e a conversa é o que a
     pessoa veio ler. */
  .sp-cabeca { flex-direction: column; align-items: flex-start; gap: 10px; margin-bottom: 18px }
  .sp-cabeca h1 { font-size: 1.4rem; line-height: 1.2; letter-spacing: -.03em; margin: 5px 0 0 }
  .sp-etiqueta { font-size: .74rem }
  .sp-conversa { gap: 10px }
  .sp-balao { padding: 14px 16px }
  .sp-balao p { font-size: .88rem }
  .sp-balao-topo { font-size: .82rem; align-items: baseline; margin-bottom: 6px }
  /* O PRINCIPAL EM CIMA, e é o único lugar onde a ordem dos dois se inverte.
     Lado a lado no computador, o de fechar vem antes porque a leitura vai da
     ação branda para a firme; empilhados no telefone, quem está com o polegar
     na tela alcança primeiro o de baixo — e o de baixo não pode ser o que
     encerra a conversa. */
  .sp-responder .sp-acoes { flex-direction: column-reverse; gap: 8px }
}

/* No telefone a tabela de chamados vira lista: código e ficha na primeira
   linha, assunto na segunda, data na terceira. Quatro colunas num aparelho de
   390px dariam ao assunto uma coluna de trinta pixels.

   A reordenação é por `order` e vale só aqui — a tabela do extrato tem quatro
   colunas com outros pesos, e a dela é dela. */
.sp-tabela { --cols: 110px 150px 1fr 150px }
@media (max-width: 720px) {
  .sp-tabela .tabela-cab { display: none }
  .sp-tabela .tabela-linha { grid-template-columns: 1fr auto; gap: 0 10px; row-gap: 3px }
  .sp-tabela .tabela-linha .sp-codigo { order: 1 }
  .sp-tabela .tabela-linha .sp-dir { order: 2 }
  .sp-tabela .tabela-linha span:nth-child(3) { order: 3; grid-column: 1 / -1; margin-top: 2px }
  .sp-tabela .tabela-linha .mk-meta { order: 4; grid-column: 1 / -1; margin: 0 }
}

/* O campo de texto longo, que o vocabulário de conta nunca teve.
   `.login-field` vestia `input` e `select` e parava aí — não por descuido, mas
   porque até aqui nenhuma tela do produto pedia um `textarea`. Sem esta regra
   ele saía com o desenho do navegador: monospace, 2px de recheio e a borda
   cinza do sistema, no meio de campos de 49px e raio 8.

   O raio é 8 e não 12, e é o mesmo caso da D-316: o canvas desenha 12, a folha
   diz 8, e numa coluna de campos a diferença lê-se como defeito. A altura vem
   do `rows` de cada tela — mensagem e resposta não têm o mesmo tamanho, e
   número fixo aqui obrigaria uma exceção lá. */
.login-field textarea {
  width: 100%; padding: 12px 13px; font-family: inherit; font-size: .92rem;
  line-height: 1.55; color: var(--text);
  border: 1px solid var(--line-strong); border-radius: var(--radius-md);
  background: var(--papel); resize: vertical;
}
.login-field textarea:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--foco) }

/* O anexo do chamado. A moldura é tracejada e não sólida: os vizinhos são
   campos que já têm valor, e a tracejada diz "ainda não há nada aqui" sem
   precisar de texto. */
.sp-opcional { font-weight: 400; color: var(--muted) }
/* ⚠ O SELETOR LEVA `.login-field` À FRENTE, e não é enfeite: sem ele esta regra
   é ANULADA e o campo do anexo fica descentrado.

   Medido em 04/09/2026, no computado da tela: `display` vinha `block` apesar de
   esta linha dizer `flex`. A causa é `.login-field label { display: block }` —
   0,2,0 contra os 0,1,0 de `.sp-anexo`. **A regra estava escrita certa e perdia
   a cascata**, e com ela o `align-items: center` ficava inerte: numa caixa de
   49px o conteúdo de 18px encostava ao topo, e o ícone e o texto ficavam a 5px
   um do outro na vertical.

   ⭐ E é a família das regras mortas: a declaração existe, alguém a lê e conclui
   que o comportamento está lá. Só o computado desmente. */
.login-field label.sp-anexo,
.sp-anexo {
  display: flex; align-items: center; flex-wrap: nowrap; gap: 10px;
  box-sizing: border-box; min-height: 49px; padding: 0 13px; cursor: pointer;
  border: 1px dashed var(--line-strong); border-radius: var(--radius-md);
  background: var(--papel);
}
.sp-anexo svg { width: 18px; height: 18px; flex: none; fill: none; stroke: var(--muted); stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round }
/* O nome do arquivo escolhido ocupa a linha e é cortado no fim: nome de câmera
   — `PHOTO-2023-03-24-21-09-51.jpg` — é mais comprido do que a moldura, e
   deixá-lo quebrar faria o campo crescer de altura ao escolher um arquivo. */
.sp-anexo > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: .9rem; color: var(--muted) }
.sp-anexo-escolhido { color: var(--text) }

/* O anexo já mandado, dentro do balão a que pertence. Não é botão: é uma linha
   de texto com um clipe, porque um botão ali competiria com os dois do rodapé
   do chamado, que são as ações da tela. */
.sp-anexo-baixar {
  display: inline-flex; align-items: center; gap: 8px; margin-top: 10px;
  padding: 7px 11px; border: 1px solid var(--line); border-radius: var(--radius-md);
  background: var(--surface-solid); color: inherit; text-decoration: none;
  font-size: .84rem; max-width: 100%;
}
.sp-anexo-baixar:hover { border-color: var(--accent); color: var(--accent) }
.sp-anexo-baixar svg { width: 15px; height: 15px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round }
.sp-anexo-baixar > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
.sp-anexo-baixar .mk-meta { margin: 0; flex: none; font-size: .78rem }

/* A página do botão de fechar que vem no e-mail. Ela é vista por quem pode não
   estar logado, então não há barra lateral para empurrá-la: o bloco se centra
   sozinho, como as telas de conta.

   ⭐ O teto veio para cá durante meia hora, em 04/09/2026, quando ele saiu da
   `.sp-coluna` — e voltou para lá quando o Alan desfez o pedido. Aqui não
   precisa de ficar duplicado: esta página VESTE a `.sp-coluna`, e herda. */
.sp-fechar { margin-inline: auto }

/* O rodapé com o link para os documentos legais. Discreto de propósito: ele
   existe para cumprir a promessa dos termos — "todos ficam publicados e
   acessíveis a qualquer momento" —, e não para disputar atenção com o produto.
   Mora aqui, e não no `styles.css`, porque as duas molduras que o usam são as
   duas que carregam esta folha. */
/* **Ele desce até o fim da MOLDURA, e não até o fim do conteúdo.** O
   `margin: 32px auto 12px` punha o rodapé logo abaixo do último bloco: numa tela
   curta — a de envio vazia é a mais curta do produto — ele parava no meio da
   página, com o resto em branco embaixo. Dois links soltos no meio da tela leem-
   se como conteúdo, e eles são rodapé.

   `margin-top: auto` e NÃO `position: fixed`. Medi as duas: o `main` já é
   `flex: 1 0 auto` dentro de um `body` que é coluna, então ele já termina no fim
   da janela quando a página é curta — basta o `main` ser coluna também para o
   `auto` empurrar o rodapé até lá. Fixo resolveria a tela curta e criaria dois
   defeitos: cobriria conteúdo no fim da rolagem das telas longas, e passaria a
   disputar o canto de baixo com a faixa do consentimento, que é `fixed` e cujo
   `z-index` já custou uma medição (a história está logo abaixo).

   `padding-top` e não `margin-top` para o respiro dos 32px: `margin-top: auto`
   come qualquer valor que se escreva nele, e sem o padding o rodapé encostava no
   conteúdo justamente nas telas longas, que são as que ele não precisava mudar.

   O `:has()` limita a mudança às molduras que TÊM este rodapé. O `.app-shell` é
   de duas molduras e de todas as telas do console; virar coluna onde não há
   rodapé seria mexer no layout de telas que ninguém me pediu para olhar. */
/* ⚠ `align-items: stretch` EXPLÍCITO, e é a correção da moldura inteira.

   `.app-shell` tem, lá em cima, `align-items: start` — escrito quando a moldura
   era GRID, onde ele governa o eixo VERTICAL e impede os itens de esticarem em
   altura. Aqui a moldura virou flex de COLUNA, e nesse contexto a MESMA
   propriedade passa a governar o eixo HORIZONTAL: os filhos encolhem à largura
   do próprio conteúdo. Medido a 1450px, o miolo dava 570 e o rodapé 235 numa
   moldura de 1450.

   ⭐ Não são três defeitos — é UM: uma propriedade correta para a moldura antiga,
   herdada pela nova, onde ela mede outro eixo. Consertar as larguras uma a uma
   seria tratar os sintomas de uma linha que continuaria errada.

   O rodapé perde as margens AUTO laterais pela mesma razão: com os filhos já a
   ocupar a largura toda, `margin: auto auto` centrava-o dentro de si mesmo e
   fazia-o parecer solto no meio. O `auto` de cima FICA — é ele que o empurra
   para o pé da moldura. E o `justify-content: flex-end` que havia aqui não fazia
   nada: o rodapé é `display: block`, e essa propriedade só existe em flex. */
main.app-shell:has(> .mk-rodape-legal) {
  /* ⚠ SÓ as telas que têm a zona de largar. `overflow: hidden` na moldura de
  todas as dezoito cortaria as listas longas — a de pedidos e a de documentos
  legais rolam de propósito, e o desenho delas ainda não foi medido. Quando as
  fichas existirem, isto sobe para a moldura. */
  /* ⚠ `min-height` e NÃO `height` com `overflow: hidden`, e a diferença é o que
  acontece na janela que NÃO chega.

  Com altura fixa e transbordo escondido, a tela cabe sempre — porque o que não
  cabe é CORTADO. Medido a 699px: o robô ia a zero, e com um piso os dois
  botões ficavam metade fora da moldura tracejada. ***A ação principal da tela
  desaparecia para a moldura poder dizer que cabia.***

  Com `min-height`, a tela ocupa a janela inteira sempre que a preenche — que
  é o que a prancha quer — e ROLA quando a janela é curta de mais para o
  desenho. Uma barra de rolagem é um defeito menor do que um botão escondido. */
  /* ⚠⚠ A MOLDURA TEM A ALTURA DA JANELA, e quem rola é o MIOLO — não a página.
  O topo e o rodapé ficam parados, e o conteúdo corre entre os dois.

  ⚠ Isto NÃO é o `overflow: hidden` que eu recusei, e a recusa continua certa:
  ali o conteúdo era CORTADO e o robô ia a zero. Aqui nada desaparece — muda
  apenas QUEM tem a barra de rolagem. Por isso vale para as dezoito telas: a
  lista de pedidos continua a rolar, só que dentro do miolo.

  O `min-height` que eu tinha posto SAI: era ele que fazia o documento crescer
  além da janela. */
  height: calc(100vh - 64px);
  padding: 0   /* 64 = a barra de topo, filete incluído */;
  display: flex;
  flex-direction: column;
  align-items: stretch;
}
/* ⚠ O `padding-top: 32px` que estava aqui fazia o trabalho do FILETE, e espaço
   não separa: só afasta. A prancha divide com uma linha de 1px e dá ao rodapé
   44px de altura com 28px de recuo lateral.

   ⚠⚠ E `flex-shrink: 0` não é detalhe: sem ele, numa janela baixa o rodapé
   seria a PRIMEIRA coisa espremida, em vez de a zona de largar ceder. Enquanto
   a moldura não cabia na janela isso nunca acontecia — os dois defeitos
   escondiam-se um ao outro, e corrigir a altura sem isto deixaria a peça pior
   do que estava. */
.mk-rodape-legal {
  display: flex; align-items: center; justify-content: flex-end; gap: 0;
  margin: auto 0 0; padding: 0 28px; height: 44px; flex-shrink: 0;
  border-top: 1px solid var(--linha); font-size: 12px
}

/* Sem borda e sem fundo, e é para continuar assim: o rodapé não é um bloco, é
   texto fraco no fim da página. Uma linha separadora aqui desenharia uma
   divisão onde não há duas coisas. */

/* E quando a faixa do consentimento está no ar, o rodapé sobe o que ela mede —
   os mesmos 138/258px já medidos no navegador para o aviso de salvo, logo
   abaixo. Sem isto, na tela curta o rodapé para exatamente atrás da faixa: ele
   não fica por cima dela (a faixa é `fixed` com `z-index`, o rodapé é fluxo),
   fica ESCONDIDO por ela — e o segundo link é justamente o controle de rever a
   medição. */
body:has(.mk-consentimento) .mk-rodape-legal { margin-bottom: 138px }
@media (max-width: 560px) {
  body:has(.mk-consentimento) .mk-rodape-legal { margin-bottom: 258px }
}
/* ⚠⚠ A COR SAIU DAQUI, e a razão é que ELA JÁ ESTAVA DECIDIDA VINTE LINHAS
   ACIMA — e a decisão de cima estava MORTA, tapada por esta.

   O selector é o mesmo, esta vinha depois, e a cascata dá a vitória à última.
   Resultado: `.mk-rodape-legal a { color: var(--texto-fraco) }` foi escrita,
   comentada e não pintava nada. Medido no produto: os elos do rodapé saíam
   `rgb(92, 108, 147)`, que é o `--tinta-500`.

   📌 Nenhum número acusava isto. A folha tem as duas regras, as duas com uma
   razão escrita por baixo, e as duas razões contradizem-se — quem lesse
   qualquer uma delas ficava convencido, porque cada uma defende bem o seu
   lado. É o defeito do INVENTARIO-DO-DESIGN §3 numa propriedade em vez de num
   token: trocar o valor de uma regra declarada duas vezes muda metade das
   telas e deixa a outra metade como estava.

   ⭐ E a que fica é a de cima, por medida e não por ser mais recente:

       12px, mínimo 4,5      claro    escuro
       --tinta-500 ........   4,89    11,27
       --texto-fraco ......   6,40    12,47   ⭐ passa melhor nos DOIS

   O `--tinta-500` passava por 0,39 no claro. O `--texto-fraco` é o que a
   prancha desenha, é o token com o papel certo, e é o que sobra aqui. */
/* ⚠⚠ E A COR VOLTOU AQUI PORQUE A FUSÃO A TINHA APAGADO DAS DUAS.

   Duas frentes acharam a regra duplicada no mesmo dia e consertaram-na em
   sentidos opostos: uma manteve a cor na regra de CIMA e esvaziou esta; a
   outra apagou a de cima e corrigiu ESTA. Cada uma sozinha estava certa —
   juntas, tiraram a cor do rodapé por completo, e os elos passaram a herdar
   o `color` do `body`.

   📌 Nenhuma das duas errou. O defeito nasceu de as duas acertarem em sítios
   diferentes, e não há teste que o apanhe: a suíte fica verde porque nada
   afirma qual é a cor do rodapé — só afirmava que ela não estava escrita
   duas vezes, e agora não está escrita nenhuma.

   ⭐ Fica UMA regra, com a cor e a decoração juntas, para não haver outra vez
   dois sítios a decidir a mesma coisa. `--texto-fraco` por medida: 6,40 no
   claro e 12,47 no escuro, contra 4,89 e 11,27 do `--tinta-500`. */
.mk-rodape-legal a { color: var(--texto-fraco); text-decoration: none }
.mk-rodape-legal a:hover { text-decoration: underline }
/* Os dois links do rodapé precisam de espaço entre si; sem isto eles encostam
   e leem-se como uma frase só. */
/* ⚠ À DIREITA e separados por ponto centralizado (prancha republicada):
   eles são o PÉ da aplicação, como o logotipo é a cabeça. Estavam centrados
   e o Alan viu-os "quase no meio da página". */
/* Os links à direita, e agora por `justify-content` de verdade: a peça passou
   a ser flex acima, pela altura fixa de 44px da prancha. Antes era um bloco, e
   um `justify-content` num bloco é ignorado em silêncio — foi assim que a
   decisão do Alan ficou escrita na folha sem nunca chegar à tela. */
.mk-rodape-legal a + a::before {
  content: '·'; margin: 0 8px; color: var(--tinta-400); text-decoration: none
}
.mk-rodape-legal a + a { margin-left: 0 }
/* ⚠ No celular eles saem do rodapé e entram no MENU — ver `_barra.html`. */
@media (max-width: 700px) { .mk-rodape-legal { display: none } }
/* E no menu só existem no celular, pela mesma razão invertida. */
.mk-conta > a.mk-conta-legal { display: none }
@media (max-width: 700px) { .mk-conta > a.mk-conta-legal { display: flex } }

/* O AVISO DA MEDIÇÃO DE USO.

   **Faixa embaixo, e não um retângulo escuro cobrindo a tela.** O que se pede
   aqui é opcional e recusar não limita nada — uma tela bloqueada diria o
   contrário do texto que ela mostra, e é a forma mais comum de fazer o "recusar"
   custar mais sem escrever uma palavra a respeito.

   **OS DOIS BOTÕES SÃO IDÊNTICOS de propósito**, e é aqui que a promessa
   publicada vira pixel: eles usam `.button.primary`, a mesma classe, então não
   há como um ficar azul e o outro cinza sem alguém trocar a classe no template
   — que é justamente o que o teste compara. Nada nesta regra os distingue, e
   isso é o requisito, não uma folga.

   No celular a caixa vira coluna e os botões esticam; continuam iguais entre
   si, que é a única coisa que esta regra não pode deixar quebrar. */
/* **A FAIXA FICA POR BAIXO DE TUDO O QUE JÁ ERA FIXO, e o número saiu de uma
   medida e não de um chute.** Ela nasceu com `z-index: 150` — acima do aviso de
   salvo (140) e do modal de confirmar (130) —, e o defeito apareceu medindo com
   os três no ar ao mesmo tempo: `elementFromPoint` no centro do aviso de salvo
   devolvia `mk-consentimento-texto`. Isto é, **a pergunta sobre cookies cobria
   a confirmação de que o trabalho da pessoa foi gravado.**

   Acontece na primeira sessão de quem entra e salva antes de responder, que não
   é caso raro — é a ordem normal de quem chega com pressa. Em 120 a faixa passa
   a ser a camada MENOS urgente das três, que é o que ela é. */
.mk-consentimento { position: fixed; left: 0; right: 0; bottom: 0; z-index: 120;
  padding: 14px; pointer-events: none }
/* E o `z-index` sozinho não bastaria: os dois moram no mesmo canto de baixo, e
   o aviso de salvo por cima da faixa é ilegível do mesmo jeito. Ele sobe o que
   a faixa mede — 124px a 994 de largura, 244px a 375, medidos no navegador —
   e só enquanto ela existe, que é uma vez por pessoa. */
body:has(.mk-consentimento) .mk-aviso { bottom: 138px }
.mk-consentimento-caixa { pointer-events: auto;
  max-width: 860px; margin: 0 auto; display: flex; align-items: center;
  gap: 18px; flex-wrap: wrap;
  background: var(--surface-solid); border: 1px solid var(--line);
  border-radius: 14px; padding: 16px 20px;
  box-shadow: none}
.mk-consentimento-texto { flex: 1 1 320px; margin: 0;
  font-size: .86rem; line-height: 1.5; color: var(--texto) }
/* ⚠ `--texto` e nunca um token fraco, e a regra é geral: NENHUMA tela em
   que alguém ACEITA alguma coisa leva tinta fraca. Este texto estava a
   8,12 de contraste por acidente (recuo de um token que não existe), e
   o candidato "natural" — `--texto-fraco`, 6,40 — teria sido uma
   regressão escrita como se fosse arrumação. "Fraco" é papel
   tipográfico legítimo; num texto de consentimento é defeito. */
/* ⚠⚠ Era `--accent`, que é `--ciano` — e `--ciano` está na lista dos que NÃO
   invertem, por ser marca. Sobre o papel CLARO media 2,72: o link para a
   Política de Cookies, no aviso que aparece em todas as telas.

   `--acento-escuro` é o token de LINK e inverte (#0077C2 claro, #009FF0
   escuro): 4,45 e 6,46. Não é a mesma cor a mudar de nome — é o link a passar
   a usar o token que existe para ele.

   ⚠ 4,45 ainda falha 4,5, por 0,05. NÃO o remendo aqui, e a razão é que já
   não é defeito deste link: é o valor claro do `--acento-escuro`, que serve
   TODOS os links do produto e o «Buy» do cabeçalho, que media exatamente o
   mesmo 4,45. Dois defeitos que eram um.

   📌 O número está calculado para quem decidir: `hsl(203 100% 37%)` = #0074BD
   dá 4,64 mantendo matiz e saturação — um degrau de luminosidade. Mudar um
   token de marca é decisão do dono, não conserto meu. */
/* ⚠ `white-space: nowrap` — o «Cookie Policy» é TÍTULO DE DOCUMENTO (o
   proposto pelo HANDOFF das traduções §4), não um rótulo de UI qualquer, e um
   título não deveria partir-se ao meio como uma frase comum parte. Medido em
   inglês a 1440px: com a redação antiga do aviso («We want to measure which
   screens people open…») o elo caía perto do fim da linha e quebrava em
   «Cookie» / «Policy», duas linhas de 6,5 letras — 23 telas na base de
   05/09/2026 (frente A0). A CAUSA não é uma coluna de largura fixa: este elo
   vive dentro de `.mk-consentimento-texto`, um parágrafo que flui (`flex: 1 1
   320px`), e o ponto de quebra depende do COMPRIMENTO da frase em cada idioma
   — que muda a cada revisão de texto. A redação atual já não quebra (medido:
   84px, uma linha), mas a próxima frase mais comprida pode voltar a acertar o
   elo bem na borda. `nowrap` fecha a FAMÍLIA do defeito, não o sintoma de
   hoje: o título ainda pode ir inteiro para a linha seguinte — só não parte
   mais ao meio. Pt-BR e es não têm este elo quebrado em nenhuma largura
   medida; a 390px (en) o título ainda cai por inteiro numa linha própria, o
   que é o comportamento aceitável ali. */
.mk-consentimento-texto a { color: var(--acento-escuro); white-space: nowrap }
.mk-consentimento-pe { flex: 0 0 auto; display: flex; gap: 10px }
.mk-consentimento-pe .button { margin-top: 0 }
@media (max-width: 560px) {
  .mk-consentimento-pe { width: 100%; }
  .mk-consentimento-pe .button { flex: 1 1 0 }
  body:has(.mk-consentimento) .mk-aviso { bottom: 258px }
}

/* ===== a tabela de preços (M8.5, frente T1) =====
 *
 * Prefixo `pr-` e não `cr-`: as caixas do extrato de créditos são `cr-caixa` e
 * têm outra forma — número grande e nada mais. Reaproveitar a classe faria
 * duas telas mudarem juntas por engano na primeira vez que uma delas mudasse.
 *
 * **As duas cores da MARCA entram só no destaque.** O azul-marinho #001A56 e o
 * ciano #009FF0 são da marca e não são tokens do produto — o `--navy` do
 * design system é #001b4d, que é PARECIDO e não é o mesmo. Escritos à mão aqui
 * porque é onde a marca aparece; o resto da tela sai de `--line`, `--muted` e
 * `--surface-solid`, e o botão é `.button.primary`/`.button.ghost` sem uma
 * linha de raio nossa, pela mesma razão da caixa de compra: raio escrito aqui
 * reintroduz a pílula que o `styles.css` já tirou na segunda regra de
 * `.button`. */
/* ⚠ O `margin-top` subiu de 6 para 20: esta linha vinha logo abaixo do
   parágrafo de abertura e agora vem depois do bloco da operação. A 6px ela
   colava-se à nota dele e lia-se como parte daquele bloco em vez de como o
   rótulo da grade. */
.pr-moeda { margin: 20px 0 18px }

/* `auto-fit` e não `repeat(4, 1fr)`: os pacotes vêm do banco, e a tela tem de
   ficar em pé com dois ou com cinco. Com três pacotes mais a caixa fixa dá as
   quatro colunas do desenho; com cinco ela quebra em duas fileiras em vez de
   espremer.

   ⚠ O 220px foi medido contra a FITA — «o menor em que "Melhor preço por
   crédito" cabe em duas linhas ao lado dela». A fita saiu, e o número perdeu a
   conta que o justificava. Fica porque agora responde por outra coisa: é a
   largura em que a sublista dos cinco formatos ainda não parte «PDF com as
   imagens» em três linhas. Medido de novo, e não herdado sem olhar. */
.pr-grade { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 16px; margin-bottom: 24px }
/* ⚠ SEM `overflow:hidden` E SEM FUNDO, e as duas ausências são medidas.
 *
 * O `overflow:hidden` era a PRISÃO DA FITA — o que fazia a diagonal acabar no
 * canto em vez de sair pela borda. A fita saiu (ordem do Alan, 04/09) e a
 * pílula que a substitui fica a cavalo na borda de cima, com `top:-9px`:
 * mantê-lo cortava metade dela. Não é limpeza, é o que faz a peça nova aparecer.
 *
 * O fundo era `--surface-solid`, que é `var(--papel)` — e o chão desta tela
 * TAMBÉM é `--papel`. Pintava-se papel sobre papel: uma declaração que não
 * mudava um pixel e que, no dia em que o cartão precisasse de tom próprio,
 * mentiria dizendo que já tinha um. O §3.2 diz isto por escrito: «cartão e
 * chão são o MESMO pardo; o que os separa é a linha, nunca o tom». */
.pr-caixa {
  position: relative; display: flex; flex-direction: column;
  padding: 20px; border: 1px solid var(--line); border-radius: 16px
}
/* A caixa em destaque não muda de tamanho, muda de contorno. Crescer empurraria
   as vizinhas e faria a fileira dançar quando o admin trocasse a fita de lugar. */
/* ⚠ `rgba(0,159,240,…)` É O `--ciano` ESCRITO EM DECIMAL — e era por isso que
   nenhuma varredura de hexadecimais o via. O `color-mix` guarda os dois alfas
   sem repetir as coordenadas: medido, dá `rgba(0, 159, 240, 0.55)` e
   `rgba(0, 159, 240, 0.3)` nos DOIS tons, que é o valor que já lá estava.
   O `--ciano` é um dos quatro que não invertem, e por isso a troca é só de
   nome. */
.pr-forte { border-color: color-mix(in srgb, var(--ciano) 55%, transparent);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--ciano) 30%, transparent) }

/* A PÍLULA A CAVALO NA BORDA — substitui a fita diagonal (Alan, 04/09).
 *
 * ⛔ O que saiu daqui era um comentário de dez linhas sobre `dx=36`, `dy=37` e
 * o comprimento da CORDA de uma diagonal a 45°. Ele estava certo e deixou de
 * ter objeto: descrevia a geometria de uma peça que não existe mais. D-1556 —
 * quem muda a regra muda o comentário na mesma volta.
 *
 * ⚠⚠ E A TINTA NÃO É BRANCA, que era o candidato óbvio e o que a landing usa.
 * Medi antes: **branco sobre `--ciano` dá 2,91** e o piso do texto pequeno é
 * 4,5 — reprova, e reprova nos dois modos, porque o `--ciano` não inverte.
 * O par que passa sai dos MESMOS dois tokens que a fita já usava, trocados de
 * lado: **`--marinho` sobre `--ciano` dá 5,55**. Nenhuma cor nova entrou —
 * mudou quem é fundo e quem é tinta, que é o uso certo da marca (D-1550).
 *
 * O `left:24px` não é gosto: é o `padding:20px` da caixa mais os mesmos 4px de
 * avanço que a landing dá ao dela (26 sobre um recheio de 22). */
.pr-pilula {
  position: absolute; top: -9px; left: 24px; padding: 3px 10px;
  border-radius: 999px; background: var(--ciano); color: var(--marinho);
  font-size: .66rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase
}

/* Altura reservada mesmo vazio: sem ela, a caixa sem selo sobe uma linha e os
   preços das quatro deixam de ficar na mesma altura — que é a única coisa que
   uma tabela de comparação precisa acertar.

   ⚠ O `padding-right: 76px` que estava na regra de baixo SAIU com a fita: ele
   existia só para o selo não passar por baixo dela. Sem fita, era um buraco de
   76px à direita de uma palavra curta. A pílula não disputa este canto — vive
   na borda de cima —, e é por isso que a troca do Alan resolve, de passagem, um
   conflito de espaço que ninguém lhe tinha pedido para resolver. */
/* ⚠⚠ OS PESOS DESCEM PARA A RAMPA DA PRANCHA — decisão do Alan, 04/09/2026:
   «os pesos de fonte — prefiro mais finas».

   Contadas as duas telas inteiras, o produto tinha inventado dois degraus
   acima do topo do desenho:

       PRANCHA ....  400 x84   500 x20   600 x5
       PRODUTO ....  400 x76   500 x8    600 x8   ⛔ 700 x9   ⛔ 750 x3

   ⭐ É UMA decisão e não quatro: quem a viu assim foi quem contou a
   DISTRIBUIÇÃO em vez de olhar peça a peça.

   ⚠️ E MEDI O CONTRASTE ANTES DE MEXER, porque peso mais fino é menos
   contraste APARENTE. A razão de contraste é entre COR e COR e não muda com o
   peso — mas o PISO muda: texto a partir de 18,66px com peso ≥700 conta como
   «grande» e tem piso 3,0; a 500 passa a normal, com piso 4,5. Conferido: as
   quatro medem 11, 10,56, 11,84 e 16,3px — todas abaixo dos 18,66 nos dois
   estados, portanto nenhuma atravessa a linha. O piso era 4,5 antes e é 4,5
   depois. */
.pr-selo { display: block; min-height: 15px; font-size: .69rem; font-weight: 500;
  letter-spacing: .04em; text-transform: uppercase; color: var(--muted) }
/* ⚠⚠ `--acento-escuro` E NÃO `--ciano`, e a razão é um erro DE MEDIDA que o
   comentário anterior escondia. Ele dizia: «passa nos dois modos (6,46 no
   escuro)». ⛔ **6,46 é o que se mede NO ESCURO. Mediu-se um modo e
   afirmaram-se dois.**

       antes   claro 2,72 ⛔   escuro 6,46 ✅
       depois  claro 5,75 ✅   escuro 6,46 ✅  ← IDÊNTICO

   ⭐ O escuro não muda um pixel: o `--acento-escuro` vale `#009FF0` lá, que é
   exactamente o literal que estava aqui. Só o claro sobe.

   📌 A intenção do comentário estava CERTA — trocar um literal por um token —
   e escolheu um token que NÃO INVERTE. O `styles.css` nomeia os quatro que não
   invertem: `--marinho`, `--ciano`, `--certo`, `--selo`. Um deles como TINTA
   sobre o papel claro é o defeito que a casa já corrigiu três vezes hoje.

   ⚠️ E este só apareceu porque semeei o selo: o campo vem do banco e estava
   VAZIO em toda a parte, então o elemento não tinha texto e varredura nenhuma
   o media. Uma cor sem texto não reprova. */
.pr-forte .pr-selo { color: var(--acento-escuro) }
.pr-nome { margin: 7px 0 0; font-size: 1.02rem; font-weight: 500 }
/* `min-height` com o texto encostado embaixo, e é o que mantém as quatro caixas
   na mesma pauta: "Fale conosco" é menor que "R$ 1.400,00", e sem altura fixa
   ele subia — arrastando junto o "Preço por volume" para 9px acima dos "por
   crédito" dos vizinhos. Numa tabela de comparação é a única coisa que precisa
   estar alinhada. */
/* ⚠️ O PREÇO ESTAVA INVISÍVEL NO ESCURO, e era um hex cru: `#001A56`.
   Medido na tela publicada, os quatro: **1,15:1** sobre o papel escuro. Numa
   tela cuja única razão de existir é dizer o preço, o preço desaparecia.

   ⚠️ **E inverter não bastava.** O `--primario` inverte — `--marinho` no claro,
   `#0C5680` no escuro — e mesmo assim dá **2,38**, abaixo do piso de 4,5: ele é
   cor de PREENCHIMENTO, feita para levar texto branco por cima, e não cor de
   texto sobre o papel. Medi os três antes de escolher:

     sobre o papel escuro #05102C
       #001A56  (o que lá estava) ....  1,15   reprova
       --primario escuro #0C5680 ....  2,38   reprova
       --texto ......................  17,59  passa

   No claro o `--texto` dá 15,85 contra os 15,33 do marinho: o número não piora.
   ⭐ É a mesma conclusão a que a tela de erro chegou quando criou o `--titulo`,
   e pela mesma medida — lá está escrito que o marinho dá 1,15 no escuro. */
/* ⭐⭐ A FACE DE LEITURA VOLTA AO PREÇO, e não é acabamento: é uma CATEGORIA
   TIPOGRÁFICA declarada. A D-1402 nomeia três papéis da casa, contados nas
   pranchas:

       96x  <h1> serifada, peso 400 ....  o TITULO DE TELA
       44x  <a>  13px/500 ..............  item de menu
     ⭐ 20x  <p>  serifada 26/32px .....  OS PRECOS

   📌 O preço está ao lado do título de tela, não ao lado do texto corrido. A
   decisão é de 02/09 e o produto nunca a aplicou — «a errata mudou a tabela do
   documento e não os geradores».

   ⚠️ E o peso desce de 700 para 400, que é o da face serifada. Medi o contraste
   depois, porque uma face mais leve pode perder o que a face pesada tinha:
   `--texto` sobre `--papel` dá 15,85 no claro e 17,59 no escuro — a razão não
   muda com o peso, e a 29,6px é texto grande, cujo piso é 3. Passa com folga
   nos dois modos, e a objeção do `#001A56` invisível continua respondida. */
.pr-preco { margin: 12px 0 0; min-height: 1.95rem; display: flex; align-items: flex-end;
  font-family: var(--leitura); font-size: 1.85rem; font-weight: 400; line-height: 1.05;
  color: var(--texto); font-variant-numeric: tabular-nums }
/* "Fale conosco" é frase e não número: no corpo de 1.85rem ele fica com cara de
   preço, e a caixa passa a parecer ter um.

   ⭐ ELE HERDA A FACE E O PESO do `.pr-preco`, e é o certo: a prancha desenha-o
   no MESMO papel tipográfico — serifada 400 —, tratando-o como preço mesmo
   quando o preço é uma frase.

   ⛔ MAS O TAMANHO NÃO SOBE PARA OS 32 DA PRANCHA, e a razão é a linha acima,
   que é anterior e continua verdadeira. A prancha discorda dela; a razão é
   medida e escrita, e fica. */
.pr-fale { font-size: 1.3rem }
.pr-unit { min-height: 17px; margin: 5px 0 0; font-size: .8rem; color: var(--muted) }

/* O QUE UM CRÉDITO PAGA — o bloco que responde a pergunta da OPERAÇÃO, não a
   do pacote.

   ⚠⚠ A LINHA MUDOU DE LADO, e a razão que a punha em cima deixou de ser
   verdade. Estava escrito aqui: «fica DEPOIS da tabela e separado por uma
   linha, para não se ler como uma quinta caixa de preço». Em 04/09 o Alan
   mandou o bloco para debaixo do título, e a linha de cima passou a desenhar
   um risco entre o «Preços» e ele — um sublinhado do título, que ninguém pediu.

   ⭐ A PROMESSA fica de pé; muda o lado que a cumpre. O que o bloco precisa de
   não ser confundido com é a grade, e a grade agora está POR BAIXO: a linha
   desce para o `border-bottom`. D-1556 — quem muda a regra muda o comentário
   na mesma volta, e aqui a regra mudou porque o comentário deixou de a
   descrever.

   ⚠️ Sem cor literal nenhuma aqui: cada uma sai de token com par nos dois
   modos. A tela ao lado acabou de custar um preço invisível no escuro por um
   `#001A56` escrito à mão. */
.cr-paga { margin: 22px 0 0; padding: 0 0 20px; border-bottom: 1px solid var(--linha) }
.cr-paga-titulo { margin: 0 0 12px; font-size: .74rem; font-weight: 500;
  letter-spacing: .12em; text-transform: uppercase; color: var(--texto-fraco) }
.cr-paga-lista { margin: 0; padding: 0; list-style: none; display: flex;
  flex-direction: column; gap: 8px; font-size: .92rem; color: var(--texto) }
.cr-paga-lista b { font-weight: 600 }
/* O selo diz que a linha é facultativa. É rótulo e não botão: sem fundo cheio,
   que o faria competir com o «mais vendido» da tabela acima. */
.cr-paga-selo { margin-left: 6px; padding: 1px 7px; border-radius: 999px;
  border: 1px solid var(--linha); font-size: .66rem; font-weight: 600;
  letter-spacing: .08em; color: var(--texto-fraco); vertical-align: 2px }
.cr-paga-promo { margin: 14px 0 0; font-size: .85rem; line-height: 1.5; color: var(--texto) }
.cr-paga-promo a { color: var(--acento-escuro) }
.cr-paga-nota { margin: 12px 0 0; padding-left: 11px; border-left: 2px solid var(--linha);
  font-size: .82rem; line-height: 1.5; color: var(--texto-fraco) }

/* `flex:1` na lista, e é o que alinha os botões das quatro caixas na mesma
   linha quando uma tem quatro itens e as outras cinco. */
.pr-itens { flex: 1 1 auto; list-style: none; margin: 17px 0 0; padding: 0;
  display: grid; gap: 9px; align-content: start }
.pr-itens li { display: flex; gap: 9px; font-size: .85rem; line-height: 1.35 }
/* ⚠ O EMBRULHO DO ITEM COMPOSTO CRESCE, e sem isto ele encolhia ao texto.
   Medido: a sublista dos cinco formatos media 166px onde o cartão lhe dava
   250 — a prancha desenha-a a 245. A causa não era a largura do CARTÃO (320
   na prancha contra 316 aqui, praticamente o mesmo): era este `<div>` ser um
   filho de flex sem `flex-grow`, portanto do tamanho da linha mais comprida.

   ⭐ O `min-width: 0` vai junto e não é enfeite: sem ele um filho de flex
   recusa-se a encolher abaixo do conteúdo, e a sublista deixaria de poder
   quebrar dentro do cartão estreito do celular. */
.pr-itens li > div { flex: 1 1 auto; min-width: 0 }
.pr-ok { flex: none; width: 16px; height: 16px; margin-top: 2px; fill: none;
  /* ⚠ `#009FF0` é o `--ciano`, letra por letra. Como ele não inverte, o valor
     computado é `rgb(0, 159, 240)` nos dois tons antes e depois — medido nas
     25 marcas de `/pricing/`. */
  stroke: var(--ciano); stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round }

/* Os cinco formatos, aninhados. Recuados e menores porque são o DETALHE de um
   item, e não seis itens: postos no mesmo peso, a exportação passava a ocupar
   metade do cartão e o «Compra única» ficava com o mesmo destaque que o «.txt».

   ⚠⚠ O PONTO LEVA `--tinta-500`, e este número já foi corrigido DUAS vezes.

   Primeiro era o `--tinta-300` da landing, e eu troquei-o por `--tinta-400`
   com esta razão: «o `-300` é `#2A3F6E` no escuro, a 1,4 do papel — um ponto
   que não se vê». ⛔ A razão estava certa e a MEDIDA estava pela metade: o
   `-300` mede 1,83 no claro TAMBÉM. Eu medi um modo e escolhi por ele.

   ⛔ E o `-400` que pus não resolvia: 3,23 no claro e 3,43 no escuro, contra
   um piso de 4,5. A sonda das três perguntas apanhou-o em 05/09.

   ⭐ A rampa inteira, medida, é o que decide:

       --tinta-300 ...  1,83  ·  1,82   ⛔ os dois
       --tinta-400 ...  3,23  ·  3,43   ⛔ os dois
       --tinta-500 ...  4,89  · 11,27   ✅ e é MAIS CLARO que o texto
       --texto-fraco .  6,40  · 12,47   ✅ mas iguala o texto da lista

   📌 O `-500` é o único que passa nos dois E fica mais leve que a linha a que
   pertence — que era a razão inteira de o ponto não ser `--texto-fraco`. */
.pr-sub { margin: 6px 0 0; padding: 0; list-style: none; display: grid; gap: 5px;
  font-size: .78rem; line-height: 1.3; color: var(--texto-fraco) }
.pr-sub li { display: flex; gap: 7px }
.pr-ponto { color: var(--tinta-500) }

/* ⚠⚠ O `.md-lead` traz `margin-top: -14px`, e esse número existe para o COLAR
   AO TÍTULO — é o que ele faz em todas as outras telas. Aqui ele já não vem
   depois de um título: vem depois da grade (Alan, 04/09), e os -14px puxavam-no
   para cima dos cartões.

   ⛔ E o `.md-lead` NÃO se toca: veste dezenas de telas, e mudá-lo lá para o
   arranjar aqui é a troca que parte vinte para consertar uma. O recuo anula-se
   SÓ onde o vizinho de cima é a grade — que é a única posição em que ele está
   errado. */
.pr-grade + .md-lead, .cr-vazio + .md-lead { margin-top: 26px }

.pr-acao { margin-top: 18px }
.pr-caixa > .button { margin-top: 18px }
.pr-acao .button, .pr-caixa > .button { width: 100% }


/* ── A MARCA, e a troca de arquivo no escuro (SISTEMA-DE-DESIGN.md §1.2) ──
   Os dois arquivos vão no HTML e a folha mostra um. `160px` é a medida da
   prancha (§4); a altura é automática porque o SVG traz a proporção. */
.logo-claro, .logo-escuro { width: 160px; height: auto; max-height: none }
.logo-escuro { display: none }
/* Os três estados do tema, pela mesma razão de cima: a escolha explícita não
   pode perder para a preferência do sistema. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .logo-claro { display: none }
  :root:not([data-theme="light"]) .logo-escuro { display: block }
}
:root[data-theme="dark"] .logo-claro { display: none }
:root[data-theme="dark"] .logo-escuro { display: block }


/* ══ OS 13 PAPÉIS DA §2.1, medidos na prancha ══
   No FIM da folha de propósito: estas regras dão o valor final de cada papel,
   e vindo por último ganham das que já existiam sem precisar de
   especificidade inventada nem de `!important` — que esta casa tem 9 e todos
   do console.

   Onde a prancha é silenciosa (▲ do documento), NÃO preenchi: a entrelinha
   de quase tudo computa `normal` porque os blocos da prancha têm uma ou duas
   linhas, e derivá-la para texto longo é decisão de desenho e não minha. */

/* ⚠ `space-between` e NÃO `flex-end`: com a trilha agora dentro do cabeçalho,
   o `flex-end` de `styles.css` empurrava os DOIS para a direita e o título
   deixava de começar na margem. A prancha põe o título à esquerda e a trilha
   à direita, alinhados pela base. */
/* O par título/subtítulo é uma coisa só, colada por 5px — prancha
   `Passo1Enviar`. O subtítulo é LEGENDA e não secção: 15px/400 em tinta fraca,
   e não os 1,35rem/680 que ele tinha enquanto vivia solto no corpo. */
.ph-titulos { display: flex; flex-direction: column; gap: 5px }
.ph-titulos .jn-titulo {
  font-size: 15px; font-weight: 400; letter-spacing: 0; color: var(--texto-fraco)
}

/* 1 · título de tela — a serifada, e é um dos DOIS lugares dela.
   ⚠ `--texto` e não `--marinho` (errata da §2.1, 02/09/2026): o marinho não
   inverte, e no escuro este título dava 1,15 sobre o papel. */
/* ⚠⚠ E O `.cr-topo` ENTRA AQUI, porque ele é um `.page-heading` que ninguém
   chamou assim.

   A tela de Créditos é a ÚNICA das seis que não usa `.page-heading`: monta o
   mesmo `flex` com `space-between` à mão, no `.cr-topo`. Copiou a disposição e
   ficou sem a tipografia — o título saía em Manrope 25px peso 700 e
   `--texto-fraco`, contra a serifada 30px peso 400 `--texto` de todas as
   outras. Medido contra a `Passo10Creditos`: quatro diferenças num elemento só.

   📌 Não é o `.cr-topo` que se apaga. Ele carrega uma decisão que o
   `.page-heading` não tem: em ≤700px o botão de comprar fica NA MESMA LINHA do
   título, e o `.page-heading` empilha. Apagar a classe trocava um defeito de
   tipografia por um defeito de disposição no celular — e o comentário que
   explica a exceção está vinte linhas abaixo, onde ninguém o leria a tempo.

   ⭐ Então o que se partilha é a REGRA do título, e não a classe. Uma causa,
   um lugar, e a exceção do celular continua onde foi escrita. */
.page-heading h1, .cr-topo h1 {
  font-family: var(--leitura); font-size: 30px; font-weight: 400;
  letter-spacing: -0.3px; color: var(--texto)
}
/* 2 · o texto transcrito — o OUTRO lugar da serifada: é a voz do documento
   lido, e é isto que a distinção protege */
.mk-texto {
  /* `pre-wrap` e não `pre`: a transcrição vem com as quebras do documento, e
  respeitá-las é o que faz o texto na tela parecer o texto no papel — mas ela
  ainda precisa caber na coluna. */
  /* Justificado e SEM hifenização. O hífen que o navegador inventa fica no meio
  de uma transcrição paleográfica, onde tudo o que está escrito é para ser
  lido como estava no papel — quem lê não tem como saber que aquele traço é
  nosso e não do escrivão. Os buracos entre as palavras são o preço, e são
  um defeito de aparência; o hífen seria um defeito de conteúdo. */
  /* ⚠️ A TRANSCRIÇÃO É O CONTEÚDO, e estava na cor do corpo por herança — a
  regra escrevia tamanho, entrelinha e justificação, tudo menos `color`.

  Ela é a coisa que a pessoa pagou para ler, e lia-se mais fraco que os
  rótulos à volta. Medido em 05/09/2026 contra a `Passo6Resultado`:

  produto   --texto-fraco #475A85   claro  6,40   escuro 11,22
  prancha   --tinta-800   #142C64   claro 12,48   escuro 13,62

  ⭐ Melhora nos DOIS modos, e o token tem par medido (#EAE6E2). É a mesma
  espécie do valor do campo e do `.mk-volta`: ninguém escreveu a cor errada —
  ninguém escreveu cor nenhuma. */
  font-size: 1.05rem;
  line-height: 1.85;
  white-space: pre-wrap;
  margin: 0;
  text-align: justify;
  hyphens: manual;
  color: var(--tinta-800);
  font-family: var(--leitura);
}
/* 3 · subtítulo de tela */
.md-lead {
  margin: -14px 0 22px;
  font-size: 15px;
  font-weight: 400;
  color: var(--texto-fraco);
}
/* 4 · título de bloco */
.mk-bloco-topo h3, .cr-extrato-topo h3 { font-size: 15px; font-weight: 500; color: var(--texto) }
/* 5 · corpo */
/* ⚠️ O TOKEN E DE PAPEL E NAO DA RAMPA, e a troca e so de VOCABULARIO:
   `--texto-fraco` e `--tinta-600` valem o mesmo (#475A85 no claro, #D5D2CD no
   escuro), entao nao se move um pixel.

   ⭐ O que muda e quem consegue LER esta linha. `--tinta-600` diz «o degrau 600
   da rampa»; o que se queria dizer e «o texto secundario». Quem mexer na rampa
   um dia mudava o corpo do produto inteiro sem saber que o estava a fazer.

   ⛔ E NAO E `--texto`: medido em 04/09/2026. Das 147 pecas com texto nas seis
   telas de conta, 17 herdam esta linha DE FACTO — e sao rotulos de campo (CPF,
   Pais, CEP, Logradouro...). A `Passo8Faturamento` pinta rotulo em
   `--texto-fraco` peso 500 e VALOR em `--texto` peso 400: pos-los em `--texto`
   dava-lhes a cor do valor, e ai sim divergiam da prancha.

   ⚠️ A conta que assusta e outra: 84 das 147 tem a mesma cor do corpo. Mas
   «mesma cor» nao e «herda» — 67 declaram-na elas proprias. A prova nao e
   comparar cores: e MUDAR A LINHA e contar quem se move. */
body { font-size: 13px; font-weight: 400; color: var(--texto-fraco) }
/* 6 · meta / legenda */
.mk-meta { font-size: 12.5px; font-weight: 400; color: var(--texto-fraco) }
/* 7 · rótulo de coluna — ⚠ mesma errata: era `--marinho`, e ninguém tinha
   olhado esta linha no escuro. Dava 1,15, como o título. */
.tabela-cab span { font-size: 12.5px; font-weight: 500; color: var(--texto) }
/* 8 · item de menu, apagado e aceso.

   ⚠ A tinta era `--marinho` e dava 1,09 no escuro — o rótulo do item
   selecionado era praticamente invisível. Errata da §2.1: `--texto`, que faz o
   mesmo trabalho e TEM par nos dois modos.

   ⭐ E O PESO SOBE DE 500 PARA 600, e não é estética: é o SEGUNDO SINAL do
   estado selecionado, depois de o Alan ter recusado o filete.

   Hover e seleção separam-se por MATIZ — bege contra azul — e a norma 1.4.11
   mede LUMINÂNCIA, que é cega ao matiz: os dois fundos ficam a 1,01 e 1,06 um
   do outro, e em escala de cinzentos fundem-se. O peso não é cor: satisfaz a
   1.4.1, não está sujeito a razão de contraste, e sobrevive a toda a
   deficiência cromática. Precedente na casa: `.mk-pop-menu button.on` e
   `.mk-gaveta-painel a.on` já usam 700. */
.module-tab { font-size: 13px; font-weight: 400; color: var(--tinta-600) }
.module-tab.active, .module-tab[aria-selected="true"] { font-size: 13px; font-weight: 500; color: var(--texto) }
/* ⚠ 600 → 500, da prancha. A COR fica em `--texto` e não vai a `--marinho`
   como ela pede: `--marinho` não inverte, e no escuro este rótulo assenta numa
   superfície escura — é o defeito da `RAMPA-ESCURA §4`, medido a 1,09. */
/* 9 · botão */
.button { font-size: 14px; font-weight: 500; line-height: 1.2 }
/* 10 · chip e trilha — e são DUAS medidas, não uma.
   ⚠ Estavam na mesma linha por os dois valerem 11px, e não por serem a mesma
   coisa. Medido na `Passo2OQueFazer` (01/09): o rótulo da trilha é 12,5px e
   não 11 — e os 11 faziam «Tipo (opcional)» sair com 72px onde a prancha
   desenha 87, e a linha com 14 de altura onde ela tem 18.
   ⛔ E a emenda tem de ser AQUI: há um `.jn-rot { font-size: 11px }` lá em
   cima, na linha 574, mas esta regra vem depois com a mesma especificidade e
   é ela que decide. Corrigir a de cima não mudaria um pixel. */
.chip {
  display:inline-block;
  padding:3px 11px;
  border-radius:999px;
  font-weight:600;
  border:1px solid;
  line-height:1.5;
  font-family:var(--ui);
  font-size: 11px;
}
.jn-rot {
  order: 2;
  font-weight: 400;
  padding: 0;
  color: var(--tinta-500);
  font-size: 12.5px;
}
/* 11 · numeração da trilha — branco sobre marinho, e o branco é a tinta
   certa aqui porque o marinho também não inverte */
.jn-col.agora .jn-bola {
  background: var(--primario);
  border-style: none;
  color: var(--sobre-primario);
  font-size: 10.5px;
  font-weight: 500;
}
/* 12 · nome de arquivo */
.mk-card-nome, .mk-res-nome { font-size: 12px; font-weight: 400; color: var(--texto) }
/* 13 · rótulo maiúsculo */
.mk-rotulo-maiusculo, .eyebrow, .section-kicker {
  font-size: 10.5px; font-weight: 500; letter-spacing: 0.14em; color: var(--tinta-400)
}


/* ══ A BARRA DO TOPO E O MENU DA CONTA (prancha `Passo19Conta`) ══
   Os valores são COPIADOS da prancha, não derivados. */

/* O saldo e o «Comprar» na barra — computador. */
.hd-saldo-largo { font-size: 13px; color: var(--texto-fraco) }
.hd-comprar { font-size: 13px; font-weight: 500; color: var(--acento-escuro); text-decoration: none }
.hd-comprar:hover { color: var(--texto) }
.hd-fio { width: 1px; height: 22px; background: var(--linha) }
/* ⚠ A variante de celular da barra: só `SALDO / 240`, empilhado. O
   «Comprar» não cabe aqui — ele vive dentro do menu, e é por isso que as
   duas variantes existem. */
.hd-saldo-estreito { display: none; flex-direction: column; align-items: flex-end; line-height: 1.2 }
.hd-saldo-estreito .hd-saldo-rotulo {
  font-size: 9px; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--tinta-500)
}
.hd-saldo-estreito b { font-size: 14px; font-weight: 500; color: var(--texto) }
.header-right-group {
  flex: none;
  display: flex;
  align-items: center;
  gap: 18px;
}

/* O painel: 248px, 8px abaixo da barra, alinhado à direita do avatar, e
   nunca a menos de 16px da borda. Zero sombra — o sistema não tem nenhuma, e
   um painel flutuante é a tentação óbvia para inventar a primeira. */
.mk-pop-menu.mk-conta {
  /* ⚠ Os 8px da prancha são medidos a partir da BARRA; este painel é
     ancorado no BOTÃO, que não termina onde a barra termina — e a diferença
     não é a mesma nas duas larguras. **Tentei esticar o container até a
     altura da barra para um `+8px` só servir aos dois: NÃO resolveu** (a
     barra tem folga própria, e o resultado foi 12 e 16). Os dois números
     abaixo são MEDIDOS na bancada, um por largura, e produzem 8px de folga
     visível nas duas — que é o que a prancha pede. */
  width: 274px; min-width: 0; right: 0; top: calc(100% + 4px);
  /* Nunca a menos de 16px da borda: a barra tem 10px de folga no celular, e
     `right: 0` deixaria o painel a 10. Medido: 10 → 16. */
  margin-right: -6px;
  max-width: calc(100vw - 32px);
  display: none; flex-direction: column; gap: 2px; padding: 10px 8px;
  background: var(--papel); border: 1px solid var(--linha); border-radius: 14px;
  box-shadow: none
}
.mk-pop.aberto .mk-pop-menu.mk-conta { display: flex }
.mk-conta > a,
.mk-conta form > button {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  width: 100%; padding: 9px 12px; border: 0; border-radius: var(--radius-md); background: transparent;
  font-family: inherit; font-size: 13px; font-weight: 400; color: var(--tinta-600);
  text-decoration: none; text-align: left; cursor: pointer
}
/* ⚠ `--light-blue` e não pardo: a superfície de SELEÇÃO desta casa é azul, e
   tem token, e tem dois sítios a usá-la — `.module-tab.active` na lateral e
   `.mk-pop-menu button:hover` no popover genérico. Era este menu que estava a
   sobrepor o certo com `--tinta-50`, e o resultado é que o mesmo gesto acendia
   azul na coluna e pardo no painel, a dois centímetros um do outro. */
/* ⚠ A SOBREPOSIÇÃO DO MENU DE CONTA SAIU. `.mk-conta` não é irmão do popover
   genérico: é um `.mk-pop-menu` com uma classe a mais, e os quatro usos são
   todos menus de escolhas. A divergência era uma sobreposição, e não uma
   decisão. Uma declaração serve os quatro — em `produto.css:102`. */
/* ⚠ O ESTADO e a AÇÃO deixam de partilhar o acento, e a regra é do sistema:
   o painel tinha UM acento a dizer duas coisas — «aqui é a ação» e «aqui é
   onde você está». Com sete linhas funcionava; com dez, não.

   **Um estado marcado por superfície SOZINHA precisa de `--tinta-200`; um
   marcado por superfície E acento pode usar `--tinta-50`.** O degrau escolhe-se
   pelo trabalho que a superfície faz, e não pelo componente onde está.

   ⚠ Por isso a barra lateral NÃO acompanha: lá não há ação nenhuma a disputar
   o acento, e a superfície fraca basta. Uniformizar por coerência quebraria a
   regra. */
/* O fundo do selecionado vem da regra dos três estados, mais abaixo. Aqui fica
   só o que é desta peça — e o peso NÃO muda, pela razão escrita lá. */
.mk-conta form > button.on { font-weight: 400; color: var(--tinta-600) }
.mk-conta form { margin: 0 }
.mk-conta form > button > span { display: inline-flex; align-items: center; gap: 8px }
.mk-conta .fl { width: 18px; height: 13px; border-radius: 2px; object-fit: cover }
.mk-conta-tique { width: 16px; height: 16px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round }
.mk-conta hr { height: 1px; margin: 6px 0; border: 0; background: var(--linha) }
/* O rótulo da secção: versalete, e é o papel 13 da §2.1. */
.mk-conta-secao {
  margin: 0; padding: 4px 12px 6px;
  font-size: 10.5px; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--tinta-400)
}
.mk-conta-quem { padding: 6px 12px 8px }
.mk-conta-quem b { display: block; font-size: 13px; font-weight: 500; color: var(--texto) }
.mk-conta-quem span { display: block; font-size: 11.5px; color: var(--texto-fraco) }
/* ⚠ No computador o «Comprar» do menu NÃO existe: ele está na barra.
   O seletor leva o `.mk-conta >` de propósito: `.mk-conta-comprar` sozinho
   (0,1,0) PERDE para `.mk-conta > a` (0,1,1), e o item aparecia no
   computador — medido na bancada, não deduzido. É especificidade e não
   ordem, e por isso escrever a regra depois não bastava. */
/* A AÇÃO fica com o acento — é o outro lado da regra acima.

   ⚠⚠ E A TINTA É `--texto`, não `--marinho`: esta era a QUARTA linha da família
   da §2.1, e a ficha listava três. Medida no escuro dava 1,15 sobre a
   superfície do menu — o Alan leu-a como ilegível, e era.

   📌 A REGRA QUE FALTAVA, e que custou cinco aplicações tarde: as cores que não
   invertem são seguras como TINTA no claro e como SUPERFÍCIE nos dois modos.
   Como tinta no escuro, nunca. */
.mk-conta > a.mk-conta-comprar { font-weight: 500; color: var(--texto) }
.mk-conta > a.mk-conta-comprar,
.mk-conta > hr.mk-conta-fio-comprar { display: none }

@media (max-width: 700px) {
  .hd-saldo-largo, .hd-comprar, .hd-fio { display: none }
  .hd-saldo-estreito { display: flex }
  .header-right-group { gap: 12px }
  .mk-pop-menu.mk-conta { margin-right: 6px; top: 100% }
  .mk-conta > a.mk-conta-comprar { display: flex }
  .mk-conta > hr.mk-conta-fio-comprar { display: block }
}


/* ══ A BARRA LATERAL EXPANDIDA (prancha; SISTEMA-DE-DESIGN.md §3.3 e §4) ══
   ⚠ Estes seletores carregam `.module-sidebar.is-expanded` de propósito: a
   regra que estava lá tem essa especificidade (0,2,1) e VENCIA o papel 8 da
   §2.1 que eu tinha escrito como `.module-tab` (0,1,0). Medido: a aba saía a
   12,8px/650 enquanto a folha "dizia" 13px/400. É a terceira vez esta noite
   que a especificidade decide sobre a ordem, e a lição é a mesma — a regra
   escrita depois não ganha por ser depois. */
/* `.is-expanded` no seletor porque a folha base declara 236px com essa mesma
   especificidade (styles.css:1030) — e o sistema (§4) diz 216 FIXO. */
.module-sidebar.is-expanded { width: 216px; padding: 14px }
.module-tabs { order: 1 }

/* ⚠ RECOLHIDA, só o ícone. O rótulo é um nó de texto dentro do `<a>`, e a
   coluna de 64px cortava-o a meio da palavra — «Transcrib», «Document t».
   Com a barra a nascer recolhida, isso é o que se vê primeiro. `font-size: 0`
   apaga o texto e deixa o ícone, que tem medida própria.

   ⚠ ISTO É ESCONDER POR ENCOLHIMENTO, e foi assim que o fio da quinta bola
   ficou pendurado. MEDI antes de o manter: o item recolhido dá 43px, o recuo
   são 10+10, e o glifo de 21 ocupa o resto — o rótulo com fonte zero NÃO
   empurra nada e o `justify-content: center` continua a centrar o ícone.

   ⭐ E aqui o encolhimento faz o que se quer também para quem não vê: o texto
   permanece no fluxo e é ANUNCIADO pelo leitor de ecrã, que é o correto numa
   navegação só de ícones. `display: none` calá-lo-ia. A diferença para a
   quinta bola é essa: ali a peça tinha de sair inteira; aqui ela tem de sumir
   do olho e ficar para o ouvido.

   (Esta regra já tinha sido escrita e eu apaguei-a sem dar por isso ao
   reescrever o bloco do botão logo abaixo. A conferência que fiz olhava UMA
   regra do bloco, e não o que havia à volta dela.) */
.module-sidebar:not(.is-expanded) .module-tab { font-size: 0; justify-content: center }

/* ── O HOVER DA LATERAL: UMA REGRA PARA AS DUAS PEÇAS ──────────────────────
   O botão e os itens tinham valores diferentes, e o Alan viu-os como duas
   coisas na mesma coluna. Partilham a declaração: o que mudar, muda nos dois.

   ⚠⚠ AQUI ESTEVE ESCRITO QUE NÃO HAVIA TOKEN PARA ISTO, E ERA FALSO. Eu li a
   §9 do `SISTEMA-DE-DESIGN.md` — «a prancha não desenha foco, hover nem
   `:active`» — e concluí que a superfície não tinha nome. A §9 fala de FOCO e
   de `:active`; a superfície de SELEÇÃO tem token, chama-se `--acento-lavado`
   (apelidada `--light-blue`), e já estava em uso a dois seletores daqui, em
   `.module-tab.active` e em `.mk-pop-menu button:hover`.

   ⭐ O que salvou isto foi ter reduzido dois literais a um em vez de escolher
   uma cor: quando a resposta chegou, a troca foi uma linha. Declarar um buraco
   é barato; enchê-lo por palpite não é. Mas declarar um buraco onde há token é
   uma medida correta sobre a coisa errada — e desta vez a coisa errada foi a
   secção do documento em que fui procurar. */
/* ⚠⚠ LACUNA DECLARADA: o bege do hover NO ESCURO não entrou nesta leva. É uma
   cor quente numa família que o Alan já rejeitou uma vez, e ele tem de a ver
   antes. Até lá, no escuro o hover fica no `--tinta-50` escuro, que é azul —
   ou seja, no escuro hover e seleção voltam a competir na mesma rampa, com
   1,11 contra 1,25 sobre o chão. Está errado e está sabido. */
.module-tab:hover, .module-sidebar-toggle:hover { color: var(--texto) }

/* ── OS TRÊS ESTADOS, E A ORDEM ENTRE ELES (§1.10) ─────────────────────────
       inativo  <  hover  <  selecionado

   ⚠⚠ ESTA ORDEM ESTÁ ESCRITA PORQUE NINGUÉM A TINHA ESCRITO. O pardo fazia a
   distinção por acidente; quando eu tirei o pardo do menu, hover e seleção
   caíram os dois no mesmo azul e o Alan leu-o como avaria — com razão.
   *Uma distinção que ninguém escreveu é uma distinção que a próxima correção
   apaga*, e foi isso que aconteceu, há uma hora, comigo.

   ⚠ O token novo é o DE BAIXO: o `--acento-lavado` de hoje passa a ser o
   HOVER, e a SELEÇÃO afasta-se do chão. Meter um azul entre o papel e o lavado
   foi tentado e medido: dois degraus de 1,07, que não é correção — é o mesmo
   defeito com mais um nome.

   Tinta e peso NÃO mudam entre os três estados, e é deliberado: mexer na tinta
   faria o item saltar de posição.

   ⚠⚠⚠ LACUNA DECLARADA, E NÃO É ESQUECIMENTO.
   Nenhum destes fundos chega a 3:1 — nem o novo. Medido: seleção contra chão
   dá 1,40 no claro e 1,56 no escuro. **O degrau maior melhora a leitura e NÃO
   satisfaz a 1.4.11**: falta um segundo sinal a carregar o estado.

   A §1.10 propunha um filete em `--acento-escuro` (3,19 e 4,93), e o Alan
   RECUSOU-O em 02/09/2026: «não quero filete no item selecionado». O
   substituto está pedido à frente de desenho e ainda não chegou.

   ⚠ Até chegar, a seleção é carregada por uma superfície sozinha — que é
   exatamente o defeito que esta leva veio corrigir, com um número melhor.
   Quem passar por aqui: NÃO invente o portador, nem por peso, nem por tinta,
   nem por ícone. A resposta é da frente de desenho. */
/* ⚠⚠ A LATERAL SEPARA-SE DO MENU DA CONTA, e a razão é a fonte de cada um.
   A `Passo2OQueFazer` desenha o item ativo da lateral com fundo `--tinta-50`
   e peso 500 — medi-o com a barra EXPANDIDA, que é o estado que ela desenha e
   que eu não tinha produzido até agora. O menu da conta não está em prancha
   nenhuma, e por isso fica onde estava: mudar-lhe a superfície por arrasto
   seria aplicar-lhe uma decisão que ninguém tomou sobre ele.

   ⚠ Isto NÃO responde à pergunta aberta logo acima — o portador da seleção,
   que o Alan devolveu à frente de desenho ao recusar o filete. Aqui só muda a
   superfície que a prancha nomeia; o portador continua a ser um só, e continua
   a ser pergunta. */
.module-tab.active, .module-tab[aria-selected="true"] {
  background: var(--tinta-50)
}
.module-sidebar.is-presa .module-sidebar-toggle,
.mk-conta form > button.on,
.mk-conta > a.on {
  background: var(--acento-lavado)
}
.module-sidebar-toggle {
  order: 2; margin: auto auto 0; width: 44px; height: 44px;
  padding: 0; border: 0; border-radius: var(--radius-md); color: var(--tinta-600)
}

/* ⚠ PRESO ACENDE, e a prancha `Passo21Lateral` desenha-o: nos estados 3 e 4 o
   botão é `color: var(--marinho); background: var(--tinta-50)` — exatamente o
   par do item selecionado. Nos estados 1, 2 e 5 é `--tinta-600` e sem fundo.

   Isto NÃO é o buraco da §9. Foco, hover e `:active` são estados transitórios
   do apontador, e desses a prancha não fala. «Preso» é uma DECISÃO da pessoa
   que persiste entre sessões — e a prancha desenha-a.

   Sem este sinal, o estado 4 é indistinguível do 1 a olho: a mesma coluna de
   64px, e num deles o rato funciona e no outro não. Era essa a avaria que o
   Alan sentiu, e não a mecânica. */
.module-sidebar.is-presa .module-sidebar-toggle { color: var(--texto) }
/* ⚠⚠ DIVERGÊNCIA DELIBERADA DA PRANCHA, e está escrita para quem a comparar
   depois: a `Passo21Lateral` desenha este aceso com `--tinta-50`, e aqui ele é
   `--light-blue`. NÃO é desvio meu — é decisão do Alan, tomada em 02/09/2026,
   depois de ver o botão aceso na tela.

   A razão: era o ÚNICO aceso pardo numa coluna onde todo o resto acende azul, e
   um aceso que destoa lê-se como avaria e não como estado. A nota que eu tinha
   escrito ao lado já dizia querer «exatamente o par do item selecionado» — a
   intenção estava certa e o par é que estava trocado.
   ⚠⚠ E A SEGUNDA MUDANÇA DE PRANCHA DO MESMO DIA: o estado 4 («presa fechada»)
   MORREU. Recolher já não prende — o botão prende ao ABRIR, e a fechar só
   fecha. Decisão do Alan, 02/09/2026.

   ⭐ Repare no que isso arruma nesta regra: o aceso deixou de ser a única
   maneira de distinguir duas colunas de 64px iguais, porque já não há duas.
   Ele passou de remendo a informação — e só aparece com a barra aberta, que é
   onde é legível. */
/* ⚠ 160ms para a largura — o tempo da prancha. Eram 200. E o glifo gira no
   mesmo tempo: `>` fechada, `<` aberta, porque ele diz o que o botão FAZ e não
   em que estado a barra está. */
.module-sidebar {
  top: 64px;
  /* E a lateral termina onde o rodapé começa, em vez de correr até ao fim da
  janela: são 44px, a altura do rodapé. */
  /* ⚠ NOTA DE UM VÃO QUE SÓ APARECE COM A FAIXA NO AR, e que não se conserta
  aqui — está escrito porque um defeito que ninguém reproduz depois é um
  defeito que se descobre duas vezes.

  Os 44px são a altura do rodapé, e com a faixa de consentimento fora do ar a
  lateral acaba exatamente onde ele começa (medido: 655 e 655). Mas a faixa,
  quando está no ar, EMPURRA O RODAPÉ PARA CIMA o que ela mede — regra
  anterior, tomada porque a faixa o cobria — e a lateral não a acompanha: fica
  um vão entre o fim de uma e o topo do outro.

  Passageiro, e o desenho é olhado sem a faixa. Se um dia contar, o número tem
  de sair de onde sai o do rodapé, e não ser escrito aqui outra vez. */
  bottom: 44px;
  /* ── O BOTÃO DA LATERAL, prancha `Passo21Lateral` ──────────────────────────
  No PÉ da coluna, encostado ao rodapé.

  ⚠ SEM FILETE, e ele estava CERTO quando o desenharam: nos 64px a barra é uma
  coluna de ícones sem rótulo, e um `>` sozinho leria-se como sexto item — o
  filete dizia «isto não é da lista» sem inventar sinal novo.

  ⚠⚠ Essa razão caducou quando o rodapé passou a atravessar por baixo. O
  rodapé já separa, o botão está encostado a ele, e duas linhas de 1px
  encostadas dizem a mesma coisa duas vezes. A distinção que o filete comprava
  passou a vir de graça. É a mesma forma do `align-items` desta manhã: uma
  declaração correta sobre a moldura antiga, herdada pela nova, onde já não
  faz o mesmo trabalho.

  ⚠ O ALVO CONTINUA 44×44 e isso não se toca: num tablet não há rato, e o
  botão é a ÚNICA via de abrir a barra. Encolheu a folga, não o alvo — o que o
  Alan viu como «toda essa altura» eram os 12px de recuo acima do filete mais
  os 20px que o separavam de uma borda que já não é a vizinha. */
  display: flex;
  flex-direction: column;
  transition: width .16s ease;
}
.module-sidebar-toggle-glyph { transition: transform .16s ease }

/* ⚠ Só a barra PRESA E ABERTA empurra o miolo. Expandida pelo rato ela passa
   POR CIMA: o gesto transitório não reorganiza a tela, a decisão reorganiza.
   Sem isto, a página inteira salta cada vez que o rato atravessa a barra. */
@media (min-width: 1080px) {
  .app-shell { transition: padding-left .16s ease }
}
.module-sidebar.is-expanded .module-tab {
  min-height: 40px; padding: 10px 12px; border-radius: var(--radius-md);
  font-size: 13px; font-weight: 400; color: var(--tinta-600)
}
/* ⚠ A MESMA ERRATA, E ESTE SELETOR É QUE DECIDE. O comentário deste bloco já
   avisa que ele carrega `.is-expanded` de propósito para vencer o papel 8 da
   §2.1 — e por isso a correção da §2.1 sozinha não chegava aqui. Medi: a §2.1
   dizia peso 600 e `--texto`, e a tela continuava a dar 500 e `--marinho`.
   É a quarta vez que a especificidade decide sobre a ordem, e a lição é a
   mesma de todas: a regra escrita depois não ganha por ser depois. */
.module-sidebar.is-expanded .module-tab.active,
.module-sidebar.is-expanded .module-tab[aria-selected="true"] {
  /* ⚠⚠ 600 → 500, e é a QUINTA vez que a especificidade decide sobre a ordem.
     Escrevi 500 em `.module-tab.active` e a tela continuou a dar 600, porque
     esta regra tem uma classe a mais e ganha esteja onde estiver.

     📌 E eu conhecia a lição — está escrita três linhas acima, por mim, hoje.
     Conhecê-la não impediu de a repetir: o que impede é MEDIR DEPOIS, e foi o
     comparador a devolver «peso 500 → 600» que me trouxe cá. */
  font-weight: 500; color: var(--texto)
}


/* ── A ISENÇÃO DA EXTRAÇÃO (prancha `Passo20Isencao`) ──────────────────────
   O riscado vai no RÓTULO do preço, nunca na coluna: a coluna conta
   documentos, e riscar um número que continua verdadeiro fá-lo-ia parecer
   anulado. */
.risco { text-decoration: line-through; color: var(--texto-fraco) }
/* ⚠ `--tinta-400` → `--texto-fraco`. A prancha risca o preço na MESMA tinta
   do preço que fica; era o traço a dizer «este não vale», e não uma segunda
   cor mais apagada a dizê-lo outra vez. */

tr.isen td, tr.isen td small { color: var(--verde-desconto) }
tr.isen td:last-child { font-weight: 500 }

.jn-precos { display: flex; flex-direction: column; align-items: flex-end; gap: 3px }
.jn-gratis { font-size: 12px; font-weight: 500; color: var(--verde-desconto) }

.jn-promo { margin: 10px 0 0; font-size: 12px; color: var(--texto-fraco) }
/* ⚠⚠ O CLARO NÃO MUDA E O ESCURO MUDA, e é o escuro que era o defeito.
   `#00679C` é o valor CLARO do `--acento-escuro` — o mesmo literal, letra por
   letra. Mas ele é metade de um par: sobre o papel escuro mede 3,06, abaixo do
   piso de 4,5, e o token resolve-se lá para `#009FF0`, a 6,46.
   ⭐ É a mesma correção que a `.pr-selo` levou duas telas acima, pela mesma
   razão e com os mesmos números. */
.jn-promo a { color: var(--acento-escuro) }


/* ── A GOTEIRA DO MENU DA CONTA (prancha `Passo19Conta`) ───────────────────
   ⚠ 18px reservados em TODAS as linhas, e não só nas que têm bandeira. Se só
   as línguas recuassem, o menu teria DOIS começos de texto na vertical — e o
   olho lê isso como duas listas encostadas, não como um menu.

   16px e não 20: o tamanho sai da peça, e não da barra lateral. */
.mk-conta-glifo { width: 16px; height: 16px; flex: 0 0 18px; margin-right: 2px }

/* ⚠ `flex-start` nos itens que TÊM glifo. O painel usa `space-between`, que
   serve às linhas de língua — bandeira e nome à esquerda, tique à direita —,
   mas nos quatro itens de conta ele empurrava o texto para a borda oposta à
   goteira. O resultado era o defeito que a goteira existe para evitar, agravado:
   não dois começos de texto, mas um começo e um fim. */
.mk-conta a:has(.mk-conta-glifo),
.mk-conta button:has(.mk-conta-glifo) { justify-content: flex-start }

/* ⚠ O SÍMBOLO não é quadrado: 839×606, ou seja 22×15,9. Herdando a caixa de
   20×20 dos glifos Lucide ele saía a 18 quadrado, e a marca deformava-se para
   caber num molde que não é o dela. */
.module-tab-simbolo { width: 22px; height: 15.9px; flex: 0 0 22px }
/* Um ficheiro por modo, como o logótipo e o ícone da barra inferior. */
.sb-escuro { display: none }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .sb-claro { display: none }
  :root:not([data-theme="light"]) .sb-escuro { display: block }
}
:root[data-theme="dark"] .sb-claro { display: none }
:root[data-theme="dark"] .sb-escuro { display: block }


/* ══ O CELULAR (pranchas `CelularTranscreverPardo` e a escura irmã) ═════════
   ⚠⚠ O CORTE AINDA NÃO FOI DESENHADO. Prancha nenhuma declara um breakpoint,
   e eu não invento um: uso os 800px que o produto JÁ usa em todos os outros
   blocos — a gaveta, a lateral estática, a trilha. Reutilizar o número que
   existe é reversível; cunhar um novo seria uma decisão de desenho tomada por
   quem não a pode tomar. Quando o valor vier, muda AQUI e nos outros blocos.

   ⚠ E a prancha é de 390px (iPhone). O Alan olha num Pixel 7, 412. Nada aqui
   depende de largura fixa, mas os dois números não são o mesmo teste. */
.mk-baixo { display: none }

@media (max-width: 1079px) {
  /* ── A BARRA INFERIOR ────────────────────────────────────────────────── */
  .mk-baixo {
    position: fixed; inset: auto 0 0 0; z-index: 60;
    display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));
    align-items: end; padding: 10px 6px 22px;
    border-top: 1px solid var(--linha); background: var(--papel)
  }
  .mk-baixo-casa {
    display: flex; flex-direction: column; align-items: center;
    justify-content: flex-end; gap: 5px; height: 56px;
    color: var(--tinta-500); text-decoration: none
  }
  .mk-baixo-casa svg { width: 21px; height: 21px; flex: none }
  .mk-baixo-casa span { font-size: 10px; font-weight: 400; line-height: 1.1 }
  /* ⚠⚠ A CASA ACESA ERA `--marinho` NOS DOIS MODOS — e o marinho não inverte.
     Sobre a barra escura ele mede 1,15: azul escuro sobre chão azul escuro, e
     o item onde a pessoa ESTÁ é justamente o que desaparecia (item 12 do Alan,
     03/09/2026).

     📌 O conserto já estava escrito vinte linhas abaixo, para o rótulo da casa
     central, com esta mesma razão — e as outras quatro ficaram de fora. Quem
     consertou olhou a peça que o Alan apontou nesse dia e não a família dela.

     ⛔ E a armadilha, que a frente de desenho mediu: o `--primario` INVERTE, e
     por isso parece o candidato — mas como TINTA dá 2,38. «Inverter» e «servir
     de tinta sobre o papel» são propriedades diferentes.

         --marinho sobre o chão escuro ......   1,15  ⛔
         --primario como tinta .............   2,38  ⛔
         --texto ...........................  17,59 / 14,12  ✅ */
  .mk-baixo-casa.on { color: var(--marinho) }
  @media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .mk-baixo-casa.on { color: var(--texto) }
  }
  :root[data-theme="dark"] .mk-baixo-casa.on { color: var(--texto) }

  /* ⭐ A ELEVADA. O anel de 5px em `--papel` é o que a solta da barra: sem ele
     o quadrado encosta na borda de cima e lê-se como botão colado. */
  .mk-baixo-meio .mk-baixo-selo {
    display: inline-flex; width: 58px; height: 58px; border-radius: 18px;
    background: var(--primario); box-shadow: 0 0 0 5px var(--papel);
    margin-bottom: -3px
  }
  .mk-baixo-meio img { width: 58px; height: 58px; border-radius: 18px }
  /* Um ficheiro por modo, como o logótipo. */
  .mk-baixo-meio .ic-escuro { display: none }
  @media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .mk-baixo-meio .ic-claro { display: none }
    :root:not([data-theme="light"]) .mk-baixo-meio .ic-escuro { display: block }
  }
  :root[data-theme="dark"] .mk-baixo-meio .ic-claro { display: none }
  :root[data-theme="dark"] .mk-baixo-meio .ic-escuro { display: block }
  /* ⚠ O RÓTULO DA CENTRAL MUDA DE TINTA ENTRE OS MODOS, e as duas pranchas
     dizem-no: `--marinho` no claro, `--texto` no escuro. Não é o mesmo valor a
     inverter — o marinho não inverte, e medido dava 1,15 sobre a barra escura
     contra os 11,27 dos rótulos vizinhos. Aqui a tinta é `--primario` no claro
     e passa a `--texto` no escuro, porque é a ÚNICA das cinco que acompanha a
     superfície da casa e não o chão da barra. */
  .mk-baixo-meio span { font-weight: 500; color: var(--marinho) }
  @media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .mk-baixo-meio span { color: var(--texto) }
  }
  :root[data-theme="dark"] .mk-baixo-meio span { color: var(--texto) }

  /* ⚠⚠ O SANDUÍCHE MORRE AQUI, no mesmo sítio em que a barra nasce. Ele era a
     única navegação do celular; separar as duas coisas em dois commits deixaria
     o produto sem navegação nenhuma pelo meio. */
  .mk-burger { display: none !important }
  .module-sidebar, .module-sidebar-toggle { display: none }

  /* A moldura deixa de recuar para uma lateral que já não está, e passa a
     reservar em baixo o que a barra ocupa. */
  main.app-shell:has(> .mk-rodape-legal) .app-content { padding: 16px 16px 12px }
  /* ⚠️ E A BARRA ACOMPANHA — o par é este, e estava partido.
     A regra base do `.jn-pe` põe `padding-left: 96px`, e ela vive FORA de
     media nenhuma: valia igual a 1440 e a 375. No celular a lateral não está
     neste fluxo (ela é a `.mk-baixo`), e os 96px ficavam vazios — 26% da
     largura de uma tela de 375, medidos.
     ⭐ O valor não vem do desenho: vem do IRMÃO. O comentário da regra base diz
     «o par é 32px 96px no `.app-content` e o mesmo aqui; se um mudar, mudam os
     dois» — e o `.app-content` já tinha mudado para 16 aqui dentro. */
  /* ⚠️ E O LADO DIREITO FALTAVA, o que custou UMA LINHA INTEIRA. Medido a 390
     em 04/09/2026, no passo 3 do fluxo:

       o recuo era ....  18px 32px 18px 16px   ← 32 à direita, 16 à esquerda
       largura util ...  342
       os dois botoes .  «Voltar» 68 + gap 12 + «Continuar…» 263  =  343

     ⛔ Faltava UM PIXEL. E como o `.jn-pe` tem `flex-wrap: wrap`, o botão caía
     para a linha de baixo e a barra passava de ~87 para 146px de altura —
     59px perdidos numa tela de 812, por um pixel.

     ⭐ E a regra estava escrita aqui em cima: «o par é 32px 96px no
     `.app-content` e o mesmo aqui; se um mudar, mudam os dois». O
     `.app-content` mudou os DOIS lados para 16; esta só mudou a esquerda. A
     emenda é aplicar a regra que o comentário já enuncia, e não uma nova.

     ⚠️ O `wrap` fica: ele é o que salva a barra quando o rótulo é comprido
     noutra língua. O que não podia ficar era ele a disparar por assimetria de
     recuo, que é defeito e não largura de texto. */
  main.app-shell:has(> .mk-rodape-legal) > .jn-pe { padding-left: 16px; padding-right: 16px }

  /* ⚠️ DOIS ALVOS ABAIXO DO DEDO. Medidos a 390 em 04/09/2026:

       .mk-volta ......  358 x 19    ← o elo de VOLTAR, em quatro telas
       .button.small ..  136 x 30    ← «+ Acrescentar campo» e irmãos

     O `.mk-volta` é `inline-block` com `font-size: .88rem`: a altura dele é a
     da linha de texto e mais nada. 19px é menos de metade do dedo, e é a única
     saída para trás destas telas.

     ⭐ `min-height` com `inline-flex`, e não `padding`: o padding empurrava o
     conteúdo todo para baixo, e o que falta é ÁREA e não espaço. Assim a caixa
     cresce à volta do texto, que fica onde estava.

     ⚠️ E o `.button.small` mantém o corpo pequeno de propósito — é uma ação
     secundária e tem de o parecer. O que muda é a área de toque, não o tamanho
     aparente da letra. No computador continuam a valer os 30px de
     `styles.css`, que lá são de rato e não de dedo. */
  .mk-volta { display: inline-flex; align-items: center; min-height: 44px }
  .button.small { min-height: 44px }
    /* 115 = os 89 que a barra mede (10 + 56 + 22, medidos no vivo) mais os 26 do
     espaçador que a prancha põe entre o conteúdo e ela. Com 104 sobravam 15px
     no fim da rolagem — não tapava, mas encostava. */
  main.app-shell:has(> .mk-rodape-legal) { height: auto; min-height: 100vh; padding-bottom: 115px }

  /* ── O TOPO ──────────────────────────────────────────────────────────── */
  .site-header .brand-row { height: 60px; padding: 0 16px }
  .site-header .logo-box img { width: 128px }
  /* O saldo empilhado da prancha: rótulo versalete de 9px, número de 14. */
  /* ⚠️ `--tinta-500` dava 4,33 sobre o cabeçalho — abaixo do piso, e num texto
     de NOVE pixels. Medido a 390 em 04/09/2026:
       --tinta-500   #5C6C93 sobre #F0E9DF  ->  4,33  ⛔
       --texto-fraco #475A85 sobre #F0E9DF  ->  5,68  ✅
     É o mesmo defeito do `.tpc-campos`: um degrau da RAMPA a servir de texto
     sobre uma superfície mais escura que o papel. A rampa não sabe sobre que
     chão vai cair. */
  .hd-saldo-estreito .hd-saldo-rotulo { font-size: 9px; font-weight: 500;
    letter-spacing: .14em; text-transform: uppercase; color: var(--texto-fraco) }
  .hd-saldo-estreito b { font-size: 14px; font-weight: 500; color: var(--texto); line-height: 1.2 }
  .mk-avatar { width: 32px; height: 32px }

  /* ── O CABEÇALHO: 25px e 14px, e é por isso que cabem numa linha ─────── */
  .app-content .page-heading { flex-direction: column; align-items: stretch; gap: 16px }
  .ph-titulos { gap: 4px }
  .page-heading h1 { font-size: 25px }
  .ph-titulos .jn-titulo { font-size: 14px }

  /* ── A TRILHA: QUATRO bolas de 20px, sem rótulo, fios ELÁSTICOS ───────
     ⚠ Ao contrário do computador, onde os fios são 20px fixos. Aqui eles
     esticam porque a trilha tem de caber na largura que houver.

     ⚠⚠ A QUINTA COLUNA SAI, e isto é inferência e não declaração: a
     `CelularResultadoPardo` não desenha trilha nenhuma, logo «Concluído» não é
     passo da trilha do celular — é o destino, e chegar lá tira-a do ecrã.
     Ficam Documentos · O que fazer · Tipo · Confirmar. Se o desenho desmentir,
     muda esta linha e mais nada. */
  .jn-trilha { gap: 7px }
  .jn-col { flex: 1 1 0; padding: 0; gap: 0; min-width: 0 }
  /* ⚠ CINCO POSIÇÕES NO CELULAR, as mesmas do computador. Estiveram quatro, e a
     razão parecia boa: a prancha do celular desenhava «1 2 3 4», a tela de
     resultado não desenhava trilha nenhuma, e a frente de desenho confirmou-o
     por texto. ***A prancha é que estava errada***, e o Alan corrigiu-a em
     02/09/2026: «o stepper são 5, precisa manter as 5 etapas do nosso fluxo».

     Não foi defeito de implementação nem leitura errada de ninguém — foi o
     desenho a dizer uma coisa e o dono a querer outra. Fica escrito para quem
     comparar a folha com a prancha antiga.

     A aritmética a 412: 5 bolas de 20 = 100px, sobram 280 para 4 vãos, ~70px
     cada. Os fios são `flex: 1 1 0` e encolhem sozinhos.

     A última coluna não reclama a sua fatia — senão a quinta bola ficaria
     sentada no início dela, longe da borda. O fio de saída dela já não se
     desenha: é o `i.vazio`, escondido na regra do computador. */
  .jn-col:last-child { flex: 0 0 auto }
  .jn-rot { display: none }
  .jn-bola { width: 20px; height: 20px; font-size: 10.5px }
  .jn-linhas i { order: 3; flex: 1 1 0; width: auto; height: 1px }
  .jn-linhas i:first-child, .jn-linhas i.vazio { display: none }

  /* ── OS DOIS BOTÕES: «Tirar foto» PRIMEIRO e primário ─────────────────
     ⚠ Ao contrário do computador, e não é engano da prancha: é a mão que
     segura o telefone. Quem está no celular tem a câmara consigo e o
     explorador de ficheiros longe; no computador é o inverso. */
  /* ⚠️ E A FILA OCUPA A LARGURA TODA — itens 9 e 10 do Alan, e o defeito era
     do CONTENTOR e não da divisão entre os dois botões.
     Medido a 375px, antes: na zona VAZIA a fila media 217px de 375 e cada
     botão ficava com ~103 — «o Foto está espremido». Com documentos ela já
     media 301, e por isso o mesmo par parecia certo numa tela e apertado na
     outra: `flex: 1 1 0` divide bem o que houver, e o que havia era pouco.
     A causa: a zona vazia é `align-items: center`, e um filho de coluna
     centrada encolhe até ao conteúdo. `align-self: stretch` desfaz isso só
     para esta fila — o robô e o texto continuam centrados. */
  .mk-solta-acoes { gap: 10px; flex-wrap: nowrap; align-self: stretch; width: 100% }
  .mk-solta-acoes .button { flex: 1 1 0; padding: 16px 12px; border-radius: 10px;
    font-size: 15px; font-weight: 500; gap: 9px }
  .mk-solta-acoes .button.primary { order: 2; background: none;
    border: 1px solid var(--tinta-300); color: var(--tinta-800) }
  .mk-solta-acoes .button.ghost { order: 1; background: var(--primario);
    border: 0; color: var(--sobre-primario) }

  /* ── O RODAPÉ DE AÇÃO ────────────────────────────────────────────────
     Geometria da prancha: `space-between`, filete por cima, recuo de 12.

     ⚠⚠ DIVERGE DA PRANCHA POR DECISÃO DO ALAN, 02/09/2026. A prancha põe à
     esquerda uma contagem («6 documentos») e à direita o botão, sem o
     «Descartar». Ele viu-o a funcionar no celular e mandou mantê-lo:
     «o botão "descartar estes documentos" está funcionando no modo celular,
     mantenha o botão».

     Está escrito para a próxima varredura não o «consertar» de volta — é a
     segunda divergência deliberada desta folha, ao lado da do `--tinta-50` no
     botão preso.

     Até lá os dois botões ficam, e `flex-wrap` impede o que eu media antes: o
     primário com a borda direita em 408 numa tela de 390, ou seja, meio botão
     fora do ecrã. Envolver é feio; sair da tela é pior. */
  .jn-pe {
    display: flex; align-items: center; justify-content: space-between;
    flex-wrap: wrap; gap: 12px; padding-top: 12px;
    border-top: 1px solid var(--linha)
  }
  .jn-pe .button { padding: 15px 20px; border-radius: 10px; font-size: 15px; font-weight: 500 }
}


/* ══ A TELA 2, medida na prancha `Passo2OQueFazer` ═════════════════════════
   ⚠ O bloco das escolhas alinha à ESQUERDA, por baixo do título — não é só
   uma largura. A ficha diz «680px e não a do miolo» e eu li isso como medida;
   é medida E LUGAR. Medido: o título começa em x 96 e o bloco começava em 405.

   📌 Um número numa ficha descreve uma medida; a prancha descreve um lugar.
   Ler o número não é ver o lugar — e a largura sozinha dava 705 contra 680,
   que parecia quase certo. «Quase certo» passa despercebido. */
.jn-meio {
  /* ===== a jornada: as regras que faltavam (D-205) =====
  Sete classes estavam escritas nos templates e não existiam em folha nenhuma,
  e a tela "O que fazer" mostrava um `<polyline>` sem estilo — uma seta preta
  ocupando o cartão inteiro. Vieram do desenho, sem retoque: é ele que manda
  quando ele e qualquer outra coisa discordam. */
  max-width: 680px;
  margin-inline: 0;
}
.jn-opcoes > .jn-op.on { background: var(--tinta-50) }
.jn-opcoes > label.jn-op { border-style: dashed; border-color: var(--tinta-400) }

/* O tique nu da primeira: sem caixa, sem fundo, e o traço na cor da marca. */
.jn-op.on > .jn-marca {
  width: 20px; height: 20px; border: 0; background: none; border-radius: 0
}
/* ⚠ `--texto` e não `--marinho`: SÉTIMA da mesma família. O tique não tem fundo
   próprio — assenta no `--tinta-50` do cartão, que no escuro é `#0C1B3E` —, e o
   marinho não inverte: no escuro ele desaparecia.

   ⚠⚠ E isto NÃO parte a §1.10, que proíbe a tinta mudar entre ESTADOS. Ela
   continua igual em todos os estados; o que muda é o MODO. Ter `--marinho`
   legível num modo e invisível no outro já era a tinta a variar — só que por
   acidente, e sem par. */
.jn-op.on > .jn-marca svg { width: 20px; height: 20px; stroke: var(--texto); stroke-width: 2.4; display: block }

/* A caixa da segunda: quadrada, raio 5. */
.jn-op:has(input) > .jn-marca { width: 20px; height: 20px; border-radius: 5px }

/* ── OS SELOS ─────────────────────────────────────────────────────────────
   Pílulas a cavalo na borda de cima, a −8px. Elas dizem em duas palavras o que
   a forma do cartão já diz em silêncio — e é de propósito: quem não lê a forma
   lê o selo, e quem lê a forma tem-no confirmado. */
.jn-op {
  display:flex;
  align-items:center;
  width:100%;
  cursor:pointer;
  font:inherit;
  font-size:.97rem;
  text-align:left;
  background:transparent;
  color:inherit;
  /* ── OS DOIS CARTÕES ──────────────────────────────────────────────────────
  ⚠⚠ A PRIMEIRA NÃO É UMA CAIXA DE SELEÇÃO. Ela nunca se desmarca — o mínimo
  é sempre «só transcrever», e não existe estado «nenhuma escolhida». Por isso
  a marca dela é um TIQUE NU, sem caixa à volta: uma caixa promete que se pode
  desmarcar, e um círculo promete que se escolhe UMA das duas.

  O produto tinha dois círculos, e dois círculos dizem «escolha uma destas» —
  a forma estava a mentir sobre o que a peça faz.

  E a segunda é QUADRADA de raio 5, que é o que o sistema usa para caixa de
  seleção. O tracejado da borda dela diz «opcional» sem uma palavra, e é o
  mesmo tracejado da área de largar da tela 1: no sistema, tracejado = ainda
  não é definitivo. */
  padding: 16px;
  border-radius: 12px;
  border: 1px solid var(--tinta-300);
  gap: 12px;
  position: relative;
}
.jn-selo {
  position: absolute; top: -8px; left: 16px; padding: 3px 9px; border-radius: 999px;
  font-size: 9.5px; font-weight: 500; letter-spacing: .1em; text-transform: uppercase
}
/* ⚠ Os dois selos são tinta CLARA sobre uma cor, e não cor sobre o papel. Medi
   na prancha: «SEMPRE INCLUÍDA» sobre `--marinho`, «OPCIONAL» sobre
   `--tinta-500`. O segundo estava ao contrário — `--tinta-500` sobre `--papel`
   —, e era a «cor errada do selo» que o Alan reportou.

   ⚠⚠ E OS DOIS NÃO LEVAM A MESMA TINTA, o que parece incoerência e não é.
   Escrevi `#fff` nos dois, como a prancha os desenha, e medi:

     «OPCIONAL»  #fff sobre --tinta-500 ....  5,22 claro · 1,67 ESCURO ⛔
                 --papel  ................... 4,89 claro · 11,27 escuro ✅
     «SEMPRE»    #fff sobre --marinho ......  16,38 nos dois            ✅
                 --papel  ...................  ~1,1 no escuro           ⛔

   📌 A razão é a superfície de cada um. `--marinho` é MARCA e não inverte: a
   pílula fica escura nos dois modos, e a tinta dela é branca nos dois. O
   `--tinta-500` INVERTE — é `#5C6C93` no claro e `#CBC8C3` no escuro —, e uma
   tinta fixa sobre uma superfície que vira é o defeito de sempre, ao contrário.

   ⚠⚠ E o `#fff` da prancha não estava errado: num desenho que só tem modo
   claro, `#fff` E `--papel` são a mesma cor. O que a prancha queria dizer era
   «a cor da página, recortada na pílula» — e é `--papel` que diz isso nos dois.

   📌 A tinta segue a SUPERFÍCIE DELA, e não uma regra da tela. */
.jn-op.on > .jn-selo { color: var(--sobre-primario); background: var(--marinho) }
.jn-op:has(input) > .jn-selo { color: var(--papel); background: var(--tinta-500) }

/* ── O RODAPÉ DE AÇÃO DO PASSO ────────────────────────────────────────────
   ⚠ Ele NÃO é o rodapé da aplicação: «Documentos legais · Medição de uso» está
   no pé da moldura e é outro. Este pertence ao passo, e o filete por cima é o
   que os separa a olho. */
/* (A regra do filete subiu para `.jn-pe`, que serve as duas telas: medi as duas
   pranchas e elas dão-lhe a mesma forma. O que continua a ser próprio da tela 2
   é o PAI — lá ele vive dentro do bloco central de 680px, e não do miolo.) */

/* ══ A FOLHA DO REGULAMENTO NO CELULAR ═════════════════════════════════════
   ⚠⚠ E a primeira coisa a dizer é o que NÃO estava partido. O mecanismo existe
   e funciona: o link tem `data-legal`, o `produto.js` busca o corpo ao banco —
   à MESMA rota que a página pública serve — e mostra-o. O que faltava era a
   APRESENTAÇÃO no celular, e o `_legal.html` já o dizia por escrito: «a folha
   do celular não é desta frente e está desenhada noutra».

   📌 Não era «está partida» nem «nunca existiu»: era uma terceira coisa —
   feita por dentro e por desenhar por fora.

   ⚠ E `.doc-caixa` estava na marcação sem existir em folha nenhuma. Mais uma
   classe escrita contra o vazio; passa a valer aqui.

   O DESENHO, aprovado pelo Alan: ela SOBE DO FUNDO e para ANTES DO TOPO, e a
   faixa que sobra em cima mostra o passo por baixo. É a faixa que diz «isto
   está por cima do que você estava a fazer» — sem ela a folha lê-se como uma
   página nova, e a pessoa perde o sítio onde estava.

   ⚠ No computador nada disto se aplica: lá a caixa é centrada e está certa. */
@media (max-width: 1079px) {
  .mk-modal:has(.doc-caixa) { place-items: end stretch; padding: 0 }

  .doc-caixa {
    width: 100%;
    /* ⭐ A FAIXA são estes 96px, e ela é o componente. `max-height` e não
       `height`: um regulamento curto não tem de encher a tela para provar que
       é uma folha. */
    max-height: calc(100dvh - 96px);
    display: flex; flex-direction: column;
    border-radius: 18px 18px 0 0; padding: 0
  }

  /* O corpo rola; o cabeçalho e o pé não. Numa folha que sobe do fundo, um pé
     que role leva o «Fechar» para fora do alcance do polegar. */
  #modal-legal-corpo {
    overflow-y: auto; -webkit-overflow-scrolling: touch;
    padding: 4px 20px 18px; min-height: 0
  }
  /* ⚠ `flex-shrink: 0` nos dois: numa coluna flexível o padrão é encolher, e
     um cabeçalho de 44px espremido a 12 continua lá — apenas ilegível. */
  .doc-caixa > .mk-modal-pe { flex-shrink: 0; padding: 12px 20px 18px }

  /* A PEGA, e ela não é decoração: é o que diz que se puxa para baixo. Fica
     dentro de uma área de 44px para o dedo a apanhar sem pontaria. */
  .doc-caixa::before {
    content: ''; flex-shrink: 0; align-self: center;
    width: 38px; height: 4px; margin: 14px 0 10px;
    border-radius: 999px; background: var(--tinta-300)
  }
}

/* O link do regulamento vai para a LINHA DE BAIXO, por pedido do Alan.
   ⚠ `display: block` e não um `<br>`: a quebra numa marcação é uma decisão de
   tipografia escrita no sítio onde a próxima tradução, mais comprida, já não a
   pode desfazer. */
.jn-promo-link { display: block; margin-top: 4px }

/* ── O RESUMO DO CELULAR: SAIU ────────────────────────────────────────────
   As regras de `.jn-resumo` viviam aqui, com um `@media (max-width: 1079px)`.
   A peça foi removida por ordem do dono — a citação está no `o_que_fazer.html`,
   ao lado do sítio onde ela estava.

   ⚠ O `@media` levava também `.jn-meio { display:flex; flex-direction:column;
   flex:1 1 auto; min-height:0 }`, que existia PARA o `margin-top:auto` do
   resumo encostar ao fundo. Sem resumo não há nada a encostar, e uma coluna
   flexível vazia é o buraco que a tela 1 já ensinou a não deixar. */


/* ══ OS TRÊS DEGRAUS DA LARGURA ═══════════════════════════════════════════
   O corte foi DERIVADO por medição, e não escolhido: quem prende é a trilha
   ROTULADA, que é texto e não quebra nem encolhe.

     trilha com rótulos ....  653px
     trilha só de números ..   80px
     lateral ...............  216 larga · 64 estreita

   Pisos medidos nas quatro telas com trilha — a 2 manda, porque o subtítulo
   dela é o mais longo:
     Passo1 1178 · ⭐ Passo2 1226 · Passo3 1179 · Passo4 1178

     >= 1240 .....  lateral 216 · trilha rotulada
     1080–1239 ...  lateral  64 · trilha rotulada   ← este faltava
     <  1080 .....  barra inferior · trilha de números

   ⚠ Os cortes arredondam PARA CIMA dos pisos (1226 → 1240, 1074 → 1080):
   arredondar para baixo põe a quebra dentro da faixa que devia funcionar.

   ⚠⚠ E O 800 ANTERIOR NÃO ESTAVA SÓ ERRADO — ESTAVA DO LADO ERRADO. Medido a
   800: a trilha esmagava-se de 653 para 589 e a linha do cabeçalho transbordava
   276px. Tudo entre 800 e 1074 recebia um computador PARTIDO em vez de um
   celular inteiro.

   ⭐ O degrau do meio não é invenção: é a lateral recolhida da `Passo21Lateral`,
   que já existe e já tem os cinco estados. Estava desenhada e faltava ligá-la a
   uma largura — a 64px o piso desce exatamente 152. */
@media (min-width: 1080px) and (max-width: 1239px) {
  /* ⚠ A LARGURA MANDA NESTA FAIXA, e sobrepõe o gesto: aqui não há espaço para
     a barra aberta E a trilha rotulada ao mesmo tempo. O `.is-expanded` continua
     a existir no HTML e no armazenamento — o que muda é que ele não se desenha
     enquanto a janela for esta. Quem alargar a janela reencontra a barra como a
     deixou.

     Isto é uma DUAS AUTORIDADES sobre a mesma peça — a média e o gesto — e está
     reportado. A escolha de deixar a largura ganhar é reversível numa linha. */
  .module-sidebar.is-expanded { width: 64px; padding: 14px 10px }
  .module-sidebar.is-expanded .module-tab { font-size: 0; justify-content: center }
  body.barra-presa main.app-shell:has(> .mk-rodape-legal) .app-content { padding-left: 96px }
  /* ⚠️ O MESMO PAR, e esta quebra ninguém tinha visto: aqui o `.app-content`
     volta a 96 e a barra ficava nos 268 da regra de `min-width: 1080px` — 172px
     de desencontro numa janela estreita. Apareceu ao MAPEAR os quatro estados
     do par em vez de consertar o primeiro que doeu. */
  body.barra-presa main.app-shell:has(> .mk-rodape-legal) > .jn-pe { padding-left: 96px }
}


/* ── A CONTAGEM DO LOTE (prancha `Passo1Enviar`) ──────────────────────────
   ⚠ Ela estava a ser desenhada como TÍTULO — 15,2px a 700 — e a prancha
   quere-a como LEGENDA: 12,5px a 400, em `--texto-fraco`.

   ⭐ E os dois defeitos que me foram reportados eram UM: uma legenda com corpo
   de título ocupa mais linha e sobe na hierarquia visual, e é isso que a punha
   a esbarrar no bloco de cima. Consertar a colisão com margem teria deixado a
   causa viva e o texto errado. */
#contagem { font-size: 12.5px; font-weight: 400; color: var(--texto-fraco) }


/* ══ A TELA 3, medida na prancha `Passo3Tipo` ══════════════════════════════
   ⚠⚠ TRÊS COLUNAS E OS NOMES DOS CAMPOS SÃO UMA DECISÃO SÓ. Cinco colunas de
   254px não cabem «Nome · Data · Pais · Padrinhos»; três de ~371 cabem.

   📌 A largura existe PARA o conteúdo. Manter cinco colunas e cortar os nomes
   seria o inverso — o desenho a servir a grelha em vez de a grelha servir o que
   se tem de ler. */
.tpc-grade {
  /* ===== tipos de documento e confirmação, do desenho da jornada (D-205) ===== */
  display:grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px;
}
/* ⚠️ E O DEGRAU, que faltava — inspecionado a 390 em 04/09/2026.

   A regra de cima é do COMPUTADOR e a razão dela está escrita: três colunas de
   ~371 cabem «Nome · Data · Pais · Padrinhos». Ela não tinha contrapartida no
   telefone, e a 390 as mesmas três colunas dão 111px cada:

     «Criar um tipo próprio»   quebrava em TRÊS linhas numa coluna de 111
     «Certidão de nascimento»  o mesmo
     e sobrava METADE da tela vazia à direita, porque só há um cartão

   ⭐ O `minmax(0, 1fr)` é que o permite: sem piso, as colunas encolhem até
   caberem três em qualquer largura. O que a regra escreveu como «a largura
   existe PARA o conteúdo» era verdade a 1440 e virava o contrário a 390.

   ⚠️ NENHUMA MEDIDA APANHOU ISTO. Não transborda, não corta, nenhum alvo abaixo
   de 44, nenhum bloco estreito pelo meu critério — a tela mede bem e lê-se mal.
   Apareceu ao OLHAR, que é o método novo, e é o argumento dele.

   A linha 691 já dizia a coisa certa — `auto-fill, minmax(210px, 1fr)`, que a
   390 dá uma coluna. Isto repõe o comportamento dela abaixo do degrau da casa,
   os mesmos 700px dos outros oito cortes. */
@media (max-width: 700px) {
  .tpc-grade { grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)) }
}

/* Fundo `--tinta-50` e borda de 1px: o cartão é uma superfície, e 1,5px de
   contorno desenhava-o como controlo. */
.tpc {
  display:flex;
  flex-direction:column;
  box-shadow: none;
  cursor:pointer;
  text-align:left;
  font:inherit;
  color:inherit;
  width:100%;
  gap: 6px;
  padding: 18px 20px;
  border: 1px solid var(--linha);
  border-radius: 12px;
  background: var(--tinta-50);
  min-height: 118px;
}
/* ⚠⚠ A cor é DECLARADA aqui e na prancha não é — e isso é sintoma, não
   descuido. A `Passo3Tipo` não declara cor em título de cartão nenhum, nem no
   «Criar» nem nos de tipo: os cinco herdam, e no desenho herdar dá `--texto`.

   📌 No produto herdar dá `--tinta-600`, porque `produto.css:1741` pinta o
   `body` inteiro com ele. Não é um valor solto: é a escala tipográfica, onde o
   corpo é meta e o forte se declara. **A prancha faz o inverso** — corpo
   forte, e o fraco é que se declara.

   ⚠ Não inverto o `body` por causa de um cartão: isso mexia em todas as telas
   de uma vez. Escrevo a cor na peça, que é reversível, e a divergência do
   corpo vai a quem decide. */
.tpc b { font-size: 14px; font-weight: 500; color: var(--texto) }
.tpc small { font-size: 12px; color: var(--texto-fraco); margin-top: 0 }
/* ⚠️ 4,33 sobre o fundo do cartão, e o mínimo é 4,5. Medido a 390 em
   04/09/2026, no modo claro:

     --tinta-500  #5C6C93 sobre #F0E9DF  ->  4,33   ⛔ falha
     --texto-fraco #475A85 sobre #F0E9DF ->  5,68   ✅

   ⭐ E o defeito não é a cor: é o TIPO de token. `--tinta-500` é um degrau da
   rampa, e a rampa não sabe sobre que papel vai cair; `--texto-fraco` é um
   token de PAPEL, feito para texto secundário sobre as superfícies da casa.
   Aqui o cartão é `--tinta-50`, mais escuro que o papel da página — e um
   degrau escolhido contra o papel claro perde o pé sobre ele.

   ⚠️ Os dois têm par medido para o escuro, e no escuro nenhum falhava. É só o
   claro, e é sobre o cartão e não sobre a página: contra o papel da PÁGINA a
   mesma cor dá 4,89 e PASSA. O fundo que conta é o que está atrás da letra, e
   uma varredura que medisse tudo contra o papel da página não veria isto. */
.tpc-campos { font-size: 11.5px; line-height: 1.5; color: var(--texto-fraco) }

/* ⚠⚠ O ícone sai do cartão de TIPO e FICA no cartão «Criar».
   Escrevi `.tpc-ico { display: none }` a pensar só no cartão de tipo — onde a
   razão está certa: a prancha não lho desenha, ele repetia em imagem o que o
   título já diz, e roubava a linha dos nomes dos campos.

   📌 Mas o seletor não sabia disso. `.tpc.novo` também é um `.tpc`, e a
   `Passo3Tipo` DESENHA-LHE um ícone: 28×28, raio 8, `--tinta-500` sobre
   `--tinta-100`, svg de 14. Uma razão verdadeira sobre uma peça, escrita num
   seletor que apanha duas. */
.tpc:not(.novo) .tpc-ico { display: none }

/* ══ O CARTÃO «CRIAR» — medido em `Passo3Tipo`, e é outra peça ══════════════
   ⚠ O título estava CIANO, e a causa não era uma regra de link a alcançá-lo:
   era `.tpc.novo b { color: var(--accent) }`, escrita de propósito. A prancha
   NÃO DECLARA COR NENHUMA ali — o título herda `--texto`, como o do cartão de
   tipo ao lado. A regra foi apagada, não coberta: cobri-la deixava a intenção
   viva à espera da próxima folha.

   ⚠ E o cartão não tem superfície: só o tracejado. O `--tinta-50` que o
   `.tpc` dá serve o cartão de tipo, que É uma superfície; aqui o tracejado
   sobre o chão é que diz «ainda não existe». */
.tpc.novo {
  border-style:dashed;
  border-color: var(--tinta-400);
  background: none;
  align-items: flex-start;
  gap: 7px;
}
.tpc.novo b { margin-top: 3px }
.tpc.novo .tpc-ico {
  width: 28px; height: 28px; border-radius: var(--radius-md);
  color: var(--tinta-500); background: var(--tinta-100)
}
.tpc.novo .tpc-ico svg { width: 14px; height: 14px; stroke-width: 1.5 }

/* Os quatro blocos do miolo com 20px entre si — a frase, e os três grupos. */
.app-content:has(.tpc-grade) { gap: 20px }

/* A frase de abertura do passo é 13,5 na prancha e o `.mk-meta` do sistema é
   12,5. Não mexo no `.mk-meta`, que é a meta de todo o produto: escrevo na
   frase, que é filha direta do miolo.

   ⚠ Escolhi `> .mk-meta` e NÃO `.jn-risca + .mk-meta`, que descrevia melhor o
   sítio. A risca está em pergunta com o Alan; ancorar a medida num vizinho que
   pode sair é escrever hoje uma regra que se cala no dia em que ele responder,
   sem erro nenhum a dizê-lo. */
.app-content > .mk-meta { font-size: 13.5px }


/* ══ A TELA 4, medida na prancha `Passo4Confirmar` ═════════════════════════
   ⚠ O bloco central ENCHE o miolo: 1150 e não os 680 da tela 2. A ficha diz
   porquê, e a razão é do conteúdo: a tela 2 estreita porque tinha duas frases
   longas; aqui há uma TABELA, e uma tabela estreita força quebras que a leitura
   não pede.

   O seletor pergunta pelo campo do nome porque ele só existe nesta tela — é o
   único campo de texto da jornada inteira. */
.jn-meio:has(.mk-rotulo-pedido) { max-width: none }

/* ⚠⚠ O CAMPO DO NOME PASSA A OCUPAR A LARGURA TODA, e isto DESFAZ uma decisão
   anterior do próprio Alan. As duas estão aqui porque a segunda não se entende
   sem a primeira:

     04/09/2026  «Nome do pedido (opcional) → deve ocupar largura integral no
                  computador»                                    ← vale esta
     antes       item 5: «respeitar a proporção da prancha», e a ficha
                 `TELA-4-CONFIRMAR.md` dava a razão: «um nome de pedido tem
                 cinco palavras, e um campo de 1150px convida a escrever um
                 parágrafo. A largura é a promessa do tamanho da resposta.»

   📌 A prancha publicada desenha 520. **Isto diverge dela de propósito**, e a
   divergência está declarada no `divergencias.json` com as duas datas — senão a
   próxima varredura mede 520 contra 1140 e chama-lhe defeito.

   ⚠ São DUAS regras a decidir isto, as duas de topo e as duas a valer: esta e
   a `.jn-confirmar .mk-rotulo-pedido` mais abaixo. Mexer só numa não muda um
   pixel — a outra continua a valer. */
.mk-rotulo-pedido {
  margin-top:12px;
  max-width: none;
}


/* ══ A TELA 5, medida na prancha `Passo5Acompanhar` ════════════════════════
   ⚠ O preenchimento das barras era `--accent` — o ciano. A prancha usa a cor
   de ação, e por isso vai em `--primario`: ela inverte, e o ciano não é a cor
   de «isto está a acontecer», é a da marca. */
#andamento-do-pedido .mk-barra span { background: var(--primario) }

/* ⚠⚠ O CHIP DE ESTADO: era `#e9f2fd` com tinta `#1a4f8a` — dois literais FRIOS
   sobre o chão pardo, a mesma família do `#f8fafc` que já saiu daqui.

   Há um comentário nesta folha a dizer que «as três cores são as do canvas» —
   e eram, do canvas dos Créditos. A `Passo5Acompanhar` é posterior e dá
   `--acento-lavado` com tinta `--marinho`, que são tokens e invertem.

   ⚠ E sem borda: a prancha não lhe desenha contorno. Uma pastilha com fundo
   próprio já se separa do que está à volta; a borda desenhava-a duas vezes. */
/* ⚠ `--marinho` sobre `--acento-lavado` media 1,09 no escuro — o selo «MEU
   TIPO» era um borrão. Os dois estão na lista dos que não invertem por serem
   MARCA e SUPERFÍCIE; o erro foi usar um deles como TINTA. `--texto` dá 13,96
   no claro e 14,12 no escuro. */
/* ⚠ O PESO desta pílula é 600 e a prancha desenha 500 — divergência
   declarada. Alan, 04/09/2026: «faça como sugeriu, e deixe o baixar do tamanho
   que está» — e dos sete que lhe levei, este ficou. A razão que ele deu para
   os três pesos juntos: UM DEGRAU DE PESO NÃO SE VÊ, e são quatro lugares.
   Mexer neles é movimento sem retorno.
   ⭐ E a BORDA dela é o quarto membro da família que o `.chip-ok` já nomeia:
   «se alguém a tirar, tira-se nos quatro de uma vez». Este é o quarto. */
.chip-run { color: var(--texto); background: var(--acento-lavado); border-color: transparent }

/* O título do pedido: 27px, e o código como marca MONOESPAÇADA de 15px — não
   em Newsreader, que é a serifada do título e fazia o código parecer parte do
   nome. Monoespaçado diz «isto é um identificador, não uma palavra». */
.page-heading:has(.mk-numero) h1 { font-size: 27px }
.mk-numero {
  /* O número do pedido continua visível ao lado do nome: é por ele que a pessoa
  fala com o suporte, e ele sumiria se o rótulo o cobrisse. */
  font-weight:400;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 15px;
  color: var(--tinta-500);
  margin-left: 8px;
}


/* ══ A TELA 6, medida na prancha `Passo6Resultado` ═════════════════════════
   ⚠ AS SETAS DA NAVEGAÇÃO dizem-se pelo estado e não pelo contorno: a que LEVA
   a algum lado é `--marinho` sobre `--tinta-50`; a que não leva é `--tinta-500`
   sem fundo. No produto as quatro eram iguais — quatro botões de contorno, e
   quem olhava não sabia quais funcionavam antes de clicar.

   30×30 e raio 6: são controlos de passo, não botões de ação, e a diferença de
   tamanho é o que os separa do «Baixar tudo» ao lado. */
.mk-nav-botoes .button {
  width: 30px; min-width: 30px; height: 30px; min-height: 0; padding: 0;
  border-radius: 6px; border: 0; background: var(--tinta-50); color: var(--marinho)
}
.mk-nav-botoes .button.desativado { background: none; color: var(--tinta-500) }

/* ⚠ O painel dos campos lidos leva um FILETE ESQUERDO em `--acento`: ele é o
   que o desenho usa para dizer «isto veio do modelo», e distingue-o do painel
   da transcrição sem lhe pôr título diferente. */
/* ⚠ O `#dados-extraidos` é o `<dl>`, e o filete é do CARTÃO que o contém — não
   do `<dl>`. Escrevi primeiro `:has(.mk-res-campos)`, uma classe que não existe,
   e depois medi onde o `id` vive de facto. */
/* ⚠⚠ `--ciano` e NÃO `--acento`: a prancha escreve `var(--acento)`, e esse token
   NÃO EXISTE nesta folha — chama-se `--ciano`, com `--accent` por apelido.

   E o modo como isto falhou é o que interessa: uma `var()` indefinida torna a
   declaração inválida NO TEMPO DE CÁLCULO, e a propriedade cai para o valor
   inicial — `border-left` deu `0px none`. Não há erro, não há aviso, e o
   seletor casa: `querySelector` achava o elemento e o filete não existia.

   📌 Copiar um nome de token da prancha sem confirmar que ele existe aqui é a
   mesma família de «medi» sem dizer o quê. */
.mk-res .mk-bloco:has(#dados-extraidos) { border-left: 1px solid var(--ciano) }

/* O seletor de PAÍS com bandeira — item 13 do Alan, 02/09/2026, e desenhado
   para ficar igual ao DDI que está logo acima dele.

   ⚠ A bandeira POUSA sobre o campo e não entra no fluxo: o `<select>` continua
   a ser o do sistema, com o seu foco, a sua busca por digitação e a sua roda no
   celular. O que muda é a folga da esquerda, que abre espaço para ela.

   📌 As medidas são as do DDI — 18×13 e raio 2 —, e não outras parecidas. Duas
   bandeiras a dois tamanhos, uma por cima da outra na mesma coluna, é o tipo
   de diferença que ninguém consegue justificar depois. */
.pais-alvo { position: relative; display: block }
.pais-alvo img.fl {
  position: absolute; left: 12px; top: 50%; transform: translateY(-50%);
  width: 18px; height: 13px; border-radius: 2px; object-fit: cover;
  pointer-events: none
}
/* Só recua o texto quando há bandeira à vista. Sem país escolhido a imagem tem
   `hidden`, e um recuo sem nada dentro dele seria um campo torto sem razão. */
.pais-alvo:has(img.fl:not([hidden])) select { padding-left: 38px }

/* ===== os blocos de FORMULÁRIO em duas colunas =====
 *
 * ⚠⚠ A `Passo14MeusDados` e a `Passo8Faturamento` desenham os campos em DUAS
 * colunas de 545px, e o produto empilhava-os numa só. Não apareceu na lista
 * como «disposição»: apareceu como catorze diferenças de LARGURA, uma por
 * rótulo, porque o comparador mede caixas e não intenções. Foi preciso olhar
 * o x de cada campo na prancha para ver que havia duas colunas.
 *
 *     prancha    x=276 w=545  |  x=835 w=545     Nome | Tipo de conta
 *     produto    x=293 w=1090                    Nome
 *                                                Tipo de conta
 *
 * 📌 Os pares saem da ORDEM e de mais nada — dois campos seguidos partilham a
 * linha —, e é por isso que uma grelha resolve isto sem tocar no HTML de cada
 * campo. O título do bloco e a nota atravessam as duas colunas, como na
 * prancha.
 *
 * ⛔ CLASSE PRÓPRIA, e não o `.mk-bloco`: esse veste DEZOITO templates, e só
 * dois deles são desta frente. Uma grelha no `.mk-bloco` punha duas colunas na
 * tela de tipos, na de resultado e na de suporte, que não são minhas e que
 * ninguém teria olhado. */
.mk-campos-2col {
  display: grid; grid-template-columns: 1fr 1fr; gap: 20px 30px;
  align-items: start
  /* ⚠⚠ SEM `max-width`, e é uma decisão do Alan CONTRA a prancha (item 4a,
     03/09/2026): «a caixa da foto tem largura diferente das outras — todas à
     largura inteira, alinhadas».

     Eu tinha posto 1120px, que é a medida da prancha: duas colunas de 545 mais
     30 de intervalo, dentro de uma tela de 1440. Mas o conteúdo do PRODUTO tem
     outra folga lateral e mede 1312 — e a caixa da foto, que não é uma grelha,
     ficava nos 1312 e as outras três nos 1120. Três cartões alinhados e um
     mais largo, um por cima do outro.

     📌 A prancha desenha a MEDIDA; o Alan pediu o ALINHAMENTO. Prender a
     medida quebrava o alinhamento, que é o que se vê. As colunas passam a ser
     metade do que houver, e a proporção do desenho mantém-se. */
}
.mk-campos-2col > .mk-bloco-topo,
.mk-campos-2col > .mk-meta,
.mk-campos-2col > .md-lead { grid-column: 1 / -1 }
/* O que não é campo — avisos, botões, blocos inteiros — também atravessa: só
   o `.login-field` é que ocupa meia linha. */
.mk-campos-2col > *:not(.login-field) { grid-column: 1 / -1 }
/* ⛔ E O `margin-top` DE IRMÃO SAI, que era o desalinhamento das duas colunas
   (item 4b e 4c do Alan).

   O `styles.css` tem `.login-field + .login-field { margin-top: 20px }` — o
   espaço entre campos EMPILHADOS. Numa grelha, o primeiro campo de cada linha
   não tem irmão imediatamente antes na mesma coluna, mas o segundo TEM: ele
   levava os 20px e descia sozinho.

       Nome completo   topo = 409
       Tipo de conta   topo = 429    ← os 20px do irmão

   📌 Quem espaça agora é o `gap`, que é o que uma grelha usa; o `margin` era a
   ferramenta da pilha e sobreviveu à troca de disposição. */
.mk-campos-2col > .login-field + .login-field { margin-top: 0 }

/* Uma coluna no que for estreito. O ponto de corte é o do resto da folha para
   esta faixa, e não um novo: catorze pontos de corte já são sedimento demais
   (INVENTARIO-DO-DESIGN §1), e acrescentar o décimo quinto por causa desta
   grelha era pagar duas vezes. */
@media (max-width: 700px) {
  .mk-campos-2col { grid-template-columns: 1fr }
}

/* O rótulo ocupa a LARGURA do campo, como na prancha — lá ele mede 545, a
   coluna inteira; aqui media 92, o tamanho da palavra.
 *
 * ⚠ Não muda nada ao olho, e é por isso que precisa de razão escrita: um
 * rótulo em bloco tem a área de clique da coluna toda, e um rótulo em linha
 * tem a da palavra. O `<label>` leva o foco ao campo, e essa diferença
 * sente-se com o rato e não se vê na captura.
 *
 * ⛔ Preso à grelha desta frente. O `.login-field` veste também as telas de
 * entrada, que são de outra — e eu já colidi hoje uma vez por não olhar. */
.mk-campos-2col .login-field > label > span { display: block }
/* ── AS TELAS DO FLUXO, NO CELULAR: duas barras e um miolo que rola ──────────
   Pedido do Alan (02/09): «a barra de botões fixa em baixo, logo acima do menu,
   e a rolagem acontece ENTRE a barra de cima e a barra de botões» — e a topbar
   também presa. É uma coisa só, e faz-se no molde, não por tela.

   ⚠️ O ESCOPO É A TRILHA, e não a barra de botões. Escolher por `.jn-pe`
   apanharia «Meus dados», «Faturamento» e as duas de tipo, que têm rodapé de
   ação e NÃO são do fluxo — quatro telas que ninguém pediu a rolar por dentro.
   ⚠⚠ ERRATA, 03/09/2026: este parágrafo argumentava que o escopo devia ser a
   TRILHA e não a `.jn-pe`, porque `.jn-pe` apanharia «Meus dados»,
   «Faturamento» e as duas de tipo. O argumento estava certo QUANDO foi escrito
   e caducou: o Alan pediu a barra fixa nas duas de tipo, e elas não têm trilha.

   ⭐ O marcador passou a ser `.jn-pe-fixa`, que é EXPLÍCITO — não é `.jn-pe`
   (que apanharia demais) nem a trilha (que apanha por vizinhança). Quem quer a
   barra pinada põe a classe; «Meus dados» e «Faturamento» continuam de fora
   porque não a põem.

   📌 A trilha nunca foi a razão de nenhuma destas regras: era o bilhete de
   identidade das telas do fluxo, e serviu enquanto fluxo e barra pinada foram
   a mesma lista. O texto abaixo fica como estava, e diz por quê:
   `body:has(.jn-trilha)` dizia o que a regra QUERIA dizer («as telas do fluxo»);
   `.jn-pe` diria só o que ela toca. Não é a mesma coisa.

   ⭐ SEM `position: fixed` E SEM UM ÚNICO NÚMERO. A pilha do canto de baixo é
   ordem de irmãos — miolo, ações, menu —, e ordem de irmãos não tem `z-index`,
   não tem aritmética e não se desalinha. A alternativa era prender a `.jn-pe` e
   calcular o `bottom` a partir da altura do menu, que ninguém escreveu: um
   número somado de `padding` + ícone + rótulo nasce errado e envelhece pior.

   📌 E dissolve as duas armadilhas que a regra do `.mk-rodape-legal` nomeou ao
   explicar por que NÃO prendeu o rodapé — «cobriria conteúdo no fim da rolagem
   das telas longas» e «passaria a disputar o canto de baixo com a faixa do
   consentimento». Sem `fixed` não há nada por cima de nada. As duas regras
   leem-se juntas.

   ⚠️ O `.mk-baixo` deixa de ser `fixed` AQUI DENTRO, e só aqui: fora do fluxo
   ele continua exactamente como estava.

   ⚠️ E o consentimento continua `fixed`, POR CIMA das duas barras: nenhuma ação
   primária fica atrás de um aviso. A faixa é uma interrupção temporária e
   responde-se uma vez; o botão é o trabalho — e um botão que não se vê é
   indistinguível de um botão que não existe. */
@media (max-width: 1079px) {
  /* ⚠⚠ SEGUNDO MARCADOR, 03/09/2026 — e eu quase derrubei a razão do primeiro.
     A nota acima diz, com todas as letras, que o escopo NÃO é `.jn-pe` porque
     isso apanharia «Meus dados», «Faturamento» e as duas de tipo — «quatro
     telas que ninguém pediu a rolar por dentro». Eu ia trocar por `.jn-pe` e
     escrever que a trilha era um proxy quebrado.

     ⭐ Metade disso é verdade. A trilha É um proxy: ela nunca foi a razão de
     nenhuma destas regras — era o bilhete de identidade das telas do stepper,
     que por acaso eram as únicas com barra a pinar.

     📌 Mas a outra metade continua de pé, e foi o que me fez parar: DUAS das
     quatro telas que a nota exclui continuam excluídas. O Alan pediu a barra
     fixa nas de EDIÇÃO DO TIPO, e não em «Meus dados» nem em «Faturamento».
     Trocar o marcador por `.jn-pe` mudava quatro telas para atender duas.

     ⭐ Então o marcador novo é EXPLÍCITO: `.jn-pe-fixa`, posto nos dois
     templates de edição. Ele diz o que a regra quer — «esta barra pina» — em
     vez de adivinhar por um vizinho.

     ⭐ DÍVIDA PAGA em 03/09/2026. Aqui esteve escrito que eram DOIS marcadores
     para UM comportamento, e que o certo seria dar o `.jn-pe-fixa` aos templates
     do stepper e apagar o `.jn-trilha`. Foi feito: os quatro templates com barra
     põem a classe, e estas regras têm um marcador só.

     📌 A dívida foi nomeada no mesmo commit em que foi criada, e paga duas
     horas depois. Escrevê-la foi o que a fez ser paga — uma dívida que ninguém
     anota não é encontrada por quem vem depois: é herdada.

     ⚠️⚠️ E ANTES DE APAGAR ESTE MARCADOR, LEIA ISTO — ele NÃO segura só a
     barra de ações.

     Segura o bloco inteiro do celular para estas telas: a altura de `100dvh`,
     o `overflow: hidden` que tira a rolagem do `body`, o miolo que passa a ser
     o único a rolar, o menu que deixa de ser `fixed` e vira o último irmão, e
     a topbar que sai do `sticky`. Tirar o marcador não deixa a barra solta:
     devolve a tela inteira ao comportamento antigo, de uma vez, e nas telas
     que já estavam certas.

     ⭐ Isto quase aconteceu em 03/09/2026: uma frente ia unificar o marcador
     apagando o antigo ANTES de as barras da quarta tela terem sido içadas — e
     aquela tela teria perdido o bloco todo, não só a barra. Quem viu foi ela
     própria, ao contar as `.jn-pe` por arquivo a pedido de outra frente. **A
     dependência existia e não estava escrita em lugar nenhum: está agora.**

     📌 E o comentário mora AQUI e não na regra da barra de propósito: quem vai
     apagar um marcador abre a regra que o define, e não as que o usam. */
  /* ⛔⛔ O DEGRAU DE ALTURA, 05/09/2026 — ordem do Alan: «conserte as 5 telas».
     ⭐ *Abaixo de certa altura a tela deixa de ser aplicativo e vira PÁGINA:
     rola inteira, e a barra de ações vai no fim do conteúdo em vez de grudada.*
     Foi essa a descrição que ele aprovou, e é este bloco que a cumpre.

     O QUE ELE CONSERTA, medido por acto (`elementFromPoint` no centro do botão,
     sem rolar e depois de rolar até ao fim) nas cinco telas com barra pinada:

         844x330  o 13 deitado com as barras do Safari .... ⛔ coberto
         667x300  o SE deitado com as barras .............. ⛔ coberto
         844x390  o 13 deitado sem barras ................. ok

     ⚠️ E não era corte: era COBERTURA. O `main` encolhe — pode, tem
     `min-height: 0` —, a barra dentro dele mede 87 e não encolhe, transborda o
     pai, e o `nav.mk-baixo` vem a seguir com `z-index: 60` e pinta por cima. A
     coluna somava 358 num corpo de 330 com `overflow: hidden`, e o `hidden`
     é o que faz não haver rolagem que traga o botão de volta.

     ⭐⭐ E o pior não era «não se alcança»: era que os DOIS EXTREMOS do gesto
     falhavam. Sem rolar, o botão está sob o menu; rolando até ao fim, está sob
     o cabeçalho. Só uma posição do meio o entregava — a que um dedo não sabe
     procurar. **Difícil de um modo que parece impossível.**

     ═══ POR QUE 520, e não 480 nem 560 ═══

     O limiar medido de 4 em 4 px, nas quatro larguras:

         390 e 375 (em pé) ....  cabe a 484, perde a 480
         844 e 667 (deitado) ..  cabe a 364, perde a 360

     ⛔ 480 é onde QUEBRA, não onde é seguro — o degrau tem de ficar acima do
     pior caso, e o pior caso é 484. ⭐ 520 dá 36px de folga sobre ele.

     ⚠️ E o teto do degrau é o que eu mais temi, porque estragar o que funciona é
     pior do que não consertar: um iPhone SE em pé com as barras do Safari fica
     acima dos 550, e o 13 acima dos 670. **Os dois continuam em modo
     aplicativo, com a barra grudada, que é o que a arquitetura lhes dá.** Só o
     deitado — e um telefone antigo muito curto — cai em modo página.

     ⚠️⚠️ E REPARE NO QUE FICA DE FORA DO DEGRAU, logo abaixo: as regras que
     TIRAM coisas do `fixed` valem em TODAS as alturas. Só as que CONSTROEM o
     aplicativo — a altura de `100dvh`, o `overflow: hidden`, o miolo como único
     a rolar — é que ficam atrás dele. Pô-las todas juntas devolvia o menu ao
     `position: fixed` em modo página, e ele voltava a cobrir o fim da página —
     que é onde a barra de ações passa a estar. **O conserto teria reposto o
     defeito por outra porta.** */
  @media (min-height: 520px) {
  body:has(.jn-pe-fixa) {
    height: 100dvh;
    display: flex;
    flex-direction: column;
    overflow: hidden;
  }

  body:has(.jn-pe-fixa) > main.app-shell {
    /* `min-height: 0` é o que faz o miolo poder ENCOLHER: sem ele um filho flex
    não desce abaixo do seu conteúdo, o `overflow-y` nunca chega a valer, e a
    página volta a rolar toda — com as barras a passear junto. */
    /* ⚠️ `main.app-shell` E NÃO SÓ `main`, e a razão é medida e não estética.
    Há uma regra vizinha — `main.app-shell:has(> .mk-rodape-legal)` — com
    `min-height: 100vh` e `padding-bottom: 115px`. Ela ganha a um `main` nu por
    especificidade, e com ela o miolo não encolhe: medido a 375×812, ele saía
    com 812 de altura e EMPURRAVA as duas barras para fora do ecrã — a de ações
    a começar em 876 e o menu em 939, os dois abaixo da dobra. A tela parecia
    inteira e o `Confirmar` não existia.
    ⭐ E repare no que o `padding-bottom: 115px` é: o espaço reservado para o
    menu ENQUANTO ELE ERA `fixed` — o número que este desenho existe para não
    precisar. Aqui ele vai a zero, e é essa a prova de que a ordem de irmãos
    dispensa a aritmética em vez de a esconder. */
    /* ⚠️ `gap: 0` — e a razão inteira, porque este número tem história.
    O `.app-shell` leva `gap: 14px` de `styles.css:1312`, escrito para uma
    GRADE (`grid-template-columns: 1fr` na mesma linha) e para separar a
    LATERAL do conteúdo quando ela empilhava por cima dele no celular.

    ⛔ Hoje esse par não existe: a lateral é `display: none` no celular
    (`produto.css:2777`) e o `.app-shell` deixou de ser grade — o
    `grid-template-columns` ficou INERTE e o `gap` não, porque vale em flex.
    Medido: nas telas do fluxo o `main` tem exactamente DOIS filhos visíveis,
    o miolo e a barra, e os 14px caem entre eles.

    📌 O que custava: no estado crítico da `confirmar` a 375×390 sobravam 42px
    para o miolo e ele media 28 — o `gap` comia um terço do que restava, numa
    tela em que o cliente veio confirmar, não pode, e precisa de perceber
    porquê.

    ⚠️ E por isso vai a ZERO só AQUI, e não na regra de origem: fora do fluxo
    o mesmo `gap` ainda separa o `.app-content` do rodapé legal, entre 701 e
    1079px, e apagá-lo lá mexeria em telas que ninguém pediu para olhar. */
    gap: 0;
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    height: auto;
    min-height: 0;
    padding-bottom: 0;
    overflow: hidden;
    /* quem rola é o miolo, não o `main` */
  }
  /* ⚠️ A BARRA É FILHA DO `main` E NÃO IRMÃ DELE — mudou de sítio em 03/09.
     Fora do `main` ela servia o celular e PARTIA o computador: perdia a coluna
     do conteúdo e os botões iam para os cantos da janela, por cima do rodapé.
     Aqui os dois modos usam a mesma propriedade — o `main` é coluna de altura
     limitada, o miolo é o único com `overflow-y`, e a barra vem a seguir sem
     encolher. */
  body:has(.jn-pe-fixa) main.app-shell > .app-content { flex: 1 1 auto; min-height: 0; overflow-y: auto }
  body:has(.jn-pe-fixa) main.app-shell > .jn-pe,
  body:has(.jn-pe-fixa) > .mk-baixo { flex: 0 0 auto }
  }
  /* ⭐ FIM DO DEGRAU. Daqui para baixo vale nas duas alturas, e é de propósito:
     são as regras que tiram peças do `fixed` e as põem no fluxo. Em modo página
     elas são ainda MAIS necessárias do que em modo aplicativo. */
  /* O rodapé legal não entra na pilha do celular: são três barras num ecrã de
     812, e a terceira come o miolo. Ele já vive no menu de baixo. */
  body:has(.jn-pe-fixa) .mk-rodape-legal { display: none }
  body:has(.jn-pe-fixa) > .mk-baixo { position: static; inset: auto }
  /* A topbar deixa de precisar do `sticky`: irmão do meio que rola é o `main`,
     e ela está fora dele. ⚠️ `sticky` e `fixed` não são a mesma palavra trocada
     — o `sticky` ocupa lugar no fluxo e o `fixed` sai dele —, e aqui não é
     preciso nenhum dos dois. */
  body:has(.jn-pe-fixa) .site-header { position: static }

  /* ⚠⚠ A FAIXA DO CONSENTIMENTO COBRIA A BARRA DE AÇÕES, e isso é defeito —
     não uma decisão a rever. A regra escrita ao lado é literal:

       «nenhuma ação primária fica atrás de um aviso»

     e «por cima das duas barras» ali quer dizer MAIS ALTO NA PILHA, não
     sobreposto. Medido a 390×844, antes: a faixa começa em 600, a barra corre
     de 668 a 755 — o «Salvar» inteiro atrás do aviso.

     ⚠ E não é só das minhas telas: medi o stepper na mesma largura e a barra
     dele (769–832) também ficava atrás. A pilha nunca tinha sido aplicada a
     NENHUMA das duas famílias; eu só a encontrei porque as minhas telas eram
     novas e eu fui olhar.

     📌 O MECANISMO É O QUE JÁ EXISTE, e não um segundo: `body:has(.mk-consentimento)`
     com o mesmo par 138/258 que o rodapé legal e o aviso de salvo já usam. Conferi
     que o número serve antes de o reusar — a faixa mede 244px a 390, e a regra
     abaixo de 560 reserva 258. Sobram 14 de folga.

     ⚠ Por que `padding-bottom` no `body` e não `bottom` na barra: a barra não é
     `fixed` — ela é item de uma coluna. Encurtar a coluna sobe as duas barras
     de uma vez, e o menu também não deve ficar atrás do aviso. Com
     `box-sizing: border-box` e `height: 100dvh`, o recuo tira do que sobra. */
  body:has(.jn-pe-fixa):has(.mk-consentimento) { padding-bottom: 138px }

  /* ⚠⚠ O DEGRAU DOS 560 TEM DE VIR DEPOIS, e eu tinha-o posto antes.
     Escrevi-o junto das regras vizinhas que já usam o par 138/258 — o que
     parecia arrumação — e as duas ficaram com a MESMA especificidade em
     ficheiro, com a larga mais abaixo. Resultado medido a 390: o `body` levava
     138 onde devia levar 258, e a barra continuava atrás da faixa.

     📌 Uma regra mais específica na INTENÇÃO não ganha por isso. Aqui as duas
     dizem `body:has(...)`: quem decide é a ordem, e a ordem tem de seguir o
     degrau, não a arrumação temática. É a sexta vez hoje que a ordem decide
     sobre a intenção. */
  /* ⛔⛔ E O ALCANCE DA REGRA ESTAVA ERRADO, medido a 05/09/2026 na
     `/support/close/<token>/`. A razão escrita acima é universal —

       «nenhuma ação primária fica atrás de um aviso»

     — e o seletor não era: pedia `.jn-pe-fixa`, que é a família do fluxo. A
     tela de fechar o chamado não pertence a ela, levava `padding-bottom: 0`, e
     a faixa cobria o «Fechar o chamado» inteiro.

     ⚠️⚠️ E É A TELA QUE CHEGA PELO E-MAIL, a quem pode nem ter sessão — ou seja,
     exatamente quem vê a faixa pela primeira vez. Medido anónimo, a 844×330: a
     faixa corre de 206 a 330, o botão está em 213. Em pé escapava por sorte.

     📌 A regra abaixo é a mesma, sem o prefixo da família. A do fluxo continua
     a existir logo acima e continua a ganhar, porque `:has()` duplo é mais
     específico — e ali o recuo tem outro efeito, que é encurtar a coluna de
     `100dvh` em vez de acrescentar espaço de rolagem. */
  body:has(.mk-consentimento) { padding-bottom: 138px }

  /* ⛔⛔ O DEGRAU DO MEIO, QUE FALTAVA NA CASA INTEIRA — e não é só da minha
     tela: a regra do fluxo tinha o mesmo vão. Medida a altura da faixa contra
     a folga reservada:

         largura   faixa   reservado
            320     248      258   ok
            390     227      258   ok
            560     186      258   ok
         ⛔ 561     186      138   FALTA 48
         ⛔ 640     145      138   FALTA 7
         ⛔ 720     145      138   FALTA 7
            740     124      138   ok
           1079     124      138   ok

     O degrau dos 560 foi escolhido quando ninguém tinha medido a banda de 561
     a 739 — e nela a faixa mede até 186 contra 138 de folga. ⭐ 198 cobre o
     pior caso com 12 de margem, que é a mesma margem que a casa já se deu no
     degrau de baixo (244 contra 258, 14 de folga).

     ⚠️ E a ORDEM importa mais do que a arrumação: os três degraus vão do mais
     largo para o mais estreito, porque têm todos a mesma especificidade e quem
     decide é o último que casa. Pôr o de 560 antes do de 739 dava 198 onde
     devia dar 258 — foi exatamente o engano que o comentário acima conta. */
  @media (max-width: 739px) {
    body:has(.mk-consentimento),
    body:has(.jn-pe-fixa):has(.mk-consentimento) { padding-bottom: 198px }
  }
  @media (max-width: 560px) {
    body:has(.mk-consentimento),
    body:has(.jn-pe-fixa):has(.mk-consentimento) { padding-bottom: 258px }
  }
}

/* ── A TELA «CONFIRMAR»: as larguras da prancha ──────────────────────────────
   Item 5 do Alan: «a tabela não ocupa a largura integral em ecrã cheio, e o
   Nome do pedido também não. Respeitar a proporção da prancha.»

   Os números são os da ficha `TELA-4-CONFIRMAR.md`, medidos na prancha
   publicada: bloco central 1150, campo do nome 520.

   ⚠️ 1150 e não 680 como a tela 2, e a ficha diz porquê: «a tela 2 estreita
   porque tinha duas frases longas; aqui há uma TABELA, e uma tabela estreita
   força quebras que a leitura não pede».

   ⭐ E o campo é o único elemento estreito da tela, de propósito — a ficha
   outra vez: «um nome de pedido tem cinco palavras, e um campo de 1150px
   convida a escrever um parágrafo. A largura é a promessa do tamanho da
   resposta.» */
/* ⚠ O PREFIXO `body:has(.jn-trilha)` SAIU daqui, e não foi trocado por outro:
   `.jn-confirmar` só existe no `confirmar.html`, que é uma tela do fluxo. O
   prefixo era cinto e suspensórios sobre uma classe que já é única.

   📌 E é por isso que ele NÃO virou `.jn-pe-fixa`: trocar um marcador
   redundante por outro sugeriria que esta regra tem a ver com a barra pinada,
   e ela não tem — é a largura do miolo da tela de confirmar. */
.jn-confirmar .jn-meio { max-width: 1150px }
/* ⚠ O par da regra de cima: as duas são de topo e as duas casam. Ver lá a
   razão e as duas datas. */
.jn-confirmar .mk-rotulo-pedido { max-width: none }

/* O aviso do saldo insuficiente, DENTRO da barra de ações e não solto por baixo.
   Fica entre o `Voltar` e o `Confirmar`, que é a ordem da prancha.

   ⚠️⚠️ E ele COLA-SE AO BOTÃO — pedido do Alan, 04/09/2026: «Falta 1 crédito
   para enviar este pedido. Comprar créditos → alinhar à direita, junto do
   botão». A razão lê-se sozinha: o aviso é sobre o botão, diz por que ele não
   vai funcionar. Colados, os dois lêem-se juntos.

   ⛔ E o `margin: 0 auto 0 12px` de antes fazia o CONTRÁRIO do que o comentário
   dizia. O `auto` estava à DIREITA, e empurrava o aviso para a ESQUERDA — o
   `text-align: right` só alinha o texto DENTRO da caixa, e por isso a coisa
   parecia certa. Medido a 1440, antes:

       Voltar termina em 363  ·  aviso 387→745  ·  primario 1192→1408
       ou seja: 447px de buraco entre o aviso e o botao que ele explica

   Os dois `auto` — o do aviso à direita e o do primário à esquerda — repartiam
   o vão ao meio, 217,6 para cada. **A emenda é inverter o do aviso e desligar
   o do primário quando há aviso**, e não acrescentar nada.

   ⚠️ Só do degrau do celular para cima: abaixo de 700 o aviso vai para fila
   própria, por cima dos botões, e essa regra é da frente do desenho. */
.jn-pe .jn-pe-aviso {
  margin: 0 auto 0 12px;
  font-size: .86rem;
  line-height: 1.35;
  text-align: right;
}
/* ⚠⚠ E a tinta NÃO é a do erro. A `Passo4Confirmar` desenha esta frase em
   `--texto-fraco`, 13px, peso 400 — e não em vermelho. Faz sentido: não é um
   erro, é uma nota ao lado de um botão apagado, a dizer porquê.

   ⛔ E o vermelho da `.mk-erro` é `#9a2b2b` à mão, sem par no escuro. Medido
   sobre `--papel` escuro (`#05102C`): **2,47**. O piso da 1.4.3 é 4,5.
   ***A frase que diz «não tens saldo» era a menos legível da tela.***
   Com `--texto-fraco`: **6,40 no claro e 12,47 no escuro** (no escuro ele
   resolve-se a `rgb(213,210,205)`, que é o par que o vermelho nunca teve).

   ⚠ Só aqui, e não na `.mk-erro`: ela é a classe do erro de formulário e
   noutros sítios o vermelho é a coisa certa. O que estava errado era esta
   frase usar a classe do erro para dizer uma coisa que não é erro. */
.jn-pe .jn-pe-aviso.mk-erro { color: var(--texto-fraco) }
@media (min-width: 701px) {
  .jn-pe .jn-pe-aviso { margin: 0 0 0 auto }
  .jn-pe:has(.jn-pe-aviso) .primary { margin-left: 12px }
}

/* ── A BARRA DA `CONFIRMAR` NAS DUAS LARGURAS ────────────────────────────────
   Medida e desenho da frente do desenho; decisão do Alan, 04/09/2026.

   ⚠️⚠️ O gabarito tem UMA ordem e as duas larguras querem duas. Quem as concilia
   é o `order` — e para o `order` valer, os botões têm de ser filhos DIRETOS do
   flex. No computador o invólucro sai do caminho com `display: contents`. */
@media (min-width: 701px) {
  .jn-pe-botoes { display: contents }
  .jn-pe-celular .jn-voltar { order: 1 }
  .jn-pe-celular .jn-pe-aviso { order: 2 }
  .jn-pe-celular .primary { order: 3 }
  .jn-pe-curto { display: none }
}

/* ⚠️ 700 e não outro número: é o degrau único do produto — a coluna única, o
   rodapé legal e o tamanho da foto mordem todos lá. Está na
   `design/REGRA-DO-CELULAR.md`. */
@media (max-width: 700px) {
  .jn-pe-celular { flex-direction: column; align-items: stretch; gap: 10px }
  .jn-pe-celular .jn-pe-aviso { width: 100%; text-align: center; margin: 0 }
  .jn-pe-botoes { display: flex; gap: 10px }
  .jn-pe-botoes .button { flex: 1 1 0; margin-left: 0 }
  /* ⚠️ 30% e não os 20% do computador, e a razão é medida: a 390 os 20% dão 73
     e o «Voltar» com a seta não cabe. Com 30% são 110 contra 248 do primário. */
  .jn-pe-botoes .jn-voltar { flex: 0 0 30% }
  .jn-pe-longo { display: none }
}

/* ⚠⚠ `.table-link` NÃO TINHA COR NENHUMA fora de uma tabela, e por isso saía com
   o azul PREDEFINIDO DO NAVEGADOR. A única regra que lhe dava tinta era
   `.compact-datatable td .table-link`, em `styles.css` — e nenhum dos seis
   sítios que usam a classe hoje está dentro de uma `compact-datatable`:

       acompanhar · base · confirmar · resultado · tipo_detalhe · tipo_novo

   Medido: `rgb(0, 0, 238)` no claro e `rgb(158, 158, 255)` no escuro — as duas
   são do navegador e nenhuma é token nosso. A `Passo4Confirmar` desenha o
   «Comprar créditos» em `--acento-escuro`, peso 500, sem sublinhado.

   📌 É uma classe batizada com o nome de um aspecto que ela só tinha num sítio.
   O aspecto ficou preso ao sítio; o nome viajou. */
/* ⚠ O PESO NÃO ENTRA AQUI, e a razão é uma medida que me apanhou:
   eu tinha posto `font-weight: 500` a partir do «Comprar créditos» da
   `Passo4Confirmar` — e a `Passo5Acompanhar` desenha o «← Meus pedidos», que é
   a MESMA classe, com 400. Um peso só não serve os dois, e o que eu fiz foi
   generalizar a partir de um exemplo. Sem declaração, cada sítio herda o seu. */
.table-link { color: var(--acento-escuro); text-decoration: none }
/* O «Comprar créditos» da barra, esse é 500 na prancha. */
.jn-pe .jn-pe-aviso .table-link {
  margin-left: 6px;
  white-space: nowrap;
  font-weight: 500;
}
.table-link:hover { color: var(--marinho); text-decoration: underline;
  text-underline-offset: 2px }

/* ===== os alvos de toque do celular (prancha «Alvos de Toque no Celular»,
   03/09/2026) =====

   ⭐ O que esta prancha corrige NÃO é conformidade com norma nenhuma. O piso de
   44px que aparece por aqui não é decisão da casa sobre toque: o
   SISTEMA-DE-DESIGN §4 tem «altura de controle (botão): 44px» como medida de
   DESENHO copiada da prancha, e na mesma tabela o item de menu é 40 de
   propósito. Coincide com o piso da Apple. O que a prancha argumenta é outra
   coisa, e é verdade sem norma: o botão que APAGA a foto está a 16px do que se
   quer carregar, e é o MENOR dos dois. Segurança, não conformidade.

   ⚠ E os «39 elementos abaixo de 44» eram uns dez. Cinco eram o `skip-link`,
   que vive fora da tela; dezasseis falhavam por um pixel de arredondamento; e
   um era o `<input>` de 13×13 dentro de um `<label>` de 308×42 — o alvo é o
   rótulo inteiro, e a primeira medida tinha lido o ELEMENTO em vez do ALVO.
   Só sobrou o que está aqui embaixo. */
@media (max-width: 700px) {

  /* 1 · MEUS DADOS, a foto — proposta B da prancha, escolhida pelo Alan.
     O ✕ sai de junto do «Trocar a foto» e vira um selo no canto da PRÓPRIA
     foto: fica ligado ao objeto que apaga, e sai da linha do botão comum.

     ⚠ A prancha desenhou a foto quadrada e o selo encostado no canto da caixa.
     A foto é REDONDA, e um selo encostado no canto da caixa de um círculo fica
     quase todo fora dele — que é o contrário de «sobre a foto». Com `right: 0;
     bottom: 0` o centro do selo cai a 38px do centro de uma foto de 84 (raio
     42): dentro do círculo, atravessando a borda. É a leitura da prancha para
     um alvo que ela não desenhou redondo.

     ⚠ E o selo continua SEM RÓTULO — reconhece-se pelo sítio, não pela
     palavra. É por isso que ele passa pelo modal, e o Alan confirmou-o em
     03/09 às 20:00: «para pedir confirmação sim». O pedido já existia
     (`data-confirmar`, D-257) e continua a ser o mesmo. */
  .md-foto .mk-avatar-g { width: 84px; height: 84px; font-size: 1.7rem }
  .md-tirar {
    top: auto; bottom: 0; right: 0; width: 30px; height: 30px;
  }
  .md-tirar svg { width: 15px; height: 15px }
  /* 130×44, e a 16px da foto — os dois discos de 44 deixam de se sobrepor,
     que é a conta inteira desta correção. */
  .md-foto { gap: 0 16px }
  .md-foto > .button { width: 130px; min-height: 44px }

  /* 2 · MEUS PEDIDOS, os filtros — quatro controles empilhados, e crescer um
     empurrava três. Os dois seletores passam a ficar LADO A LADO, e a pilha
     encurta ao mesmo tempo que todos os alvos sobem para 44:

         hoje ....  41+12+34+10+34+10+37  =  178px
         agora ...  44+12+44+12+44        =  156px   ⭐ 22px mais curta

     ⭐ «Um alvo maior empurra o vizinho» era verdade na vertical. Na
     horizontal havia espaço parado. */
  .mk-busca input { min-height: 44px }
  .mk-filtros { gap: 12px }
  /* `calc(50% - 6px)` é metade da linha menos metade da folga: a 390 dá
     exatamente os 173 da prancha, e continua certo em qualquer largura. */
  .mk-filtros select { flex: 1 1 calc(50% - 6px); min-height: 44px }
  /* ⚠ O `space-between` é meu, e não da prancha: ela desenhou os três da
     mesma largura e não disse onde fica a seta. Ao alargar o botão para 173
     eu criei o desalinhe — os dois seletores em cima levam a seta à borda
     direita, e este ficava com ela colada ao texto, no meio de uma caixa
     igual às outras. É consequência da medida que me mandaram fazer, não
     desenho novo. */
  .mk-ord-bt { flex: 0 0 calc(50% - 6px); min-height: 44px;
    justify-content: space-between }

  /* 3 · CRÉDITOS, o extrato — em largura não cabe, em altura cabe com folga.
     Os dois seletores somam 308 numa tela de 390: crescer em largura está
     fora de questão. Então a folga sai da LARGURA deles e a altura sobe.

         hoje ....  150 + 8 + 150 = 308,  altura 40
         agora ...  148 + 12 + 148 = 308,  altura 44   ⭐ mesma soma

     ⚠ Os 148 não vão escritos: `flex: 1` com folga de 12 dá 148 numa tela de
     390 e continua a dar a metade certa nas outras. Uma largura fixa aqui
     seria a medida de UMA tela transcrita para todas. */
  .cr-filtros {
    width: 100%;
    display: grid;
    grid-template-columns: 1fr 1fr;
    flex: 1 1 100%;
    gap: 12px;
  }
  .cr-filtros select {
    flex: 1;
    min-height: 44px;
  }
}
