/* ---------- temas ----------
   O tema é escolha de quem está olhando, guardada no navegador dela (ver tema.js).
   O `data-tema` é escrito no <html> antes da página pintar.

   Regra pra manter isto são: cor de DADO não entra aqui. A identidade do Meta é azul
   nos quatro temas, e verde continua sendo bom. Só o cromo (fundo, linha, sombra,
   zebra de tabela, guia de gráfico) muda de tema pra tema. */
:root, html[data-tema="escuro"] {
  --bg: #070b14;
  --card: #0d1421;
  --card2: #111a2b;
  --linha: #1b2740;
  --tx: #e8eefb;
  --tx2: #93a1bf;
  --tx3: #5c6a87;
  --verde: #2fd48c;
  --verm: #ff5d7c;
  --ambar: #f5b23c;
  --acc: #2f6bff;
  --sobre-acc: #fff;
  --sombra: rgba(0, 0, 0, .5);
  --veu: rgba(0, 0, 0, .55);
  /* zebra e hover de tabela: CLAREAMENTO nos temas escuros, escurecimento nos claros.
     A calibragem antiga (4% a 6% de branco-azulado) sumia por completo em fundo claro
     e a tabela perdia a leitura de linha */
  --zebra: rgba(147, 161, 191, .05);
  --zebra-forte: rgba(147, 161, 191, .09);
  --guia: rgba(255, 255, 255, .07);
  --tip-bg: #0b1220;
  --tip-borda: #24314d;
  --filtro-titulo: saturate(.7) brightness(1.25);
  --filtro-dado: none;
  --badge-servico: #7fb3ff;
  --badge-ecom: #ff9ec6;
  --badge-local: #5fd8b8;
  --lat: 236px;         /* largura do menu lateral; some no celular (vira gaveta) */
  color-scheme: dark;
}
/* cinza neutro, sem o azul-noite: o fundo não compete com a cor do cliente */
html[data-tema="grafite"] {
  --bg: #101113;
  --card: #17191d;
  --card2: #1e2126;
  --linha: #2b2f36;
  --tx: #e9eaec;
  --tx2: #a0a4ab;
  --tx3: #6b7079;
  --zebra: rgba(255, 255, 255, .04);
  --zebra-forte: rgba(255, 255, 255, .07);
  --tip-bg: #1a1c20;
  --tip-borda: #343941;
  color-scheme: dark;
}
html[data-tema="claro"] {
  --bg: #f6f8fc;
  --card: #ffffff;
  --card2: #eef2f8;
  --linha: #dde4ee;
  --tx: #131824;
  --tx2: #56617a;
  --tx3: #7c869c;
  /* tons mais fechados: #2fd48c e #ff5d7c sobre branco não têm contraste de leitura */
  --verde: #10a065;
  --verm: #d92f52;
  --ambar: #b47708;
  --sombra: rgba(16, 26, 48, .16);
  --veu: rgba(16, 26, 48, .38);
  --zebra: rgba(19, 34, 68, .035);
  --zebra-forte: rgba(19, 34, 68, .07);
  --guia: rgba(19, 34, 68, .06);
  --tip-bg: #ffffff;
  --tip-borda: #cdd7e6;
  --filtro-titulo: saturate(.9) brightness(.82);
  --filtro-dado: saturate(1.15) brightness(.74);
  --badge-servico: #1f5fc4;
  --badge-ecom: #c22a72;
  --badge-local: #0d7f61;
  color-scheme: light;
}
/* claro quente, pra leitura longa e pra sair melhor se alguém salvar em PDF */
html[data-tema="papel"] {
  --bg: #f5f1e8;
  --card: #fffdf7;
  --card2: #efe9dc;
  --linha: #e0d8c8;
  --tx: #2a2620;
  --tx2: #6b6355;
  --tx3: #8f8676;
  --verde: #12855a;
  --verm: #c53a52;
  --ambar: #a8720a;
  --sombra: rgba(60, 48, 28, .16);
  --veu: rgba(60, 48, 28, .4);
  --zebra: rgba(80, 64, 36, .04);
  --zebra-forte: rgba(80, 64, 36, .08);
  --guia: rgba(80, 64, 36, .07);
  --tip-bg: #fffdf7;
  --tip-borda: #ded4c0;
  --filtro-titulo: saturate(.9) brightness(.8);
  --filtro-dado: saturate(1.15) brightness(.72);
  --badge-servico: #2a5ea8;
  --badge-ecom: #b03567;
  --badge-local: #14705a;
  color-scheme: light;
}

* { margin: 0; padding: 0; box-sizing: border-box; }

/* rolagem ANIMADA fica de fora de propósito, tanto aqui quanto no scrollIntoView:
   em navegador com animação de rolagem desligada, `smooth` não rola nada e o item
   do menu vira clique morto, sem erro nenhum no console. Salto instantâneo sempre
   funciona, e num relatório longo ele é até mais rápido de usar. */
html { scroll-behavior: auto; }

body {
  background: var(--bg);
  color: var(--tx);
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  font-size: 15px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}

.container { max-width: 1180px; margin: 0 auto; padding: 24px 20px 60px; }

/* ---------- casca: menu lateral + conteúdo ---------- */
/* minmax(0,1fr) na coluna do conteúdo: as tabelas de criativo têm 10+ colunas e com
   `1fr` puro o track cresceria pra caber, empurrando o menu pra fora da tela */
.casca { display: grid; grid-template-columns: var(--lat) minmax(0, 1fr); }
.casca.sem-menu { grid-template-columns: minmax(0, 1fr); }
.conteudo { max-width: 1180px; margin: 0 auto; padding: 24px 20px 60px; min-width: 0; width: 100%; }
/* acima de 1240px o conteúdo acompanha a tela em vez de travar em 1180: as tabelas
   largas precisam do espaço, e o texto corrido já tem medida de leitura própria */
@media (min-width: 1240px) { .conteudo { max-width: 1720px; } }
.lateral {
  position: sticky; top: 0; align-self: start; height: 100vh; overflow-y: auto;
  border-right: 1px solid var(--linha); background: var(--card);
  padding: 20px 12px 30px; display: flex; flex-direction: column; gap: 4px;
}
.lat-topo { display: flex; align-items: center; gap: 10px; padding: 0 6px 16px; }
.lat-topo .logo-bloco { width: 36px; height: 36px; border-radius: 9px; font-size: 14px; }
.lat-nome { font-size: 13.5px; font-weight: 800; line-height: 1.25; min-width: 0; }
.lat-fechar { display: none; margin-left: auto; background: none; border: 0; color: var(--tx2);
  font-size: 16px; cursor: pointer; padding: 4px 6px; }
.lat-nav { display: flex; flex-direction: column; gap: 2px; }
.lat-grupo { font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--tx3); padding: 16px 8px 6px; }
/* a linha inteira é o alvo visual (fundo, seleção); dentro dela o rótulo e a setinha
   são dois botões separados, pra setinha abrir o grupo sem trocar de tela */
.lat-linha { display: flex; align-items: center; border-radius: 8px; }
.lat-linha:hover { background: var(--card2); }
.lat-linha:hover .lat-item { color: var(--tx); }
.lat-linha.sel { background: var(--acc); }
.lat-linha.sel .lat-item, .lat-linha.sel .lat-seta { color: var(--sobre-acc); }
.lat-item {
  flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px;
  text-align: left; background: none; border: 0; color: var(--tx2); cursor: pointer;
  font: inherit; font-size: 13px; font-weight: 600; padding: 8px 10px; border-radius: 8px;
}
.lat-item > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lat-ico { width: 17px; height: 17px; flex: none; opacity: .85; }
/* a marca não perde a cor na linha selecionada nem no tema claro: é ela que faz o
   gestor achar a aba sem ler o rótulo */
.lat-ico.marca { opacity: 1; width: 18px; height: 18px; }
.lat-seta { background: none; border: 0; color: var(--tx3); cursor: pointer;
  padding: 8px 8px 8px 2px; display: flex; align-items: center; border-radius: 8px; }
.lat-seta svg { width: 15px; height: 15px; transition: transform .15s ease; }
/* aberta aponta pra baixo, fechada aponta pra direita (pro conteúdo que está oculto) */
.lat-seta:not(.aberta) svg { transform: rotate(-90deg); }
.lat-seta:hover { color: var(--tx); }
/* alinhado com o RÓTULO do item pai, não com o ícone: 10px de padding + 17px de
   ícone + 10px de gap */
.lat-subs { display: flex; flex-direction: column; gap: 1px; margin: 4px 0 6px 19px;
  padding-left: 9px; border-left: 1px solid var(--linha); }
.lat-sub {
  text-align: left; background: none; border: 0; color: var(--tx3); cursor: pointer;
  font: inherit; font-size: 12px; padding: 5px 8px; border-radius: 6px;
}
.lat-sub:hover { color: var(--tx); }
.lat-sub.at { color: var(--tx); font-weight: 700; background: var(--card2); }
/* botão de peso próprio, não uma setinha discreta: é o único controle do menu que a
   pessoa precisa achar de primeira, e recolhido ele fica sozinho numa faixa vazia */
.lat-mini-btn { display: none; margin-left: auto; background: var(--card2);
  border: 1px solid var(--linha); color: var(--tx2); cursor: pointer;
  font-size: 19px; line-height: 1; width: 32px; height: 32px; flex: none;
  border-radius: 9px; align-items: center; justify-content: center; padding: 0;
  transition: color .12s ease, border-color .12s ease, background .12s ease; }
.lat-mini-btn:hover { color: var(--sobre-acc); background: var(--acc); border-color: var(--acc); }
/* Menu recolhido: só ícones, devolvendo 172px pro conteúdo. Só no desktop, porque
   abaixo de 980px o menu já é gaveta e recolher não teria o que ganhar. */
@media (min-width: 981px) {
  .lat-mini-btn { display: flex; }
  .casca.lat-mini { --lat: 84px; }
  .casca.lat-mini .lateral { padding: 20px 6px 30px; align-items: center; }
  .casca.lat-mini .lat-topo { flex-direction: column; gap: 8px; padding: 0 0 14px; }
  .casca.lat-mini .lat-nome { display: none; }
  .casca.lat-mini .lat-mini-btn { margin-left: 0; }
  .casca.lat-mini .lat-seta,
  .casca.lat-mini .lat-subs { display: none; }
  /* o nome fica, cortado com reticências, como no Google Ads: só o ícone obriga a
     decorar o que cada símbolo quer dizer, e as seções da Visão geral não têm
     símbolo óbvio nenhum */
  .casca.lat-mini .lat-item { flex-direction: column; gap: 5px; padding: 9px 2px;
    text-align: center; }
  .casca.lat-mini .lat-item > span { font-size: 9.5px; font-weight: 600;
    letter-spacing: .01em; max-width: 100%; }
  /* o rótulo do grupo vira um traço: sem ele, Plataformas, Site e Mais viram uma
     pilha de ícones sem divisão nenhuma */
  .casca.lat-mini .lat-grupo { font-size: 0; padding: 10px 0 4px; height: 1px;
    background: var(--linha); margin: 6px 8px; }
  .casca.lat-mini .lat-nav { width: 100%; }
}
.lat-veu { display: none; }
.menu-btn { display: none; background: var(--card2); border: 1px solid var(--linha);
  color: var(--tx); border-radius: 9px; font-size: 17px; line-height: 1;
  padding: 9px 11px; cursor: pointer; flex: none; }
/* âncora não pode parar embaixo de nada: dá folga acima da seção ao rolar até ela */
[data-secao] { scroll-margin-top: 16px; }

@media (max-width: 980px) {
  .casca { grid-template-columns: minmax(0, 1fr); }
  .menu-btn { display: block; }
  .lat-fechar { display: block; }
  .lateral {
    position: fixed; top: 0; left: 0; z-index: 80; width: min(280px, 84vw); height: 100%;
    transform: translateX(-102%); transition: transform .18s ease;
  }
  .casca.menu-aberto .lateral { transform: none; }
  .casca.menu-aberto .lat-veu { display: block; position: fixed; inset: 0; z-index: 70;
    background: var(--veu); }
  body.trava-rolagem { overflow: hidden; }
}

/* ---------- cabeçalho ---------- */
.topo { display: flex; align-items: center; gap: 16px; padding: 8px 0 20px; border-bottom: 1px solid var(--linha); flex-wrap: wrap; }
.logo-bloco {
  width: 52px; height: 52px; border-radius: 12px; flex: none;
  background: var(--acc); color: var(--sobre-acc); display: flex; align-items: center; justify-content: center;
  font-weight: 800; font-size: 19px; letter-spacing: .5px;
}
.topo h1 { font-size: 19px; font-weight: 700; letter-spacing: .2px; }
.topo .sub { font-size: 11px; color: var(--tx2); text-transform: uppercase; letter-spacing: .14em; margin-top: 2px; }
.topo .topo-id { min-width: 0; }
/* linha por padrão. A COLUNA é caso especial do painel do cliente, onde a direita
   empilha "atualizando…" e o aviso de dado velho (cliente.js). O admin põe seis
   botões aqui, e com a coluna eles viravam uma escada de 268px de altura: o
   `style` inline do admin.html não corrigia porque não declara flex-direction, e
   inline só vence a propriedade que ele mesmo escreve */
.topo .direita { margin-left: auto; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  justify-content: flex-end; }
.casca .topo .direita { flex-direction: column; align-items: flex-end; gap: 6px; }
.topo .atualizado { font-size: 11.5px; color: var(--tx3); }

/* ---------- barra de período ---------- */
.barra-filtro {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  background: var(--card); border: 1px solid var(--linha); border-radius: 12px;
  padding: 10px 14px; margin: 16px 0 4px;
}
.bf-esq { display: flex; align-items: center; gap: 8px; min-width: 0; }
.bf-cal { width: 15px; height: 15px; color: var(--tx3); flex: none; }
.bf-rot { font-size: 12.5px; color: var(--tx2); }
.bf-chip { font-size: 11.5px; font-weight: 700; padding: 3px 9px; border-radius: 999px;
  background: var(--card2); color: var(--tx2); white-space: nowrap; }
.bf-datas { font-size: 12.5px; color: var(--tx); white-space: nowrap; }
.bf-dir { margin-left: auto; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.bf-atalhos { display: flex; gap: 2px; background: var(--card2); border-radius: 9px; padding: 2px; }
.bf-atalho, .bf-comp, .bf-limpar {
  background: none; border: 0; color: var(--tx2); cursor: pointer; font: inherit;
  font-size: 12px; font-weight: 600; padding: 5px 11px; border-radius: 7px; white-space: nowrap;
}
.bf-atalho:hover, .bf-comp:hover, .bf-limpar:hover:not(:disabled) { color: var(--tx); }
.bf-atalho.sel { background: var(--acc); color: var(--sobre-acc); }
/* o aviso ocupa a faixa inteira embaixo dos controles */
/* o aviso é o que impede alguém de ler um número recortado como se fosse o total:
   com --tx3 ele era o texto MAIS fraco da tela (3,4:1), justamente o que não pode
   passar despercebido. --tx2 e 12px deixam entre 5,8 e 7,1:1 nos quatro temas */
.bf-aviso { flex-basis: 100%; font-size: 12px; color: var(--tx2); line-height: 1.5;
  border-top: 1px solid var(--linha); padding-top: 8px; margin-top: 2px; }
.periodo-item.bloqueado { color: var(--tx3); opacity: .5; cursor: default; }
.periodo-item.bloqueado:hover { background: none; }
/* desabilitado, e não escondido: sumir o botão faz a barra pular de largura a cada
   troca de período, e o gestor perde a referência de onde clicar */
.bf-limpar:disabled { color: var(--tx3); opacity: .45; cursor: default; }

/* ---------- seletor de período ---------- */
.periodo { position: relative; }
.periodo-botao {
  display: inline-flex; align-items: center; gap: 8px; height: 36px; padding: 0 12px;
  background: var(--card2); color: var(--tx); border: 1px solid var(--linha);
  border-radius: 9px; font-size: 13.5px; font-weight: 600; cursor: pointer; font-family: inherit;
}
.periodo-botao:hover { border-color: var(--acc); }
.periodo-botao .cal { color: var(--tx2); flex: none; }
.periodo-botao .chev { font-style: normal; color: var(--tx2); font-size: 11px; transition: transform .15s; }
.periodo[data-open="true"] .periodo-botao .chev { transform: rotate(180deg); }
.periodo-menu {
  position: absolute; top: calc(100% + 6px); right: 0; min-width: 210px; max-height: 320px;
  overflow-y: auto; list-style: none; margin: 0; padding: 6px;
  background: var(--card); border: 1px solid var(--linha); border-radius: 12px;
  box-shadow: 0 14px 36px var(--sombra); z-index: 40; display: none;
}
.periodo[data-open="true"] .periodo-menu { display: block; }
.periodo-item {
  display: flex; justify-content: space-between; align-items: center; gap: 10px;
  padding: 9px 11px; border-radius: 7px; font-size: 13.5px; color: var(--tx2); cursor: pointer;
}
.periodo-item:hover { background: var(--card2); color: var(--tx); }
.periodo-item.ativo { background: rgba(47, 107, 255, .12); color: var(--tx); font-weight: 700; }
.periodo-item .ck { color: var(--acc); font-weight: 700; }
.periodo-sep { height: 1px; background: var(--linha); margin: 6px 4px; }
/* filtro de objetivo: cabeçalho de plataforma dentro do menu, e o investimento de
   cada opção à direita, que é o que faz escolher sem abrir a tabela antes */
.obj-menu { min-width: 260px; }
/* --tx2, e não --tx3: em maiúscula de 10,5px o cinza mais claro dava 3,4:1 nos quatro
   temas, abaixo do mínimo de leitura. Com --tx2 fica entre 5,8 e 7,1:1 */
.periodo-grupo {
  display: flex; align-items: center; gap: 7px; padding: 10px 11px 5px;
  font-size: 10.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: var(--tx2); cursor: default;
}
.periodo-grupo .pt { width: 7px; height: 7px; border-radius: 50%; flex: none; }
/* o investimento de cada opção é número pra comparar, não legenda: mesmo tratamento */
.obj-inv { margin-left: auto; font-size: 12px; color: var(--tx2); font-variant-numeric: tabular-nums; }
.periodo-item.ativo .obj-inv { color: var(--tx); }
.periodo-item .ck { margin-left: 2px; }
/* o botão avisa que há recorte ligado mesmo com o menu fechado */
.periodo-botao.ativo { border-color: var(--acc); color: var(--acc); }
/* seção que se recusa a mostrar número no lugar de mostrar número errado */
.card.vazio-filtro p { margin: 0; color: var(--tx2); font-size: 13.5px; line-height: 1.6; }
.periodo-custom { padding: 4px 7px 6px; }
.pc-campos { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; }
/* sem `color-scheme` aqui: o tema já declara o dele no <html>, e o seletor de data
   nativo acompanha sozinho. Fixar `dark` deixava o calendário preto no tema claro */
.pc-campos input { padding: 6px 8px; font-size: 12.5px; }
.pc-campos span { font-size: 12px; color: var(--tx3); flex: none; }
.periodo-custom .botao { width: 100%; }

/* ---------- chips de mês ---------- */
.meses { display: flex; gap: 8px; overflow-x: auto; padding: 16px 0 4px; scrollbar-width: none; }
.meses::-webkit-scrollbar { display: none; }
.chip {
  border: 1px solid var(--linha); background: var(--card); color: var(--tx2);
  border-radius: 8px; padding: 6px 13px; font-size: 12.5px; font-weight: 600;
  cursor: pointer; white-space: nowrap; transition: all .15s;
}
.chip:hover { border-color: var(--acc); color: var(--tx); }
.chip.sel { background: var(--acc); border-color: var(--acc); color: var(--sobre-acc); }

/* ---------- abas ---------- */
.abas { display: flex; gap: 6px; overflow-x: auto; padding: 14px 0 2px; border-bottom: 1px solid var(--linha); scrollbar-width: none; }
.abas::-webkit-scrollbar { display: none; }
.aba {
  background: none; border: none; color: var(--tx2); font-size: 13.5px; font-weight: 600;
  padding: 8px 14px; border-radius: 8px 8px 0 0; cursor: pointer; white-space: nowrap;
}
.aba:hover { color: var(--tx); }
.aba.sel { background: var(--acc); color: var(--sobre-acc); }

/* ---------- seções e cards ---------- */
/* o título era 11px em maiúsculas e o texto de apoio embaixo dele 15px: a explicação
   pesava mais que o título e nada guiava o olho nas 9 seções da Visão geral. Agora o
   título é 17px em caixa normal, com um traço na cor do cliente no lugar do
   maiúsculo espaçado, e o apoio desce pra 13px secundário. */
.secao-titulo {
  font-size: 17px; font-weight: 700; letter-spacing: -.01em; color: var(--tx);
  margin: 30px 0 4px; display: flex; align-items: center; gap: 9px;
}
.secao-titulo::before {
  content: ""; width: 3px; height: 17px; border-radius: 2px; flex: none;
  background: var(--acc); filter: var(--filtro-titulo);
}
/* medida de leitura: a 1140px de largura a linha passa de 160 caracteres, o dobro do
   confortável. Só o texto corrido é limitado; tabela e gráfico continuam largos. */
.sec > .desc, .secao-titulo + .desc, .card > .desc {
  font-size: 13px; color: var(--tx2); max-width: 680px; line-height: 1.5;
}
.sec > .desc { margin: 0 0 14px; }
.card { background: var(--card); border: 1px solid var(--linha); border-radius: 14px; padding: 20px; }
.card h3 { font-size: 15px; font-weight: 700; margin-bottom: 2px; }
.card .desc { font-size: 12.5px; color: var(--tx2); margin-bottom: 14px; }

/* ---------- seção dobrável ---------- */
.sec { margin-top: 26px; }
.sec:first-child { margin-top: 8px; }
/* cabeçalho e botão de PDF na mesma linha, como irmãos: o cabeçalho é um <button>
   inteiro, então o PDF não pode morar dentro dele */
.sec-topo { display: flex; align-items: center; gap: 4px; border-radius: 10px; }
.sec-cab {
  flex: 1; min-width: 0; display: flex; align-items: center; gap: 9px; background: none;
  border: 0; padding: 4px 0; cursor: pointer; font: inherit; text-align: left;
  color: var(--tx); border-radius: 8px;
}
.sec-cab > svg { width: 15px; height: 15px; flex: none; color: var(--tx3);
  transition: transform .15s ease; }
.sec.fechada .sec-cab > svg { transform: rotate(-90deg); }
.sec-cab:hover > svg, .sec-cab:hover .sec-tit { color: var(--tx); }
.sec-tit { font-size: 17px; font-weight: 700; letter-spacing: -.01em; }
.sec-dica { margin-left: auto; font-size: 11.5px; font-style: normal; color: var(--tx3); }
/* recolhida vira uma faixa clicável com a mesma altura de linha da aberta */
.sec.fechada .sec-topo { border: 1px solid var(--linha); background: var(--card);
  padding: 13px 16px; }
.sec.fechada .sec-topo:hover { border-color: var(--acc); }
/* o símbolo da seção, do mesmo tamanho e cor da setinha, some no papel junto com ela */
.sec-cab .lat-ico { width: 16px; height: 16px; flex: none; color: var(--tx3); }
.sec-cab:hover .lat-ico { color: var(--acc); }
.sec-corpo { margin-top: 4px; }
/* o rótulo do cabeçalho já diz o nome da seção: o título interno viraria eco */
.sec-corpo > .secao-titulo:first-child { display: none; }

/* ---------- KPIs ---------- */
.kpis { display: grid; grid-template-columns: repeat(6, 1fr); gap: 10px; }
.kpis.k4 { grid-template-columns: repeat(4, 1fr); }
.kpi { background: var(--card); border: 1px solid var(--linha); border-radius: 12px; padding: 14px 16px; }
.kpi .rotulo { font-size: 10.5px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--tx3); }
.kpi .valor { font-size: 21px; font-weight: 800; margin: 5px 0 4px; letter-spacing: -.3px; }
.kpi .valor.verde { color: var(--verde); }
.kpi .valor.verm { color: var(--verm); }
/* as quatro principais são maiores e ocupam a linha inteira: o tamanho é o que
   diz "olhe aqui primeiro", antes de qualquer texto explicando */
.kpis.destaque { grid-template-columns: repeat(4, 1fr); }
.kpis.destaque .kpi { padding: 18px 20px 0; overflow: hidden; }
.kpis.destaque .valor { font-size: 27px; }
/* a miniatura encosta nas três bordas do card: ela é fundo do número, não um
   gráfico ao lado dele */
.kpi-mini { display: block; width: calc(100% + 40px); height: 46px; margin: 10px -20px 0; }
.kpis.secundarias { margin-top: 8px; }
.kpi-grupo { margin-top: 14px; }
.kpi-etapa { display: flex; align-items: baseline; gap: 8px; padding-left: 2px; }
.kpi-etapa b { font-size: 12px; font-weight: 800; letter-spacing: .06em;
  text-transform: uppercase; color: var(--tx); }
.kpi-etapa span { font-size: 12px; color: var(--tx3); }
.kpis.secundarias .kpi { padding: 11px 13px; background: var(--card2); }
.kpis.secundarias .valor { font-size: 17px; }
.kpi-mais {
  display: flex; align-items: center; gap: 8px; margin: 12px 0 0;
  background: none; border: 0; padding: 4px 0; cursor: pointer;
  font: inherit; font-size: 12.5px; font-weight: 700; color: var(--tx2);
}
.kpi-mais:hover { color: var(--tx); }
.kpi-mais .seta { display: inline-block; transition: transform .15s; font-size: 11px; }
.kpi-mais.aberto .seta { transform: rotate(90deg); }
.kpi-mais em { font-style: normal; font-weight: 500; color: var(--tx3); font-size: 12px; }
.kpi .valor small { font-size: 13px; font-weight: 700; color: var(--tx2); }

.pill { display: inline-block; font-size: 11px; font-weight: 700; border-radius: 6px; padding: 1.5px 7px; }
.pill.sobe  { color: var(--verde); background: rgba(47, 212, 140, .1); }
.pill.desce { color: var(--verm);  background: rgba(255, 93, 124, .1); }
.pill.neutro{ color: var(--tx2);   background: rgba(147, 161, 191, .1); }

/* ---------- grids ---------- */
.grid-2 { display: grid; grid-template-columns: 1.6fr 1fr; gap: 12px; margin-top: 12px; }
.grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }

/* ---------- gráfico ---------- */
.graf-cab { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.selo-roas {
  border: 1px solid rgba(47, 212, 140, .4); background: rgba(47, 212, 140, .08);
  color: var(--verde); border-radius: 10px; padding: 5px 12px; font-size: 13px; font-weight: 700;
}
.selo-roas span { font-size: 10.5px; letter-spacing: .1em; opacity: .8; margin-right: 6px; }
.legenda { display: flex; gap: 16px; margin-top: 10px; font-size: 12px; color: var(--tx2); }
.legenda i { display: inline-block; width: 14px; height: 3px; border-radius: 2px; margin-right: 6px; vertical-align: middle; }
svg.graf { width: 100%; height: auto; display: block; margin-top: 6px; }
svg.graf circle { cursor: pointer; }

/* ---------- canais ---------- */
.canal { padding: 11px 0; border-bottom: 1px solid var(--linha); }
.canal:last-child { border-bottom: none; }
.canal .linha1 { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; font-size: 13px; }
.canal .nome { font-weight: 700; filter: var(--filtro-dado); }
.canal .meta { color: var(--tx2); font-size: 12px; text-align: right; }
.canal .barra { height: 6px; border-radius: 3px; background: var(--card2); margin: 7px 0 5px; overflow: hidden; }
.canal .barra i { display: block; height: 100%; border-radius: 3px; }
.canal .share { font-size: 11px; color: var(--tx3); }

/* ---------- tabelas ---------- */
.tabela-scroll { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; font-size: 13px; white-space: nowrap; }
th { font-size: 10.5px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--tx3); text-align: right; padding: 10px 12px; border-bottom: 1px solid var(--linha); }
th:first-child, td:first-child { text-align: left; padding-left: 4px; }
td { padding: 11px 12px; text-align: right; border-bottom: 1px solid var(--linha); color: var(--tx); }
tr:last-child td { border-bottom: none; }
tr.total td { font-weight: 800; background: var(--zebra); }
tr.clicavel { cursor: pointer; }
tr.clicavel:hover td { background: var(--zebra); }
tr.sel-mes td { background: rgba(47, 107, 255, .1); }
.chip-fonte { filter: var(--filtro-dado); display: inline-block; font-size: 11.5px; font-weight: 700; border-radius: 6px; padding: 3px 9px; }
td .verde { color: var(--verde); font-weight: 700; }
td .roas { font-weight: 800; }

/* ---------- comparativo por origem ---------- */
.comp-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(310px, 1fr)); gap: 12px; }
.comp-col { background: var(--card); border: 1px solid var(--linha); border-radius: 14px; overflow: hidden; }
.comp-head {
  display: flex; align-items: center; gap: 8px; padding: 11px 15px;
  font-size: 13.5px; font-weight: 800; letter-spacing: .01em;
  border-bottom: 1px solid var(--linha);
}
.comp-head .pt { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.sub-abas { margin-left: auto; display: flex; gap: 3px; background: var(--zebra-forte); border-radius: 8px; padding: 2px; }
.sub-aba {
  background: none; border: none; font-family: inherit; cursor: pointer;
  color: var(--tx3); font-size: 11px; font-weight: 700; letter-spacing: .02em;
  padding: 4px 10px; border-radius: 6px; white-space: nowrap;
}
.sub-aba:hover { color: var(--tx2); }
.sub-aba.sel { font-weight: 800; }
.comp-linha { display: flex; border-bottom: 1px solid var(--linha); }
.comp-linha:last-child { border-bottom: none; }
.comp-linha .cel { flex: 1; min-width: 0; padding: 11px 14px 12px; border-right: 1px solid var(--linha); }
.comp-linha .cel:last-child { border-right: none; }
.cel-rot { font-size: 10px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--tx3); }
/* rótulo com explicação: sublinhado pontilhado discreto + cursor de ajuda */
.tem-dica { cursor: help; text-decoration: underline dotted rgba(147, 161, 191, .45); text-underline-offset: 3px; }
.tem-dica:hover { color: var(--tx2); text-decoration-color: var(--tx2); }
.comp-head .ct.tem-dica:hover { color: inherit; opacity: .85; }
.cel-val { font-size: 17px; font-weight: 800; letter-spacing: -.3px; margin: 3px 0 2px; }
.cel.destaque .cel-val { font-size: 22px; }
.cel-val.verde { color: var(--verde); }
.cel-proj { margin-top: 5px; font-size: 11px; color: var(--tx3); line-height: 1.35; }
.cel-proj span { display: block; font-size: 9.5px; letter-spacing: .08em; text-transform: uppercase; opacity: .75; }

/* ---------- funil da loja ---------- */
.fl-grid { display: grid; grid-template-columns: minmax(230px, 300px) 1fr; gap: 20px; align-items: start; }
.fl-funil { display: flex; flex-direction: column; align-items: center; gap: 6px; padding-top: 2px; }
.fl-nivel { border: 1px solid; border-radius: 10px; padding: 11px 12px; text-align: center; transition: width .2s; }
.fl-nivel-rot { font-size: 10px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--tx2); }
.fl-nivel-val { font-size: 21px; font-weight: 800; letter-spacing: -.3px; margin-top: 2px; }

.fl-etapas { display: flex; flex-direction: column; gap: 10px; }
.fl-etapa-linha { display: grid; grid-template-columns: 130px 1fr minmax(190px, 260px); gap: 14px;
  align-items: start; background: var(--card2); border: 1px solid var(--linha); border-radius: 12px; padding: 12px 14px; }
.fl-etapa-cab b { display: block; font-size: 12.5px; font-weight: 800; color: var(--tx); }
.fl-etapa-cab span { font-size: 11px; color: var(--tx3); line-height: 1.35; display: block; margin-top: 2px; }
.fl-etapa-corpo { min-width: 0; }
.fl-expl { font-size: 11.5px; color: var(--tx3); margin-top: 6px; line-height: 1.4; }
.fl-taxa { font-size: 24px; font-weight: 800; letter-spacing: -.3px; }
.fl-taxa.bom, .fl-mini-val.bom, .fl-refs .bom { color: var(--verde); }
.fl-taxa.medio, .fl-mini-val.medio { color: var(--ambar); }
.fl-taxa.ruim, .fl-mini-val.ruim, .fl-refs .ruim { color: var(--verm); }

/* o que vale pra conta inteira em cima, os quadros de plataforma embaixo */
.fl-mets { display: flex; flex-direction: column; gap: 12px; }
.fl-mets-geral { display: flex; flex-wrap: wrap; gap: 8px 22px; align-items: flex-start; }
/* colunas de largura igual: o quadro do Meta tem quatro métricas e o do Google
   duas, e sem a grade o segundo encolhia até virar meia largura ao lado do primeiro */
.fl-plats { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 10px; align-items: start; }
.fl-mini { min-width: 62px; }
.fl-mini-rot { font-size: 9.5px; font-weight: 700; letter-spacing: .09em; text-transform: uppercase; color: var(--tx3); }
.fl-mini-val { font-size: 14.5px; font-weight: 800; margin-top: 1px; }
/* quatro colunas fixas dentro do quadro: assim o CPC e o CTR do Google caem
   exatamente embaixo do CPC e do CTR do Meta, e o olho compara na vertical */
.fl-plat { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px 12px;
  border: 1px solid; border-radius: 10px; padding: 9px 12px; align-content: start; }
.fl-plat-nome { grid-column: 1 / -1; font-size: 10px; font-weight: 800; letter-spacing: .09em; text-transform: uppercase; }

.fl-refs { font-size: 11px; color: var(--tx3); line-height: 1.6; }
.fl-refs b { display: block; font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--tx2); margin-bottom: 3px; }

.fl-legenda { display: flex; flex-wrap: wrap; gap: 6px 20px; margin-top: 16px; padding-top: 14px;
  border-top: 1px solid var(--linha); font-size: 11.5px; color: var(--tx3); }
.fl-legenda > b { font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--tx2); }
.fl-legenda span b { color: var(--tx2); font-weight: 800; }

/* ---------- tabela de anúncios ---------- */
.cab-plataforma { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin: 26px 0 12px; }
/* As sub-abas da plataforma são navegação de primeiro nível, não um ajuste fino de
   card: a 11px em --tx3 elas sumiam ao lado do título grande da plataforma, e quem
   não sabia que existiam não achava. Ganham corpo, contraste e área de clique. */
.sub-abas.plat { margin-left: 0; padding: 3px; gap: 2px; }
.sub-abas.plat .sub-aba { font-size: 12.5px; padding: 6px 13px; color: var(--tx2);
  letter-spacing: 0; }
.sub-abas.plat .sub-aba:hover { color: var(--tx); background: var(--zebra); }
.sub-abas.plat .sub-aba.sel { font-weight: 800; color: var(--tx); }
.tab-anuncios td, .tab-anuncios th { vertical-align: middle; }
/* o criativo é uma célula normal (senão a linha divisória quebra no meio da
   tabela); o alinhamento vem de inline-block nos filhos, não de flex no td */
.an-cri { text-align: left !important; white-space: nowrap; }
.an-cri > * { display: inline-block; vertical-align: middle; }
.an-cri img, .an-semimg { width: 62px; height: 62px; border-radius: 8px; object-fit: cover; margin: 6px 12px; background: var(--card2); border: 1px solid var(--linha); }
/* miniatura maior pede linha mais alta: o criativo é o que se reconhece de olho,
   e a 42px não dava pra saber qual anúncio era */
.tab-anuncios tbody td { padding-top: 8px; padding-bottom: 8px; }
.an-pos { font-size: 11px; color: var(--tx3); font-weight: 700; min-width: 15px; }
.an-nome { max-width: 240px; }
.an-nome > * { display: block; }
.an-camps { margin-top: 2px; }
.an-sub { margin-top: 2px; }
.an-nome-t { font-weight: 700; font-size: 12.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 230px; }
.an-sub { font-size: 10.5px; color: var(--tx3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 230px; }
.an-camps { font-size: 10px; color: var(--tx3); background: var(--card2); border: 1px solid var(--linha);
  border-radius: 5px; padding: 1px 6px; width: fit-content; cursor: help; }
.an-link { color: var(--acc); font-size: 12px; font-weight: 700; text-decoration: none; white-space: nowrap; }
.an-link:hover { text-decoration: underline; }
tr.sem-entrega td { background: rgba(255, 93, 124, .05); }
.tag-ok, .tag-alerta { font-size: 10.5px; font-weight: 700; border-radius: 5px; padding: 2px 8px; white-space: nowrap; }
.tag-ok { color: var(--verde); background: rgba(47, 212, 140, .12); }
.tag-alerta { color: var(--verm); background: rgba(255, 93, 124, .12); }
/* As tabelas de criativo têm 10+ colunas e não cabem na medida de leitura de 1180px
   do resto do painel. Em tela grande elas escapam do container e usam a largura
   disponível; o texto de apoio continua limitado, senão a linha fica longa demais
   pra ler. */
@media (min-width: 1240px) {
  /* sem escapar do container: o .conteudo já usa a largura toda acima de 1240px.
     Sobra só o ajuste de nome visível, que a folga extra permite. */
  .card-largo > .desc,
  .card-largo > .aviso-leitura,
  .card-largo > .ref-nota { max-width: 900px; }
  /* a folga que sobra na coluna do criativo vira nome visível, não espaço morto */
  .card-largo .an-nome { max-width: 420px; }
  .card-largo .an-nome-t,
  .card-largo .an-sub { max-width: 410px; }
}
/* ---------- funil em formato de funil ---------- */
.fn { display: flex; flex-direction: column; align-items: center; gap: 2px; }
.fn-faixa { display: flex; align-items: baseline; gap: 12px; justify-content: center;
  border: 1px solid; border-radius: 10px; padding: 12px 18px; min-width: 300px;
  white-space: nowrap; }
.fn-rot { font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase; color: var(--tx2); }
/* a cor aqui vem do DADO (verde do funil, azul da plataforma) e chega por style
   inline, então não dá pra trocar por variável. Nos temas claros um escurecimento
   uniforme resolve o contraste sem perder a matiz, igual ao .secao-titulo */
.fn-val { font-size: 21px; font-weight: 800; filter: var(--filtro-dado); }
.fn-extra { font-size: 11px; color: var(--tx3); }
.fn-passo { display: flex; align-items: center; gap: 6px; padding: 3px 0; font-size: 11px; color: var(--tx3); }
.fn-passo b { color: var(--verde); font-size: 12.5px; }
@media (max-width: 560px) {
  .fn-faixa { width: 100% !important; flex-wrap: wrap; gap: 6px; padding: 10px 12px; min-width: 0; }
  .fn-val { font-size: 18px; }
}

/* ---------- por origem de tráfego ---------- */
.og-linha { border: 1px solid; border-radius: 12px; padding: 12px 16px; margin-bottom: 10px;
  display: flex; align-items: center; gap: 18px; flex-wrap: wrap; }
.og-linha:last-child { margin-bottom: 0; }
.og-nome { font-size: 13px; font-weight: 800; min-width: 92px; }
/* grade de 5, e não flex-wrap: com wrap, "% Marketing" não cabia e caía sozinho numa
   segunda linha em TODA plataforma. Em duas fileiras de 5 as células ficam alinhadas
   entre Meta e Google, que é o que permite comparar de olho, coluna a coluna. */
.og-cels { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 14px 18px; flex: 1; min-width: 0; }
.og-cel { min-width: 0; }
.og-rot { font-size: 9.5px; letter-spacing: .07em; text-transform: uppercase; color: var(--tx3); margin-bottom: 3px; }
.og-val { font-size: 15px; font-weight: 700; display: flex; align-items: baseline; gap: 6px; }
.og-total { border-color: var(--linha) !important; background: var(--zebra-forte); }
.og-total .og-nome { color: var(--tx); }

/* ---------- quem comprou ---------- */
/* colunas IGUAIS (o .grid-2 é 1.6fr/1fr, feito pro gráfico) e `start` pra cada
   card ter a altura do próprio conteúdo — esticar espalhava as linhas da tabela
   menor e deixava o bloco torto */
/* minmax(0,1fr) e não 1fr: nome de produto é longo e com nowrap o track cresceria
   até caber, quebrando a simetria das colunas */
/* `stretch` (padrão) pra os dois quadros da fileira terminarem juntos: Por dispositivo
   tem 3 linhas e Por estado tem 8, e a diferença de 270px de altura era o que deixava
   o bloco torto. O card vira coluna e a tabela fica com a altura dela, então a sobra
   aparece como ar no fim do card menor, não espalhada entre as linhas da tabela. */
.grid-qc { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 12px; margin-top: 12px; }
.qc-card { display: flex; flex-direction: column; }
.qc-card .tabela-scroll { flex: none; }
@media (max-width: 980px) { .grid-qc { grid-template-columns: minmax(0, 1fr); } }
/* seis colunas por card não cabem na medida de leitura: em tela grande o bloco
   inteiro escapa do container, igual às tabelas de anúncio */
.qc-card .tabela-scroll { margin-top: 10px; }
.tab-qc { table-layout: auto; width: 100%; }
.tab-qc td, .tab-qc th { white-space: nowrap; }
.qc-nome { text-align: left !important; min-width: 120px; max-width: 195px;
  overflow: hidden; text-overflow: ellipsis; }
/* 5px e não 3px, e proporcional ao MAIOR da tabela: com 41 categorias a fatia do
   topo era 13% da receita e todas as barras viravam um toco invisível */
.qc-barra { display: block; height: 5px; border-radius: 3px; background: var(--zebra-forte); margin-top: 6px; }
.qc-barra i { display: block; height: 100%; border-radius: 3px; background: var(--acc); min-width: 2px; }
.qc-pos { width: 22px; text-align: right !important; color: var(--tx3); font-size: 11px;
  padding-right: 2px !important; }
/* número e variação na mesma célula, com a variação sempre à direita */
.qc-var { white-space: nowrap; }
.qc-var .pill { margin-left: 6px; }
.qc-total td { border-top: 1px solid var(--linha); font-weight: 800;
  background: var(--zebra); position: sticky; bottom: 0; }
tr.qc-resto { color: var(--tx3); font-style: italic; }
tr.qc-resto .qc-barra i { background: var(--tx3); }

/* ---------- gráfico: coluna + linha com balão no hover ---------- */
.gb-hit { fill: transparent; }
.gb-guia, .gb-tip { opacity: 0; transition: opacity .12s; pointer-events: none; }
.gb-guia { fill: var(--guia); }
.gb-eixo { filter: var(--filtro-dado); }
.gb:hover .gb-guia, .gb:hover .gb-tip { opacity: 1; }
.gb-tip rect { fill: var(--tip-bg); stroke: var(--tip-borda); }
.gb-tit { font-size: 10.5px; fill: var(--tx2); font-weight: 700; }
.gb-txt { font-size: 11px; fill: var(--tx2); }
.gb-val { font-size: 11px; fill: var(--tx); font-weight: 700; }

/* ---------- controle diário ---------- */
/* período longo gera muita linha: a tabela rola por dentro com o cabeçalho fixo,
   em vez de empurrar o resto da página pra baixo */
.cd-scroll { max-height: 520px; overflow-y: auto; }
.cd-scroll thead th { position: sticky; top: 0; background: var(--card); z-index: 2; }
.tab-diario td, .tab-diario th { white-space: nowrap; }
/* o total fica fixo no rodapé do scroll; sem z-index as linhas rolando pintam
   por cima dele e o número aparece cortado */
.tab-diario tr.total td { position: sticky; bottom: 0; z-index: 2;
  background: var(--card); box-shadow: 0 -1px 0 var(--linha); }
.cd-data { text-align: left !important; }
.cd-sem { color: var(--tx3); font-size: 10.5px; margin-left: 4px; }
.tab-diario .bom { color: var(--verde); }
.tab-diario .medio { color: var(--ambar); }
.tab-diario .ruim { color: var(--verm); }
.fl-mini-comp { margin-top: 2px; }
.fl-nivel-val .pill { margin-left: 8px; vertical-align: middle; }

/* a coluna ordenada era destacada só na tabela de criativos, porque a regra estava
   presa ao .tab-anuncios. Agora vale em qualquer tabela com cabeçalho clicável. */
th.ord { cursor: pointer; user-select: none; white-space: nowrap; }
th.ord:hover { color: var(--tx); }
.ord-seta { font-size: 8px; margin-left: 4px; opacity: .3; vertical-align: 1px; }
th.ord:hover .ord-seta { opacity: .7; }
th.ord-ativa { color: var(--tx) !important; font-weight: 800; }
th.ord-ativa .ord-seta { opacity: 1; color: var(--acc); }
.freq-ok { font-size: 12px; color: var(--tx2); }
/* sem `cursor: help`: o motivo da falha virou texto visível, não tem mais tooltip
   escondido pra sinalizar */
.sync-faixa { font-size: 11px; font-weight: 700; padding: 7px 10px; border-radius: 8px;
  margin-bottom: 10px; }
/* cor de texto normal, e não o âmbar herdado: o âmbar sinaliza o alerta no
   cabeçalho, mas como corpo de texto a 11px dava 3,5:1 sobre o fundo claro,
   abaixo do mínimo de 4,5:1. O motivo da falha tem que ser legível */
.sync-faixa .sf-item { font-weight: 400; margin-top: 4px; line-height: 1.35;
  overflow-wrap: anywhere; color: var(--tx); }
.sync-faixa .sf-item b { font-weight: 700; }
.sync-faixa.ok { color: var(--verde); background: rgba(47, 212, 140, .1); }
.sync-faixa.alerta { color: var(--ambar); background: rgba(245, 178, 60, .12); }
.aviso-dado { font-size: 11px; font-weight: 700; color: var(--ambar); margin-top: 4px;
  text-align: right; cursor: help; }
.ver-mais { display: flex; align-items: center; gap: 10px; margin-top: 12px;
  font-size: 12px; color: var(--tx3); flex-wrap: wrap; }
.ver-mais button { background: var(--card2); border: 1px solid var(--linha); color: var(--tx2);
  border-radius: 7px; padding: 5px 12px; font-size: 12px; font-weight: 700; cursor: pointer;
  font-family: inherit; }
.ver-mais button:hover { color: var(--tx); border-color: var(--tx3); }
.ref-nota { font-size: 11px; color: var(--tx3); margin-top: 10px; }
.ref-nota .bom { color: var(--verde); }
.ref-nota .ruim { color: var(--verm); }
.tab-anuncios .bom { color: var(--verde); }
.tab-anuncios .medio { color: var(--ambar); }
.tab-anuncios .ruim { color: var(--verm); }
.an-parcial { display: block; font-size: 10px; color: var(--tx3); margin-top: 2px; cursor: help;
  text-decoration: underline dotted rgba(147, 161, 191, .45); text-underline-offset: 2px; }

/* linha expandida com as métricas secundárias */
tr[data-expandir] { cursor: pointer; }
tr[data-expandir]:hover td { background: var(--zebra); }
.an-seta { display: inline-block; width: 12px; color: var(--tx3); font-size: 9px;
  transition: transform .15s; }
tr.aberta .an-seta { transform: rotate(90deg); color: var(--tx2); }
tr.aberta td { background: var(--zebra-forte); }
tr.det td { padding: 0 !important; background: var(--card2); }
.det-caixa { padding: 14px 16px 16px; display: flex; flex-wrap: wrap; gap: 22px; }
.det-grupo { min-width: 150px; }
.det-tit { font-size: 10px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--tx3); font-weight: 700; margin-bottom: 8px; }
.det-item { display: flex; justify-content: space-between; gap: 16px; font-size: 12px;
  padding: 3px 0; }
.det-item span:first-child { color: var(--tx2); }
.det-item span:last-child { font-weight: 700; white-space: nowrap; }
.det-vazio { font-size: 12px; color: var(--tx3); font-style: italic; }
.det-ref { display: block; font-size: 10px; color: var(--tx3); font-weight: 400; margin-top: 1px; }
.det-camp { font-size: 11px; color: var(--tx3); padding: 1px 0 1px 8px; max-width: 260px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.det-grupo .bom { color: var(--verde); }
.det-grupo .medio { color: var(--ambar); }
.det-grupo .ruim { color: var(--verm); }
.det-tit.tem-dica { display: inline-block; }
/* os filhos do nome são bloco pra empilhar; a tag precisa voltar a ter a largura
   do próprio texto, senão vira uma barra atravessando a coluna inteira */
.an-nome .tag-alerta { display: inline-block; margin-top: 3px; }
.ativos-resumo { font-size: 13px; color: var(--tx2); margin: 4px 0 12px; }
.ativos-resumo b { color: var(--tx); font-size: 15px; }
.aviso-leitura { font-size: 12px; color: var(--tx2); background: var(--card2); border-left: 2px solid var(--acc);
  border-radius: 0 8px 8px 0; padding: 9px 12px; margin: 10px 0 14px; line-height: 1.5; }

/* ---------- criativos ---------- */
/* `align-items: start`, e não o stretch padrão: como todo card tem exatamente a mesma
   estrutura, os fechados já saem com a mesma altura sozinhos. Com stretch, abrir UM
   card esticava os outros cinco junto e deixava um vazio de 250px em cada um. */
.criativos { display: grid; grid-template-columns: repeat(auto-fill, minmax(168px, 1fr));
  gap: 12px; align-items: start; }
.criativo { background: var(--card2); border: 1px solid var(--linha); border-radius: 12px;
  overflow: hidden; display: flex; flex-direction: column; cursor: pointer;
  transition: border-color .12s; }
.criativo:hover { border-color: var(--acc); }
.criativo.aberto { border-color: var(--acc); }
.cr-img { position: relative; aspect-ratio: 1; background: var(--bg); flex: none;
  overflow: hidden; display: flex; align-items: center; justify-content: center; }
/* a imagem sai do fluxo (`absolute`) de propósito: com ela no fluxo, um criativo em
   retrato ignorava o aspect-ratio e esticava a moldura, e aquele card ficava com os
   números 80px abaixo dos vizinhos */
.cr-img img { position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; display: block; z-index: 1; }
/* sem imagem a moldura FICA, com a inicial da plataforma: remover a moldura era o
   que desalinhava a fileira inteira quando um criativo não tinha prévia */
.cr-sigla { position: absolute; font-size: 34px; font-weight: 800; color: var(--cf, var(--tx3));
  opacity: .28; z-index: 0; }
.cr-img.sem { background: var(--card); }
.cr-corpo { padding: 11px 13px 12px; flex: 1; display: flex; flex-direction: column; min-width: 0; }
.cr-nome { font-size: 12.5px; font-weight: 700; line-height: 1.3; overflow: hidden;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; min-height: 2.6em; }
.cr-fonte { font-size: 10.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; margin: 2px 0 8px; }
.cr-linha { display: flex; justify-content: space-between; gap: 8px; font-size: 12px; color: var(--tx2); padding: 2.5px 0; }
.cr-linha b { color: var(--tx); font-weight: 700; }
.cr-linha b.verde { color: var(--verde); }
.cr-linha b.verm { color: var(--verm); }
.cr-extra { margin-top: 8px; padding-top: 8px; border-top: 1px dashed var(--linha); }
/* empilhado, e não lado a lado: em 173px de coluna os dois não cabiam na mesma linha,
   o botão era esmagado a ~20px e quebrava letra por letra, deixando o card 100px mais
   alto que os vizinhos. Empilhado a altura é a mesma em todo card. */
.cr-pe { margin-top: auto; padding-top: 10px; display: flex; flex-direction: column;
  align-items: flex-start; gap: 4px; }
.cr-mais { background: none; border: 0; padding: 0; cursor: pointer; font: inherit;
  font-size: 11px; font-weight: 700; color: var(--acc); white-space: nowrap; }
.cr-mais:hover { text-decoration: underline; }
.cr-ver { font-size: 11px; color: var(--tx2); text-decoration: none; white-space: nowrap; }
.cr-ver:hover { color: var(--tx); text-decoration: underline; }
.cr-ver.sem-link { color: var(--tx3); font-style: italic; }

/* cabeçalho da grade: título à esquerda, classificação à direita */
.cr-cab { display: flex; align-items: flex-start; gap: 16px; flex-wrap: wrap; margin-bottom: 12px; }
.cr-cab-tx { flex: 1; min-width: 240px; }
.cr-cab-tx .desc { margin-bottom: 0; }
.cr-ord { display: flex; align-items: center; gap: 8px; flex: none; }
.cr-ord-rot { font-size: 11.5px; color: var(--tx3); white-space: nowrap; }
.cr-dir { background: var(--card2); border: 1px solid var(--linha); color: var(--tx);
  border-radius: 8px; width: 30px; height: 30px; cursor: pointer; font-size: 14px;
  line-height: 1; flex: none; }
.cr-dir:hover { border-color: var(--acc); }

/* paginação */
.cr-pag { display: flex; align-items: center; justify-content: space-between; gap: 12px;
  flex-wrap: wrap; margin-top: 14px; font-size: 12px; color: var(--tx3); }
.cr-pg-nav { display: flex; gap: 4px; margin-left: auto; }
.cr-pg { background: var(--card2); border: 1px solid var(--linha); color: var(--tx2);
  border-radius: 7px; min-width: 28px; height: 28px; padding: 0 8px; cursor: pointer;
  font: inherit; font-size: 12px; font-weight: 600; }
.cr-pg:hover:not(:disabled) { color: var(--tx); border-color: var(--acc); }
.cr-pg.sel { background: var(--acc); border-color: var(--acc); color: var(--sobre-acc); }
.cr-pg:disabled { opacity: .4; cursor: default; }
.cr-pag-de { padding: 0 8px; align-self: center; }

/* ---------- funil ---------- */
.funil-linha { display: flex; align-items: stretch; gap: 8px; flex-wrap: wrap; }
.funil-linha .etapa { flex: 1; min-width: 118px; background: var(--card2); border: 1px solid var(--linha); border-radius: 12px; padding: 15px 14px; text-align: center; }
.funil-linha .etapa .valor { font-size: 23px; font-weight: 800; letter-spacing: -.3px; }
.funil-linha .etapa .rotulo { font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--tx3); font-weight: 700; margin-top: 3px; }
.funil-linha .seta { display: flex; flex-direction: column; justify-content: center; align-items: center; color: var(--tx3); font-size: 10.5px; min-width: 58px; text-align: center; }
.funil-linha .seta b { color: var(--verde); font-size: 13px; }
/* nome de campanha do Meta passa de 40 caracteres com frequência: em vez de virar
   "…", ele quebra em até duas linhas e só aí corta */
.cel-nome { text-align: left !important; min-width: 220px; max-width: 340px; }
.cel-nome .cel-foco { display: block; overflow: hidden; text-overflow: ellipsis;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  white-space: normal; line-height: 1.35; }

/* ---------- rodapé ---------- */
.rodape { margin-top: 40px; text-align: center; font-size: 12px; color: var(--tx3); }
.rodape b { color: var(--tx2); }

/* ---------- admin ---------- */
/* só o /admin alarga. O `.container` de 1180px é medida de LEITURA, boa pro painel
   do cliente, que é texto e gráfico. Aqui é formulário de três colunas com tabela
   de sete colunas do lado, e a mesma medida apertava tudo. `estilo.css` é
   compartilhado, então isto tem que ficar preso à classe, nunca no `.container` */
.container.admin { max-width: 1400px; }

.layout-admin { display: grid; grid-template-columns: 300px 1fr; gap: 14px; margin-top: 18px; align-items: start; }

/* ---------- abas do detalhe do cliente ---------- */
.abas-det { display: flex; gap: 4px; margin-bottom: 12px; flex-wrap: wrap;
  border-bottom: 1px solid var(--linha); padding-bottom: 0; }
.aba-det { background: none; border: 1px solid transparent; border-bottom: none;
  color: var(--tx2); font-size: 13px; font-weight: 700; padding: 8px 14px;
  border-radius: 9px 9px 0 0; cursor: pointer; margin-bottom: -1px;
  font-family: inherit; display: flex; align-items: center; gap: 5px; }
.aba-det:hover { color: var(--tx); background: var(--card2); }
.aba-det.sel { color: var(--tx); background: var(--card); border-color: var(--linha);
  border-bottom: 1px solid var(--card); }
.aba-det:focus-visible { outline: 2px solid var(--acc); outline-offset: -2px; }
.aba-ponto { color: var(--ambar); font-size: 18px; line-height: 0; }

/* ---------- ajuda que abre só quando pedem ---------- */
.ajuda-bloco { margin: 10px 0 6px; }
.ajuda-btn { width: 16px; height: 16px; padding: 0; margin-left: 5px; cursor: pointer;
  border: 1px solid var(--linha); background: var(--card2); color: var(--tx2);
  border-radius: 50%; font-size: 10px; font-weight: 700; font-family: inherit;
  line-height: 1; vertical-align: middle; }
.ajuda-btn:hover { color: var(--tx); border-color: var(--acc); }
.ajuda-btn[aria-expanded="true"] { background: var(--acc); color: var(--sobre-acc);
  border-color: var(--acc); }
.ajuda-txt { font-size: 12px; color: var(--tx2); line-height: 1.5; margin-top: 6px;
  padding: 9px 11px; background: var(--card2); border-radius: 9px;
  border-left: 2px solid var(--acc); }
.lista-clientes .item {
  padding: 13px 14px; border: 1px solid var(--linha); border-radius: 12px; background: var(--card);
  cursor: pointer; margin-bottom: 8px;
}
.lista-clientes .item:hover { border-color: var(--acc); }
.lista-clientes .item.sel { border-color: var(--acc); background: var(--card2); }
.lista-clientes .nome { font-weight: 700; font-size: 14px; }
.lista-clientes .info { font-size: 11.5px; color: var(--tx2); margin-top: 2px; }
.badge { display: inline-block; font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; border-radius: 5px; padding: 2px 7px; margin-left: 6px; }
.badge.servico   { color: var(--badge-servico); background: rgba(47, 107, 255, .12); }
.badge.ecommerce { color: var(--badge-ecom); background: rgba(236, 95, 158, .12); }
.badge.local     { color: var(--badge-local); background: rgba(47, 212, 140, .12); }

.botao {
  background: var(--acc); border: none; color: var(--sobre-acc); font-weight: 700; font-size: 13px;
  border-radius: 9px; padding: 9px 16px; cursor: pointer;
}
.botao:hover { filter: brightness(1.12); }
.botao.fantasma { background: var(--card2); border: 1px solid var(--linha); color: var(--tx2); }
.botao.fantasma:hover { color: var(--tx); border-color: var(--acc); filter: none; }
.botao.perigo { background: none; border: 1px solid rgba(255, 93, 124, .35); color: var(--verm); }
.botao.mini { padding: 6px 11px; font-size: 12px; }

input, select {
  background: var(--card2); border: 1px solid var(--linha); border-radius: 8px;
  color: var(--tx); font-size: 13px; padding: 8px 10px; font-family: inherit; width: 100%;
}
input:focus, select:focus { outline: none; border-color: var(--acc); }
input[type="color"] { padding: 2px; height: 36px; cursor: pointer; }
label.campo { display: block; font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--tx3); margin-bottom: 4px; }
.form-linha { display: flex; gap: 10px; margin-bottom: 12px; flex-wrap: wrap; }
.form-linha > div { flex: 1; min-width: 130px; }

.grade-mes { width: 100%; border-collapse: collapse; }
.grade-mes th { padding: 8px 6px; }
.grade-mes td { padding: 4px 3px; border-bottom: none; }
.grade-mes input { text-align: right; padding: 7px 8px; font-size: 12.5px; }
.grade-mes input.nome-fonte { text-align: left; font-weight: 600; }
.grade-mes .rm { background: none; border: none; color: var(--tx3); cursor: pointer; font-size: 15px; padding: 4px 6px; }
.grade-mes .rm:hover { color: var(--verm); }

.link-caixa { display: flex; gap: 8px; flex-wrap: wrap; }
.link-caixa input { flex: 1; min-width: 200px; font-family: ui-monospace, monospace; font-size: 12px; color: var(--tx2); }

#toast {
  position: fixed; bottom: 26px; left: 50%; transform: translateX(-50%) translateY(80px);
  background: var(--card2); border: 1px solid var(--acc); color: var(--tx);
  border-radius: 10px; padding: 11px 20px; font-size: 13.5px; font-weight: 600;
  transition: transform .25s; z-index: 50; box-shadow: 0 8px 30px var(--sombra);
}
#toast.mostra { transform: translateX(-50%) translateY(0); }

/* explicação ao tocar (celular não tem hover) */
#dica-box {
  position: fixed; left: 50%; bottom: 22px; transform: translateX(-50%) translateY(90px);
  max-width: min(560px, calc(100vw - 32px)); z-index: 60;
  background: var(--card2); border: 1px solid var(--acc); border-radius: 12px;
  padding: 13px 17px; font-size: 13.5px; line-height: 1.5; color: var(--tx);
  box-shadow: 0 10px 34px var(--sombra); transition: transform .22s, opacity .22s;
  opacity: 0; pointer-events: none;
}
#dica-box.mostra { transform: translateX(-50%) translateY(0); opacity: 1; }

.vazio { text-align: center; color: var(--tx2); padding: 60px 20px; }
.vazio h2 { font-size: 18px; margin-bottom: 8px; color: var(--tx); }

/* ---------- responsivo ---------- */
@media (max-width: 1180px) { .og-cels { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 980px) {
  .kpis, .kpis.k4 { grid-template-columns: repeat(3, 1fr); }
  .og-cels { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .grid-2 { grid-template-columns: 1fr; }
  .layout-admin { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
  .kpis, .kpis.k4 { grid-template-columns: repeat(2, 1fr); }
  .grid-3 { grid-template-columns: 1fr; }
  .kpi .valor { font-size: 18px; }
  .container, .conteudo { padding: 16px 12px 50px; }
  /* o botão do menu e o nome do cliente dividem a primeira linha: com `flex: auto`
     o texto empurrava o botão pra uma linha só dele */
  .topo { gap: 12px; }
  .topo .topo-id { flex: 1 1 0; }
  .funil-linha .seta { min-width: 100%; flex-direction: row; gap: 8px; }
  .cel-nome { max-width: 150px; }
  .fl-grid { grid-template-columns: 1fr; gap: 14px; }
  .fl-etapa-linha { grid-template-columns: 1fr; gap: 8px; }
  /* no celular o card deita: miniatura à esquerda e os números à direita, senão
     cada criativo ocuparia uma tela inteira e ninguém compara nada */
  .og-cels { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .criativos { grid-template-columns: 1fr; gap: 10px; }
  .criativo { flex-direction: row; align-items: stretch; }
  .cr-img { flex: 0 0 108px; aspect-ratio: auto; }
  .cr-corpo { flex: 1; min-width: 0; padding: 10px 12px; }
  .cr-nome { -webkit-line-clamp: 1; min-height: 0; }
}

/* ---------- seletor de tema ---------- */
.tema-ico { width: 14px; height: 14px; flex: none; }
#tema-admin .periodo-menu { right: 0; left: auto; }

/* ---------- barras de parte-do-todo (fatia de sessões x de receita) ---------- */
/* ocupa o quadro: com 3 linhas de tabela sobrava metade do card em branco ao lado
   do Por estado, que tem 8 */
.bp { margin: 8px 0 18px; }
.bp-linha { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
.bp-rot { font-size: 11.5px; color: var(--tx2); width: 56px; flex: none; text-align: right; }
/* o gap de 2px na cor da superfície é o que separa os segmentos: contorno em volta
   da marca acrescentaria peso de tinta que não é dado */
.bp-barra { flex: 1; display: flex; gap: 2px; height: 34px; min-width: 0; }
.bp-barra i {
  display: flex; align-items: center; justify-content: center; min-width: 3px;
  font-style: normal; font-size: 11.5px; font-weight: 700;
  overflow: hidden; white-space: nowrap;
}
/* ponta arredondada só nas extremidades da régua, quadrada nas emendas */
.bp-barra i:first-child { border-radius: 6px 0 0 6px; }
.bp-barra i:last-child { border-radius: 0 6px 6px 0; }
.bp-barra i:only-child { border-radius: 6px; }
.bp-leg { display: flex; flex-wrap: wrap; gap: 4px 16px; padding-left: 68px; margin-top: 2px; }
.bp-leg span { display: flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--tx2); }
.bp-leg i { width: 9px; height: 9px; border-radius: 3px; flex: none; }
@media (max-width: 560px) {
  .bp-rot { width: 48px; }
  .bp-leg { padding-left: 0; }
}

/* ---------- exportar em PDF e escolher o que aparece ---------- */
.bf-pdf, .bf-campos { gap: 6px; }
.bf-pdf svg, .bf-campos svg { width: 14px; height: 14px; flex: none; }
.sec-pdf {
  margin-left: auto; display: inline-flex; align-items: center; gap: 5px; flex: none;
  background: none; border: 1px solid transparent; color: var(--tx3); cursor: pointer;
  font: inherit; font-size: 11.5px; font-weight: 600; padding: 4px 9px; border-radius: 7px;
}
.sec-pdf svg { width: 13px; height: 13px; }
.sec-cab:hover .sec-pdf { border-color: var(--linha); color: var(--tx2); }
.sec-pdf:hover { border-color: var(--acc) !important; color: var(--tx) !important; }
/* a dica de "abrir" e o botão de PDF disputam o mesmo canto na seção recolhida */
.sec.fechada .sec-dica { margin-left: auto; }
.sec.fechada .sec-pdf { margin-left: 12px; }
/* lista de campos: mesma casca do seletor de período, com caixa de marcar */
.periodo-menu.campos { max-height: 340px; overflow-y: auto; min-width: 226px; }
/* o item de período usa space-between pra jogar o ✓ na ponta; aqui a marca vem
   ANTES do rótulo, então o texto tem que encostar nela e não na borda oposta */
.campos-item { display: flex; justify-content: flex-start; align-items: center; gap: 9px; }
.campos-cx {
  width: 15px; height: 15px; flex: none; border-radius: 4px; border: 1.5px solid var(--tx3);
  display: grid; place-items: center; font-size: 10px; color: var(--sobre-acc); line-height: 1;
}
.campos-item.on .campos-cx { background: var(--acc); border-color: var(--acc); }
.periodo-item.campos-pe { border-top: 1px solid var(--linha); margin-top: 4px;
  color: var(--tx2); font-size: 12px; }

/* ---------- impressão ---------- */
/* O PDF sai pela caixa de impressão do navegador, sem biblioteca nenhuma. Aqui o
   painel vira documento: some tudo que é controle, o que restou ocupa a página
   inteira, e o cabeçalho de papel entra com cliente e período, que na tela ficam
   no topo fixo e no PDF não iriam junto. */
.print-cab { display: none; }
@media print {
  @page { margin: 12mm 10mm; }
  html, body { background: #fff !important; }
  /* fundo de barra, chip e funil é dado, não enfeite: sem isso o funil imprime vazio */
  * { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }
  .casca { grid-template-columns: minmax(0, 1fr) !important; }
  .lateral, .lat-veu, .barra-filtro, .menu-btn, .topo .direita, .rodape,
  .sec-pdf, .sec-cab > svg, .sec-dica, .dica-veu, .periodo, .kpi-mais { display: none !important; }
  .conteudo { max-width: none !important; padding: 0 !important; }
  .topo { padding-top: 0; }
  .print-cab { display: block; margin-bottom: 14px; font-size: 11px; color: #555; }
  .print-cab b { color: #111; }
  /* seção não parte no meio, e card nenhum fica com título numa página e número na
     seguinte. O corte é entre blocos ou não é */
  .sec, .card, .kpi, .criativo, .quadro { break-inside: avoid; page-break-inside: avoid; }
  .sec { margin-top: 18px; }
  .sec-cab { padding: 0; }
  /* a tabela larga rola na tela, no papel não há pra onde rolar */
  .tabela-scroll { overflow: visible !important; }
  table { font-size: 10px; }
  /* imprimindo UMA seção: as outras saem da página, e o cabeçalho do painel fica */
  html[data-imprimir] .sec:not(.imprimir) { display: none !important; }
  /* a tabela por canal tem uma coluna por dia e não cabe em folha nenhuma. Em vez
     de deixar o navegador cortar em silêncio, os dias saem e fica o total, com uma
     linha dizendo o que ficou de fora */
  .cnl-dia { display: none !important; }
  .so-papel { display: block !important; font-size: 10px; color: #666;
    padding: 8px 18px 0; line-height: 1.45; }
}

/* cabeçalho do card com o seletor de colunas encostado à direita */
.card-cab { display: flex; align-items: center; gap: 12px; margin-bottom: 2px; }
.card-cab h3 { margin: 0; }
.card-cab .col-sel { margin-left: auto; }
.cab-fim { display: flex; align-items: center; gap: 8px; margin-left: auto; }
.cab-fim .col-sel { margin-left: 0; }
.busca { display: flex; align-items: center; gap: 6px; padding: 0 10px;
  border: 1px solid var(--linha); border-radius: 8px; background: var(--card2); }
.busca span { color: var(--tx3); font-size: 14px; }
.busca input { border: 0; background: none; outline: none; padding: 7px 0;
  font: inherit; font-size: 12.5px; color: var(--tx); width: 150px; }
.busca input::placeholder { color: var(--tx3); }
.busca:focus-within { border-color: var(--acc); }
.btn-calor { display: flex; align-items: center; gap: 6px; cursor: pointer;
  padding: 7px 11px; border: 1px solid var(--linha); border-radius: 8px;
  background: var(--card2); font: inherit; font-size: 12.5px; font-weight: 600; color: var(--tx2); }
.btn-calor:hover { color: var(--tx); }
.btn-calor.on { border-color: var(--acc); color: var(--tx); }
@media print { .busca, .btn-calor { display: none !important; } }
.card-cab .periodo-botao { height: 30px; padding: 0 10px; font-size: 12px; }
.col-sel .periodo-menu { right: 0; left: auto; }
@media (max-width: 560px) {
  .card-cab { flex-wrap: wrap; }
  .card-cab .col-sel { margin-left: 0; }
}

/* ---------- por canal ---------- */
.cnl-card { padding: 0; overflow: hidden; }
/* um canal por bloco, e o respiro entre eles é o que separa a leitura: colados,
   a última linha de um vira a primeira do seguinte */
.cnl-card + .cnl-card { margin-top: 22px; }
/* o cabeçalho agora tem duas linhas: nome e selo em cima, legenda ocupando a faixa
   inteira embaixo */
.cnl-cab { display: flex; align-items: center; gap: 10px; padding: 13px 18px;
  border-bottom: 1px solid; background: var(--card2); flex-wrap: wrap; }
.cnl-sobre { flex-basis: 100%; font-size: 12px; color: var(--tx3); line-height: 1.5;
  max-width: 90ch; }
.cnl-nome { font-size: 13px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; }
.cnl-tag { font-size: 10.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: var(--tx3); border: 1px solid var(--linha); border-radius: 999px; padding: 2px 8px; }
.cnl-rec { font-size: 12.5px; color: var(--tx2); line-height: 1.55; padding: 12px 18px 0; }
.cnl-rec b { color: var(--tx); }
.cnl-card .tabela-scroll { padding: 12px 18px 18px; }
.cnl-tab { font-size: 12.5px; }
/* a coluna de métrica fica parada enquanto os dias rolam: sem isso, três dias pra
   direita e a pessoa não sabe mais qual linha está lendo */
.cnl-tab th[scope="row"] { position: sticky; left: 0; z-index: 2; background: var(--card);
  text-align: left; white-space: nowrap; font-weight: 600; color: var(--tx2); }
/* o cabeçalho tinha o mesmo peso das métricas embaixo e a tabela virava um bloco
   cinza só: agora ele é a linha mais forte da tabela, com fundo e traço embaixo */
.cnl-tab thead th { white-space: nowrap; font-size: 11px; font-weight: 800 !important;
  color: var(--tx) !important; letter-spacing: .04em; background: var(--card2);
  border-bottom: 2px solid var(--linha); padding-top: 9px; padding-bottom: 9px; }
.cnl-tab thead th:first-child { text-transform: uppercase; font-size: 10px; letter-spacing: .1em; }
.cnl-tab td { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.cnl-tab .cnl-tot { font-weight: 800; color: var(--tx);
  border-left: 1px solid var(--linha); background: var(--zebra); }
.cnl-tab .cnl-fraca td { color: var(--tx3); }
.cnl-tab .cnl-verde td { color: var(--verde); font-weight: 700; }
.cnl-tab .cnl-verde td.cnl-tot { color: var(--verde); }
/* faixa que separa a régua declarada da medida no site. É a divisão que dá sentido
   à tela, então ela precisa pesar mais que um rótulo de linha: fundo próprio, texto
   na cor cheia e um traço de acento na esquerda pra marcar onde o bloco começa */
.cnl-faixa th { position: sticky; left: 0; background: var(--card2) !important;
  font-size: 11.5px !important; font-weight: 800 !important; letter-spacing: .09em;
  text-transform: uppercase; color: var(--tx) !important;
  padding: 11px 12px 11px 14px !important; border-left: 3px solid var(--acc);
  border-top: 1px solid var(--linha); border-bottom: 1px solid var(--linha); }
.cnl-faixa.fechada th { color: var(--tx2) !important; border-left-color: var(--tx3); }
/* ponto no lugar do ROAS do dia sem verba suficiente: marca que existiu movimento
   ali, sem estampar um número que não significa nada */
.cnl-tab tr th[scope="row"] .tem-dica { border-bottom: 1px dotted var(--tx3); cursor: help; }

/* só existe no papel: na tela essa linha seria ruído */
.so-papel { display: none; }

/* faixa de régua como botão de recolher */
.cnl-topo { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 8px; }
.cnl-topo .periodo { margin-left: auto; }
.cnl-faixa th { cursor: pointer; }
.cnl-faixa th > svg { width: 12px; height: 12px; margin-right: 7px; vertical-align: -1px;
  transition: transform .15s ease; }
.cnl-faixa.fechada th > svg { transform: rotate(-90deg); }
.cnl-faixa th:hover { color: var(--tx) !important; }
.cnl-faixa th > i { font-style: normal; margin-left: 10px; font-weight: 600;
  letter-spacing: 0; text-transform: none; opacity: .7; }

/* ---------- retorno por plataforma, dia a dia ---------- */
.rp-quadros { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 12px; margin-top: 12px; }
.rp-quadro { background: var(--card2); border: 1px solid var(--linha); border-radius: 12px;
  padding: 12px 14px 10px; }
.rp-cab { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
.rp-nome { font-size: 12px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; }
.rp-resumo { margin-left: auto; font-size: 11.5px; color: var(--tx3); white-space: nowrap; }
.rp-eixos { display: flex; gap: 8px; }
/* os dois rótulos ocupam exatamente a altura das duas faixas, então cada um fica
   encostado na faixa que nomeia, sem precisar de linha guia */
.rp-rot { display: flex; flex-direction: column; flex: none; width: 74px; }
.rp-rot span { font-size: 8px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  color: var(--tx3); display: flex; align-items: flex-end; }
.rp-rot span:first-child { height: 92px; padding-bottom: 1px; }
.rp-rot span:last-child { height: 34px; padding-bottom: 2px; }
.rp-plot { flex: 1; min-width: 0; display: flex; align-items: stretch; gap: 2px; }
.rp-col { flex: 1; min-width: 0; display: flex; flex-direction: column; cursor: help; }
/* faixa de cima: faturamento. Barra fina, ponta arredondada, ancorada no chão */
/* o espaço de cima é do rótulo do pico: sem ele a barra mais alta empurra o número
   pra fora da faixa e ele cai em cima do cabeçalho do quadro */
.rp-fat { height: 92px; padding-top: 15px; box-sizing: border-box;
  display: flex; align-items: flex-end; }
.rp-fat i { width: 100%; border-radius: 3px 3px 0 0; display: block; position: relative; }
.rp-pico { position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%);
  font-size: 10px; font-weight: 800; color: var(--tx2); white-space: nowrap; margin-bottom: 3px; }
/* faixa de baixo: vendas. Mesma cor, mais apagada, pra ler como coadjuvante */
.rp-cv { height: 34px; display: flex; align-items: flex-end;
  border-top: 1px solid var(--linha); padding-top: 3px; }
.rp-cv i { width: 100%; border-radius: 2px 2px 0 0; display: block; }
.rp-col:hover .rp-fat i, .rp-col:hover .rp-cv i { filter: brightness(1.25); }
.rp-dias { display: flex; justify-content: space-between; padding-left: 82px; margin-top: 5px;
  font-size: 10px; color: var(--tx3); }

/* alça de arrasto e alvo do solte */
.cnl-cab[draggable] { cursor: grab; user-select: none; }
.cnl-cab[draggable]:active { cursor: grabbing; }
.cnl-pega { color: var(--tx3); font-size: 15px; line-height: 1; letter-spacing: -2px; }
.cnl-cab:hover .cnl-pega { color: var(--tx); }
.cnl-card.arrastando { opacity: .45; }
.cnl-card.alvo-solte { outline: 2px dashed var(--acc); outline-offset: 2px; }

/* bloco Geral: é a leitura do negócio inteiro, então ele se destaca dos canais.
   Sem color-mix de propósito: o painel abre em navegador de cliente, e cair pra
   "sem fundo" num navegador antigo é pior que uma borda explícita */
.cnl-geral { border-color: var(--acc); }
.cnl-geral .cnl-cab { border-left: 4px solid var(--acc); padding-left: 14px; }
.cnl-geral .cnl-tag { border-color: var(--acc); color: var(--tx2); }
/* alternador diária/mensal: era o mesmo cinza de tudo em volta e sumia. Agora tem
   moldura própria, e o selecionado usa a cor do cliente */
.cnl-modo { flex: none; background: var(--card2); border: 1px solid var(--linha);
  border-radius: 10px; padding: 3px; gap: 2px; }
.cnl-modo .sub-aba { font-size: 12.5px; font-weight: 700; padding: 7px 14px;
  border-radius: 8px; color: var(--tx2); }
.cnl-modo .sub-aba:hover { color: var(--tx); }
.cnl-modo .sub-aba.sel { background: var(--acc); color: var(--sobre-acc); }

/* nome do conjunto com a campanha dona embaixo, em texto de apoio */
.cel-sub { display: block; font-size: 11px; color: var(--tx3); margin-top: 2px;
  max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ---------- foco: um item de cada vez ---------- */
.cel-foco { background: none; border: 0; padding: 0; font: inherit; color: inherit;
  text-align: left; cursor: pointer; text-decoration: underline;
  text-decoration-color: var(--linha); text-underline-offset: 3px; }
.cel-foco:hover { color: var(--acc); text-decoration-color: var(--acc); }
.an-nome-t.cel-foco { display: block; max-width: 230px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }
.foco { border: 1px solid var(--cf, var(--acc)); border-left: 4px solid var(--cf, var(--acc));
  border-radius: 12px; padding: 14px 16px 16px; background: var(--card); }
.foco.carregando { opacity: .7; }
.foco-cab { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.foco-cab b { font-size: 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  max-width: 60%; }
.foco-nivel { font-size: 10.5px; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  color: var(--cf, var(--acc)); border: 1px solid var(--linha); border-radius: 6px; padding: 2px 7px; }
.foco-x { margin-left: auto; background: var(--card2); border: 1px solid var(--linha);
  border-radius: 8px; padding: 6px 11px; font: inherit; font-size: 12px; font-weight: 700;
  color: var(--tx2); cursor: pointer; }
.foco-x:hover { color: var(--tx); border-color: var(--acc); }
.foco-viz { margin-top: 14px; }
.foco-viz-t { font-size: 11.5px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  color: var(--tx3); margin-bottom: 6px; }
.foco-viz-t span { color: var(--cf, var(--acc)); }
.foco-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.foco-chip { background: var(--card2); border: 1px solid var(--linha); border-radius: 999px;
  padding: 5px 11px; font: inherit; font-size: 11.5px; color: var(--tx2); cursor: pointer;
  max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.foco-chip:hover { color: var(--tx); border-color: var(--acc); }
@media print { .foco-x, .cel-foco { text-decoration: none; } }
.foco-faixa { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px;
  padding: 9px 13px; border: 1px solid var(--linha); border-left: 4px solid var(--acc);
  border-radius: 10px; background: var(--card); }
.foco-faixa b { font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  max-width: 40%; }
.foco-faixa .desc { margin: 0; }
/* o filtro por item vive fora da barra, então precisa de um lembrete NA barra:
   é o único lugar que está visível em qualquer rolagem da página */
.bf-limpar.bf-foco { border-color: var(--acc); color: var(--tx); max-width: 260px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.an-nome .an-link { font-size: 11px; margin-top: 3px; }
.an-nome .an-link.sem { color: var(--tx3); font-weight: 500; }

/* ---------- comparação de itens ---------- */
.cx-sel { width: 17px; height: 17px; flex: 0 0 17px; margin-right: 9px; padding: 0;
  border: 1.5px solid var(--linha); border-radius: 5px; background: var(--card2);
  color: var(--sobre-acc); font-size: 11px; font-weight: 800; line-height: 1;
  cursor: pointer; vertical-align: middle; }
.cx-sel:hover:not(:disabled) { border-color: var(--acc); }
.cx-sel.on { background: var(--acc); border-color: var(--acc); }
.cx-sel:disabled { opacity: .35; cursor: not-allowed; }
tr.sel-linha > td { background: var(--zebra); box-shadow: inset 3px 0 0 var(--acc); }
.cmp-cor { display: inline-block; width: 10px; height: 10px; border-radius: 3px;
  margin-right: 8px; vertical-align: middle; }
.cmp-x { background: none; border: 0; padding: 0 0 0 8px; color: var(--tx3);
  font: inherit; font-size: 11px; cursor: pointer; }
.cmp-x:hover { color: var(--verm); }
@media print { .cx-sel, .cmp-x { display: none !important; } }
/* a caixinha fica fora do fluxo do nome, senão ela empurra o texto e o corta */
/* tabela de corte: o valor não é nome de campanha, é rótulo curto ("Feed", "25-34"),
   então não precisa dos 220px mínimos que a coluna de nome reserva */
.tab-corte .cel-nome { min-width: 130px; max-width: 240px; }
.tab-corte tfoot td { border-top: 1px solid var(--linha); font-weight: 700;
  color: var(--tx2); background: var(--card2); }
.cel-nome { display: flex; align-items: flex-start; gap: 0; }
.cel-nome .cx-sel { margin-top: 1px; }
.cel-nome > div { min-width: 0; }
/* a pílula dentro da célula da tabela é menor que a dos cartões e nunca quebra a
   linha: ela acompanha o número, não concorre com ele */
td .pill { margin-left: 6px; font-size: 9.5px; padding: 1px 4px; vertical-align: 1px; }
td .pill.nova { color: var(--tx3); background: var(--card2); font-weight: 700; }
@media print { td .pill { font-size: 9px; } }

/* linha da grade do mês reprovada na validação. Escopado em `.grade-mes`, que só
   existe no /admin: 0 ocorrências em cliente.js */
.grade-mes tr.linha-erro input { border-color: var(--verm); }
.grade-mes tr.linha-erro input:focus { outline: 2px solid var(--verm); outline-offset: 1px; }

/* erro fica na tela até ser fechado; sucesso continua sumindo sozinho. Antes os
   dois tinham a mesma cara e 2,6s de vida, e quem olhava pro teclado perdia a
   única pista de que a operação falhou */
#toast.erro { background: var(--verm); color: #fff; }
#toast .toast-x {
  background: none; border: 0; color: inherit; cursor: pointer; font-size: 13px;
  padding: 0 2px; margin-left: 8px; opacity: .85; font-family: inherit;
}
#toast .toast-x:hover { opacity: 1; }
/* enquanto o detalhe troca de cliente: some o clarão sem mexer no layout */
#detalhe.carregando { opacity: .45; pointer-events: none; transition: opacity .12s; }
/* o item clicado diz "abrindo…" ate a resposta chegar. Pseudo-elemento pra nao
   mexer no HTML que o renderLista monta */
.lista-clientes .item.abrindo .info { visibility: hidden; }
.lista-clientes .item.abrindo { position: relative; }
.lista-clientes .item.abrindo::after {
  content: "abrindo…"; position: absolute; left: 14px; bottom: 13px;
  font-size: 11.5px; color: var(--acc); font-weight: 600;
}
