/* PreservaCred — ficha de empresa do Explorador de CNPJ (pública + painel).
   Padrão: densidade de terminal financeiro com a clareza do design system. */

/* ============================== Faixa de indicadores (elemento certo por métrica)
   Grade de cartões alinhados: rótulo em cima · corpo no meio · sub embaixo, em
   linhas de posição FIXA — cards de conteúdos diferentes ficam alinhados. */
.indic-row {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: var(--sp-3); margin-bottom: var(--sp-6); align-items: stretch;
}
/* O cartão de situação cadastral (o mais importante) ocupa mais largura
   e puxa a atenção primeiro. A faixa tem de 4 a 7 cartões ("Dívida total na RJ"
   e "Interesse recente" só aparecem quando há dado) — cada contagem tem seu
   template para a grade ficar sempre cheia, sem coluna órfã. */
@media (min-width: 720px) {
  .indic-row--7 { grid-template-columns: 1.4fr 1fr 1fr 1fr 1fr 1fr 1fr; }
  .indic-row--6 { grid-template-columns: 1.6fr 1fr 1fr 1fr 1fr 1fr; }
  .indic-row--5 { grid-template-columns: 1.6fr 1fr 1fr 1fr 1fr; }
  .indic-row--4 { grid-template-columns: 1.6fr 1fr 1fr 1fr; }
}
/* 5–7 KPIs viram 3 colunas em telas médias (evita tiles espremidos) */
@media (max-width: 1080px) and (min-width: 561px) {
  .indic-row--7, .indic-row--6, .indic-row--5 { grid-template-columns: repeat(3, 1fr); }
}
.indic {
  display: grid; grid-template-rows: auto 1fr auto; gap: var(--sp-2);
  background: var(--pc-bg-0); border: var(--hairline); border-radius: var(--r-lg);
  box-shadow: var(--shadow-1); padding: var(--sp-4); min-width: 0;
  text-decoration: none; color: inherit;
}
.indic-link { transition: border-color var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast); }
.indic-link:hover { border-color: var(--pc-petrol-300); box-shadow: var(--shadow-2); transform: translateY(-1px); text-decoration: none; }
.indic-rotulo {
  font-size: var(--fs-xs); font-weight: 650; text-transform: uppercase;
  letter-spacing: .07em; color: var(--pc-ink-400);
  line-height: 1.2; overflow-wrap: break-word;
}
.indic-corpo { display: flex; flex-direction: column; justify-content: center; gap: var(--sp-2); min-width: 0; }
.indic-sub { font-size: var(--fs-xs); color: var(--pc-ink-400); line-height: 1.3; overflow-wrap: break-word; }

/* -- semântica de cor por nível (variável local herdada pelos elementos) -- */
.ind-ok      { --ind-c: var(--pc-success-600); --ind-bg: var(--pc-success-100); }
/* aviso (RJ/RE) = âmbar/terracota, NÃO dourado — dourado é reservado a
   paywall/planos/premium (tokens.css). Corrige a colisão semântica do selo. */
.ind-warn    { --ind-c: var(--pc-warning-700); --ind-bg: var(--pc-warning-100); }
.ind-danger  { --ind-c: var(--pc-danger-700);  --ind-bg: var(--pc-danger-100); }
.ind-info    { --ind-c: var(--pc-info-600);     --ind-bg: var(--pc-info-100); }
.ind-neutral { --ind-c: var(--pc-ink-400);      --ind-bg: var(--pc-bg-100); }

/* (a) SELO — grande e inequívoco (situação de insolvência) */
.indic-destaque { border-left: 4px solid var(--ind-c); }
.indic-selo { display: inline-flex; align-items: center; gap: var(--sp-2); min-width: 0; }
.indic-selo-dot {
  width: 12px; height: 12px; border-radius: var(--r-full); flex: none;
  background: var(--ind-c); box-shadow: 0 0 0 4px var(--ind-bg);
}
.indic-selo-txt {
  font-weight: 750; font-size: var(--fs-h4); line-height: 1.15;
  color: var(--pc-ink-900); letter-spacing: -0.01em; overflow-wrap: break-word;
}
.indic-destaque .indic-selo-txt { color: var(--ind-c); }

/* (b) BADGE com dot colorido (situação cadastral) */
.indic-badge {
  display: inline-flex; align-items: center; gap: 7px; align-self: flex-start;
  padding: 4px 10px; border-radius: var(--r-full);
  background: var(--ind-bg); color: var(--ind-c);
  font-weight: 700; font-size: var(--fs-sm); line-height: 1.2; max-width: 100%;
}
.indic-badge-dot { width: 8px; height: 8px; border-radius: var(--r-full); background: var(--ind-c); flex: none; }

/* (c) NÚMERO grande (porte, idade, interesse) */
.indic-numero { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.indic-num-v {
  font-weight: 750; font-size: var(--fs-h3); line-height: 1.05;
  color: var(--pc-ink-900); letter-spacing: -0.02em; font-variant-numeric: tabular-nums;
}
.indic-num-sfx { font-size: var(--fs-sm); font-weight: 600; color: var(--pc-ink-500); letter-spacing: normal; }
.indic-tend { font-size: var(--fs-body); font-weight: 700; line-height: 1; }
.ind-tend-up   { color: var(--pc-success-600); }
.ind-tend-down { color: var(--pc-danger-600); }
.ind-tend-flat { color: var(--pc-ink-300); }

/* (d) SEMÁFORO (3 luzes) — disponível para métricas de estado triplo */
.indic-semaforo { display: inline-flex; gap: 5px; align-items: center; margin-bottom: 4px; }
.indic-semaforo .sf { width: 11px; height: 11px; border-radius: var(--r-full); background: var(--pc-line-200); opacity: .35; }
.indic-semaforo .sf.on { opacity: 1; }
.indic-semaforo .sf-danger.on { background: var(--pc-danger-600); }
.indic-semaforo .sf-warn.on   { background: var(--pc-gold-600); }
.indic-semaforo .sf-ok.on     { background: var(--pc-success-600); }
.indic-valor { font-weight: 700; font-size: var(--fs-body); color: var(--pc-ink-900); line-height: 1.2; }

/* (e) BARRA — o único "medidor" que sobrou (gauge.php reencaminha para cá) */
.indic-barra { display: block; height: 6px; border-radius: var(--r-full); background: var(--pc-line-100); overflow: hidden; margin-top: 4px; }
.indic-barra-fill { display: block; height: 100%; border-radius: var(--r-full); background: var(--ind-c); }

/* ============================== Ícones de linha */
.icn { width: 16px; height: 16px; flex: none; color: var(--pc-petrol-500); vertical-align: -3px; }
.icn-lg { width: 18px; height: 18px; }

/* ============================== Cadastro RFB compacto (2 colunas com ícones) */
/* align-items:start impede o card mais curto de esticar (o buraco de ~90-120px
   no rodapé do card direito). Carimbo RFB ÚNICO ocupa a linha inteira embaixo. */
/* Row-gap = column-gap: quando a grade colapsa para 1 coluna (≤900px) os dois
   cards ficavam a 12px um do outro, apertados contra o respiro de 32px que
   separa as SEÇÕES — a hierarquia lia ao contrário. */
.rfb-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-5);
  align-items: start;
}
.rfb-grid .rfb-stamp { grid-column: 1 / -1; margin-top: var(--sp-1); }
@media (max-width: 900px) { .rfb-grid { grid-template-columns: 1fr; } }
.info-list { list-style: none; padding: 0; margin: 0; }
.info-list li {
  display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: var(--sp-3);
  padding: var(--sp-3) 0; border-bottom: var(--hairline); align-items: start;
}
.info-list li:last-child { border-bottom: 0; }
.info-list .icn { margin-top: 2px; }
.info-list .il-label {
  display: block; font-size: var(--fs-xs); font-weight: 650; text-transform: uppercase;
  letter-spacing: .07em; color: var(--pc-ink-400); margin-bottom: 1px;
}
.info-list .il-value { font-size: var(--fs-sm); color: var(--pc-ink-900); overflow-wrap: anywhere; }
.info-list .il-value .mono { font-size: var(--fs-sm); }
.info-list .il-note {
  display: block; margin-top: 2px; font-size: var(--fs-xs);
  color: var(--pc-ink-500); line-height: 1.4; max-width: 52ch;
}

/* CNAEs secundários: disclosure nativo + carregamento lazy por CNPJ. O item
   ocupa as duas subcolunas para a lista abrir sem criar um "buraco" no bento. */
.info-list--2col > .info-list__cnae--expandable { grid-column: 1 / -1; }
.cnae-secondary { margin-top: var(--sp-2); }
.cnae-secondary > summary {
  cursor: pointer; list-style: none; display: inline-flex; align-items: center;
  gap: var(--sp-2); min-height: 28px; color: var(--pc-petrol-600);
  font-size: var(--fs-xs); font-weight: 650; border-radius: var(--r-sm);
}
.cnae-secondary > summary::-webkit-details-marker { display: none; }
.cnae-secondary > summary:hover > span:first-child { text-decoration: underline; }
.cnae-secondary > summary:focus-visible { outline: none; box-shadow: var(--ring-focus); }
.cnae-secondary__count {
  min-width: 22px; padding: 1px 7px; border-radius: var(--r-full);
  background: var(--pc-petrol-100); color: var(--pc-petrol-700);
  text-align: center; font-variant-numeric: tabular-nums;
}
.cnae-secondary__count[hidden] { display: none; }
.cnae-secondary__chev {
  width: 7px; height: 7px; margin: -3px 2px 0 1px;
  border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
  transform: rotate(45deg); transition: transform var(--t-fast);
}
.cnae-secondary[open] .cnae-secondary__chev {
  margin-top: 3px; transform: rotate(225deg);
}
.cnae-secondary__state {
  display: flex; align-items: center; gap: var(--sp-2);
  margin: var(--sp-2) 0 0; padding: var(--sp-3);
  color: var(--pc-ink-500); font-size: var(--fs-xs); line-height: 1.45;
  background: var(--pc-bg-50); border: var(--hairline); border-radius: var(--r-md);
}
.cnae-secondary__state[hidden] { display: none; }
html:not(.js) .cnae-secondary__state.is-loading { display: none; }
.cnae-secondary__state.is-error { color: var(--pc-danger-700); }
.cnae-secondary__spinner {
  width: 14px; height: 14px; flex: none; border-radius: 50%;
  border: 2px solid var(--pc-petrol-100); border-top-color: var(--pc-petrol-600);
  animation: cnae-secondary-spin .75s linear infinite;
}
@keyframes cnae-secondary-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .cnae-secondary__spinner { animation: none; border-top-color: var(--pc-petrol-100); }
}
.cnae-secondary__list {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--sp-2); list-style: none; margin: var(--sp-2) 0 0; padding: var(--sp-3);
  background: var(--pc-bg-50); border: var(--hairline);
  border-radius: var(--r-md);
}
.cnae-secondary__list[hidden] { display: none; }
.info-list .cnae-secondary__item {
  display: grid; grid-template-columns: minmax(68px, auto) minmax(0, 1fr);
  gap: var(--sp-2); align-items: baseline; padding: var(--sp-2);
  border: 0; border-radius: var(--r-sm); background: var(--pc-bg-0);
}
.cnae-secondary__item:only-child { grid-column: 1 / -1; }
.cnae-secondary__code {
  color: var(--pc-petrol-700); font-size: var(--fs-xs); font-weight: 650;
  font-variant-numeric: tabular-nums;
}
.cnae-secondary__desc {
  color: var(--pc-ink-700); font-size: var(--fs-xs); line-height: 1.45;
  overflow-wrap: anywhere;
}
@media (max-width: 640px) {
  .cnae-secondary__list { grid-template-columns: 1fr; }
  .info-list .cnae-secondary__item {
    grid-template-columns: 1fr; gap: 2px; align-items: start;
  }
}

/* QSA + localização lado a lado */
.qsa-map-grid {
  display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, .75fr);
  gap: var(--sp-5); align-items: start;
}
/* Sem QSA materializado: a Localização ocupa a linha inteira (a nota de sócios
   vira uma linha compacta dentro do card do mapa) — nada de card vazio 5/12. */
.qsa-map-grid--sem-qsa { grid-template-columns: 1fr; }
@media (max-width: 900px) { .qsa-map-grid { grid-template-columns: 1fr; } }
/* nota compacta de sócios (1 linha) ao pé do card de localização */
.qsa-note {
  display: flex; align-items: flex-start; gap: var(--sp-3);
  background: var(--pc-bg-50); border: 1px dashed var(--pc-line-200);
  border-radius: var(--r-md); padding: var(--sp-3) var(--sp-4);
  font-size: var(--fs-sm); color: var(--pc-ink-500);
}
.qsa-note .icn { color: var(--pc-ink-300); width: 18px; height: 18px; margin-top: 2px; }
.qsa-note p { margin: 0; line-height: 1.5; }
.qsa-note strong { color: var(--pc-ink-700); }
.qsa-empty {
  display: flex; align-items: center; gap: var(--sp-3);
  background: var(--pc-bg-50); border: 1px dashed var(--pc-line-200);
  border-radius: var(--r-md); padding: var(--sp-4); font-size: var(--fs-sm);
  color: var(--pc-ink-500);
}
.qsa-empty .icn { color: var(--pc-ink-300); width: 20px; height: 20px; }

/* Mini-mapa de localização da matriz */
.mini-map { width: 100%; max-width: 300px; height: auto; display: block; margin: 0 auto; }
.mini-map .uf-mini { stroke: #FFFFFF; stroke-width: 1.4; stroke-linejoin: round; }
.mini-map .uf-mini-label {
  font-family: var(--font-sans); font-size: 30px; font-weight: 700; fill: #FFFFFF;
  pointer-events: none; letter-spacing: .02em;
}
.map-caption {
  display: flex; align-items: center; justify-content: center; gap: var(--sp-2);
  font-size: var(--fs-sm); color: var(--pc-ink-700); margin-top: var(--sp-3); text-align: center;
}

/* ============================== Cabeçalho de seção unificado (§2.2)
   O ícone vira coluna-âncora; h2 e sub compartilham a MESMA borda-esquerda de
   texto — acaba a "escada" de indentação. A tag ("Experimental"/"Parcial")
   senta na linha do h2 sem flutuar. */
.sec-head {
  display: grid; grid-template-columns: 24px 1fr auto;
  column-gap: var(--sp-3); align-items: center;
}
.sec-head .icn { grid-column: 1; grid-row: 1; width: 22px; height: 22px; color: var(--pc-petrol-600); }
.sec-head h2 { grid-column: 2; grid-row: 1; margin: 0; }
.sec-head .tag-inline, .sec-head .tip { grid-column: 3; grid-row: 1; align-self: center; }
/* a .sec-sub vem FORA do .sec-head no markup, mas alinha ao mesmo x do h2.
   SEM teto de largura: o parágrafo de abertura ocupa o bloco, como o h2 acima
   dele. O `max-width: 72ch` que havia aqui não entregava o que prometia —
   `ch` é a largura do algarismo 0, e como o 0 é mais largo que a média das
   minúsculas, 72ch rendia 86 caracteres por linha (pico de 91), já acima da
   faixa de 45–75 que justifica a regra. Ficava largo demais para ser o ótimo
   tipográfico e estreito demais contra um card de ~1104px: parava na metade e
   lia como defeito. O recuo à esquerda fica — é ele que alinha com o título. */
.sec-sub {
  font-size: var(--fs-sm); color: var(--pc-ink-500); line-height: 1.6;
  margin-top: var(--sp-2); margin-left: calc(24px + var(--sp-3));
}
/* cabeçalho compacto dos cards RFB (ícone + h2 pequeno, sem sub) */
.sec-head-sm { grid-template-columns: 22px 1fr; }
.sec-head-sm .icn { width: 20px; height: 20px; }
.sec-head-sm h2 { font-size: var(--fs-h4); }
@media (max-width: 640px) { .sec-sub { margin-left: 0; } }

/* Total consolidado do grupo, exibido uma vez no topo da seção de processos —
   torna o número do CTA rastreável sem somar subtotais mentalmente. */
.sec-consolidado {
  display: flex; align-items: flex-start; gap: var(--sp-2);
  margin-top: var(--sp-3); margin-left: calc(24px + var(--sp-3));
  padding: var(--sp-3) var(--sp-4);
  background: var(--pc-petrol-50); border: var(--hairline);
  border-radius: var(--r-md); font-size: var(--fs-sm); color: var(--pc-ink-700);
}
@media (max-width: 640px) { .sec-consolidado { margin-left: 0; } }
.sec-consolidado .icn { width: 18px; height: 18px; flex: none; color: var(--pc-petrol-600); margin-top: 1px; }
.sec-consolidado strong { color: var(--pc-ink-900); }
/* Nota (só quando há >1 grupo econômico entre os processos): explica que o total
   soma casos de grupos distintos, não de um único grupo consolidado. */
.sec-consolidado-nota {
  margin: var(--sp-2) 0 0; margin-left: calc(24px + var(--sp-3));
  font-size: var(--fs-xs); color: var(--pc-ink-500); line-height: 1.5;
}
.sec-consolidado-nota strong { color: var(--pc-ink-700); }
@media (max-width: 640px) { .sec-consolidado-nota { margin-left: 0; } }

/* ============================== Processo expandível in-page */
.proc-acc {
  border: var(--hairline-strong); border-radius: var(--r-md);
  background: var(--pc-bg-0); margin-bottom: var(--sp-3); overflow: hidden;
  transition: border-color var(--t-base), box-shadow var(--t-base);
}
.proc-acc[open] { border-color: var(--pc-petrol-300); box-shadow: var(--shadow-2); }
.proc-acc > summary {
  list-style: none; cursor: pointer; padding: var(--sp-4) var(--sp-5);
  display: flex; align-items: center; gap: var(--sp-4);
  transition: background-color var(--t-fast);
}
.proc-acc > summary::-webkit-details-marker { display: none; }
.proc-acc > summary:hover { background: var(--pc-petrol-50); }
.proc-acc > summary:focus-visible { outline: none; box-shadow: var(--ring-focus) inset; }
.proc-sum-main { flex: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2) var(--sp-3); }
.proc-sum-main .mono { font-size: var(--fs-sm); color: var(--pc-ink-700); }
.proc-sum-meta { font-size: var(--fs-sm); color: var(--pc-ink-500); white-space: nowrap; min-width: 0; }
/* Em telas estreitas (iPhone SE/mini) a linha longa "processo de {grupo}" com
   nowrap estourava a borda do card e era cortada pelo clip do body (sem
   reticências, sem rolagem). O item já vive num flex-wrap com min-width:0, então
   permitir a quebra resolve sem estourar. */
@media (max-width: 420px) {
  .proc-sum-meta { white-space: normal; overflow-wrap: anywhere; max-width: 100%; }
}
.proc-sum-val { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--pc-petrol-800); font-size: var(--fs-sm); white-space: nowrap; }
/* Rótulo da medida no sumário do processo — cada número diz o que é */
.proc-sum-val .psv-label {
  font-size: var(--fs-xs); font-weight: 650; text-transform: uppercase;
  letter-spacing: .06em; color: var(--pc-ink-400);
}
.proc-chevron {
  flex: none; width: 10px; height: 10px;
  border-right: 1.7px solid var(--pc-ink-400); border-bottom: 1.7px solid var(--pc-ink-400);
  transform: rotate(45deg) translateY(-2px); transition: transform var(--t-base);
}
.proc-acc[open] .proc-chevron { transform: rotate(225deg) translateY(-1px); }
.proc-body { border-top: var(--hairline); padding: var(--sp-5); }
.proc-acc[open] .proc-body { animation: pc-fade-up 340ms var(--ease-out) both; }
.proc-body h4 { font-size: var(--fs-sm); font-weight: 650; text-transform: uppercase; letter-spacing: .06em; color: var(--pc-ink-500); margin: var(--sp-5) 0 var(--sp-3); }
.proc-body h4:first-child { margin-top: 0; }

/* ============================================================================
   ESCALA DO BLOCO DE PROCESSO — quatro espécies, uma função cada.
   Rótulo e valor se distinguem por PESO e COR, nunca por caixa. CAIXA ALTA é
   DECISÃO e vive só em .pc-eyebrow (rótulo de FAIXA). Medido antes: 11 receitas
   de uppercase dentro de #processos, e o h4 de seção IDÊNTICO em 5/5
   propriedades ao h4 do paywall (13px/650/uppercase/.78px/ink-500).
   Ritmo: 4px LIGA rótulo↔valor · 12px AGRUPA título↔conteúdo · 32px SEPARA seções.
   TUDO escopado em #processos: empresa.css também é a folha do PORTAL DO
   CLIENTE (PainelController → page_css 'empresa'), e client/empresa.php reusa
   .proc-body / .fact-grid / .fact / .f-label / .f-value com OUTRA estrutura.
   ========================================================================== */
#processos {
  --pc-t-secao:  1.0625rem;  /* 17px */
  --pc-t-rotulo: 0.75rem;    /* 12px */
  --pc-t-valor:  0.9375rem;  /* 15px */
  --pc-t-forte:  1.25rem;    /* 20px — título de paywall / total */
  --pc-t-nota:   0.6875rem;  /* 11px */
  --pc-r-liga:   4px;
  --pc-r-bloco:  12px;
  --pc-r-secao:  32px;
}

/* (1,1,1) — vence .proc-body h4 (0,1,1) e não toca o portal do cliente */
#processos .proc-body h4 {
  font-size: var(--pc-t-secao); font-weight: 700; letter-spacing: -.005em;
  text-transform: none; color: var(--pc-ink-900); line-height: 1.25;
  margin: var(--pc-r-secao) 0 var(--pc-r-bloco);
  padding-left: var(--sp-3); position: relative;
}
#processos .proc-body h4::before {
  content: ""; position: absolute; left: 0; top: .18em; bottom: .18em;
  width: 3px; border-radius: 2px; background: var(--pc-petrol-500);
}
#processos .proc-body h4:first-child { margin-top: 0; }

/* RÓTULO — receita única em todo o bloco, inclusive th de tabela */
#processos .pk-label,
#processos .dl-rot,
#processos .cc-nome,
#processos .psv-label,
#processos table.data th {
  font-size: var(--pc-t-rotulo); font-weight: 600; text-transform: none;
  letter-spacing: 0; color: var(--pc-ink-500); line-height: 1.3;
}
/* VALOR — o contraste com o rótulo é de peso (600→680) e cor (500→900) */
#processos .dl-val,
#processos .val-list__txt {
  font-size: var(--pc-t-valor); font-weight: 680; color: var(--pc-ink-900);
  line-height: 1.4;
}
/* NOTA — nunca carrega preço nem oferta */
#processos .pk-stamp,
#processos .pf-txt,
#processos .dl-nota,
#processos .stamp {
  font-size: var(--pc-t-nota); font-weight: 400; color: var(--pc-ink-400);
  letter-spacing: 0; line-height: 1.5;
}

/* A ÚNICA caixa alta sobrevivente — rótulo de FAIXA, nunca de campo */
.pc-eyebrow {
  display: block; font-size: 0.6875rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .08em;
  color: var(--pc-petrol-700); margin: 0 0 var(--sp-3);
}
.pc-eyebrow--gold { color: var(--pc-gold-800); }

/* ---- Dados-chave: LISTA DE DEFINIÇÃO de 2 colunas -----------------------
   Substitui .fact-hero (3 células de 157,6px fixos: uma com ~88% de vazio e
   outra estourando com reticências). A proximidade rótulo↔valor passa a ser
   de COLUNA (24px horizontais), não de gap de 4px vertical. */
.dl-dados {
  margin: 0 0 var(--sp-2); background: var(--pc-bg-0);
  border: var(--hairline-strong); border-radius: var(--r-md); overflow: hidden;
}
.dl-linha {
  display: grid; grid-template-columns: minmax(150px, 210px) minmax(0, 1fr);
  align-items: stretch; border-top: var(--hairline);
}
.dl-linha:first-child { border-top: 0; }
.dl-linha > dt {
  display: flex; align-items: flex-start; gap: var(--sp-2);
  margin: 0; padding: var(--sp-3) var(--sp-4);
  background: var(--pc-bg-50); border-right: var(--hairline);
}
.dl-ico { flex: none; line-height: 0; color: var(--pc-petrol-500); margin-top: 1px; }
.dl-ico .icn { width: 16px; height: 16px; }
.dl-linha > dd { margin: 0; padding: var(--sp-3) var(--sp-4); min-width: 0; }
.dl-val { display: block; overflow-wrap: anywhere; }
.dl-linha--num .dl-val { font-variant-numeric: tabular-nums; }
/* As três linhas que o dono pediu com mais peso */
.dl-linha.is-destaque > dt,
.dl-linha.is-destaque > dd { background: var(--pc-petrol-50); }
.dl-linha.is-destaque > dt { border-right-color: var(--pc-petrol-200); }
/* DIVERGÊNCIA do plano (especificidade): os modificadores vinham como
   `.dl-linha--forte .dl-val` (0,2,0) e PERDIAM para `#processos .dl-val`
   (1,1,0) da escala — MEDIDO: a observação saía 15px/680 (peso de dado) em vez
   de 15px/400 (peso de prosa), e o "forte" nunca crescia. Escopados, saem
   (1,2,0) e vencem. */
#processos .dl-linha--forte .dl-val { font-size: var(--fs-lead); font-weight: 700; }
/* Observação é PROSA, não dado: peso de leitura */
#processos .dl-linha--prosa .dl-val {
  font-size: var(--fs-sm); font-weight: 400; color: var(--pc-ink-700);
  line-height: 1.6; max-width: 82ch;
}
.dl-nota { margin: var(--sp-2) 0 0; }
@media (max-width: 560px) {
  .dl-linha { grid-template-columns: minmax(0, 1fr); }
  .dl-linha > dt { border-right: 0; border-bottom: var(--hairline); }
}

/* ---- Vários itens num campo: uma LINHA por item, numerada ----------------
   MEDIDO: 62,4% dos processos com grupo_cnpjs têm 2+ CNPJs; 44 fichas exibiam
   o pipe "|" cru (8 admin_judicial + 36 escritório). */
/* fx-fonte__n e não ft__n: `ft_` é PREFIXO DE TABELA no guard de
   identificadores internos (PublicSourcePolicy::INTERNAL_IDENTIFIER_PATTERN), e
   o sanitize da publicação reescrevia o próprio atributo — a ficha pública saía
   com class="dados consolidados pela PreservaCred" e o estilo se perdia.
   Medido no HTML servido em 18/08, 2 ocorrências por ficha. */
.fx-fonte__n {
  display: inline-block; margin-bottom: var(--sp-2);
  font-size: var(--fs-xs); font-weight: 650; color: var(--pc-petrol-700);
  background: var(--pc-bg-0); border: 1px solid var(--pc-petrol-200);
  border-radius: var(--r-full); padding: 2px 9px;
}
.val-list { list-style: none; margin: 0; padding: 0; counter-reset: vl; }
.val-list > li {
  display: flex; align-items: baseline; gap: var(--sp-2);
  padding: 5px 0; line-height: 1.4; overflow-wrap: anywhere;
}
.val-list > li + li { border-top: 1px dotted var(--pc-line-200); }
.val-list > li::before {
  counter-increment: vl; content: counter(vl); flex: none; align-self: center;
  width: 17px; height: 17px; border-radius: var(--r-full);
  background: var(--pc-petrol-100); color: var(--pc-petrol-700);
  font-size: 10px; font-weight: 700; line-height: 17px; text-align: center;
}
.val-list > li:only-child { padding: 0; }
.val-list > li:only-child::before { content: none; }
.val-list__txt a { color: var(--pc-petrol-700); font-weight: 680; }
.val-list__sub { font-size: var(--fs-xs); font-weight: 400; color: var(--pc-ink-400); }

/* (P3) Fatos-chave do processo — cards VERTICAIS como o print do dono:
   ícone-contorno no topo, label pequena, valor maior embaixo. Divisórias
   sutis entre colunas; fundo branco. */
.fact-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 0; background: var(--pc-bg-0);
  border: var(--hairline); border-radius: var(--r-md); overflow: hidden;
}
.fact-grid .fact {
  display: flex; flex-direction: column; align-items: flex-start; gap: 4px;
  padding: var(--sp-3) var(--sp-4);
  border-left: var(--hairline);
}
.fact-grid .fact:first-child { border-left: 0; }
.fact-grid .icn {
  color: var(--pc-petrol-500); width: 20px; height: 20px; margin-bottom: 2px;
}
.fact-grid .f-label { display: block; font-size: var(--fs-xs); font-weight: 650; text-transform: uppercase; letter-spacing: .07em; color: var(--pc-ink-400); }
.fact-grid .f-value { display: block; font-size: var(--fs-body); font-weight: 600; color: var(--pc-ink-900); overflow-wrap: anywhere; }
.fact-grid .fact-wide { grid-column: 1 / -1; }
@media (max-width: 560px) {
  .fact-grid { grid-template-columns: 1fr; }
  .fact-grid .fact { border-left: 0; border-top: var(--hairline); }
  .fact-grid .fact:first-child { border-top: 0; }
}

/* Chips do quadro de credores por classe */
.classe-chips { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.classe-chips .chip { height: auto; line-height: 1.5; padding: 3px 9px; }
.classe-chips .chip small { color: inherit; opacity: .85; font-size: inherit; }

/* Ações do processo (tribunal / painel) */
.proc-actions { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin-top: var(--sp-5); padding-top: var(--sp-4); border-top: var(--hairline); align-items: center; }
.proc-actions .link-arrow { font-size: var(--fs-sm); }
.proc-actions .ext-link { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm); font-weight: 600; color: var(--pc-petrol-600); }
.proc-actions .ext-link:hover { color: var(--pc-petrol-700); text-decoration: none; }

/* Processos além dos 5 expandíveis: linha compacta */
.proc-more {
  display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap;
  border: var(--hairline); border-radius: var(--r-md); background: var(--pc-bg-50);
  padding: var(--sp-3) var(--sp-5); margin-bottom: var(--sp-3); font-size: var(--fs-sm);
}

/* Empty states da ficha: 3 linhas de texto centralizadas não pedem ~64px de
   respiro em cada ponta — menos rolagem vazia, mesma honestidade do vazio */
#processos .empty, #exposicao .empty, #interesse .empty, #comunidade .empty {
  padding-top: var(--sp-5); padding-bottom: var(--sp-5);
}

/* Paywall na ficha: nada atrás do overlay rola nem exibe scrollbar — a
   amostra bloqueada é decorativa (placeholders) e fica contida no card.
   O tbody vira a "tabela" interna a 100% (o display:block do table sozinho
   encolheria as linhas para a largura do conteúdo). */
.paywall-zone > .is-locked,
.paywall-zone table.data.is-locked { display: block; overflow: hidden; max-width: 100%; }
/* table-layout:fixed faz as células respeitarem os 100% do bloco: sem ele, o
   layout automático dimensiona a tabela pelo conteúdo dos placeholders e o
   scrollWidth estoura a caixa (corte visível no mobile). Com fixed, o texto
   mascarado quebra dentro da célula e o corte, se houver, é limpo. */
.paywall-zone table.data.is-locked tbody { display: table; width: 100%; table-layout: fixed; }
.paywall-zone table.data.is-locked td { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Mobile: sumário do processo empilha com respiro */
@media (max-width: 640px) {
  .proc-acc > summary { padding: var(--sp-3) var(--sp-4); }
  .proc-body { padding: var(--sp-4); }
  .indic-row { grid-template-columns: 1fr 1fr; }
  /* o selo de insolvência ocupa a linha inteira no mobile (o que mais importa) */
  .indic-row > .indic-destaque { grid-column: 1 / -1; }
  /* Chips de classe: o texto quebra dentro do chip — nada é cortado seco
     na borda nem depende de scroll lateral para ser lido */
  .classe-chips .chip { white-space: normal; max-width: 100%; }
  /* Paywall: o véu cobre o bloco bloqueado INTEIRO (não só os 240px finais) —
     nenhuma faixa de conteúdo mascarado aparece nítida acima do overlay */
  .paywall-zone .paywall-fade {
    inset: 0; height: auto;
    background: linear-gradient(180deg, rgba(255,255,255,.55) 0%, var(--pc-bg-0) 82%);
  }
}
@media (max-width: 420px) { .indic-row { grid-template-columns: 1fr; } }

/* Tabelas empilhadas (mobile): a célula de valor quebra DENTRO do card —
   "R$ 100 mi – R$ 500 mi" nunca é truncado nem exige rolagem lateral */
@media (max-width: 768px) {
  table.data.responsive td { min-width: 0; }
  table.data.responsive td.num { white-space: normal; overflow-wrap: anywhere; }
  table.data.responsive td.num[data-label] { justify-content: space-between; }
}

/* Cabeçalho de seção no mobile: a tag desce para a 2ª linha (não espreme o h2) */
@media (max-width: 560px) {
  .sec-head { grid-template-columns: 24px 1fr; }
  .sec-head .tag-inline, .sec-head .tip { grid-column: 2; grid-row: 2; justify-self: start; margin-top: var(--sp-1); }
}

/* ============================== Status/atividade do processo (lista ordenada) */
/* Tag de status no sumário — o ATIVO recebe cor e pulso; o encerrado, discreto. */
.proc-tag {
  display: inline-flex; align-items: center; gap: 5px;
  height: 20px; padding: 0 8px; border-radius: var(--r-full);
  font-size: var(--fs-xs); font-weight: 700; text-transform: uppercase;
  letter-spacing: .04em; white-space: nowrap; border: 1px solid transparent;
}
.proc-tag-recente { background: var(--pc-petrol-600); color: #fff; }
.proc-tag-ok      { background: var(--pc-success-100); color: var(--pc-success-700); border-color: var(--pc-success-600); }
.proc-tag-warn    { background: var(--pc-warning-100); color: var(--pc-warning-700); border-color: var(--pc-warning-600); }
.proc-tag-danger  { background: var(--pc-danger-100);  color: var(--pc-danger-700);  border-color: var(--pc-danger-600); }
.proc-tag-neutral { background: var(--pc-bg-100);      color: var(--pc-ink-500);     border-color: var(--pc-line-200); }
.proc-tag-pulse { width: 7px; height: 7px; border-radius: var(--r-full); background: currentColor; box-shadow: 0 0 0 0 currentColor; animation: proc-pulse 2.4s var(--ease-out) infinite; }
@keyframes proc-pulse {
  0%   { box-shadow: 0 0 0 0 rgba(24,105,116,.45); }
  70%  { box-shadow: 0 0 0 6px rgba(24,105,116,0); }
  100% { box-shadow: 0 0 0 0 rgba(24,105,116,0); }
}
@media (prefers-reduced-motion: reduce) { .proc-tag-pulse { animation: none; } }

/* Processo ATIVO: borda com acento à esquerda (destaque). Encerrado: apagado. */
.proc-ativo { border-left: 3px solid var(--pc-petrol-400); }
.proc-recente.proc-ativo { border-left-color: var(--pc-petrol-600); }
.proc-encerrado { opacity: .82; background: var(--pc-bg-50); }
.proc-encerrado > summary .mono { color: var(--pc-ink-500); }
.proc-encerrado[open] { opacity: 1; }

/* ============================== Trilha de MARCOS acompanhados (fallback stepper)
   Só usada pelo <ol class="marcos-trilha"> de FALLBACK (quando partials/marcos.php
   não existe). Seletor ancorado em `ol.` de propósito: a <section class="marcos-trilha">
   do partial marcos.php NÃO deve herdar este display:flex — herdá-lo empurrava o
   rótulo (badge do tipo) para um gutter lateral flutuante no mobile (bug). */
ol.marcos-trilha {
  list-style: none; margin: 0 0 var(--sp-2); padding: var(--sp-2) 0 0;
  display: flex; gap: 0; overflow-x: auto;
}
ol.marcos-trilha .mk {
  position: relative; flex: 1 1 0; min-width: 92px;
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  text-align: center; padding: 0 4px;
}
/* linha conectora entre os passos */
ol.marcos-trilha .mk::before {
  content: ""; position: absolute; top: 6px; left: -50%; width: 100%; height: 2px;
  background: var(--pc-line-200); z-index: 0;
}
ol.marcos-trilha .mk:first-child::before { display: none; }
ol.marcos-trilha .mk-dot {
  position: relative; z-index: 1; width: 14px; height: 14px; border-radius: var(--r-full);
  background: var(--pc-bg-0); border: 2px solid var(--pc-line-200); flex: none;
}
ol.marcos-trilha .mk-nome { font-size: var(--fs-xs); color: var(--pc-ink-400); line-height: 1.25; }
/* passo já atingido */
ol.marcos-trilha .mk-feito .mk-dot { background: var(--pc-petrol-500); border-color: var(--pc-petrol-500); }
ol.marcos-trilha .mk-feito::before { background: var(--pc-petrol-300); }
ol.marcos-trilha .mk-feito .mk-nome { color: var(--pc-ink-700); }
/* passo ATUAL — em destaque */
ol.marcos-trilha .mk-atual .mk-dot {
  background: var(--pc-petrol-600); border-color: var(--pc-petrol-600);
  box-shadow: 0 0 0 4px var(--pc-petrol-100);
}
ol.marcos-trilha .mk-atual::before { background: var(--pc-petrol-300); }
ol.marcos-trilha .mk-atual .mk-nome { color: var(--pc-petrol-800); font-weight: 700; }

/* ============================== Gráfico de interesse (60 dias, downdetector) */
.interesse-chart { border: var(--hairline); border-radius: var(--r-md); padding: var(--sp-3); background: var(--pc-bg-0); }
.interesse-chart .ic-head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap; margin-bottom: var(--sp-2); }
.interesse-chart .ic-pico { font-size: var(--fs-xs); color: var(--pc-ink-400); font-variant-numeric: tabular-nums; }
/* série de 60 dias rola lateralmente no mobile sem estourar a página */
.chart-scroll { overflow-x: auto; }
.chart-scroll .chart-svg { min-width: 520px; }
@media (min-width: 720px) { .chart-scroll .chart-svg { min-width: 0; } }
/* O viewBox deste é 1440 de largura (metade da altura renderizada): com o
   min-width de 520px o gráfico ficaria de 72px e os rótulos ilegíveis. */
.interesse-chart .chart-scroll .chart-svg { min-width: 760px; }
@media (min-width: 900px) { .interesse-chart .chart-scroll .chart-svg { min-width: 0; } }

/* ============================== Nota de fonte/metodologia (rodapé da ficha) */
.ficha-nota {
  border-top: var(--hairline); margin-top: var(--sp-8); margin-bottom: var(--sp-8);
  padding-top: var(--sp-4);
}
.ficha-nota p { font-size: var(--fs-sm); color: var(--pc-ink-400); line-height: 1.5; margin: 0 0 var(--sp-2); }
.ficha-nota p:last-child { margin-bottom: 0; }

/* ============================== Ritmo vertical da ficha (§2.1)
   Só três saltos: intra-item 12px, título↔conteúdo 20px, entre-blocos 32px.
   .ficha-bloco padroniza o respiro entre grandes blocos. */
.ficha-bloco { margin-bottom: var(--sp-8); }
@media (max-width: 640px) { .ficha-bloco { margin-bottom: var(--sp-6); } }

/* Hero de identidade — respiro consistente, H1 que nunca estoura no estreito */
.ficha-hero { margin-bottom: var(--sp-8); }
.ficha-hero h1 { overflow-wrap: anywhere; hyphens: auto; }
.ficha-hero-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2) var(--sp-3);
}

/* ============================== Par de blocos numa linha (§2.4)
   "mais de um bloco por linha": resumo (interesse) + experimental (exposição).
   align-items:start impede o card curto de esticar. */
.ficha-par {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: var(--sp-5); align-items: start;
}
.ficha-par > * { margin-bottom: 0; }
@media (max-width: 900px) { .ficha-par { grid-template-columns: 1fr; gap: var(--sp-6); } }

/* ============================== Tabelas: nunca estouram o bloco (§2.6)
   .tbl-scroll é a rede de segurança (rola DENTRO do card; o corpo da página
   nunca rola na horizontal). table-layout fixed + faixa que quebra. */
.tbl-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
#processos table.data.responsive,
#exposicao table.data.responsive { table-layout: fixed; width: 100%; }
#processos table.data.responsive td,
#exposicao table.data.responsive td { overflow-wrap: anywhere; }
/* Razão social LONGA quebra dentro da própria coluna. .link-arrow é
   inline-flex + white-space:nowrap (para a seta deslizar colada ao texto), e
   nowrap num table-layout:fixed não alarga a coluna — o nome simplesmente
   transbordava por cima da coluna vizinha ("Tipo / UF"). Dentro de tabela quem
   manda é o texto: o link volta a ser inline e quebra; a seta acompanha a
   última palavra e o hover (transform no ::after inline-block) continua. */
#processos table.data .link-arrow,
#exposicao table.data .link-arrow { display: inline; white-space: normal; }
/* Quatro colunas DECLARADAS para quatro conteúdos. Documento leva 11.5rem
   porque o CNPJ formatado tem 18 caracteres em .mono e, com menos, quebra no
   "/" e no "-" (medido: 9.5rem partia "0001-12" para a linha de baixo). Valor
   ganha largura própria: sem ela, table-layout:fixed dividia a sobra em partes
   iguais com Credor e o nome ficava com metade do que podia — Credor é a única
   coluna elástica e absorve todo o resto. */
.tbl-cred th:nth-child(1) { width: auto; }
.tbl-cred th:nth-child(2) { width: 11.5rem; }
.tbl-cred th:nth-child(3) { width: 8rem; }
.tbl-cred th:nth-child(4) { width: 11rem; }
.tbl-expo th:last-child   { width: 22%; }   /* PRESERVADA da linha 566 */
.tbl-expo th:nth-child(1) { width: 40%; }
.tbl-expo th:nth-child(2) { width: 22%; }
.tbl-expo th:nth-child(3) { width: 20%; }
/* Um chip por classe habilitada no caso: o mesmo credor pode ter crédito em
   classes diferentes do mesmo processo, e antes só a maior aparecia. Flex com
   wrap porque a coluna tem 20% e dois chips não cabem lado a lado no estreito. */
.tbl-expo .td-classes { display: flex; flex-wrap: wrap; gap: 4px; }
/* O valor volta a NÃO quebrar — mas só no desktop. O override deliberado de
   mobile (empresa.css, @media max-width:768px table.data.responsive td.num) tem
   especificidade (0,2,2) e perderia para um seletor com id: por isso o carve-out. */
@media (min-width: 769px) {
  #processos table.data.responsive td.num,
  #exposicao table.data.responsive td.num { white-space: nowrap; overflow-wrap: normal; }
}
/* DIVERGÊNCIA do plano (especificidade): o plano escrevia `#processos
   .tbl-cred td` (1,1,1), que PERDERIA para o `#processos table.data.responsive
   td { overflow-wrap: anywhere }` já existente logo acima (1,2,2) — o
   `overflow-wrap: normal` nunca valeria. Ancorado na própria tabela
   (`table.data.responsive.tbl-cred`) a regra sai (1,3,2) e vence. */
#processos table.data.responsive.tbl-cred td {
  height: auto; padding: var(--sp-3); vertical-align: top;
  overflow-wrap: normal; word-break: normal;
}
#processos table.data.responsive.tbl-cred td[data-label="Credor"] { overflow-wrap: anywhere; }
/* CNPJ inteiro numa linha: "/" e "-" são oportunidade de quebra para o
   navegador mesmo com overflow-wrap:normal — nowrap fecha a porta; a coluna
   de 11.5rem acima garante que os 18 caracteres cabem sem transbordar. */
#processos table.data.responsive.tbl-cred td[data-label="Documento"] { white-space: nowrap; }
#processos .tbl-cred td.num { font-weight: 650; color: var(--pc-ink-900); font-variant-numeric: tabular-nums; }
/* .td-cred saiu com a tabela dos "Maiores credores (PJ)" (virou .cred-top). */
#processos .tbl-cred .chip { white-space: nowrap; }
/* O th sticky de components.css é CÓDIGO MORTO aqui: o scrollport do sticky é
   o .tbl-scroll (overflow-x:auto → overflow-y usado = auto), que não rola na
   vertical. Declarar e nunca grudar é pior que não declarar. */
#processos .tbl-scroll table.data th,
#exposicao .tbl-scroll table.data th { position: static; }
/* sub-linha (CNJ + distribuição) sob o nome da devedora e UF ao lado do tipo (§4.e) */
.td-sub { display: block; font-size: var(--fs-xs); color: var(--pc-ink-400); margin-top: 2px; }
.td-uf { font-size: var(--fs-xs); color: var(--pc-ink-500); font-weight: 600; }
/* CNJ na sub-linha: o número absorveu a lista "Processos em que figura como
   credora", que era um bloco inteiro só para exibi-lo. Herda o fs-xs do .td-sub
   (não o fs-sm de .mono, que competiria com o nome da devedora acima) e fica em
   tom de identificador — o link forte da linha continua sendo o nome. */
.td-cnj {
  font-family: var(--font-mono); font-size: inherit; color: var(--pc-ink-500);
  white-space: nowrap;
  /* sublinhado fraco SEMPRE: sem ele o número parecia texto morto e ninguém
     descobriria que ali estão os autos (era o antigo "Detalhes no portal"). */
  text-decoration: underline; text-decoration-color: var(--pc-ink-300); text-underline-offset: 2px;
}
.td-cnj:hover { color: var(--pc-petrol-700); text-decoration-color: currentColor; }
/* Mobile: a linha vira `rótulo | valor` (td em flex, ::before de 67px) e sobram
   ~150px para um CNJ de 166px — com nowrap ele vazava a coluna. Quebra, mas no
   HÍFEN do número (break-word respeita a oportunidade natural: "5008465-" +
   "92.2023.8.24.0023", 2 linhas) em vez do `anywhere` herdado da tabela, que
   picotava o identificador em 3 linhas no meio dos dígitos. */
@media (max-width: 768px) {
  .td-cnj { white-space: normal; overflow-wrap: break-word; word-break: normal; }
}
/* Célula sem dado publicado (caso em que ela é parte credora mas a relação de
   credores não trouxe linha com valor): apagada de propósito, sem virar "R$ 0". */
.td-nulo { color: var(--pc-ink-400); font-size: var(--fs-xs); }
td.num .td-nulo { font-size: inherit; font-weight: 400; }

/* ============================== Card afirmativo de insolvência (§4.a.2 / §2.9)
   Estado RECEITA_SEM_CAPTURA: a empresa ESTÁ em insolvência (flag da Receita),
   mas o processo é anterior à janela de captura. NÃO é um "empty" apagado —
   é uma AFIRMAÇÃO da condição, com nota honesta de janela. Conserta o bug. */
.insolv-afirma {
  display: grid; grid-template-columns: 48px 1fr; gap: var(--sp-4);
  align-items: start; padding: var(--sp-5);
  border: var(--hairline); border-radius: var(--r-md);
  border-left: 4px solid var(--band-c, var(--pc-warning-600));
  background: var(--band-bg, var(--pc-warning-100));
}
.insolv-afirma.insolv-warn   { --band-c: var(--pc-warning-600); --band-bg: var(--pc-warning-100); }
.insolv-afirma.insolv-danger { --band-c: var(--pc-danger-600);  --band-bg: var(--pc-danger-100); }
.insolv-afirma-ico { color: var(--band-c); }
.insolv-afirma-ico .icn { width: 40px; height: 40px; }
@media (prefers-reduced-motion: no-preference) {
  .insolv-afirma-ico .icn { animation: pc-float 6s ease-in-out infinite; }
}
.insolv-afirma-body { min-width: 0; }
.insolv-afirma-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3); }
.insolv-afirma-head h3 { margin: 0; font-size: var(--fs-h4); color: var(--pc-ink-900); }
.insolv-afirma-body p { margin: var(--sp-2) 0 0; font-size: var(--fs-sm); color: var(--pc-ink-700); line-height: 1.6; max-width: 72ch; }
/* trilha de marcos neutra dentro do card afirmativo — rola no mobile */
.insolv-marcos { margin-top: var(--sp-5); overflow-x: auto; }
/* No estado RECEITA_SEM_CAPTURA a trilha é EDUCATIVA e fica COLAPSADA (não há
   fase real a mostrar) — evita a fileira alta de nós ocos. Abre sob demanda. */
.insolv-etapas { margin-top: var(--sp-4); }
.insolv-etapas > summary {
  list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: var(--sp-2);
  font-size: var(--fs-sm); font-weight: 650; color: var(--pc-petrol-700);
  padding: var(--sp-1) 0;
}
.insolv-etapas > summary::-webkit-details-marker { display: none; }
.insolv-etapas > summary:hover .insolv-etapas-txt { text-decoration: underline; }
.insolv-etapas > summary:focus-visible { outline: none; box-shadow: var(--ring-focus); border-radius: var(--r-sm); }
.insolv-etapas-chevron {
  width: 8px; height: 8px; border-right: 1.7px solid currentColor; border-bottom: 1.7px solid currentColor;
  transform: rotate(45deg) translateY(-2px); transition: transform var(--t-base);
}
.insolv-etapas[open] .insolv-etapas-chevron { transform: rotate(225deg) translateY(-1px); }
.insolv-etapas[open] .insolv-marcos { margin-top: var(--sp-4); }
@media (prefers-reduced-motion: no-preference) {
  .insolv-etapas[open] .insolv-marcos { animation: pc-fade-up 300ms var(--ease-out) both; }
}
@media (max-width: 560px) {
  .insolv-afirma { grid-template-columns: 1fr; }
  .insolv-afirma-ico .icn { width: 32px; height: 32px; }
}

/* ============================== Interesse condensado (§2.5 / §4.c)
   Linha-resumo + UM gráfico, igual para visitante, conta gratuita e plano pago.
   Saíram daqui a sparkline de 48px (repetia a série do gráfico), os mini-stats
   (repetiam os números da frase) e o divisor da camada de conta. */
.interesse-card { align-self: start; }
/* .interesse-h3 saiu junto com o overline: o cabeçalho deste bloco passou a ser
   o .sec-head padrão da ficha (ícone + h2 + .sec-sub). */
.interesse-resumo { font-size: var(--fs-sm); color: var(--pc-ink-700); line-height: 1.55; margin: var(--sp-4) 0 var(--sp-3); }
.interesse-resumo strong { color: var(--pc-ink-900); }
.interesse-medicao { margin: var(--sp-4) 0 0; }

/* ============================== Tooltip discreto (data-tip) — escopo da ficha
   (não há componente global; implementação mínima, só onde a ficha usa .tip) */
.tip {
  position: relative; cursor: help;
  border-bottom: 1px dotted var(--pc-ink-300);
}
.tip[data-tip]:hover::after, .tip[data-tip]:focus-visible::after {
  content: attr(data-tip);
  position: absolute; left: 0; top: calc(100% + 6px); z-index: 20;
  width: max-content; max-width: 260px; padding: var(--sp-2) var(--sp-3);
  font-size: var(--fs-xs); font-weight: 400; line-height: 1.4; text-transform: none; letter-spacing: normal;
  color: #fff; background: var(--pc-ink-900); border-radius: var(--r-sm);
  box-shadow: var(--shadow-2); white-space: normal; pointer-events: none;
}
.sec-head .tip.tag-inline { border-bottom: 0; }

/* ============================================================================
   ============================  FICHA v2 (fx-)  ==============================
   Blueprint docs/ux-ui/03 §B. Sete assinaturas visuais distintas — uma por
   função — para o dono nunca ver "blocos todos iguais". Namespace fx- para
   não colidir com indic-/rfb-/proc-/marcos-. ============================== */

/* ---- keyframe de pulse da fase atual do stepper (reduced-motion respeitado) */
/* @keyframes fx-pulse MOVIDO para components.css (usado pelo stepper
   compartilhado — ver seção "PROCESSO — jornada + andamentos"). */

/* ============================== Aviso de FILIAL (acima do herói)
   Vive só na ficha aberta por um CNPJ de filial. Faixa de INFORMAÇÃO, não de
   alerta: azul da família --pc-info (o âmbar é risco e o vermelho é falência —
   nenhum dos dois descreve "você digitou a filial"). Fica acima do H1 porque a
   pergunta que ele responde ("por que o CNPJ na tela é outro?") nasce antes da
   primeira linha lida. */
.ficha-filial {
  display: flex; align-items: flex-start; gap: var(--sp-3);
  margin-top: var(--sp-6); padding: var(--sp-3) var(--sp-4);
  background: var(--pc-info-100); border: 1px solid #C3D9EC; /* mesmo par do .chip-c1 */
  border-radius: var(--r-md);
}
.ficha-filial .icn { width: 20px; height: 20px; flex: none; color: var(--pc-info-600); margin-top: 2px; }
/* Sem medida curta: a caixa é de largura cheia e o texto acompanha. O teto de
   68ch que havia aqui existia para evitar a órfã (uma linha longa + meia linha)
   em telas de 1800px, mas o preço era a frase parando na metade da caixa em
   QUALQUER largura — que é o defeito que se vê, não a órfã que se evita.
   `pretty` resolve a órfã sem encurtar as linhas anteriores; `balance`, que
   estava aqui, faz o oposto: iguala as linhas encolhendo-as de propósito, o
   que reproduziria o mesmo "para no meio" mesmo depois de tirar o teto. */
.ficha-filial__txt { min-width: 0; }
.ficha-filial p {
  margin: 0; font-size: var(--fs-sm); color: var(--pc-ink-700); line-height: 1.55;
  text-wrap: pretty;
}
.ficha-filial strong { color: var(--pc-ink-900); }
/* CNPJ nunca parte em duas linhas — é um número, não uma frase */
.ficha-filial .mono { white-space: nowrap; }
/* sem mexer no display: .link-arrow já é inline-flex com gap de 6px até a seta
   (inline-block matava esse gap e colava a → na última palavra) */
.ficha-filial .link-arrow { margin-top: var(--sp-1); font-size: var(--fs-sm); }

/* ============================== [1] HERÓI — identidade + selo de estado
   Único bloco com selo colorido cheio. Monograma + H1 + selo grande. */
.fx-hero {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: var(--sp-5);
  align-items: start;
  border: var(--hairline-strong); border-radius: var(--r-lg);
  border-top: 4px solid var(--fx-hero-c, var(--pc-petrol-500));
  background: var(--pc-bg-0); box-shadow: var(--shadow-1);
  padding: var(--sp-5) var(--sp-6);
}
.fx-hero--rj       { --fx-hero-c: var(--pc-warning-600); --fx-hero-bg: var(--pc-warning-100); --fx-hero-txt: var(--pc-warning-700); }
.fx-hero--falencia { --fx-hero-c: var(--pc-danger-600);  --fx-hero-bg: var(--pc-danger-100);  --fx-hero-txt: var(--pc-danger-700); }
.fx-hero--ok       { --fx-hero-c: var(--pc-success-600); --fx-hero-bg: var(--pc-success-100); --fx-hero-txt: var(--pc-success-700); }
.fx-hero--confirma { --fx-hero-c: var(--pc-ink-400);     --fx-hero-bg: var(--pc-bg-100);      --fx-hero-txt: var(--pc-ink-700); }
/* --neutro: ATO SEM RITO. Pedido de insolvência INDEFERIDO (a inicial foi
   rejeitada: nenhum processo de recuperação ou falência corre) ou rito já
   encerrado. Distinto de --confirma, que é "papel em revisão" — aqui o dado é
   certo, o que não existe é a insolvência. Mesmos tokens de cinza; a diferença
   é semântica e vive no rótulo. */
.fx-hero--neutro   { --fx-hero-c: var(--pc-ink-400);     --fx-hero-bg: var(--pc-bg-100);      --fx-hero-txt: var(--pc-ink-700); }
.fx-hero__mono {
  width: 68px; height: 68px; border-radius: var(--r-lg); flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 1.7rem; font-weight: 800; letter-spacing: -0.02em; line-height: 1;
  color: var(--fx-hero-txt, var(--pc-petrol-700));
  background: var(--fx-hero-bg, var(--pc-petrol-100));
  border: 1px solid color-mix(in srgb, var(--fx-hero-c) 30%, transparent);
}
.fx-hero__id { min-width: 0; }
.fx-hero__id h1 { margin: var(--sp-1) 0 0; overflow-wrap: anywhere; hyphens: auto; line-height: 1.12; }
/* Razão social oficial sob o H1 quando o chamariz é o nome fantasia. */
.fx-hero__razao {
  margin: var(--sp-1) 0 0; font-size: var(--fs-sm); font-weight: 600;
  color: var(--pc-ink-500); overflow-wrap: anywhere; line-height: 1.35;
}
.fx-hero__meta {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--sp-2);
  margin: var(--sp-2) 0 0; font-size: var(--fs-sm); color: var(--pc-ink-500);
}
.fx-hero__meta .mono { color: var(--pc-ink-700); font-size: var(--fs-sm); }
.fx-hero__dot { color: var(--pc-ink-300); }
.fx-hero__sub { margin: var(--sp-3) 0 0; font-size: var(--fs-xs); color: var(--pc-ink-400); line-height: 1.5; }
/* (T4) Crachá de ESTADO à direita: carimbo de cartório, não badge tímido. */
.fx-hero__badge {
  align-self: stretch; display: flex; flex-direction: column; gap: 6px;
  justify-content: center; min-width: 168px; max-width: 216px;
  padding: var(--sp-4); border-radius: var(--r-lg);
  border: 1px solid color-mix(in srgb, var(--fx-hero-c) 34%, transparent);
  border-top: 4px solid var(--fx-hero-c);
  background: var(--fx-hero-bg); color: var(--fx-hero-txt);
  box-shadow: var(--shadow-1);
}
.fx-hero__badge-ico { display: inline-flex; }
.fx-hero__badge-ico .icn { width: 28px; height: 28px; color: var(--fx-hero-c); }
.fx-hero__badge-txt {
  font-size: var(--fs-h4); font-weight: 800; line-height: 1.1;
  text-transform: uppercase; letter-spacing: .02em; overflow-wrap: anywhere;
}
.fx-hero__badge-sub {
  font-size: var(--fs-xs); font-weight: 600; line-height: 1.35;
  color: color-mix(in srgb, var(--fx-hero-txt) 82%, transparent);
}
@media (max-width: 720px) {
  .fx-hero { grid-template-columns: auto minmax(0, 1fr); }
  .fx-hero__badge {
    grid-column: 1 / -1; max-width: none; flex-direction: row;
    align-items: center; gap: var(--sp-3);
  }
  .fx-hero__badge-txt { font-size: var(--fs-body); }
  .fx-hero__badge-sub { display: none; }
}
@media (max-width: 560px) {
  .fx-hero { grid-template-columns: 1fr; gap: var(--sp-3); padding: var(--sp-5); }
  .fx-hero__mono { width: 52px; height: 52px; font-size: 1.3rem; }
}

/* ============================== [2] KPI-row calma
   Reaproveita .indic; só ajusta a grade (3 ou 4 tiles, sem o selo). */
@media (min-width: 720px) {
  .indic-row--3 { grid-template-columns: 1fr 1fr 1fr; }
}
.fx-kpirow { margin-top: var(--sp-4); }
/* (T5) KPI de relacionamento — estrelas fracionárias (glifo empilhado, dourado
   premium) + score /5. Mesma técnica de .vr-star, escala menor para o tile. */
.indic-estrelas { display: inline-flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
.indic-stars { display: inline-flex; gap: 2px; line-height: 1; }
.istar {
  position: relative; width: 1em; height: 1em; font-size: 1.15rem;
  color: var(--pc-gold-300); /* trilho vazio */
}
.istar::before,
.istar__fill::before {
  content: "★"; position: absolute; inset: 0; display: block; text-align: center;
}
.istar__fill {
  position: absolute; inset: 0; overflow: hidden; white-space: nowrap;
  color: var(--pc-gold-600); /* preenchido */
}
/* Estado VAZIO (N<3, "sem avaliações ainda"): o trilho não pode ficar dourado —
   ★★★★★ dourado lê como nota ~5/5. Neutraliza para não enganar a leiga. */
.indic-stars.is-vazio .istar { color: var(--pc-line-200); }
.indic-num-v--dim { color: var(--pc-ink-300); }

/* ============================== [3] BENTO — identidade + localização mini + teasers
   col 1 (identidade em cima, localização embaixo, span 2 linhas) · col 2 (2 tiles).
   grid-auto-rows: min-content → densidade adaptativa (tiles encolhem, não esticam). */
/* (T2) ESQUERDA = identidade (um card); DIREITA = aside com pesquisa (topo) +
   localização (base). Junta os dois blocos leves numa coluna só — sem o vazio
   lateral que a exposição-teaser (agora KPI T3) deixava. */
.fx-bento {
  display: grid; grid-template-columns: 1.4fr 1fr; gap: var(--sp-4); align-items: start;
}
.fx-bento__id  { grid-column: 1; }
.fx-bento__aside {
  grid-column: 2; display: flex; flex-direction: column; gap: var(--sp-4); min-width: 0;
}
@media (max-width: 900px) {
  .fx-bento { grid-template-columns: 1fr; }
  .fx-bento__id, .fx-bento__aside { grid-column: 1; }
}
/* pesquisa condensada (clicável → #comunidade) */
.fx-bento__pesquisa { text-decoration: none; color: inherit; display: block;
  transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.fx-bento__pesquisa:hover { border-color: var(--pc-petrol-300); box-shadow: var(--shadow-2); text-decoration: none; }
.fx-pesq__row { display: flex; align-items: baseline; gap: var(--sp-2); margin-top: var(--sp-2); }
.fx-pesq__num { font-size: var(--fs-h2); font-weight: 780; line-height: 1;
  color: var(--pc-petrol-600); font-variant-numeric: tabular-nums; }
.fx-pesq__lbl { font-size: var(--fs-sm); color: var(--pc-ink-500); }
.fx-pesq__tend--up { color: var(--pc-success-600); }
.fx-pesq__tend--down { color: var(--pc-danger-600); }
.fx-pesq__spark { display: block; margin: var(--sp-2) 0; }
.fx-pesq__cta { display: inline-block; font-size: var(--fs-sm); font-weight: 600; color: var(--pc-petrol-600); }
.fx-pesq__vazio { margin: var(--sp-2) 0 0; font-size: var(--fs-sm); color: var(--pc-ink-500); line-height: 1.5; }
/* info-list em 2 subcolunas quando couber (densidade da identidade) */
.info-list--2col { display: grid; grid-template-columns: 1fr 1fr; gap: 0 var(--sp-5); }
.info-list--2col li { border-bottom: var(--hairline); }
@media (max-width: 560px) { .info-list--2col { grid-template-columns: 1fr; } }

/* localização compacta: mini-mapa PEQUENO ao lado do texto */
.fx-geo { display: flex; align-items: center; gap: var(--sp-4); margin-top: var(--sp-3); }
.mini-map--xs { max-width: 128px; margin: 0; flex: none; }
.fx-geo__txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.fx-geo__cidade { font-size: var(--fs-body); font-weight: 700; color: var(--pc-ink-900); overflow-wrap: anywhere; }
.fx-geo__uf { font-size: var(--fs-sm); color: var(--pc-ink-700); }
.fx-geo__nota { font-size: var(--fs-xs); color: var(--pc-ink-400); margin-top: 2px; }
.fx-geo__vazio { margin-top: var(--sp-3); font-size: var(--fs-sm); color: var(--pc-ink-500); }

/* endereço e contato declarados no CNPJ — dois blocos no pé do card Localização */
.fx-endr, .fx-fone { margin-top: var(--sp-4); padding-top: var(--sp-3); border-top: var(--hairline); }
.fx-endr__rot { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs);
  font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--pc-ink-400); }
.fx-endr__rot .icn { width: 15px; height: 15px; color: var(--pc-petrol-600); }
.fx-endr__txt { display: flex; flex-direction: column; gap: 2px; margin: var(--sp-2) 0 0; font-style: normal; }
.fx-endr__rua { font-size: var(--fs-body); font-weight: 600; color: var(--pc-ink-900); overflow-wrap: anywhere; }
.fx-endr__compl { font-size: var(--fs-sm); color: var(--pc-ink-700); overflow-wrap: anywhere; }
.fx-endr__loc { font-size: var(--fs-sm); color: var(--pc-ink-500); overflow-wrap: anywhere; }

/* prévia e botão na MESMA linha, botão à direita — mascarado o bloco ocupa duas
   linhas (rótulo + prévia), não quatro. Em cartão estreito o botão desce
   sozinho (wrap) em vez de espremer o número. Revelado, o botão some e a lista
   fica com a linha inteira. */
.fx-fone__linha { display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--sp-3); flex-wrap: wrap; margin-top: var(--sp-2); }
.fx-fone__lista { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.fx-fone__item { display: flex; align-items: baseline; gap: var(--sp-2); }
.fx-fone__num { font-size: var(--fs-body); font-weight: 600; color: var(--pc-ink-900); font-variant-numeric: tabular-nums; }
.fx-fone__num a { color: inherit; text-decoration: none; }
.fx-fone__num a:hover { text-decoration: underline; }
.fx-fone__mask { margin-left: 3px; color: var(--pc-ink-300); letter-spacing: .1em; font-size: .78em; vertical-align: 1px; }
/* e-mail é mais longo que telefone: cabe menor e quebra em qualquer ponto */
.fx-fone__mail { font-size: var(--fs-sm); overflow-wrap: anywhere; }
.fx-fone__dom { color: var(--pc-ink-700); font-weight: 500; }
.fx-fone__btn { display: inline-block; flex: none; padding: 0; border: 0; background: none;
  font: inherit; font-size: var(--fs-sm); font-weight: 600; color: var(--pc-petrol-600); cursor: pointer; }
.fx-fone__btn:hover { text-decoration: underline; }
/* display explícito vence o [hidden] do agente — os dois precisam do próprio */
.fx-fone__btn[hidden], .fx-fone__nota[hidden] { display: none; }
.fx-fone__btn[disabled] { color: var(--pc-ink-400); cursor: default; text-decoration: none; }
.fx-fone__nota { display: block; margin-top: var(--sp-2); font-size: var(--fs-xs); color: var(--pc-ink-400); line-height: 1.45; }

/* sparkline (usada agora no card de pesquisa condensado) */
.fx-spark-svg { display: block; width: 100%; height: 30px; }
/* barras finas por dia (§8) — pico destacado; base fica clara mesmo em dia zero */
.fx-spark-bar { fill: var(--pc-petrol-200); }
.fx-spark-bar.is-pico { fill: var(--pc-petrol-500); }

/* ============================== [4] EXPOSIÇÃO — número-herói, cor própria (azul)
   Contrasta com o âmbar de risco: azul = "a receber". */
/* O filete vem de .card[data-secao]; aqui só a cor (azul = "a receber"). */
.fx-expo { --sec-acento: var(--pc-info-600); }
.fx-expo__hero {
  display: grid; grid-template-columns: auto 1fr; gap: var(--sp-5) var(--sp-6);
  align-items: center; margin-bottom: var(--sp-5);
  padding: var(--sp-5); border-radius: var(--r-md);
  background: var(--pc-info-100);
}
.fx-expo__numwrap { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.fx-expo__num {
  font-size: var(--fs-kpi); font-weight: 800; line-height: 1; letter-spacing: -0.02em;
  color: var(--pc-info-600); font-variant-numeric: tabular-nums; overflow-wrap: anywhere;
}
.fx-expo__numlbl { font-size: var(--fs-xs); font-weight: 650; text-transform: uppercase; letter-spacing: .06em; color: var(--pc-info-600); }
.fx-expo__ctx { min-width: 0; }
.fx-expo__ctx p { margin: 0 0 var(--sp-2); font-size: var(--fs-sm); color: var(--pc-ink-700); line-height: 1.55; }
.fx-expo__ctx strong { color: var(--pc-ink-900); }
.fx-expo__maior strong { color: var(--pc-info-600); }
.fx-expo__stamp { margin: var(--sp-2) 0 0 !important; }
@media (max-width: 640px) {
  .fx-expo__hero { grid-template-columns: 1fr; gap: var(--sp-3); text-align: left; }
}

/* MOVIDO para components.css (seção "PROCESSO — jornada + andamentos"):
   .marcos-solo / .marcos-data* / pulse da fase atual. O bloco é renderizado por partials/proc-jornada e
   partials/proc-andamentos, que a ficha do Explorador e o /painel
   compartilham — o CSS tinha de sair de um stylesheet de PÁGINA para o
   global, senão a mesma marcação viria sem estilo na área logada. */

/* MOVIDO para components.css (seção "PROCESSO — jornada + andamentos"):
   .fx-tl* (caixa, itens, selos e recorte "com documento"). O bloco é renderizado por partials/proc-jornada e
   partials/proc-andamentos, que a ficha do Explorador e o /painel
   compartilham — o CSS tinha de sair de um stylesheet de PÁGINA para o
   global, senão a mesma marcação viria sem estilo na área logada. */

/* ==============================================================================
   DASHBOARD DO PROCESSO (accordion aberto) — spec 04/05, adaptado à marca.
   Só tokens --pc-… --r-… --sp-… --fs-… (escritos sem asterisco de propósito: a
   sequência `*` seguida de `/` FECHA o comentário, e o resto virava seletor —
   matava a regra .proc-sum-cnj logo abaixo). teal do spec → petrol; badges de classe
   → tints info/warning/petrol; dourado só no CTA de planos.
   ============================================================================ */

/* ---- Header do accordion: novos elementos (fase + credores) ---------------- */
.proc-sum-cnj { overflow-wrap: anywhere; }
.proc-sum-fase {
  font-size: var(--fs-sm); font-weight: 650; color: var(--pc-petrol-700);
  position: relative; padding-left: var(--sp-3);
}
.proc-sum-fase::before {
  content: "·"; position: absolute; left: 0; color: var(--pc-ink-300); font-weight: 400;
}
.proc-sum-val--cred { color: var(--pc-ink-700); }
.proc-sum-dagger { margin-left: 2px; color: var(--pc-ink-300); font-weight: 400; cursor: help; }

/* ---- O bloco do processo é UMA coluna. O rail de 265px saiu; devolve
   289px (265 + 24 de gap) à tabela e à ficha de dados. -------------------- */
.proc-dash { display: block; }
.proc-dash__main { min-width: 0; }

/* ---- Barra de identidade do processo + gate das peças ------------------- */
.proc-id {
  display: grid; grid-template-columns: minmax(0, 1fr) auto;
  align-items: center; column-gap: var(--sp-5); row-gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-4); margin: 0 0 var(--sp-5);
  border: var(--hairline-strong); border-radius: var(--r-md);
  background: var(--pc-bg-50);
}
.proc-id__row { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--sp-2) var(--sp-4); min-width: 0; }
.proc-id__k { font-size: 0.75rem; font-weight: 600; color: var(--pc-ink-500); }
.proc-id__cnj { font-size: var(--fs-sm); font-weight: 620; color: var(--pc-ink-900); font-variant-numeric: tabular-nums; }
.proc-id__ext { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm); font-weight: 600; color: var(--pc-petrol-600); }
.proc-id__ext .icn { width: 14px; height: 14px; }

/* ---- Aviso de extração pendente ----------------------------------------
   A PEÇA (.proc-extracao) mora em components.css: a aba Credores do /painel
   mostra o mesmo aviso sobre o mesmo vazio e não carrega este arquivo. O que
   fica aqui é só a COLAGEM à barra de identidade (a barra perde a margem
   quando o aviso existe): os dois são a mesma unidade de leitura — "este
   processo" e "o que ainda não sabemos dele" —, e isso é do Explorador. */
.proc-id:has(+ .proc-extracao) { margin-bottom: var(--sp-3); }

/* ---- LAJE DE PANORAMA (KPI) --------------------------------------------
   A separação passa a ser de SUPERFÍCIE, não de margem: antes o gap KPIs→h4
   era 20px, exatamente o mesmo de tudo→tudo. Agora: laje petróleo + eyebrow +
   32px de degrau de seção. */
.proc-panel {
  background: var(--pc-petrol-50); border: 1px solid var(--pc-petrol-200);
  border-radius: var(--r-lg); padding: var(--sp-5) var(--sp-5) var(--sp-3);
  margin: 0 0 var(--sp-8);
}
.proc-panel__grid {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  column-gap: var(--sp-5); row-gap: var(--sp-4);
}
/* Divisórias verticais em vez de 4 mini-cards com sombra dentro de outro card */
.pk {
  display: flex; flex-direction: column; min-width: 0;
  padding-left: var(--sp-5); border-left: 1px solid var(--pc-petrol-200);
}
.pk:first-child { padding-left: 0; border-left: 0; }
/* LINHA DE BASE COMUM sem subgrid: o rótulo reserva 2 linhas e o valor é
   empurrado ao pé. Antes os 5 valores caíam em 3 alturas (27px de dispersão). */
.pk-label {
  display: flex; align-items: flex-start; gap: 6px;
  min-height: 2.6em;
}
.pk-label .icn { width: 15px; height: 15px; flex: none; color: var(--pc-petrol-600); margin-top: 1px; }
.pk-value {
  margin-top: auto; padding-top: var(--sp-2);
  font-size: var(--fs-h3); font-weight: 750; color: var(--pc-petrol-900);
  line-height: 1.15; font-variant-numeric: tabular-nums;
  white-space: normal; word-break: keep-all; overflow-wrap: normal; max-width: 100%;
}
.pk-value--fase { font-size: var(--fs-h4); overflow-wrap: anywhere; }
.pk-value--vazio { color: var(--pc-ink-300); font-weight: 650; font-size: var(--fs-h4); }
.pk-stamp { margin-top: 2px; }
.pk--vazio .pk-value { opacity: .78; }
.proc-panel__foot {
  display: flex; align-items: center; gap: var(--sp-2);
  margin: var(--sp-4) 0 0; padding-top: var(--sp-3);
  border-top: 1px solid var(--pc-petrol-200);
  font-size: 0.6875rem; color: var(--pc-ink-500);
}
.proc-panel__foot .icn { width: 14px; height: 14px; flex: none; color: var(--pc-petrol-600); }
.proc-panel__foot strong { color: var(--pc-ink-700); font-variant-numeric: tabular-nums; }
@media (max-width: 760px) {
  .proc-panel__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .pk:nth-child(odd) { padding-left: 0; border-left: 0; }
}
@media (max-width: 440px) {
  .proc-panel__grid { grid-template-columns: 1fr; }
  .pk { padding-left: 0; border-left: 0; padding-top: var(--sp-3); border-top: 1px solid var(--pc-petrol-200); }
  .pk:first-child { padding-top: 0; border-top: 0; }
}

/* MOVIDO para components.css (seção "PROCESSO — jornada + andamentos"):
   .proc-recorte. O bloco é renderizado por partials/proc-jornada e
   partials/proc-andamentos, que a ficha do Explorador e o /painel
   compartilham — o CSS tinha de sair de um stylesheet de PÁGINA para o
   global, senão a mesma marcação viria sem estilo na área logada. */

/* ---- Rodapé de procedência (o que sobrou do rail) ----------------------- */
.proc-fontes {
  display: grid; grid-template-columns: auto minmax(0, 1fr);
  align-items: baseline; gap: var(--sp-2) var(--sp-3);
  margin-top: var(--sp-8); padding-top: var(--sp-4);
  border-top: var(--hairline-strong);
}
.pf-rot { font-size: 0.6875rem; font-weight: 650; color: var(--pc-ink-500); }
.pf-txt { grid-column: 2; margin: 0; max-width: 88ch; }
.pf-links { grid-column: 2; display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-5); margin-top: var(--sp-1); }
.pf-links a { font-size: var(--fs-sm); font-weight: 600; }
.pf-links .ext-link { display: inline-flex; align-items: center; gap: 6px; color: var(--pc-petrol-600); }
.pf-links .ext-link:hover { color: var(--pc-petrol-700); text-decoration: none; }
@media (max-width: 560px) {
  .proc-fontes { grid-template-columns: minmax(0, 1fr); }
  .pf-txt, .pf-links { grid-column: 1; }
}
/* MOVIDO para components.css (seção "PROCESSO — jornada + andamentos"):
   .proc-journey / .marcos-stepper--h / check de fase concluída / nó hipotético. O bloco é renderizado por partials/proc-jornada e
   partials/proc-andamentos, que a ficha do Explorador e o /painel
   compartilham — o CSS tinha de sair de um stylesheet de PÁGINA para o
   global, senão a mesma marcação viria sem estilo na área logada. */

/* ---- Maiores credores (PJ): LISTA compacta, não tabela ------------------
   Três dados curtos por credor não pagam o custo de uma tabela: cabeçalho de
   coluna + CNPJ em segunda linha davam ~110px de altura por credor. Aqui é uma
   linha por credor (posto · nome + documento inline · classe · valor), com o
   ranking no marcador — o mesmo conteúdo em cerca de um terço da altura. */
#processos .proc-body h4.cred-top-h {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--sp-3); flex-wrap: wrap;
}
.cred-top-regua { font-size: var(--fs-xs); font-weight: 500; color: var(--pc-ink-400); letter-spacing: 0; }
/* Painel rebaixado, a mesma receita da caixa dos andamentos (.fx-tl-box): num
   corpo de accordion que é só texto corrido sobre branco, o fundo é o que diz
   "aqui começa e aqui acaba uma tabela" sem gastar mais um título. */
.cred-top {
  list-style: none; margin: 0; counter-reset: credtop;
  border: var(--hairline); border-radius: var(--r-md);
  background: var(--pc-bg-50); padding: var(--sp-2) var(--sp-4);
}
.cred-top__item {
  counter-increment: credtop;
  display: grid; grid-template-columns: 1.25rem minmax(0, 1fr) auto auto;
  align-items: baseline; column-gap: var(--sp-3);
  padding: var(--sp-2) 0; border-top: var(--hairline);
}
.cred-top__item:first-child { border-top: 0; }
.cred-top__item::before {
  content: counter(credtop); text-align: right;
  font-size: var(--fs-xs); color: var(--pc-ink-300); font-variant-numeric: tabular-nums;
}
/* Nome um degrau ABAIXO do valor (13px × 15px): a razão social vem em caixa
   alta da RFB e, no mesmo corpo do valor, dominava a linha — quem ordena a
   lista é o crédito. O nome identifica; o valor é o dado. */
.cred-top__nome { min-width: 0; font-size: var(--fs-sm); font-weight: 620; color: var(--pc-ink-900); overflow-wrap: anywhere; }
/* documento na MESMA linha do nome (era .td-sub, uma segunda linha por credor) */
.cred-top__doc { margin-left: var(--sp-2); font-size: var(--fs-xs); font-weight: 400; color: var(--pc-ink-400); white-space: nowrap; }
#processos .cred-top__classe { white-space: nowrap; }
.cred-top__val { font-size: var(--pc-t-valor, var(--fs-body)); font-weight: 650; color: var(--pc-ink-900); font-variant-numeric: tabular-nums; white-space: nowrap; text-align: right; }
/* Estreito: o nome toma a linha inteira e classe/valor descem juntos — nunca
   uma coluna de 3 caracteres espremendo o nome do credor. */
@media (max-width: 640px) {
  .cred-top__item { grid-template-columns: 1.25rem minmax(0, 1fr) auto; row-gap: 2px; }
  .cred-top__nome { grid-column: 2 / -1; }
  .cred-top__classe { grid-column: 2; justify-self: start; }
  .cred-top__val { grid-column: 3; }
  .cred-top__doc { display: block; margin-left: 0; }
}

/* ---- Cards de classe: cabem na linha, ZERO overflow ---------------------
   Sai grid-auto-flow:column + overflow-x:auto, cuja "rede de segurança"
   (@media ≤720px { grid-auto-columns: minmax(150px,1fr) }) era o que produzia
   240px MEDIDOS de rolagem horizontal a 700px. Entra auto-fit: em tela larga
   tudo numa linha; sem largura, QUEBRA em ordem — nunca rola. */
.cred-classe-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(146px, 1fr));
  gap: var(--sp-2); margin-bottom: 0; overflow: visible;
}
.cred-classe {
  display: flex; flex-direction: column; gap: 0; min-width: 0; text-align: left;
  background: var(--pc-bg-0);
  border: var(--hairline-strong);
  border-top: 3px solid var(--cc-cor, var(--pc-line-200));
  border-radius: var(--r-md); padding: var(--sp-3) var(--sp-4);
}
.cred-classe > * { margin: 0; }        /* mata os 3 recuos diferentes medidos */
.cc-classe { font-size: var(--fs-sm); font-weight: 700; color: var(--pc-ink-900); line-height: 1.2; }
.cc-nome { overflow-wrap: anywhere; min-height: 2.5em; }  /* base comum p/ o valor */
.cc-value {
  margin-top: auto; padding-top: var(--sp-3);
  font-size: var(--fs-h4); font-weight: 800; color: var(--pc-ink-900);
  line-height: 1.1; font-variant-numeric: tabular-nums;
  white-space: nowrap; overflow-wrap: normal;
}
.cc-count { margin-top: 2px; font-size: var(--fs-xs); color: var(--pc-ink-400); font-variant-numeric: tabular-nums; }
/* Cor da classe como FILETE de topo, não fundo chapado: sobre branco o
   agregado lê como NÚMERO; sobre chapado colorido lia como etiqueta. */
.cred-classe--i      { --cc-cor: var(--pc-info-600); }
.cred-classe--ii     { --cc-cor: var(--pc-warning-600); }
.cred-classe--iii    { --cc-cor: var(--pc-petrol-500); }
.cred-classe--iv,
.cred-classe--me_epp { --cc-cor: #5E4699; }

/* ---- Cards como FILTRO (só na visão liberada de admin) ------------------
   Vira <button>: zera a aparência de botão e reusa o mesmo card. O selecionado
   ganha fundo e anel — a cor do filete continua identificando a classe. */
.cred-classe-grid.is-filtravel button.cred-classe {
  font: inherit; color: inherit; cursor: pointer; width: 100%;
  transition: background-color var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast);
}
.cred-classe-grid.is-filtravel button.cred-classe:hover {
  background: var(--pc-bg-50); transform: translateY(-1px); box-shadow: var(--shadow-2);
}
.cred-classe-grid.is-filtravel button.cred-classe.is-selected {
  background: var(--pc-petrol-50);
  box-shadow: inset 0 0 0 2px var(--cc-cor, var(--pc-petrol-500));
}
.cred-classe--total { --cc-cor: var(--pc-petrol-700); }

/* ---- Busca na lista liberada ------------------------------------------- */
.admin-unlock__busca { display: flex; align-items: center; gap: var(--sp-3); margin-bottom: var(--sp-3); flex-wrap: wrap; }
.admin-unlock__busca input {
  flex: 1 1 260px; min-width: 0; height: 38px; padding: 0 var(--sp-4);
  border: var(--hairline-strong); border-radius: var(--r-full);
  background: var(--pc-bg-0); font-size: var(--fs-sm); color: var(--pc-ink-900);
}
.admin-unlock__busca input:focus { outline: 2px solid var(--pc-petrol-500); outline-offset: 1px; }
.admin-unlock__status {
  flex: none; display: inline-flex; align-items: center; gap: var(--sp-2);
  font-size: var(--fs-xs); color: var(--pc-ink-500); font-variant-numeric: tabular-nums;
}
/* Carregando: a lista ANTIGA continua legível, só esmaecida — trocar por um
   esqueleto piscando a cada clique de classe faria a tela saltar. O ponteiro é
   bloqueado para não empilhar cliques enquanto a consulta roda. */
.admin-unlock__tabela.is-carregando { position: relative; }
.admin-unlock__tabela.is-carregando table { opacity: .45; transition: opacity var(--t-fast); pointer-events: none; }
.admin-unlock__tabela.is-carregando::after {
  content: ''; position: absolute; inset: 0; background: var(--pc-bg-0); opacity: .25; pointer-events: none;
}
/* …mas só esmaecer não diz que ALGO está acontecendo: a faixa nomeia o estado no
   topo da lista, onde o olho está depois de clicar na classe. Fica ABSOLUTA sobre
   o wrapper (não dentro da caixa que rola) para não empurrar a tabela nem escapar
   da vista quando o usuário já rolou a lista. */
.admin-unlock__tabela-wrap { position: relative; }
.admin-unlock__carregando {
  position: absolute; top: 0; left: 0; right: 0; z-index: 4;
  display: flex; align-items: center; justify-content: center; gap: var(--sp-2);
  margin: 0; padding: var(--sp-2) var(--sp-3); pointer-events: none;
  background: var(--pc-petrol-50); border-bottom: 1px solid var(--pc-petrol-200);
  font-size: var(--fs-xs); font-weight: 650; color: var(--pc-petrol-800);
}
.admin-unlock__carregando[hidden] { display: none; }
/* "Ver mais" como última LINHA da tabela: aparece ao rolar até o fim da lista.
   Sem zebra nem hover — é um controle, não um registro. */
.admin-unlock__tabela tfoot .admin-unlock__mais td {
  text-align: center; padding: var(--sp-3); background: var(--pc-bg-0);
  border-top: var(--hairline-strong);
}
.admin-unlock__tabela tfoot .admin-unlock__mais:hover td { background: var(--pc-bg-0); }
/* No modo empilhado (mobile) o td vira flex com um rótulo ::before vindo do
   data-label; esta linha não é registro, então o rótulo sai e o botão centra. */
@media (max-width: 768px) {
  .admin-unlock__tabela tfoot .admin-unlock__mais td { justify-content: center; text-align: center; }
  .admin-unlock__tabela tfoot .admin-unlock__mais td::before { content: none; }
  /* Empilhado, a célula é flex com o rótulo à esquerda: os chips acompanham o
     resto do conteúdo e encostam à direita. */
  .tbl-expo .td-classes { justify-content: flex-end; }
}

/* ---- Total: faixa de SOMA, depois das parcelas -------------------------- */
.cred-total {
  display: grid; grid-template-columns: minmax(0, 1fr) auto;
  align-items: baseline; column-gap: var(--sp-4); row-gap: 2px;
  margin: var(--sp-2) 0 var(--sp-4); padding: var(--sp-3) var(--sp-4);
  background: var(--pc-petrol-50);
  border: 1px solid var(--pc-petrol-200); border-radius: var(--r-md);
}
.ct-rot { grid-column: 1; grid-row: 1; font-size: var(--fs-sm); font-weight: 650; color: var(--pc-petrol-800); }
.ct-value {
  grid-column: 2; grid-row: 1; text-align: right; white-space: nowrap;
  font-size: var(--fs-h3); font-weight: 800; color: var(--pc-petrol-900);
  line-height: 1.1; font-variant-numeric: tabular-nums;
}
.ct-count { grid-column: 2; grid-row: 2; text-align: right; font-size: var(--fs-xs); color: var(--pc-ink-500); }
@media (max-width: 460px) {
  .cred-total { grid-template-columns: 1fr; }
  .ct-value, .ct-count { grid-column: 1; text-align: left; }
}

/* nota de divergência (spec note_box) */
.cred-note {
  display: flex; gap: var(--sp-3); align-items: flex-start;
  background: var(--pc-info-100); border-left: 3px solid var(--pc-info-600);
  border-radius: 0 var(--r-md) var(--r-md) 0; padding: var(--sp-3) var(--sp-4);
  margin-bottom: var(--sp-4);
}
.cred-note .icn { width: 18px; height: 18px; flex: none; color: var(--pc-info-600); margin-top: 1px; }
.cred-note p { margin: 0; font-size: var(--fs-xs); color: var(--pc-ink-700); line-height: 1.5; }

/* .proc-empty* MORREU (03/09/2026): saiu daqui para components.css quando a
   caixa vazia de andamentos era compartilhada com o /painel, e saiu de vez
   quando a regra virou "sem andamento, sem seção" — nenhuma marcação a produz.
   Ver o comentário que ficou em components.css, seção dos andamentos. */

/* O rail lateral (.proc-rail / .rail-card* / .rail-kv / .rk-* / .rail-btn* /
   .rail-link / .rail-fonte) SAIU: nenhuma view tem o markup. Ver o rodapé de
   procedência (.proc-fontes), que herdou a única função própria do rail. */

/* ---- A LINHA QUE VENDE — espécie própria -------------------------------
   Medido: o h4 do paywall e o h4 de seção eram IDÊNTICOS em 5 de 5
   propriedades (13px/650/uppercase/.78px/ink-500), porque .paywall-card h4
   (components.css) só define margin-bottom. Aqui a especificidade é
   (1,2,1) contra (1,1,1) do título de seção — vence por especificidade, não
   por ordem de cascata. */
#processos .proc-body .paywall-card h4 {
  font-size: var(--pc-t-forte); font-weight: 720; color: var(--pc-ink-900);
  text-transform: none; letter-spacing: -.01em; line-height: 1.25;
  margin: 0 0 var(--sp-2); padding-left: 0;
}
#processos .proc-body .paywall-card h4::before { content: none; }
#processos .paywall-card p { font-size: var(--fs-sm); color: var(--pc-ink-500); line-height: 1.55; }
#processos .paywall-card .pc-eyebrow { text-align: center; }
/* O PREÇO é régua da oferta, não rodapé. Era .rail-fonte: 11px/ink-500,
   o MESMO estilo de "Fonte: Tribunais de Justiça". */
/* Duas linhas: o VALOR sozinho (lido de relance) e as condições embaixo, em
   corpo menor — na mesma frase o "R$ 99" se perdia no meio da letra miúda. */
#processos .paywall-card .paywall-nota {
  display: inline-block; margin: 0 auto var(--sp-4);
  padding: var(--sp-2) var(--sp-5); border-radius: var(--r-lg);
  background: var(--pc-gold-50); border: 1px solid var(--pc-gold-300);
  font-size: var(--fs-sm); font-weight: 650; color: var(--pc-gold-800);
  text-align: center; line-height: 1.35;
}
#processos .paywall-card .paywall-nota__preco {
  display: block; font-size: var(--fs-h4); font-weight: 750; letter-spacing: -0.01em;
}
#processos .paywall-card .paywall-nota__cond {
  display: block; font-size: var(--fs-xs); font-weight: 600; opacity: .85;
}

/* ---- Liberação de admin (sessão + CNPJ) --------------------------------
   O ANÚNCIO da liberação vive numa barra só, no topo da ficha (.admin-bar).
   Daqui para baixo, bloco liberado renderiza IGUAL ao de quem paga para ver a
   ficha inteira: nada de moldura própria, selo repetido ou tarja por seção.
   Por isso `.admin-unlock` não tem mais regra de decoração — a classe segue no
   HTML só como âncora de JS (app.js usa closest('.admin-unlock') para achar o
   corpo da lista de credores), e closest() casa por seletor no DOM, sem
   depender de existir estilo. O espaçamento do bloco vem do utilitário .mt-4
   que já acompanha a div. `.admin-unlock__head` morreu junto com as tarjas.
   O que sobra aqui é usado pela barra do topo (__tag/__txt/__form) ou é
   apresentação de tabela longa (__tabela/__nota). */
.admin-unlock__tag {
  flex: none; padding: 3px 10px; border-radius: var(--r-full);
  background: var(--pc-petrol-700); color: #fff;
  font-size: var(--fs-xs); font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
}
.admin-unlock__txt { flex: 1 1 240px; font-size: var(--fs-xs); color: var(--pc-ink-500); line-height: 1.4; }
.admin-unlock__form { flex: none; margin: 0; }
/* Altura FIXA com rolagem própria: a tabela não pode esticar o card do bloco
   (ver comentário na view — reveal por área nunca dispara em bloco gigante). */
.admin-unlock__tabela { max-height: 460px; overflow-y: auto; overscroll-behavior: contain; }
/* Painel rebaixado ao redor da tabela — a MESMA receita da caixa de andamentos
   e do .cred-top: fundo bg-50, filete e raio, com a tabela branca por dentro
   (lá são os cards do andamento; aqui é o <table>). Num corpo de accordion que
   é texto corrido sobre branco, é o fundo que diz onde a tabela começa e acaba
   sem gastar mais um título. O branco do <table> fica como está — o contraste
   com o painel é justamente o que recorta o bloco. */
.admin-unlock__tabela {
  border: var(--hairline); border-radius: var(--r-md);
  background: var(--pc-bg-50); padding: var(--sp-3) var(--sp-4);
}
.admin-unlock__tabela thead th { position: sticky; top: 0; background: var(--pc-bg-0); z-index: 1; }
.admin-unlock__nota { margin: var(--sp-3) 0 0; font-size: var(--fs-xs); color: var(--pc-ink-500); line-height: 1.5; }

/* Barra de liberação no nível da FICHA (logo abaixo do herói). É o ÚNICO lugar
   da página que anuncia o estado: tracejado petróleo quando liberada, cinza
   quando pública — fechada, a barra não pode competir com o crachá de
   insolvência do herói. Os blocos abaixo dela não repetem esse vocabulário. */
.admin-bar {
  display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap;
  margin: var(--sp-4) 0 var(--sp-6); padding: var(--sp-3) var(--sp-4);
  border: 1px dashed var(--pc-line-200); border-radius: var(--r-lg);
  background: var(--pc-bg-50);
}
.admin-bar.is-liberada { border-color: var(--pc-petrol-300); background: var(--pc-petrol-50); }
.admin-bar .admin-unlock__tag { background: var(--pc-ink-500); }
.admin-bar.is-liberada .admin-unlock__tag { background: var(--pc-petrol-700); }
.admin-bar .admin-unlock__txt { flex: 1 1 320px; }

/* ---- Gate das peças em PDF: revelação IN-PLACE, nunca modal -------------- */
.pdf-gate { grid-column: 2; justify-self: end; min-width: 0; }
.pdf-gate__btn {
  list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: var(--sp-2);
  height: 34px; padding: 0 var(--sp-4); border-radius: var(--r-full);
  background: var(--pc-gold-50); border: 1px solid var(--pc-gold-300);
  font-size: var(--fs-sm); font-weight: 650; color: var(--pc-gold-800);
  transition: background-color var(--t-fast), border-color var(--t-fast);
}
.pdf-gate__btn::-webkit-details-marker { display: none; }
.pdf-gate__btn:hover { background: var(--pc-gold-100); border-color: var(--pc-gold-500); }
.pdf-gate__btn:focus-visible { outline: none; box-shadow: var(--ring-focus); }
.pdf-gate__btn .icn { width: 15px; height: 15px; }
.pdf-gate__n {
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: var(--r-full);
  background: var(--pc-gold-300); color: var(--pc-gold-800);
  font-size: 10px; font-weight: 700; line-height: 18px; text-align: center;
  font-variant-numeric: tabular-nums;
}
/* Download REAL (visão liberada): mesmo desenho do gate, só que é <a> que baixa
   direto — nada abre in-place. */
a.pdf-gate__btn--dl { text-decoration: none; }
/* Sem arquivo no bucket: o botão existe (o recurso é conhecido) mas INERTE —
   cinza, sem hover, cursor de negado. <span>, então não há ação a bloquear. */
.pdf-gate__btn--off,
.pdf-gate__btn--off:hover {
  cursor: not-allowed;
  background: var(--pc-bg-100); border-color: var(--pc-line-200);
  color: var(--pc-ink-400);
}
/* ABERTO: o painel toma o lugar da linha do número do processo — o pedido
   literal ("dentro/substituindo o bloco do número"). O CNJ NÃO some: reaparece
   dentro do painel (.pdf-gate__cnj), porque é a âncora que prova de qual
   processo é a peça. Sem :has() o painel simplesmente abre abaixo. */
.pdf-gate[open] { grid-column: 1 / -1; justify-self: stretch; }
.proc-id:has(.pdf-gate[open]) .proc-id__row { display: none; }
.pdf-gate[open] .pdf-gate__btn { width: 100%; justify-content: flex-start; border-radius: var(--r-md) var(--r-md) 0 0; }
.pdf-gate__painel {
  margin-top: -1px; padding: var(--sp-5);
  background: var(--pc-bg-0);
  border: 1px solid var(--pc-gold-300); border-radius: 0 0 var(--r-md) var(--r-md);
}
@media (prefers-reduced-motion: no-preference) {
  .pdf-gate[open] .pdf-gate__painel { animation: pc-fade-up 240ms var(--ease-out) both; }
}
.pdf-gate__cnj { margin: 0 0 var(--sp-2); font-size: var(--fs-sm); font-weight: 620; color: var(--pc-ink-700); font-variant-numeric: tabular-nums; }
.pdf-gate__h { margin: 0 0 var(--sp-2); font-size: var(--fs-h4); font-weight: 700; color: var(--pc-ink-900); }
.pdf-gate__p { margin: 0 0 var(--sp-3); font-size: var(--fs-sm); color: var(--pc-ink-700); line-height: 1.55; max-width: 72ch; }
.pdf-gate__nota {
  display: inline-block; margin: 0 0 var(--sp-4);
  padding: 4px var(--sp-4); border-radius: var(--r-full);
  background: var(--pc-gold-50); border: 1px solid var(--pc-gold-300);
  font-size: var(--fs-sm); font-weight: 650; color: var(--pc-gold-800);
}
.pdf-gate__acoes { display: flex; flex-wrap: wrap; gap: var(--sp-3); }
@media (max-width: 720px) {
  .proc-id { grid-template-columns: 1fr; }
  .pdf-gate, .pdf-gate[open] { grid-column: 1; justify-self: stretch; }
  .pdf-gate__btn { width: 100%; justify-content: flex-start; }
}

/* MOVIDO para components.css (seção "PROCESSO — jornada + andamentos"):
   .pc-blur* (fake-blur de zona paga). O bloco é renderizado por partials/proc-jornada e
   partials/proc-andamentos, que a ficha do Explorador e o /painel
   compartilham — o CSS tinha de sair de um stylesheet de PÁGINA para o
   global, senão a mesma marcação viria sem estilo na área logada. */
/* ============================== [6] QSA — cards de perfil (avatares)
   Único bloco com avatares em círculo. */
.fx-qsa { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: var(--sp-3); }
.fx-qsa__card {
  display: grid; grid-template-columns: auto 1fr; gap: var(--sp-3); align-items: start;
  border: var(--hairline-strong); border-radius: var(--r-lg);
  background: var(--pc-bg-0); padding: var(--sp-4); text-decoration: none; color: inherit;
  transition: border-color var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast);
}
.fx-qsa__card:hover { border-color: var(--pc-petrol-300); box-shadow: var(--shadow-2); transform: translateY(-1px); text-decoration: none; }
.fx-qsa__avatar {
  width: 42px; height: 42px; border-radius: var(--r-full); flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: var(--fs-sm); font-weight: 750; letter-spacing: .02em;
  color: var(--pc-petrol-700); background: var(--pc-petrol-100);
  border: 1px solid var(--pc-petrol-200);
}
.fx-qsa__body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.fx-qsa__nome { font-size: var(--fs-sm); font-weight: 700; color: var(--pc-ink-900); overflow-wrap: anywhere; }
.fx-qsa__meta { font-size: var(--fs-xs); color: var(--pc-ink-500); }
.fx-qsa__doc { font-size: var(--fs-xs); color: var(--pc-ink-400); }
.fx-qsa__outras {
  margin-top: 4px; font-size: var(--fs-xs); font-weight: 650;
  color: var(--pc-petrol-600);
}

/* (T1) QSA condensado: total no cabeçalho + chips menores + expansão em <details>. */
.fx-qsa__total {
  margin-left: auto; font-size: var(--fs-xs); font-weight: 650;
  color: var(--pc-ink-500); background: var(--pc-bg-100); border: var(--hairline);
  border-radius: var(--r-full); padding: 2px 10px; white-space: nowrap;
}
.fx-qsa--chips { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: var(--sp-2); }
.fx-qsa--chips .fx-qsa__card {
  grid-template-columns: 28px 1fr; gap: var(--sp-2); align-items: center;
  padding: var(--sp-2) var(--sp-3); border: var(--hairline); border-radius: var(--r-md);
}
.fx-qsa--chips .fx-qsa__card:hover { border-color: var(--pc-petrol-300); box-shadow: var(--shadow-1); transform: none; }
.fx-qsa--chips .fx-qsa__avatar { width: 28px; height: 28px; font-size: var(--fs-xs); }
.fx-qsa--chips .fx-qsa__nome { font-size: var(--fs-sm); font-weight: 650; }
.fx-qsa--chips .fx-qsa__meta { font-size: var(--fs-xs); color: var(--pc-ink-500); }
.fx-qsa--chips .fx-qsa__outras { margin-top: 2px; font-size: var(--fs-xs); }
.fx-qsa__expand summary {
  cursor: pointer; list-style: none; display: inline-flex; align-items: center; gap: 6px;
  margin-top: var(--sp-3); font-size: var(--fs-sm); font-weight: 600; color: var(--pc-petrol-600);
}
.fx-qsa__expand summary::-webkit-details-marker { display: none; }
.fx-qsa__chev {
  width: 8px; height: 8px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg); transition: transform var(--t-fast);
}
.fx-qsa__expand[open] .fx-qsa__chev { transform: rotate(225deg); }

/* ============================== (C1) Guia do credor — hierarquia + ícones
   Título curto + subtítulo + 3 passos em cards com ícone e número. Menos texto,
   escaneável, didático (público = credores leigos). */
/* O bloco é um CTA, não um card informativo (pedido do dono): fundo com leve
   lavagem petróleo, borda superior de ação e sombra um degrau acima — sinaliza
   "aqui se faz algo" sem gritar. O dourado segue reservado a paywall/premium. */
.credor-guia {
  background: linear-gradient(160deg, var(--pc-petrol-50) 0%, var(--pc-bg-0) 58%);
  border: 1px solid var(--pc-petrol-200);
  --sec-acento: var(--pc-petrol-600); /* filete de topo: .card[data-secao] */
  box-shadow: var(--shadow-2, 0 10px 26px rgba(6, 24, 27, .08));
}
.credor-guia .overline {
  display: inline-block; color: var(--pc-petrol-700);
  background: var(--pc-petrol-100); border-radius: var(--r-full);
  padding: 3px 12px; letter-spacing: .06em;
}
.credor-guia__cta .btn-primary {
  padding: 12px 26px; font-size: var(--fs-body);
  box-shadow: 0 6px 16px rgba(24, 105, 116, .22);
}
.credor-guia__head { max-width: 62ch; }
.credor-guia__titulo { margin: var(--sp-1) 0 0; }
/* o lead é irmão do __head (e não filho): recolhido, o bloco mostra só o título */
.credor-guia__lead { max-width: 62ch; margin: var(--sp-3) 0 0; font-size: var(--fs-body); color: var(--pc-ink-700); line-height: 1.55; }
.credor-guia__passos {
  list-style: none; margin: var(--sp-5) 0 0; padding: 0;
  display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-4);
}
.cg-passo {
  position: relative; border: var(--hairline-strong); border-radius: var(--r-lg);
  background: var(--pc-bg-0); padding: var(--sp-4); box-shadow: var(--shadow-1);
}
.cg-passo__ico {
  display: inline-flex; width: 38px; height: 38px; border-radius: var(--r-md);
  align-items: center; justify-content: center;
  background: var(--pc-petrol-50); color: var(--pc-petrol-600); margin-bottom: var(--sp-3);
}
.cg-passo__ico .icn { width: 20px; height: 20px; }
.cg-passo__n {
  position: absolute; top: var(--sp-3); right: var(--sp-4);
  font-size: var(--fs-h3); font-weight: 800; color: var(--pc-line-200); line-height: 1;
}
.cg-passo h3 { margin: 0 0 4px; font-size: var(--fs-body); }
.cg-passo p { margin: 0; font-size: var(--fs-sm); color: var(--pc-ink-500); line-height: 1.5; }
.credor-guia__cta { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin-top: var(--sp-5); }
.credor-guia__nota { margin-top: var(--sp-3); font-size: var(--fs-xs); color: var(--pc-ink-400); }
@media (max-width: 720px) { .credor-guia__passos { grid-template-columns: 1fr; } }

/* ============================== [8] RELATOS + CTA fundidos (2fr / 1fr)
   Lista de relatos à esquerda, painel de ação sticky à direita. */
.fx-relatos { display: grid; grid-template-columns: 2fr 1fr; gap: var(--sp-6); align-items: start; }
.fx-relatos__lista { min-width: 0; }
.fx-relatos__lista .lista-relatos li:last-child { border-bottom: 0; }
.fx-relatos__cta {
  position: sticky; top: var(--sp-6);
  border: var(--hairline-strong); border-radius: var(--r-lg);
  border-top: 3px solid var(--pc-gold-500);
  background: var(--pc-gold-50); padding: var(--sp-5);
  display: flex; flex-direction: column; gap: var(--sp-3);
}
.fx-relatos__cta-eyebrow { font-size: var(--fs-body); font-weight: 750; color: var(--pc-ink-900); line-height: 1.25; }
.fx-relatos__cta-txt { margin: 0; font-size: var(--fs-sm); color: var(--pc-ink-700); line-height: 1.55; }
.fx-relatos__cta-btn { width: 100%; text-align: center; }
.fx-relatos__cta-alt { font-size: var(--fs-sm); text-align: center; }
.fx-relatos__form .field { margin-bottom: var(--sp-3); }
@media (max-width: 900px) {
  .fx-relatos { grid-template-columns: 1fr; }
  .fx-relatos__cta { position: static; }
}
/* Mobile: rótulos de CTA longos NÃO podem estourar o card. O .btn global é
   white-space:nowrap + height fixa; no estreito liberamos a quebra do rótulo
   (largura intrínseca deixa de mandar) e prendemos a largura ao card. Vale para
   os CTAs da ficha: painel de relatos e a fileira do guia do credor. */
@media (max-width: 640px) {
  .fx-relatos__cta .btn,
  #voce-e-credor .flex.flex-wrap .btn {
    white-space: normal; max-width: 100%; min-width: 0;
    height: auto; min-height: 42px; padding-top: 9px; padding-bottom: 9px;
    text-align: center; overflow-wrap: anywhere; line-height: 1.25;
  }
  /* a fileira do guia empilha os botões no estreito (cada um a 100%) */
  #voce-e-credor .flex.flex-wrap { flex-direction: column; align-items: stretch; }
  #voce-e-credor .flex.flex-wrap .btn { width: 100%; }
}

/* ============================== [9] UPSELL — faixa de conversão destacada
   Gradiente petróleo, cadeado, botão grande. Deliberadamente destoa. */
.fx-upsell {
  display: grid; grid-template-columns: auto 1fr; gap: var(--sp-4) var(--sp-5);
  align-items: start;
  border-radius: var(--r-xl); padding: var(--sp-6) var(--sp-8);
  color: var(--pc-dark-text);
  background:
    radial-gradient(120% 140% at 100% 0%, rgba(29,131,143,.35), transparent 60%),
    linear-gradient(135deg, var(--pc-petrol-900), var(--pc-petrol-800));
  box-shadow: var(--shadow-3);
}
.fx-upsell__lock {
  width: 46px; height: 46px; border-radius: var(--r-md); flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--pc-gold-300); background: rgba(255,255,255,.08);
  border: 1px solid rgba(255,255,255,.14);
}
.fx-upsell__body { min-width: 0; }
.fx-upsell__body .overline { color: var(--pc-petrol-200); margin-bottom: var(--sp-1); }
.fx-upsell__titulo { margin: 0; color: #fff; line-height: 1.15; }
.fx-upsell__quant { margin: var(--sp-3) 0 0; font-size: var(--fs-sm); color: var(--pc-dark-text-dim); line-height: 1.6; }
/* O PREÇO — a régua da oferta, e a contrapartida visível do nó Offer do
   JSON-LD. Sai em linha própria e mais claro que a prosa acima: gold-300 é o
   tom que esta faixa já usa para o que é comercial (o botão), e ele lê 8,2:1
   sobre o petrol-900 do fundo. */
.fx-upsell__preco {
  margin: var(--sp-3) 0 0; font-size: var(--fs-body);
  color: var(--pc-gold-300); font-weight: 600; line-height: 1.5;
}
.fx-upsell__cta { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin-top: var(--sp-5); }
.fx-upsell__cta .btn-primary { background: var(--pc-gold-500); color: var(--pc-petrol-950); }
.fx-upsell__cta .btn-primary:hover { background: var(--pc-gold-300); }
.fx-upsell__cta .btn-ghost { color: var(--pc-petrol-100); border-color: rgba(255,255,255,.24); }
.fx-upsell__cta .btn-ghost:hover { background: rgba(255,255,255,.10); color: #fff; }
.fx-upsell__stamp { margin: var(--sp-4) 0 0; font-size: var(--fs-xs); color: var(--pc-petrol-300); }
@media (max-width: 640px) {
  .fx-upsell { grid-template-columns: 1fr; padding: var(--sp-5); gap: var(--sp-3); }
  .fx-upsell__cta .btn { width: 100%; text-align: center; }
}

/* ============================================================================
   ÍNDICE DE RELACIONAMENTO COMERCIAL (vendor rating B2B)
   Bloco público da ficha + área privada da empresa avaliada (/painel).
   Estrelas em gold; semáforo em success/warning/danger. Só apresenta números
   agregados no bloco público — nenhum dado identificável no DOM.
   ========================================================================== */

/* ---- estrelas (widget de leitura, fracionárias) ------------------------- */
.vr-stars { display: inline-flex; gap: 2px; line-height: 1; vertical-align: middle; }
.vr-star {
  position: relative; width: 1em; height: 1em; font-size: 1.05em;
  color: var(--pc-gold-300); /* trilho vazio */
}
.vr-star::before,
.vr-star__fill::before {
  content: "★"; position: absolute; inset: 0;
  display: block; text-align: center;
}
.vr-star__fill {
  position: absolute; inset: 0; overflow: hidden; white-space: nowrap;
  color: var(--pc-gold-600); /* preenchido */
}
.vr-stars--lg .vr-star { font-size: 1.7em; }

/* ---- Identidade de SEÇÃO (era só .vr-sec): o filete de topo marcava uma
   seção só, e a diferença lida como "esta é especial" em vez de "aqui começa
   uma seção". Agora todo card de seção da ficha abre com o filete — o hook é
   [data-secao], o mesmo atributo que o app.js usa para injetar o chevron de
   recolher, então nenhuma caixa interna (.card-pad, bento, faixa de upsell)
   entra por engano. Quem tem cor própria só troca --sec-acento. */
.card[data-secao] { border-top: 3px solid var(--sec-acento, var(--pc-petrol-500)); }
/* O modificador .sec-sub--full morreu aqui: ele existia para soltar ESTE
   parágrafo do teto de 72ch, e agora nenhuma .sec-sub tem teto. */
.vr-corpo { min-width: 0; }
/* Uma coluna só: a grade 1,55fr/1fr era incondicional acima de 860px e dava ao
   miolo um TETO de 59,5% do card, com ou sem agregado. O markup do <aside>
   .vr-layout__cta saiu inteiro; as regras ficam só como rede de segurança
   caso outra view ainda monte .vr-layout. */
.vr-layout { display: block; }
.vr-layout__main { min-width: 0; }

/* ---- Convite a avaliar: faixa de largura cheia, POR ÚLTIMO -------------- */
.vr-convite {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(260px, 300px);
  gap: var(--sp-6); align-items: center;
  margin-top: var(--sp-8); padding: var(--sp-6);
  border-radius: var(--r-lg);
  background: linear-gradient(135deg, var(--pc-petrol-900), var(--pc-petrol-700));
  color: var(--pc-dark-text);
}
.vr-convite .pc-eyebrow { color: var(--pc-petrol-200); }
.vr-convite__h { margin: 0 0 var(--sp-2); font-size: var(--fs-h3); font-weight: 720; letter-spacing: -.01em; color: var(--pc-bg-0); }
.vr-convite__sub { margin: 0 0 var(--sp-3); font-size: var(--fs-sm); line-height: 1.6; }
.vr-convite__aviso {
  margin: 0; padding: var(--sp-3) var(--sp-4);
  font-size: var(--fs-sm); line-height: 1.55;
  background: rgba(255,255,255,.08); border-left: 3px solid var(--pc-petrol-300);
  border-radius: 0 var(--r-md) var(--r-md) 0;
}
.vr-convite__aviso strong { color: var(--pc-bg-0); }
.vr-convite__estado {
  margin: var(--sp-3) 0 0; padding: var(--sp-2) var(--sp-3);
  font-size: var(--fs-xs); line-height: 1.5;
  background: rgba(255,255,255,.06); border-radius: var(--r-sm);
}
.vr-convite__acao { display: flex; flex-direction: column; align-items: stretch; gap: var(--sp-2); }
/* CTA de ALTO contraste sobre a banda escura. O antigo era .btn-secondary
   #FFFFFF sobre cartão #F6F8F8 — contraste de superfície 1,07:1 (borda 1,21:1). */
.vr-convite__btn {
  width: 100%; height: 48px; text-align: center; font-size: var(--fs-body); font-weight: 700;
  background: var(--pc-bg-0); border-color: var(--pc-bg-0); color: var(--pc-petrol-900);
}
.vr-convite__btn:hover { background: var(--pc-petrol-100); border-color: var(--pc-petrol-100); color: var(--pc-petrol-950); }
.vr-convite__btn:focus-visible { outline: 2px solid var(--pc-bg-0); outline-offset: 2px; }
.vr-convite__alt { align-self: center; font-size: var(--fs-sm); color: var(--pc-petrol-200); }
.vr-convite__nota { margin: var(--sp-2) 0 0; font-size: var(--fs-xs); line-height: 1.5; text-align: center; color: var(--pc-dark-text-dim); }
.vr-convite__nota a { color: var(--pc-petrol-200); text-decoration: underline; }
@media (max-width: 820px) { .vr-convite { grid-template-columns: 1fr; } }

/* ---- Formulário: sai da coluna de 423px e ocupa o bloco ----------------- */
.vr-formzona { margin-top: var(--sp-6); padding: var(--sp-6); border: var(--hairline-strong); border-radius: var(--r-lg); background: var(--pc-bg-50); }
.vr-formzona .vr-form { max-width: 680px; }
.vr-formzona .vr-cta__btn { width: auto; min-width: 260px; }

/* ---- hero: score grande + semáforo + N + tendência ---------------------- */
.vr-agg { display: flex; flex-direction: column; gap: var(--sp-5); }
.vr-hero {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-6);
  padding: var(--sp-5); border: var(--hairline); border-radius: var(--r-lg);
  background: linear-gradient(180deg, var(--pc-bg-0), var(--pc-bg-50));
}
.vr-hero__score { display: flex; flex-direction: column; gap: var(--sp-2); align-items: flex-start; }
.vr-score-num {
  font-size: var(--fs-display, 2.6rem); font-weight: 750; line-height: 1;
  color: var(--pc-ink-900); font-variant-numeric: tabular-nums;
}
.vr-score-den { font-size: 0.45em; font-weight: 600; color: var(--pc-ink-400); margin-left: 2px; }
.vr-semaforo { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm); font-weight: 650; }
.vr-semaforo__ico { font-size: 0.9em; }
.vr-semaforo.is-verde { color: var(--pc-success-700); }
.vr-semaforo.is-amarelo { color: var(--pc-warning-700); }
.vr-semaforo.is-vermelho { color: var(--pc-danger-700); }

.vr-hero__meta { display: flex; flex-direction: column; gap: var(--sp-3); margin-left: auto; }
.vr-hero__n { display: flex; align-items: baseline; gap: 8px; }
.vr-hero__n-num { font-size: var(--fs-h2); font-weight: 720; color: var(--pc-petrol-800); font-variant-numeric: tabular-nums; }
.vr-hero__n-rot { font-size: var(--fs-sm); color: var(--pc-ink-500); }

.vr-trend {
  display: inline-flex; align-items: center; gap: 8px;
  padding: var(--sp-2) var(--sp-3); border-radius: var(--r-full);
  font-size: var(--fs-sm); font-weight: 600; border: 1px solid;
}
.vr-trend__seta { font-size: 1em; }
.vr-trend__sub { font-weight: 400; opacity: .8; font-size: var(--fs-xs); }
.vr-trend__delta { font-variant-numeric: tabular-nums; font-weight: 700; margin-left: 2px; }
.vr-trend.is-up { color: var(--pc-success-700); background: var(--pc-success-100); border-color: #BFE3CD; }
.vr-trend.is-down { color: var(--pc-danger-700); background: var(--pc-danger-100); border-color: #F0C7C2; }
.vr-trend.is-flat { color: var(--pc-ink-500); background: var(--pc-bg-50); border-color: var(--pc-line-200); }

/* ---- abas de período (CSS puro via radios) ------------------------------ */
.vr-periodos { border: var(--hairline); border-radius: var(--r-lg); overflow: hidden; }
.vr-periodos__tabs { display: flex; flex-wrap: wrap; background: var(--pc-bg-50); border-bottom: var(--hairline); }
.vr-tab-in { position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none; }
.vr-tab {
  flex: 1 1 auto; text-align: center; cursor: pointer; user-select: none;
  padding: var(--sp-3) var(--sp-3); font-size: var(--fs-sm); font-weight: 600;
  color: var(--pc-ink-500); border-bottom: 2px solid transparent;
  transition: color var(--t-fast), border-color var(--t-fast), background var(--t-fast);
}
.vr-tab:hover { color: var(--pc-petrol-700); background: var(--pc-petrol-50); }
.vr-pane { display: none; padding: var(--sp-5); }
.vr-pane__cap { font-size: var(--fs-xs); color: var(--pc-ink-400); margin: 0 0 var(--sp-4); }
.vr-pane__vazio { font-size: var(--fs-sm); color: var(--pc-ink-500); margin: 0; }
/* Ordem no HTML dentro de .vr-periodos: 3 inputs, depois .vr-periodos__tabs
   (labels), depois 3 .vr-pane. Cada input:checked ~ pinta seu label e mostra
   seu painel, casados por modificador de janela (--d90/--m12/--total). */
.vr-tab-in--d90:checked ~ .vr-periodos__tabs .vr-tab--d90,
.vr-tab-in--m12:checked ~ .vr-periodos__tabs .vr-tab--m12,
.vr-tab-in--total:checked ~ .vr-periodos__tabs .vr-tab--total {
  color: var(--pc-petrol-800); border-bottom-color: var(--pc-gold-600); background: var(--pc-bg-0);
}
.vr-tab-in--d90:checked ~ .vr-pane--d90,
.vr-tab-in--m12:checked ~ .vr-pane--m12,
.vr-tab-in--total:checked ~ .vr-pane--total { display: block; }
.vr-tab-in--d90:focus-visible ~ .vr-periodos__tabs .vr-tab--d90,
.vr-tab-in--m12:focus-visible ~ .vr-periodos__tabs .vr-tab--m12,
.vr-tab-in--total:focus-visible ~ .vr-periodos__tabs .vr-tab--total {
  outline: 2px solid var(--pc-petrol-400); outline-offset: -2px;
}

.vr-pane__grid { display: grid; grid-template-columns: 1fr; gap: var(--sp-5); }
@media (min-width: 560px) { .vr-pane__grid { grid-template-columns: 1.4fr 1fr; align-items: start; } }

/* ---- dimensões (estrelas por dimensão) ---------------------------------- */
.vr-dims { display: flex; flex-direction: column; gap: var(--sp-4); }
.vr-dim { display: flex; flex-direction: column; gap: 3px; }
.vr-dim__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-2); }
.vr-dim__rot { font-size: var(--fs-sm); font-weight: 600; color: var(--pc-ink-700); }
.vr-dim__num { font-size: var(--fs-sm); font-weight: 700; color: var(--pc-gold-700); font-variant-numeric: tabular-nums; }
.vr-dim__sub { font-size: var(--fs-xs); color: var(--pc-ink-400); }
.vr-reco {
  display: flex; align-items: baseline; gap: 8px; margin-top: var(--sp-1);
  padding-top: var(--sp-3); border-top: var(--hairline);
}
.vr-reco__pct { font-size: var(--fs-h4); font-weight: 720; color: var(--pc-petrol-800); }
.vr-reco__rot { font-size: var(--fs-sm); color: var(--pc-ink-500); }

/* ---- distribuição 5..1 estrelas ---------------------------------------- */
.vr-dist { display: flex; flex-direction: column; gap: 6px; }
.vr-dist__row { display: grid; grid-template-columns: 2.2em 1fr 1.6em; align-items: center; gap: 8px; }
.vr-dist__lbl { font-size: var(--fs-sm); font-weight: 600; color: var(--pc-ink-500); display: inline-flex; align-items: center; gap: 2px; }
.vr-dist__star { color: var(--pc-gold-500); font-size: .85em; }
.vr-dist__bar { height: 8px; background: var(--pc-bg-50); border-radius: var(--r-full); overflow: hidden; border: 1px solid var(--pc-line-100); }
.vr-dist__fill {
  display: block; height: 100%; border-radius: var(--r-full);
  background: linear-gradient(90deg, var(--pc-gold-500), var(--pc-gold-600));
  transition: width var(--t-base, .4s) ease;
}
.vr-dist__n { font-size: var(--fs-sm); color: var(--pc-ink-400); text-align: right; font-variant-numeric: tabular-nums; }

/* ---- Estado insuficiente: ocupa o bloco, alinhado à esquerda ------------ */
.vr-empty {
  display: grid; grid-template-columns: 44px minmax(0, 1fr);
  align-items: start; column-gap: var(--sp-4); row-gap: var(--sp-1);
  text-align: left; padding: var(--sp-6);
  background: var(--pc-bg-50);
  border: 1px dashed var(--pc-line-200); border-radius: var(--r-lg);
  color: var(--pc-ink-500);
}
.vr-empty__ico { grid-column: 1; grid-row: 1 / span 2; font-size: 2rem; color: var(--pc-gold-300); line-height: 1; margin: 0; }
.vr-empty h4 { grid-column: 2; margin: 0 0 var(--sp-2); font-size: var(--fs-h4); font-weight: 700; color: var(--pc-ink-900); }
.vr-empty p  { grid-column: 2; margin: 0; max-width: none; font-size: var(--fs-sm); line-height: 1.6; }
@media (max-width: 560px) {
  .vr-empty { grid-template-columns: 1fr; }
  .vr-empty__ico, .vr-empty h4, .vr-empty p { grid-column: 1; grid-row: auto; }
}

/* ---- painel de ação / CTA ---------------------------------------------- */
/* (V2) selo de destaque: a empresa avaliada SABERÁ quem avaliou */
.vr-cta__identidade {
  display: flex; gap: var(--sp-2); align-items: flex-start;
  font-size: var(--fs-sm); color: var(--pc-ink-700); line-height: 1.5;
  background: var(--pc-petrol-50); border: var(--hairline);
  border-left: 3px solid var(--pc-petrol-500);
  border-radius: 0 var(--r-md) var(--r-md) 0;
  padding: var(--sp-3); margin: 0 0 var(--sp-3);
}
.vr-cta__id-ico { flex: none; line-height: 0; }
.vr-cta__id-ico .icn { width: 18px; height: 18px; color: var(--pc-petrol-600); margin-top: 1px; }
.vr-cta__identidade strong { color: var(--pc-ink-900); }
.vr-cta__txt { font-size: var(--fs-sm); color: var(--pc-ink-700); margin: 0 0 var(--sp-4); }
.vr-cta__btn { width: 100%; text-align: center; }
.vr-cta__alt { display: inline-block; margin-top: var(--sp-3); font-size: var(--fs-sm); }
.vr-cta__nota { font-size: var(--fs-xs); color: var(--pc-ink-400); margin: var(--sp-4) 0 0; padding-top: var(--sp-3); border-top: var(--hairline); }

/* ---- avisos jurídicos --------------------------------------------------- */
.vr-aviso { font-size: var(--fs-xs); line-height: 1.5; }
.vr-aviso--form {
  color: var(--pc-ink-700); background: var(--pc-petrol-50);
  border-left: 3px solid var(--pc-petrol-400); border-radius: var(--r-sm);
  padding: var(--sp-3); margin: 0 0 var(--sp-4);
}
.vr-aviso--coment { color: var(--pc-ink-500); }
.vr-legal { font-size: var(--fs-xs); color: var(--pc-ink-400); line-height: 1.55; border-top: var(--hairline); padding-top: var(--sp-4); }
.vr-legal p { margin: 0 0 var(--sp-2); }
.vr-legal p:last-child { margin-bottom: 0; }
.vr-legal a { color: var(--pc-petrol-700); }

/* ---- formulário de avaliação ------------------------------------------- */
.vr-form { margin: 0; }
.vr-field { margin-bottom: var(--sp-4); }
.vr-field__rot { display: block; font-size: var(--fs-sm); font-weight: 600; color: var(--pc-ink-700); }
.vr-field__sub { display: block; font-size: var(--fs-xs); color: var(--pc-ink-400); margin-bottom: 4px; }
.vr-field--inline label { display: block; font-size: var(--fs-sm); font-weight: 600; color: var(--pc-ink-700); margin-bottom: var(--sp-2); }
.vr-tag-priv, .vr-tag-demo {
  display: inline-block; font-size: 0.68rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: .04em; padding: 1px 7px; border-radius: var(--r-full); vertical-align: middle;
}
.vr-tag-priv { color: var(--pc-petrol-700); background: var(--pc-petrol-100); }
.vr-tag-demo { color: var(--pc-warning-700); background: var(--pc-warning-100); }

/* input de estrelas: radios invertidos (5→1) + hover/checked pinta à esquerda */
.vr-rate { display: inline-flex; flex-direction: row-reverse; justify-content: flex-end; gap: 2px; }
.vr-rate__in { position: absolute; opacity: 0; width: 0; height: 0; }
.vr-rate__star {
  cursor: pointer; font-size: 1.7rem; line-height: 1; color: var(--pc-gold-300);
  transition: color var(--t-fast), transform var(--t-fast);
}
.vr-rate__star:hover { transform: scale(1.12); }
.vr-rate__in:checked ~ .vr-rate__star,
.vr-rate__star:hover,
.vr-rate__star:hover ~ .vr-rate__star { color: var(--pc-gold-600); }
.vr-rate__in:focus-visible + .vr-rate__star { outline: 2px solid var(--pc-petrol-400); outline-offset: 2px; border-radius: 3px; }

/* consentimento */
.vr-consent { border: var(--hairline); border-radius: var(--r-md); padding: var(--sp-3); background: var(--pc-bg-0); margin-bottom: var(--sp-4); }
.vr-consent__box { display: flex; gap: 10px; align-items: flex-start; cursor: pointer; }
.vr-consent__box input { margin-top: 3px; flex: none; width: 18px; height: 18px; accent-color: var(--pc-petrol-700); }
.vr-consent__short { font-size: var(--fs-sm); color: var(--pc-ink-700); line-height: 1.4; }
.vr-consent__full { margin-top: var(--sp-2); }
.vr-consent__full > summary { cursor: pointer; font-size: var(--fs-xs); color: var(--pc-petrol-700); font-weight: 600; }
.vr-consent__txt { font-size: var(--fs-xs); color: var(--pc-ink-500); line-height: 1.55; margin-top: var(--sp-2); }
.vr-consent__txt ol { margin: var(--sp-2) 0 0; padding-left: 1.2em; display: flex; flex-direction: column; gap: 6px; }
.vr-form__lim { font-size: var(--fs-xs); color: var(--pc-ink-400); margin: var(--sp-2) 0 0; }

/* =============================== ÁREA PRIVADA DA EMPRESA AVALIADA ========= */
.vr-mea-aviso { line-height: 1.5; }
.vr-mea-resumo { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-6); }
.vr-mea-resumo__score { display: flex; flex-direction: column; gap: 6px; }
.vr-mea-resumo__lead { font-size: var(--fs-h4); font-weight: 700; margin: 0 0 4px; }
.vr-mea-resumo__meta { min-width: 0; }

.vr-mea-list { display: flex; flex-direction: column; gap: var(--sp-4); }
.vr-mea-card { display: flex; flex-direction: column; gap: var(--sp-3); }
.vr-mea-card__head { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: var(--sp-2); }
.vr-mea-card__nome { display: block; font-weight: 700; color: var(--pc-ink-900); }
.vr-mea-card__sub { font-size: var(--fs-xs); color: var(--pc-ink-400); }
.vr-mea-card__tags { display: inline-flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.vr-mea-status { font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; padding: 2px 9px; border-radius: var(--r-full); }
.vr-mea-status.is-ok { color: var(--pc-success-700); background: var(--pc-success-100); }
.vr-mea-status.is-warn { color: var(--pc-warning-700); background: var(--pc-warning-100); }
.vr-mea-status.is-danger { color: var(--pc-danger-700); background: var(--pc-danger-100); }
.vr-mea-status.is-neutral { color: var(--pc-ink-500); background: var(--pc-bg-50); }

.vr-mea-card__notas { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-5); padding: var(--sp-3) 0; border-top: var(--hairline); border-bottom: var(--hairline); }
.vr-mea-card__geral { display: inline-flex; align-items: center; gap: 8px; }
.vr-mea-card__geral .vr-star { font-size: 1.3em; }
.vr-mea-card__geral-num { font-size: var(--fs-h4); font-weight: 720; color: var(--pc-gold-700); }
.vr-mea-card__dims { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: var(--sp-3) var(--sp-5); }
.vr-mea-card__dims li { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm); }
.vr-mea-card__dim-rot { color: var(--pc-ink-500); }
.vr-mea-reco { font-weight: 700; }
.vr-mea-reco.is-sim { color: var(--pc-success-700); }
.vr-mea-reco.is-nao { color: var(--pc-danger-700); }

.vr-mea-card__coment {
  margin: 0; padding: var(--sp-3) var(--sp-4); border-left: 3px solid var(--pc-petrol-300);
  background: var(--pc-bg-50); border-radius: 0 var(--r-md) var(--r-md) 0;
}
.vr-mea-card__coment-lbl { display: block; font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--pc-petrol-700); margin-bottom: 4px; }
.vr-mea-card__coment p { margin: 0; color: var(--pc-ink-700); font-size: var(--fs-sm); }

.vr-mea-card__resposta { padding: var(--sp-3) var(--sp-4); background: var(--pc-petrol-50); border-radius: var(--r-md); }
.vr-mea-card__resposta-lbl { display: block; font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--pc-petrol-800); margin-bottom: 4px; }
.vr-mea-card__resposta p { margin: 0; color: var(--pc-ink-700); font-size: var(--fs-sm); }
.vr-mea-card__respform > summary { cursor: pointer; font-size: var(--fs-sm); font-weight: 600; color: var(--pc-petrol-700); }
.vr-mea-respform { margin-top: var(--sp-2); }
.vr-mea-respform .field { margin-bottom: var(--sp-2); }

@media (max-width: 560px) {
  .vr-hero { gap: var(--sp-4); }
  .vr-hero__meta { margin-left: 0; }
  .vr-cta__btn { width: 100%; }
}


/* A frase-fato corrida (.fx-fato*) saiu da ficha por decisão do dono (30/07) —
   ficava entre o nome e os dados básicos repetindo o que o crachá do herói e o
   bloco #processos já afirmam. Sem markup em nenhuma view, o CSS saiu junto.
   NÃO confundir com .frase-citavel (partials/frase-fato.php), que segue viva
   nos HUBs (/dados/uf, /dados/tipo, /dados/cnae…) e é o alvo real do
   `speakable` daquelas páginas. */

/* ============================== Trilho de navegação da ficha (fx-pagenav)
   Padrão Notion/Docs: coluna de TRAÇOS fixa na borda esquerda (≥1280px) —
   presença mínima, cabe até em notebook, onde a calha de um .container de
   1200px não comporta rótulos fixos. Passar o mouse (ou focar via teclado)
   expande o painel "Nesta página" com os rótulos, em card branco por cima do
   que estiver embaixo. Os traços são <a> reais: no toque, o tap navega sem
   depender de hover. O item ativo (scrollspy do app.js) fica petróleo e mais
   comprido. Abaixo de 1280px o trilho some por inteiro. */
.fx-pagenav {
  display: none;
  position: fixed;
  /* Duas custom properties porque o MESMO corpo serve duas calhas: na vitrine
     o trilho encosta na borda da janela, abaixo do header do site; no painel
     (.app-main) a borda esquerda é a sidebar de 252px e não há header — sem
     isto o trilho cai EM CIMA do menu. Ver .app-main abaixo. */
  top: var(--fx-rail-top, calc(var(--hdr-h) + 40px));
  left: var(--fx-rail-left, var(--sp-2));
  width: 46px;                                  /* colapsado: só os traços */
  padding: var(--sp-2) var(--sp-3);
  border: 1px solid transparent; border-radius: var(--r-md);
  background: transparent;
  max-height: calc(100vh - var(--hdr-h) - 88px);
  overflow: hidden;
  z-index: calc(var(--z-sticky) - 1);           /* nunca por cima do header */
  transition: width var(--t-base), background-color var(--t-fast),
              border-color var(--t-fast), box-shadow var(--t-fast);
}
@media (min-width: 1280px) { .fx-pagenav { display: block; } }
/* CALHA DO PAINEL: sidebar de 252px (components.css) e sem header do site. */
.app-main { --fx-rail-left: calc(252px + var(--sp-2)); --fx-rail-top: var(--sp-6); }
.fx-pagenav:hover, .fx-pagenav:focus-within {
  width: 236px;
  background: var(--pc-bg-0);
  border-color: var(--pc-line-100); box-shadow: var(--shadow-2);
  overflow-y: auto; overscroll-behavior: contain;
}

/* título só aparece com o painel aberto (ocupa altura sempre — nada salta) */
.fx-pagenav__title {
  margin: 0 0 var(--sp-1); padding: 2px 6px;
  font-size: var(--fs-xs); font-weight: 650; text-transform: uppercase;
  letter-spacing: .07em; color: var(--pc-ink-400); white-space: nowrap;
  opacity: 0; transition: opacity var(--t-fast);
}
.fx-pagenav:hover .fx-pagenav__title,
.fx-pagenav:focus-within .fx-pagenav__title { opacity: 1; }

.fx-pagenav ul { list-style: none; margin: 0; padding: 0; }
.fx-pagenav li { margin: 0; }
.fx-pagenav__link {
  display: flex; align-items: center; gap: 10px;
  padding: 5px 6px; border-radius: var(--r-sm);
  font-size: var(--fs-sm); line-height: 1.4; color: var(--pc-ink-500);
  text-decoration: none; white-space: nowrap;
  transition: color var(--t-fast), background-color var(--t-fast);
}
.fx-pagenav__dash {
  flex: none; width: 14px; height: 2px; border-radius: var(--r-full);
  background: var(--pc-ink-300);
  transition: background-color var(--t-fast), width var(--t-base);
}
.fx-pagenav__lbl {
  opacity: 0; transform: translateX(-4px);
  overflow: hidden; text-overflow: ellipsis;
  transition: opacity var(--t-fast), transform var(--t-fast);
}
.fx-pagenav:hover .fx-pagenav__lbl,
.fx-pagenav:focus-within .fx-pagenav__lbl { opacity: 1; transform: none; }
.fx-pagenav__link:hover { color: var(--pc-petrol-700); background: var(--pc-petrol-50); text-decoration: none; }
.fx-pagenav__link:focus-visible { outline: none; box-shadow: var(--ring-focus); }
.fx-pagenav__link.is-active { color: var(--pc-petrol-700); font-weight: 650; }
.fx-pagenav__link.is-active .fx-pagenav__dash { background: var(--pc-petrol-600); width: 22px; }

/* "Empresas relacionadas" lista DUAS origens na mesma tabela: grupo econômico
   extraído dos autos (vínculo de fato, vem primeiro) e vizinhança de CNAE/UF
   (não é vínculo). Sem este marcador as duas se confundiriam numa lista só —
   e a linha que separa "é do grupo" de "é do mesmo setor" é justamente a que
   não pode ficar implícita. Discreto de propósito: não compete com o selo de
   situação, que é a informação que a coluna ao lado carrega. */
#relacionadas .rel-vinculo {
  display: block; margin-top: 2px;
  font-size: var(--fs-xs); font-weight: 650; text-transform: uppercase; letter-spacing: .06em;
  color: var(--pc-petrol-700);
}

/* Âncoras da ficha param ABAIXO do header fixo (68px) com respiro — vale para
   o trilho E para os href="#…" que já existiam (KPI → #processos, etc.). */
#visao-geral, #qsa, #voce-e-credor, #processos, #exposicao,
#interesse, #relacionadas, #insolve, #comunidade, #acesso {
  scroll-margin-top: calc(var(--hdr-h) + 28px);
}

/* ============================================================================
   [8b] COBERTURA NO INSOLVE — o caderno dentro do dado
   Bloco #insolve, entre #relacionadas e #comunidade.
   Doutrina: docs/ux-ui/canone/08c-design-bloco-insolve.md.

   A REGRA QUE MANDA AQUI: na ficha, o terracota do Insolve é sempre TINTA,
   nunca SUPERFÍCIE. Nada de preenchimento, pastilha, disco, barra ou filete
   nessa cor. Motivo medido, não estético: ΔE2000(#B23A22, --pc-danger-600
   #B3261E) = 3,86, enquanto os DOIS níveis de alarme da PRÓPRIA ficha
   (danger × warning) separam por 9,81. Como superfície, o terracota é
   indistinguível de "falência decretada"; como letra, não colide com nada,
   porque o sistema de severidade da ficha é feito só de superfícies
   (.indic-badge pílula, .indic-selo-dot disco, .indic-destaque border-left,
   .card[data-secao] border-top). Duas gramáticas que não se cruzam.

   Por isso --sec-acento NÃO é sobrescrito: o filete de topo deste bloco é o
   mesmo petróleo de "Quadro societário" e "Empresas relacionadas". A marca do
   jornal entra por TIPOGRAFIA (Newsreader — a ficha não tem nenhuma serifa) e
   pelo WORDMARK, o mesmo lockup já shipado em components.css:71-110.
   ========================================================================== */

/* A serifa do caderno. MESMO family-name e MESMA URL de pages/noticias.css:13-20
   → mesma entrada de cache HTTP; quem veio do portal não baixa nada. Declarada
   aqui porque a ficha carrega UM page-css (layouts/public.php:142-144) e nunca
   carrega noticias.css — sem isto o wordmark .ins-word do header GLOBAL
   (components.css:73-78) renderiza em Georgia na ficha e em Newsreader no
   portal: a mesma marca com dois desenhos no mesmo site. O itálico NÃO entra
   (61,7 KB para uma linha), e por isso todo elemento serifado abaixo leva
   font-synthesis:none — sem o arquivo, o navegador falsificaria a inclinação. */
/* (02/09/2026) As fontes vivem em tokens.css agora — Schibsted Grotesk para o
   wordmark, Source Serif 4 para o papel serifado. A Newsreader saiu do site. */

/* ARMADILHA DE ESPECIFICIDADE — medida, não teórica. base.css traz
   `.prose p + p, .card-pad p + p { margin-top: 1em }`, e `.card-pad p + p` tem
   especificidade (0,1,2), MAIOR que qualquer classe sozinha (0,1,0). Como este
   bloco vive dentro de um .card-pad e a bandeira é uma pilha de <p>, o ritmo
   vertical seria silenciosamente substituído por 1em do tamanho da fonte do
   parágrafo (.fx-ins__conta sairia com 13px em vez dos 16px escritos). Por isso
   TODA regra de margem de <p> aqui usa DOIS seletores (0,2,0). Não é
   redundância — é o que vence. */

/* ---- grade: manchetes à esquerda, apresentação do jornal à direita -------
   O flag vem PRIMEIRO no DOM (leitor de tela ouve a procedência antes da
   manchete) e a grade o manda para a direita por ÁREA — assim a versão
   empilhada não precisa de `order` na grade. clamp() em vez de breakpoint: a
   trilha acompanha larguras intermediárias sem degrau. */
.fx-ins {
  display: grid;
  grid-template-columns: minmax(0, 1fr) clamp(232px, 28%, 320px);
  grid-template-areas: "col flag";
  column-gap: var(--sp-8);
  align-items: start;
  margin-top: var(--sp-5);           /* passo "título↔conteúdo" da ficha */
}
.fx-ins__col  { grid-area: col;  min-width: 0; }
/* --hairline-strong (#DCE4E5) e NÃO --hairline: medido na tela, o hairline
   claro não aparece no vão. O filete de goteira é a assinatura de caderno mais
   barata que existe — e é cor do HOSPEDEIRO: estrutura, não marca. */
.fx-ins__flag {
  grid-area: flag; min-width: 0;
  border-left: var(--hairline-strong);
  padding-left: var(--sp-6);
}

/* ---- a apresentação do jornal ------------------------------------------- */
.fx-ins__over {
  display: block;
  font-size: var(--fs-xs); font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase;
  color: #B23A22;                    /* 5,96:1 sobre branco — AA. LITERAL, nunca
                                        token: o terracota não pode entrar no
                                        sistema de cor da ficha e virar semântica. */
  margin-bottom: var(--sp-2);
}
/* O wordmark É o logo (não existe arquivo). 700, e não o 600 do masthead do
   portal: em 28px sobre branco, ao lado de um h2 sans de 680, o 600 fica
   anêmico. A tinta é a do HOSPEDEIRO (--pc-ink-900), não --nx-ink: dois
   quase-pretos na mesma página é defeito, não marca. */
.fx-ins__word {
  display: block;
  font-family: 'Schibsted Grotesk', var(--font-sans);
  font-synthesis: none;
  font-weight: 800; font-size: 1.75rem; line-height: .95; letter-spacing: -.025em;
  color: var(--pc-ink-900);
  border-bottom: 2px solid var(--pc-ink-900);   /* a régua do caderno */
  padding-bottom: var(--sp-3);
}
/* font-weight:inherit é OBRIGATÓRIO: o `b` do agente de usuário é `bolder`, que
   a partir de 700 numa variável 200–800 resolve para 800 — o ponto sairia mais
   gordo que a palavra. */
.fx-ins__word b { color: #B23A22; font-weight: inherit; }

/* dois seletores: ver a nota de especificidade no topo da seção */
/* LINHA EDITORIAL DA MARCA — sans, roman, como .nx-mast-tag e .ix-foot-tag
   (noticias.css). Era serifa: as três superfícies dizem a MESMA frase no MESMO
   papel, e uma delas em serifa deixava a assinatura inconsistente. Motivo
   técnico além da coerência: em 16px a Newsreader está no fundo do vale de
   altura-x do próprio eixo `opsz` (.4260em em opsz 18 — ver o bloco 16 de
   pages/noticias.css), então serifa aqui é a pior escolha ótica disponível.
   Pedido registrado em docs/ux-ui/10-insolve-identidade.md §3. */
.fx-ins .fx-ins__tag {
  margin: var(--sp-3) 0 0;
  font-family: var(--font-sans);
  font-synthesis: none;
  font-size: .9375rem; line-height: 1.55;
  color: var(--pc-ink-500);
  max-width: 30ch;
}
/* a contagem é o TOTAL de matérias do radical, não o número exibido — quem
   declara o corte é o rodapé da coluna ("Mostrando 3 de 7") */
.fx-ins .fx-ins__conta { margin: var(--sp-4) 0 0; font-size: var(--fs-sm); color: var(--pc-ink-700); }
.fx-ins__conta strong { font-weight: 700; color: var(--pc-ink-900); font-variant-numeric: tabular-nums; }
/* o carimbo usa o .stamp do sistema (base.css:156); só a margem precisa dos
   dois seletores para vencer .card-pad p + p */
.fx-ins .stamp { margin-top: var(--sp-2); }
.fx-ins .fx-ins__carimbo { margin-top: var(--sp-4); }

/* ---- links do bloco: sempre #8F2C18 (8,26:1 — AAA) ---------------------- */
.fx-ins__ir, .fx-ins__mais {
  display: inline-flex; align-items: center; gap: 6px;
  margin-top: var(--sp-4);
  font-size: var(--fs-sm); font-weight: 700;
  color: #8F2C18;
}
.fx-ins__ir::after, .fx-ins__mais::after {
  content: "\2192"; display: inline-block; transition: transform var(--t-base);
}
/* base.css:38 sublinha TODO a:hover — aqui o sublinhado é deliberado e
   explícito (offset alinhado ao do sistema), não herdado por acidente. */
.fx-ins__ir:hover, .fx-ins__mais:hover {
  color: #8F2C18; text-decoration: underline; text-underline-offset: 3px;
}
.fx-ins__ir:hover::after, .fx-ins__mais:hover::after { transform: translateX(4px); }
/* o carimbo de fonte/errata é do HOSPEDEIRO (petróleo): é rodapé de dado, não
   voz do caderno — e o sistema de links da ficha manda no rodapé da ficha. */
.fx-ins__carimbo a { color: var(--pc-petrol-600); }

/* ---- a lista de manchetes ----------------------------------------------- */
.fx-ins__lista { list-style: none; margin: 0; padding: 0; }
.fx-ins__item {
  position: relative;                /* âncora do alvo esticado */
  padding: var(--sp-3) 0;            /* 12px = passo intra-item da ficha */
  border-bottom: var(--hairline);
}
.fx-ins__item:first-child { padding-top: 0; }
.fx-ins__item:last-child  { border-bottom: 0; padding-bottom: 0; }

/* crédito "fonte · editoria · data (↗)" — mesma gramática de .nx-artcard-meta */
.fx-ins .fx-ins__cred {
  display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
  margin: 0 0 var(--sp-2);
  font-size: var(--fs-xs); color: var(--pc-ink-400);
}
.fx-ins__fav {
  width: 16px; height: 16px; flex: none;
  border-radius: 3px; object-fit: contain; background: var(--pc-bg-100);
}
/* fallback CSP-safe do favicon quebrado — mesmo mecanismo do portal
   (app.js marca .is-broken; noticias.css:500-502) */
.fx-ins__fav-alt { display: none; width: 16px; height: 16px; flex: none; color: var(--pc-ink-300); }
.fx-ins__cred.is-broken .fx-ins__fav     { display: none; }
.fx-ins__cred.is-broken .fx-ins__fav-alt { display: block; }

.fx-ins__fonte {
  font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: var(--pc-ink-500);          /* imprensa = nanquim neutro */
}
.fx-ins__fonte--nos { color: #8F2C18; }   /* assinatura da casa = tinta do jornal */
.fx-ins__dot  { color: var(--pc-line-200); }
.fx-ins__cred time { font-variant-numeric: tabular-nums; }
.fx-ins__ext  { display: inline-flex; color: var(--pc-ink-400); }
.fx-ins__ext svg { width: 12px; height: 12px; display: block; }
.fx-ins__item:hover .fx-ins__ext { color: #8F2C18; }
/* item de acesso restrito: mostra o FATO (existe matéria), nega o DETALHE */
.fx-ins__gate {
  font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: var(--pc-gold-700);
}

/* manchete: a serifa é o que carrega a marca. 19px = o mesmo de
   .nx-artcard-title (noticias.css:517-521) — quem lê o card no portal
   reconhece a linha na ficha. Sem line-clamp: cortar manchete alheia com
   reticências é editar a fonte. */
.fx-ins__hl {
  margin: 0;
  font-family: 'Source Serif 4', Georgia, 'Times New Roman', serif;
  font-synthesis: none;
  font-weight: 600; font-size: 1.1875rem; line-height: 1.18; letter-spacing: -.01em;
  color: var(--pc-ink-900);
  max-width: 60ch;
  text-wrap: pretty;
}
/* O hover do caderno: o filete cresce da esquerda. box-decoration-break:clone é
   OBRIGATÓRIO — uma manchete média (81 caracteres) em 19px numa medida de 400px
   produz 3 fragmentos de linha, e sem `clone` o gradiente pinta UMA faixa na
   união dos fragmentos (filete só sob a última linha, com a largura da mais
   larga). O portal tem o mesmo defeito em .nx-artcard-title a; retroportar. */
.fx-ins__hl a {
  color: inherit;
  -webkit-box-decoration-break: clone;
          box-decoration-break: clone;
  background-image: linear-gradient(#B23A22, #B23A22);
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 0 1px;
  transition: background-size var(--t-base), color var(--t-fast);
}
/* alvo esticado: a linha inteira é clicável, mas há UM só ponto de foco por
   item (o <a> da manchete), e o anel de foco desenha na palavra, não na linha */
.fx-ins__hl a::after { content: ""; position: absolute; inset: 0; }
.fx-ins__item:hover .fx-ins__hl a,
.fx-ins__hl a:focus-visible {
  color: #8F2C18; background-size: 100% 1px; text-decoration: none;
}
.fx-ins__hl a:hover { text-decoration: none; }   /* base.css:38 sublinharia por cima do filete */

/* linha-fina: SÓ no estado lead (um item só) */
.fx-ins .fx-ins__dek {
  margin: var(--sp-2) 0 0;
  font-family: 'Source Serif 4', Georgia, 'Times New Roman', serif;
  font-synthesis: none;
  font-size: 1rem; line-height: 1.5; color: var(--pc-ink-500);
  max-width: 58ch;
}

/* ---- estado LEAD (n = 1): sem lista, a manchete abre a coluna ------------ */
.fx-ins--lead .fx-ins__item { padding: 0; border-bottom: 0; }
.fx-ins--lead .fx-ins__hl {
  font-size: 1.5rem; line-height: 1.14;
  max-width: 34ch;
}

/* ---- empilhado: a bandeira SOBE e vira tarja de cabeçalho ---------------- */
/* 860 e não 900 (o do .fx-bento): abaixo disso, 232px de rail + 32px de vão +
   uma manchete de 49 caracteres deixam de caber juntos.
   `order` AQUI é o uso legítimo dele: no DOM o CTA vem por último (no desktop
   lê-se identidade → número → ação), mas na tarja ele tem de cavalgar a linha
   do wordmark, senão a bandeira ganha uma faixa inteira só para o link.
   NENHUM breakpoint extra abaixo daqui — flex-wrap já quebra sozinho. */
@media (max-width: 860px) {
  .fx-ins { grid-template-columns: 1fr; grid-template-areas: "flag" "col"; row-gap: var(--sp-5); }
  .fx-ins .fx-ins__flag {
    border-left: 0; padding-left: 0;
    border-bottom: 2px solid var(--pc-ink-900);   /* a régua muda de dono */
    padding-bottom: var(--sp-3);
    display: flex; flex-wrap: wrap; align-items: baseline;
    column-gap: var(--sp-4); row-gap: var(--sp-1);
  }
  .fx-ins .fx-ins__over { order: 1; flex: 1 0 100%; margin-bottom: 0; }
  .fx-ins .fx-ins__word { order: 2; font-size: 1.5rem; border-bottom: 0; padding-bottom: 0; }
  .fx-ins .fx-ins__ir   { order: 3; flex: 0 0 auto; margin-top: 0; margin-left: auto; }
  .fx-ins .fx-ins__tag  { display: none; }  /* idem .nx-mast-tag ≤760 (noticias.css:167-170) */
  /* contagem e carimbo NUNCA somem: são o recorte e o limite */
  .fx-ins .fx-ins__conta { order: 4; flex: 1 0 100%; margin-top: var(--sp-2); }
  .fx-ins .fx-ins__flag .stamp { order: 5; flex: 1 0 100%; margin-top: var(--sp-1); }
}

/* ---- impressão: sem coluna, sem CTA, sem filete de hover ---------------- */
@media print {
  .fx-ins { grid-template-columns: 1fr; grid-template-areas: "flag" "col"; }
  .fx-ins .fx-ins__flag { border-left: 0; padding-left: 0; }
  .fx-ins .fx-ins__ir, .fx-ins .fx-ins__mais { display: none; }
  .fx-ins__hl a { background-image: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   PORTA DA EMPRESA — "por que esta ficha está aberta" / "como abrir".
   Um bloco, dois estados. Vive no corpo único, logo abaixo do herói: é a
   primeira coisa que o leitor precisa saber depois de confirmar QUAL empresa
   está vendo. O estado ABERTO usa .notice (mesma família dos avisos do painel);
   o estado FECHADO é um card de ação, com o botão à direita em desktop e
   empilhado no celular.
   ═══════════════════════════════════════════════════════════════════════════ */
.ficha-porta {
  /* Largura TOTAL do corpo, como o herói logo acima e a fileira de cards logo
     abaixo (dono, 22/08/2026): o bloco tinha max-width 86ch e ficava "solto",
     mais estreito que tudo ao redor. O texto continua legível porque a coluna
     de texto (.ficha-porta__txt) divide a linha com o CTA, não ocupa tudo. */
  width: 100%;
  margin-top: var(--sp-3);
  margin-bottom: var(--sp-6);
}
.ficha-porta--fechada {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-4);
  padding: var(--sp-4) var(--sp-5);
  /* TOKENS REAIS (tokens.css). Estavam escritos como --pc-line/--pc-accent/
     --pc-ink/--pc-bg-1, que NÃO existem em lugar nenhum da folha: uma var()
     insolúvel numa shorthand invalida a declaração inteira no tempo de valor
     computado, então `border` caía para o inicial (style:none) e este card —
     agora a porta do visitante anônimo, o primeiro CTA da ficha — desenhava
     SEM borda. Falha silenciosa: nada no console, nada no lint. */
  border: 1px solid var(--pc-line-200); border-left: 3px solid var(--pc-petrol-600);
  border-radius: var(--r-md);
  background: var(--pc-bg-50);
}
.ficha-porta__txt { flex: 1 1 34ch; font-size: var(--fs-sm); line-height: 1.5; }
.ficha-porta__cta {
  display: flex; flex-direction: column; align-items: stretch; gap: var(--sp-1);
  flex: 0 0 auto;
}
/* O saldo fica ABAIXO do botão e não dentro do rótulo: .btn é nowrap e o
   número de créditos muda de largura a cada compra. */
.ficha-porta__saldo {
  /* --pc-ink-3/--pc-ink-2 também não existem: sem token real a cor caía no
     `unset` (= inherit) e a linha de preço saía do MESMO tom do corpo, sem a
     hierarquia que ela precisa ter. --pc-ink-400 é o auxiliar pequeno com AA
     garantido sobre branco e sobre bg-50. */
  font-size: var(--fs-xs); color: var(--pc-ink-400);
  text-align: center;
}
@media (max-width: 640px) {
  .ficha-porta__cta { width: 100%; }
  .ficha-porta__cta .btn { width: 100%; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   FICHA LIMPA — a ausência de processo, dita como argumento.
   Vive na MESMA altura da porta (logo abaixo do herói) e é mutuamente exclusiva
   com ela na prática: a ficha sem processo raramente tem muro a abrir. O tom é
   o oposto do bloqueio — nada de cadeado nem de dourado de paywall: borda
   discreta, acento no verde de "ok" que o selo do herói já usa neste estado.
   ═══════════════════════════════════════════════════════════════════════════ */
.ficha-limpa {
  width: 100%;
  margin-top: var(--sp-3);
  margin-bottom: var(--sp-6);
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-4);
  padding: var(--sp-4) var(--sp-5);
  border: 1px solid var(--pc-line-200);
  border-left: 3px solid var(--pc-success-600);
  border-radius: var(--r-md);
  background: var(--pc-bg-50);
}
.ficha-limpa__txt { flex: 1 1 42ch; font-size: var(--fs-sm); line-height: 1.55; }
.ficha-limpa__titulo {
  /* Não compete com o H1 da ficha: é h2 semântico com corpo de rótulo forte. */
  font-size: var(--fs-h4); line-height: 1.25; margin: 0 0 var(--sp-2);
}
.ficha-limpa__txt p { margin: 0 0 var(--sp-2); }
.ficha-limpa__txt p:last-child { margin-bottom: 0; }
.ficha-limpa__cta {
  display: flex; flex-direction: column; align-items: stretch; gap: var(--sp-1);
  flex: 0 0 auto;
}
/* Preço e escopo ABAIXO do botão, nunca dentro do rótulo — mesma regra do
   .ficha-porta__saldo, e o mesmo motivo (o veto de publicação 0.9). */
.ficha-limpa__nota {
  font-size: var(--fs-xs); color: var(--pc-ink-400);
  text-align: center;
}
.ficha-limpa__cta .link-arrow { font-size: var(--fs-xs); text-align: center; }
/* O carimbo ocupa a linha inteira embaixo dos dois blocos (flex-basis 100%). */
.ficha-limpa__stamp {
  flex: 1 0 100%; margin: 0;
  font-size: var(--fs-xs); color: var(--pc-ink-400);
}
@media (max-width: 640px) {
  .ficha-limpa__cta { width: 100%; }
  .ficha-limpa__cta .btn { width: 100%; }
}
