/* ══════════════════════════════════════════════════════════════
   MODULE · FONTES DE DADOS  · v4.0
   ══════════════════════════════════════════════════════════════
   • Header com botão de voltar à direita (flex)
   • Drop zone com hover/drag suave
   • Cards clicáveis (hover lift via fb-ds.css)
   • Drawer de detalhe com seções (.fb-section, .fb-grid-kv,
     .fb-tbl, .fb-jsonbox, .fb-erro-box)
   ══════════════════════════════════════════════════════════════ */

.fontes {
  display: block;
  width: 100%;
  max-width: 1280px;
  margin: 0 auto;
}

.fontes__head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 20px;
  margin-bottom: 24px;
}
.fontes__head--embed { margin-bottom: 14px; align-items: center; }
.fontes__head-info { flex: 1; min-width: 0; }
.fontes__head-actions {
  display: flex;
  gap: 8px;
  flex-shrink: 0;
}
.fontes__head--embed .fontes__head-actions { gap: 6px; }

.fontes__crumb {
  font-size: 11px;
  font-weight: 700;
  color: var(--accent-dark);
  text-transform: uppercase;
  letter-spacing: 1.5px;
  margin-bottom: 4px;
}
.fontes__crumb-projeto { color: var(--sub); font-weight: 400; }
.fontes__head h1 {
  font-family: var(--font-display);
  font-size: 28px;
  color: var(--txt);
}
.fontes__sub {
  color: var(--sub);
  font-size: 13px;
  margin-top: 6px;
  max-width: 720px;
  line-height: 1.55;
}
.fontes__sub--warn { color: var(--warn); font-style: italic; }

/* ═══ DROP ZONE ═══ */
.fontes__upload {
  background: var(--card);
  border: 2px dashed var(--borda);
  border-radius: var(--radius-lg);
  padding: 48px 20px;
  text-align: center;
  cursor: pointer;
  transition:
    border-color .18s var(--ease-soft),
    background   .18s var(--ease-soft),
    transform    .12s var(--ease-out);
}
.fontes__upload:hover,
.fontes__upload.is-drag {
  border-color: var(--accent);
  background: var(--ok-bg);
}
.fontes__upload.is-drag {
  transform: scale(1.005);
}
.fontes__upload-ico { font-size: 40px; margin-bottom: 12px; }
.fontes__upload h3 {
  font-family: var(--font-display);
  font-size: 18px;
  color: var(--txt);
  margin-bottom: 6px;
}
.fontes__upload-hint {
  font-size: 12px;
  color: var(--muted);
}

/* ═══ PROGRESS LINES ═══ */
.fontes__progress {
  margin-top: 20px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.fontes__prog-item {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 14px;
  align-items: center;
  padding: 12px 16px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-left: 3px solid var(--primary);
  border-radius: var(--radius);
  animation: fbFadeUp .25s var(--ease-out);
}
.fontes__prog-item.is-ok    { border-left-color: var(--ok); }
.fontes__prog-item.is-warn  { border-left-color: var(--warn); background: var(--warn-bg); }
.fontes__prog-item.is-erro  { border-left-color: var(--err); background: var(--err-bg); }
.fontes__prog-ico { font-size: 20px; flex-shrink: 0; }
.fontes__prog-body { min-width: 0; }
.fontes__prog-nome {
  font-weight: 600;
  font-size: 13px;
  color: var(--txt);
  margin-bottom: 2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.fontes__prog-status { font-size: 12px; color: var(--sub); }
.fontes__prog-meta   { margin-top: 2px; font-size: 11px; color: var(--sub); }
.fontes__prog-mods   { margin-top: 4px; }
.fontes__prog-spin {
  width: 16px; height: 16px;
  border: 2px solid var(--borda);
  border-top-color: var(--primary);
  border-radius: 50%;
  animation: spin .8s linear infinite;
}

.fontes__prog-bar {
  margin-top: 6px;
  height: 4px;
  background: var(--borda);
  border-radius: 2px;
  overflow: hidden;
}
.fontes__prog-bar-fill {
  height: 100%;
  width: 0%;
  background: var(--primary);
  transition: width .25s var(--ease-out);
}
.fontes__prog-item.is-ok .fontes__prog-bar-fill { background: var(--ok); }
.fontes__prog-status code {
  font-family: var(--font-mono);
  font-size: 11px;
  padding: 1px 5px;
  background: var(--borda);
  border-radius: 3px;
  color: var(--txt);
}

/* ═══ LISTA ═══ */
.fontes__list-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin: 28px 0 14px;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--borda);
}
.fontes__list-head h2 {
  font-family: var(--font-display);
  font-size: 22px;
  color: var(--txt);
}
.fontes__list-head .n {
  font-size: 11px;
  font-weight: 700;
  color: var(--sub);
  text-transform: uppercase;
  letter-spacing: 1px;
}

/* ════════ Lista de fontes: mostra ~5, rola o resto, com dica sutil ════════ */
/* "scroll com dica de rolagem": caixa de altura limitada + fade de rodapé + chevron */
.fontes__scrollwrap { position: relative; }
.fontes__scrollbox {
  max-height: 480px;        /* ~5 cards; o resto rola dentro */
  overflow-y: auto;
  padding: 2px 2px 0;
}
/* fade no rodapé enquanto há fonte abaixo da dobra (some ao chegar no fim) */
.fontes__scrollwrap::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 42px;
  background: linear-gradient(to top, var(--bg) 12%, rgba(245,245,246,0));
  pointer-events: none; opacity: 0; transition: opacity .25s ease;
  border-radius: 0 0 var(--radius) var(--radius);
}
.fontes__scrollwrap.fontes__scroll--mais::after { opacity: 1; }
/* chevron sutil, com leve respiro */
.fontes__scrollwrap::before {
  content: ''; position: absolute; left: 50%; bottom: 11px; z-index: 2;
  width: 8px; height: 8px;
  border-right: 2px solid var(--sub); border-bottom: 2px solid var(--sub);
  transform: translateX(-50%) rotate(45deg);
  pointer-events: none; opacity: 0; transition: opacity .25s ease;
  animation: fontes-chev 1.5s ease-in-out infinite;
}
.fontes__scrollwrap.fontes__scroll--mais::before { opacity: .7; }
@keyframes fontes-chev {
  0%, 100% { transform: translate(-50%, 0) rotate(45deg); }
  50%      { transform: translate(-50%, 3px) rotate(45deg); }
}

.fontes__card {
  display: grid;
  grid-template-columns: auto 1fr auto auto;
  gap: 14px;
  align-items: center;
  padding: 14px 16px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-left: 4px solid var(--muted);
  border-radius: var(--radius);
  margin-bottom: 8px;
  cursor: pointer;
  transition:
    border-color .15s var(--ease-soft),
    box-shadow   .18s var(--ease-soft),
    transform    .15s var(--ease-out);
}
.fontes__card:hover {
  border-color: var(--primary);
  box-shadow: var(--shadow-md);
  transform: translateY(-1px);
}
.fontes__card:focus-visible {
  outline: none;
  box-shadow: var(--shadow-md), 0 0 0 3px var(--accent-soft);
}
.fontes__card.is-extraido  { border-left-color: var(--ok); }
.fontes__card.is-falhou    { border-left-color: var(--err); }
.fontes__card.is-aguardando_mapeamento { border-left-color: var(--warn); }
.fontes__card.is-analisando { border-left-color: var(--info); }

.fontes__card-ico { font-size: 24px; flex-shrink: 0; }
.fontes__card-body { min-width: 0; }
.fontes__card-nome {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 15px;
  color: var(--txt);
  margin-bottom: 2px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.fontes__card-meta { font-size: 12px; color: var(--sub); }
.fontes__card-meta strong { color: var(--primary); font-weight: 600; }
.fontes__card-resumo { font-size: 12px; color: var(--ok); margin-top: 4px; font-weight: 500; }
.fontes__card-erro   { font-size: 12px; color: var(--err); margin-top: 4px; }

.fontes__card-badge {
  display: inline-block;
  padding: 3px 10px;
  border-radius: 12px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .5px;
  text-transform: uppercase;
  background: var(--bg);
  color: var(--sub);
  white-space: nowrap;
}
.fontes__card-badge.is-extraido               { background: var(--ok-bg);   color: var(--ok); }
.fontes__card-badge.is-falhou                 { background: var(--err-bg);  color: var(--err); }
.fontes__card-badge.is-aguardando_mapeamento  { background: var(--warn-bg); color: var(--gold-dark); }
.fontes__card-badge.is-analisando             { background: var(--info-bg); color: var(--primary); }

.fontes__card-btn {
  background: transparent;
  border: 1px solid var(--borda);
  color: var(--sub);
  width: 30px; height: 30px;
  border-radius: var(--radius-sm);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
}
.fontes__card-btn:hover { background: var(--bg); }
.fontes__card-btn.is-danger:hover {
  background: var(--err-bg);
  border-color: var(--err);
  color: var(--err);
}

.fontes__vazio {
  background: var(--card);
  border: 1px dashed var(--borda);
  border-radius: var(--radius-lg);
  padding: 48px 20px;
  text-align: center;
  color: var(--sub);
}
.fontes__vazio-ico { font-size: 40px; margin-bottom: 10px; }
.fontes__vazio h3 {
  font-family: var(--font-display);
  font-size: 18px;
  color: var(--txt);
  margin-bottom: 4px;
}

@media (max-width: 720px) {
  .fontes__card { grid-template-columns: 1fr; gap: 8px; }
  .fontes__head { flex-direction: column; }
  .fontes__head-actions { width: 100%; justify-content: flex-end; }
}

/* ═══ BADGES DE MÓDULOS CONSULTIVOS ═══ */
.fontes__card-modulos {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
  margin-top: 6px;
}
.fontes__card-modulos-lbl {
  font-size: 11px;
  font-weight: 700;
  color: var(--sub);
  text-transform: uppercase;
  letter-spacing: .5px;
}

.mod-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  background: var(--info-bg);
  color: var(--primary);
  font-size: 11px;
  font-weight: 600;
  padding: 3px 9px;
  border-radius: 12px;
  white-space: nowrap;
  line-height: 1.4;
}
.mod-badge--mini { font-size: 10px; padding: 2px 7px; }
.fontes__prog-status .mod-badge { font-size: 10px; padding: 2px 7px; }


/* ══════════════════════════════════════════════════════════════
   DRAWER DE DETALHE · primitivos compartilhados
   (usados também pelo Plano de Ação)
   ══════════════════════════════════════════════════════════════ */
.fb-section {
  margin-bottom: 22px;
}
.fb-section:last-child { margin-bottom: 0; }
.fb-section__title {
  font-size: 10px;
  font-weight: 700;
  color: var(--sub);
  text-transform: uppercase;
  letter-spacing: 1px;
  margin-bottom: 10px;
  padding-bottom: 6px;
  border-bottom: 1px solid var(--borda);
}

.fb-grid-kv {
  display: grid;
  grid-template-columns: 140px 1fr;
  gap: 8px 18px;
  font-size: 13px;
}
.fb-grid-kv .k { color: var(--sub); font-weight: 500; }
.fb-grid-kv .v { color: var(--txt); }
.fb-grid-kv .v.fb-mono { font-family: var(--font-mono); font-size: 12px; }

.fb-tbl {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: var(--radius-sm);
  overflow: hidden;
}
.fb-tbl th {
  text-align: left;
  font-weight: 700;
  color: var(--sub);
  padding: 8px 12px;
  background: var(--bg-soft);
  border-bottom: 1px solid var(--borda);
  text-transform: uppercase;
  font-size: 10px;
  letter-spacing: .5px;
}
.fb-tbl td {
  padding: 8px 12px;
  border-bottom: 1px solid var(--borda-soft);
}
.fb-tbl tr:last-child td { border-bottom: none; }
.fb-tbl .num {
  text-align: right;
  font-variant-numeric: tabular-nums;
  font-family: var(--font-mono);
  font-size: 12px;
}
.fb-tbl .num.crit { color: var(--err); font-weight: 600; }
.fb-tbl__pre {
  max-width: 280px;
  font-size: 11px;
  color: var(--sub);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.fb-jsonbox {
  background: var(--bg-soft);
  border: 1px solid var(--borda);
  border-radius: var(--radius-sm);
  padding: 12px 14px;
  font-family: var(--font-mono);
  font-size: 11px;
  line-height: 1.5;
  color: var(--txt);
  overflow-x: auto;
  max-height: 320px;
  white-space: pre;
}

.fb-erro-box {
  background: var(--err-bg);
  border-left: 3px solid var(--err);
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  font-size: 13px;
  color: var(--err);
  font-family: var(--font-mono);
  font-size: 12px;
  white-space: pre-wrap;
}

/* ══════════════════════════════════════════════════════════════
 * v5.0 · 18/05/2026 — Aprovação de carga + Cobertura de dados
 * ══════════════════════════════════════════════════════════════ */

/* ── Bloco de cobertura no topo ─────────────────────────────── */
.fontes__cobertura {
  background: var(--bg-soft, #fff);
  border: 1px solid var(--borda);
  border-radius: var(--radius, 10px);
  padding: 14px 16px;
  margin: 16px 0 20px;
}
.fontes__cobertura-head h2 {
  font-family: var(--font-display);
  font-size: 15px;
  margin: 0 0 4px;
  color: var(--txt);
}
.fontes__cobertura-sub {
  font-size: 12px;
  color: var(--sub);
  margin: 0 0 10px;
}
.fontes__cobertura-tabela-wrap {
  overflow-x: auto;
}
.fontes__cobertura-tabela {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
.fontes__cobertura-tabela th,
.fontes__cobertura-tabela td {
  text-align: left;
  padding: 6px 10px;
  border-bottom: 1px solid var(--borda);
}
.fontes__cobertura-tabela th {
  color: var(--sub);
  font-weight: 600;
  text-transform: uppercase;
  font-size: 10px;
  letter-spacing: .5px;
}
.fontes__cobertura-tabela td.num,
.fontes__cobertura-tabela th.num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}
.fontes__cobertura-tabela code {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--primary);
}
.fontes__cobertura-tabela .muted {
  color: var(--sub);
  opacity: 0.5;
}

/* ── Novos status: aguardando_aprovacao + cancelado ─────────── */
.fontes__card.is-aguardando_aprovacao  { border-left-color: var(--warn); }
.fontes__card.is-cancelado             { border-left-color: var(--sub); opacity: 0.7; }

.fontes__card-badge.is-aguardando_aprovacao {
  background: var(--warn-bg);
  color: var(--gold-dark);
}
.fontes__card-badge.is-cancelado {
  background: var(--bg);
  color: var(--sub);
  text-decoration: line-through;
}

/* Botões primários no card (Revisar) */
.fontes__card-btn.is-primary {
  background: var(--primary);
  color: #fff;
  border-color: var(--primary);
  width: auto;
  padding: 0 12px;
  font-weight: 700;
  font-size: 12px;
}
.fontes__card-btn.is-primary:hover {
  filter: brightness(1.1);
}

/* Alertas no card */
.fontes__card-alerta {
  font-size: 12px;
  color: var(--err);
  margin-top: 4px;
  font-weight: 600;
}
.fontes__card-cancelado {
  font-size: 11px;
  color: var(--sub);
  margin-top: 4px;
  font-style: italic;
}

/* Progress messages */
.fontes__prog-warn {
  color: var(--gold-dark);
  font-weight: 600;
}
.fontes__prog-meta.crit {
  color: var(--err);
  font-weight: 600;
}

/* ── Drawer · seção crítica (cross-cliente) ─────────────────── */
.fb-section--crit {
  background: var(--err-bg);
  border-left: 4px solid var(--err);
  padding: 14px 16px;
  border-radius: var(--radius-sm, 6px);
  margin: 8px 0 16px;
}
.fb-section--crit .fb-section__title {
  color: var(--err);
  font-weight: 700;
}
.fontes__revisao-warn-msg {
  font-size: 13px;
  color: var(--txt);
  margin: 6px 0 12px;
}
.fb-section--crit h4 {
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 700;
  margin: 8px 0 6px;
  color: var(--txt);
}

/* ── Badges de severidade ───────────────────────────────────── */
.fontes__sev {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .3px;
}
.fontes__sev--ok      { background: var(--ok-bg);   color: var(--ok); }
.fontes__sev--critico { background: var(--err-bg);  color: var(--err); }
.fontes__sev--alerta  { background: var(--warn-bg); color: var(--gold-dark); }


/* ══════════════════════════════════════════════════════════════
   TABELA DE ARQUIVOS (2026-08-26)
   ══════════════════════════════════════════════════════════════
   A lista de fontes era uma pilha de cards numa caixa rolante. Com
   102 arquivos ninguém achava nada, não dava pra ordenar por data
   nem enxergar de qual módulo era cada um. Virou a mesma tabela da
   Central de Dados da produtividade.

   O cabeçalho e o popover de filtro vêm do core/tabela-filtros.js,
   que usa a linguagem visual da auditoria do gmedia. O POPOVER é
   regra global (fica no document.body) e já funciona aqui; o
   CABEÇALHO, não: no gmedia.css ele está escopado em `.gmedia`,
   então precisa ser redeclarado dentro de `.fontes`.
   ══════════════════════════════════════════════════════════════ */

.fontes .fnt-tab-busca {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 10px;
}
.fontes .fnt-tab-busca input {
  flex: 1 1 auto; min-width: 0;
  padding: 9px 12px; font: inherit; font-size: var(--fs-sm, 13px);
  border: 1px solid var(--borda); border-radius: var(--radius);
  background: var(--card); color: var(--txt);
}
.fontes .fnt-tab-busca input:focus {
  outline: none; border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-soft, rgba(2,157,102,.12));
}
.fontes .fnt-tab-busca__n {
  flex: 0 0 auto; font-size: var(--fs-sm, 13px); color: var(--sub);
  white-space: nowrap;
}

/* SEM ROLAGEM LATERAL. A tabela nasceu com overflow:auto e colunas que
   não encolhiam (nowrap em quase todas, min-width na de módulos, o
   rótulo "✓ Revisar" por extenso nas ações), então em tela de notebook
   ela estourava a largura e o nome do arquivo saía cortado à esquerda.
   Agora é table-layout fixo, largura em porcentagem somando 100%, e o
   rolador só rola na vertical: o que não cabe vira ellipsis ou quebra,
   nunca empurra a tabela para fora. */
.fontes .fnt-tab-rol {
  overflow-y: auto; overflow-x: hidden;
  border: 1px solid var(--borda); border-radius: var(--radius-lg, 12px);
  background: var(--card);
}
.fontes .fnt-tab {
  width: 100%; border-collapse: collapse; table-layout: fixed;
}
.fontes .fnt-tab thead th {
  position: sticky; top: 0; z-index: 2;
  background: var(--bg-soft); border-bottom: 1px solid var(--borda);
  text-align: left; padding: 0; white-space: nowrap;
}
.fontes .fnt-tab thead th.num { text-align: right; }
.fontes .fnt-tab tbody td {
  padding: 9px 10px; border-bottom: 1px solid var(--borda-soft);
  font-size: var(--fs-sm, 13px); color: var(--txt); vertical-align: middle;
}
.fontes .fnt-tab tbody td.num {
  text-align: right; font-variant-numeric: tabular-nums;
}
.fontes .fnt-tab tbody tr:last-child td { border-bottom: none; }
.fontes .fnt-tab tbody tr[data-id] { cursor: pointer; }
.fontes .fnt-tab tbody tr[data-id]:hover { background: var(--bg-soft); }
.fontes .fnt-tab tbody tr[data-id]:focus-visible {
  outline: none; box-shadow: inset 0 0 0 2px var(--accent);
}

/* borda esquerda de estado, o mesmo semáforo que os cards tinham */
.fontes .fnt-tab tbody tr.fnt-tr td:first-child {
  border-left: 3px solid var(--muted);
}
.fontes .fnt-tab tbody tr.is-extraido td:first-child { border-left-color: var(--ok); }
.fontes .fnt-tab tbody tr.is-falhou td:first-child { border-left-color: var(--err); }
.fontes .fnt-tab tbody tr.is-aguardando_aprovacao td:first-child { border-left-color: var(--gold); }
.fontes .fnt-tab tbody tr.is-cancelado td:first-child { opacity: .6; }

.fontes .fnt-tab-vazio {
  padding: 28px 16px; text-align: center;
  color: var(--muted); font-size: var(--fs-sm, 13px);
}
.fontes .fnt-tab-pag { margin-top: 12px; }

/* células */
.fontes .fnt-arq { display: flex; align-items: center; gap: 7px; min-width: 0; }
.fontes .fnt-arq i { font-style: normal; flex: 0 0 auto; }
.fontes .fnt-arq b {
  font-weight: var(--fw-semibold, 600); overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap;
}
.fontes .fnt-arq-sub {
  display: block; margin-left: 22px;
  font-size: var(--fs-xs, 11px); color: var(--muted);
}
/* o ellipsis do nome só funciona com a célula segurando a largura */
.fontes .fnt-tab td.fnt-c-arq { overflow: hidden; }
.fontes .fnt-tab td.fnt-c-mod { overflow: hidden; }
.fontes .fnt-mods .mod-badge { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* larguras somam 100% · quem manda no table-layout fixo é a primeira
   linha, ou seja o <thead>, e o thsFiltraveis do core já repassa a
   classe da coluna para o <th> */
.fontes .fnt-tab th.fnt-c-arq   { width: 26%; }
.fontes .fnt-tab th.fnt-c-fmt   { width: 16%; }
.fontes .fnt-tab th.fnt-c-mod   { width: 15%; }
.fontes .fnt-tab th.num         { width:  9%; }
.fontes .fnt-tab th.fnt-c-em    { width: 12%; }
.fontes .fnt-tab th.fnt-c-st    { width: 15%; }
.fontes .fnt-tab th.fnt-c-acoes { width:  7%; }

/* NADA de nowrap nas células largas. A primeira tentativa cortava com
   reticências, e cortar não é caber: o nome do detector e o rótulo
   "Aguardando aprovação" ficavam ilegíveis. Aqui o texto QUEBRA e a
   linha cresce em altura, que é a dimensão que sobra. */
.fontes .fnt-tab td.fnt-c-fmt,
.fontes .fnt-tab td.fnt-c-em,
.fontes .fnt-tab td.fnt-c-st { white-space: normal; overflow-wrap: anywhere; }
.fontes .fnt-c-st .fontes__card-badge { white-space: normal; text-align: left; }
.fontes .fnt-mods { display: flex; flex-wrap: wrap; gap: 4px; }
.fontes .fnt-mut { color: var(--muted); }
.fontes .fnt-quando small { color: var(--muted); }
.fontes .fnt-tags { display: inline-flex; flex-wrap: wrap; gap: 4px; margin-left: 6px; }
.fontes .fnt-tag {
  display: inline-block; font-size: var(--fs-xs, 11px); line-height: 1;
  padding: 3px 7px; border-radius: 99px;
  border: 1px solid var(--borda-soft); color: var(--sub); background: var(--bg-soft);
}
.fontes .fnt-tag.is-aviso { border-color: #e8c98a; color: #7a4b10; background: #fdf3e3; }
.fontes .fnt-tag.is-erro { border-color: #e8a8a8; color: #7a1010; background: #fdeaea; }
/* a coluna de ações tem que caber em 7% mesmo em tela de 1024: dois
   botões de 24 + 3 de intervalo + 8 de respiro = 59px, e 7% de 1000
   dá 70. Antes eram 26px de botão com 12 de padding e ela estourava. */
.fontes .fnt-c-acoes { white-space: nowrap; text-align: right; padding-left: 2px; padding-right: 6px; }
.fontes .fnt-acoes { display: inline-flex; gap: 3px; }
.fontes .fnt-btn {
  border: 1px solid var(--borda); background: var(--card); cursor: pointer;
  font: inherit; font-size: 11px; line-height: 1; color: var(--sub);
  flex: 0 0 auto; width: 24px; height: 24px; border-radius: 6px;
  display: inline-flex; align-items: center; justify-content: center;
  transition: background .15s, color .15s, border-color .15s;
}
.fontes .fnt-btn.is-ok:hover { color: #fff; background: var(--ok); border-color: var(--ok); }
.fontes .fnt-btn.is-danger:hover { color: #fff; background: var(--err); border-color: var(--err); }
.fontes .fnt-btn:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--accent-soft, rgba(2,157,102,.2)); }

/* pílulas de escopo do módulo */
.fontes .fnt-escopo { display: inline-flex; gap: 6px; margin-left: 12px; }
.fontes .fnt-escopo button {
  border: 1px solid var(--borda); background: var(--card); cursor: pointer;
  font: inherit; font-size: var(--fs-xs, 11px); color: var(--sub);
  padding: 5px 10px; border-radius: 99px; display: inline-flex; gap: 5px;
}
.fontes .fnt-escopo button b { color: var(--txt); font-weight: var(--fw-semibold, 600); }
.fontes .fnt-escopo button:hover { border-color: var(--accent); color: var(--txt); }
.fontes .fnt-escopo button.is-on {
  background: var(--primary); border-color: var(--primary); color: #fff;
}
.fontes .fnt-escopo button.is-on b { color: #fff; }

/* cabeçalho filtrável do core · no gmedia.css estas regras estão
   escopadas em `.gmedia`, então não valem aqui e são redeclaradas */
.fontes .gmed-aud-th { display: flex; align-items: center; gap: 2px; padding: 7px 10px; }
.fontes .fnt-tab th.num .gmed-aud-th { justify-content: flex-end; }
.fontes .gmed-aud-th__lbl {
  border: none; background: none; cursor: pointer; padding: 3px 2px;
  font: inherit; font-size: var(--fs-2xs, 10.5px); font-weight: var(--fw-bold, 700);
  letter-spacing: .06em; text-transform: uppercase; color: var(--sub); white-space: nowrap;
}
.fontes .gmed-aud-th__lbl:hover { color: var(--accent); }
.fontes .gmed-aud-th__lbl i { font-style: normal; font-size: 8.5px; color: var(--accent); }
.fontes .gmed-aud-th__f {
  border: none; background: none; cursor: pointer; padding: 3px;
  border-radius: 5px; color: #c3c9cf; display: inline-flex; line-height: 0;
}
.fontes .gmed-aud-th__f:hover { color: var(--accent); background: var(--accent-soft, rgba(2,157,102,.1)); }
.fontes .gmed-aud-th__f.is-on { color: #fff; background: var(--accent); }

/* Tela estreita: some a coluna do detector, que é a mais larga e cujo
   dado o drawer já mostra por extenso. As outras seis redistribuem e
   continuam cabendo, sem reticências e sem rolagem lateral.
   Bloco @media INTEIRO, com abre e fecha, para não virar regra solta
   valendo em toda resolução. */
@media (max-width: 1100px) {
  .fontes .fnt-tab th.fnt-c-fmt,
  .fontes .fnt-tab td.fnt-c-fmt { display: none; }
  .fontes .fnt-tab th.fnt-c-arq   { width: 30%; }
  .fontes .fnt-tab th.fnt-c-mod   { width: 19%; }
  .fontes .fnt-tab th.num         { width: 11%; }
  .fontes .fnt-tab th.fnt-c-em    { width: 15%; }
  .fontes .fnt-tab th.fnt-c-st    { width: 16%; }
  .fontes .fnt-tab th.fnt-c-acoes { width:  9%; }
}

/* ── Cobertura de dados retrátil (28/08) ───────────────────────
   O painel abria expandido e empurrava a área de upload para baixo
   da dobra: quem vinha soltar um arquivo passava por uma tabela de
   conferência antes de chegar no que veio fazer. Ele é consulta
   pontual, não leitura de abertura, então nasce fechado e o resumo
   na própria barra responde a pergunta mais comum (quantas tabelas,
   quando foi a última carga) sem abrir nada. */
.fontes__cobertura-sum{
  display:flex; align-items:center; gap:10px; cursor:pointer;
  list-style:none; padding:2px 0; user-select:none;
}
.fontes__cobertura-sum::-webkit-details-marker{ display:none; }
.fontes__cobertura-sum__t{
  font-family:var(--font-display); font-size:15px; color:var(--txt);
}
.fontes__cobertura-sum__r{
  font-size:12px; color:var(--sub); font-variant-numeric:tabular-nums;
}
.fontes__cobertura-sum__i{
  margin-left:auto; color:var(--sub); font-size:12px;
  transition:transform 140ms ease;
}
.fontes__cobertura-det[open] .fontes__cobertura-sum__i{ transform:rotate(180deg); }
.fontes__cobertura-det[open] .fontes__cobertura-head{ margin-top:8px; }
.fontes__cobertura-sum:hover .fontes__cobertura-sum__t{ color:var(--accent); }
