/* ==========================================================================
   app.css — extensões do design system original para:
   modal de contato, toasts, autenticação e painel administrativo.
   Usa exclusivamente as variáveis definidas em site.css (:root).
   ========================================================================== */

/* ---------- Menu mobile (.nav__links abaixo de 1024px — ver breakpoint
   do hambúrguer em site.css): cabeçalho "Menu"/fechar e ícones por item —
   escondidos acima de 1024px pra não aparecer em cima da linha única da
   pílula no desktop (ver .nav__links em site.css). Entrar/Sair/Cadastre-se
   não moram mais aqui dentro — ver .nav__top-link em site.css, sempre na
   linha de cima, nos dois tamanhos de tela. */
.nav__links-head, .nav__link-icon{display:none;}
@media(max-width:1024px){
  .nav__links-head{
    display:flex; align-items:center; justify-content:space-between;
    margin-bottom:12px; padding-bottom:14px; border-bottom:1px solid rgba(255,255,255,0.12);
  }
  .nav__links-head h3{font-family:var(--serif); font-size:20px; font-weight:700; color:#fff; margin:0;}
  .nav__links-close{
    display:flex; align-items:center; justify-content:center; width:32px; height:32px;
    background:none; border:none; color:#fff; cursor:pointer; border-radius:7px; transition:background .15s ease;
  }
  .nav__links-close:hover{background:rgba(255,255,255,0.1);}
  .nav__links-close .icon{width:18px; height:18px;}
  .nav__link-icon{display:inline-flex; width:16px; height:16px; flex-shrink:0; margin-right:2px;}
  .nav__links a{display:flex; align-items:center; gap:10px;}
}

/* ---------- Nav back-link (páginas de artigo) ---------- */
.nav-back-link{
  display:inline-flex; align-items:center; gap:8px; color:var(--gray-300); text-decoration:none;
  font-size:13.5px; font-weight:500; padding:9px 12px; border-radius:7px; transition:all .15s ease;
}
.nav-back-link:hover{color:#fff; background:rgba(255,255,255,0.08);}

/* ---------- Article hero (reaproveitado das páginas originais) ---------- */
.article-tag{display:inline-block; font-family:var(--mono); font-size:11px; letter-spacing:0.08em; text-transform:uppercase; background:rgba(255,255,255,0.1); border:1px solid rgba(255,255,255,0.18); padding:5px 11px; border-radius:99px; margin-bottom:14px;}
.article-hero h1{font-size:clamp(24px,3.2vw,34px); color:#fff; font-weight:600; line-height:1.2; letter-spacing:-0.02em;}
.article-hero__meta{color:var(--gray-300); font-size:13px; margin-top:10px;}

/* ---------- Toasts ---------- */
.toast-stack{
  position:fixed; right:20px; bottom:20px; z-index:999; display:flex; flex-direction:column; gap:10px;
  max-width:min(360px, calc(100vw - 40px));
}
.toast{
  background:var(--navy-950); color:#fff; border-radius:10px; padding:14px 16px; box-shadow:var(--shadow-lg);
  display:flex; align-items:flex-start; gap:10px; font-size:13.5px; line-height:1.45;
  border-left:3px solid var(--navy-700);
  opacity:0; transform:translateY(8px) scale(.98);
  animation:toast-in .22s ease forwards;
}
.toast--success{border-left-color:#6fbf73;}
.toast--error{border-left-color:#d16a6a;}
.toast.toast--leaving{animation:toast-out .18s ease forwards;}
@keyframes toast-in{to{opacity:1; transform:translateY(0) scale(1);}}
@keyframes toast-out{to{opacity:0; transform:translateY(6px) scale(.98);}}
.toast__icon{flex-shrink:0; width:18px; height:18px; margin-top:1px;}
.toast__body{flex:1;}
.toast__title{font-weight:600; margin-bottom:2px;}
.toast__close{background:none; border:none; color:var(--gray-300); cursor:pointer; padding:0; line-height:1;}

/* ---------- Modal (contato) ---------- */
.modal-overlay{
  position:fixed; inset:0; background:rgba(15,23,42,0.55); backdrop-filter:blur(2px);
  display:flex; align-items:center; justify-content:center; padding:20px; z-index:500;
  opacity:0; transition:opacity .18s ease;
}
.modal-overlay.is-open{opacity:1;}
.modal-overlay[hidden]{display:none;}
.modal{
  background:var(--white); border-radius:14px; box-shadow:var(--shadow-lg); width:100%; max-width:520px;
  max-height:90vh; overflow-y:auto; padding:28px 26px 24px; position:relative;
  transform:translateY(10px) scale(.97); opacity:0; transition:transform .2s ease, opacity .2s ease;
}
.modal-overlay.is-open .modal{transform:translateY(0) scale(1); opacity:1;}
.modal--wide{max-width:720px;}
.modal__close{
  position:absolute; top:14px; right:14px; background:var(--gray-100); border:none; border-radius:8px;
  width:32px; height:32px; display:flex; align-items:center; justify-content:center; cursor:pointer;
  color:var(--gray-700);
}
.modal__close:hover{background:var(--gray-200);}
.modal__head{margin-bottom:18px; padding-right:30px;}
.modal__title{font-size:20px; margin:10px 0 4px;}
.modal__subtitle{color:var(--gray-700); font-size:13.5px;}
.modal__actions{display:flex; justify-content:flex-end; gap:10px; margin-top:6px;}

/* ---------- Modal TAX PRO (descrição + preço, aberto pelos CTAs "Quero ser TAX PRO" e pelos cards "Por que escolher TAXEDU?") ---------- */
.taxpro-modal__features{list-style:none; margin:0 0 20px; padding:0; display:flex; flex-direction:column; gap:14px;}
.taxpro-modal__features li{display:flex; align-items:flex-start; gap:12px;}
.taxpro-modal__features .icon{width:20px; height:20px; color:var(--blue-600); flex-shrink:0; margin-top:2px;}
.taxpro-modal__features strong{display:block; font-size:14px; color:var(--navy-900); margin-bottom:2px;}
.taxpro-modal__features span{display:block; font-size:12.8px; color:var(--gray-700); line-height:1.5;}
.taxpro-modal__pricing{display:flex; gap:10px; margin-bottom:20px;}
.taxpro-modal__price-card{
  flex:1; position:relative; text-align:center; padding:16px 12px; border-radius:12px;
  background:var(--gray-50); border:1px solid var(--gray-200);
}
.taxpro-modal__price-card--highlight{background:var(--blue-50); border-color:var(--blue-100);}
.taxpro-modal__price-badge{
  position:absolute; top:-10px; left:50%; transform:translateX(-50%); white-space:nowrap;
  background:var(--blue-600); color:#fff; font-size:10.5px; font-weight:700; padding:3px 10px; border-radius:99px;
}
.taxpro-modal__price-value{display:block; font-family:var(--serif); font-size:24px; font-weight:700; color:var(--navy-900);}
.taxpro-modal__price-period{display:block; font-size:12px; color:var(--gray-500); margin-top:2px;}
.btn--dark{color:#fff; }
.btn--dark.btn--primary{background:var(--navy-900); color:#fff;}
.btn--dark.btn--primary:hover{background:var(--navy-800);}
.btn--dark.btn--ghost{background:var(--gray-100); color:var(--navy-900); border-color:var(--gray-200);}
.btn--dark.btn--ghost:hover{background:var(--gray-200);}
.btn[disabled]{opacity:.6; cursor:not-allowed;}
.btn__spinner{width:14px; height:14px; border-radius:50%; border:2px solid rgba(255,255,255,0.4); border-top-color:#fff; display:inline-block; animation:spin .6s linear infinite;}
.btn__spinner[hidden]{display:none;}
@keyframes spin{to{transform:rotate(360deg);}}

/* ---------- Visualizador de PDF em tela cheia (material de apoio dos cursos) ---------- */
.pdf-viewer-overlay{
  position:fixed; inset:0; background:rgba(15,23,42,0.85); z-index:600;
  display:flex; flex-direction:column;
}
.pdf-viewer-overlay[hidden]{display:none;}
.pdf-viewer{display:flex; flex-direction:column; height:100%;}
.pdf-viewer__toolbar{
  display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap;
  background:var(--navy-950); color:#fff; padding:10px 16px; flex-shrink:0;
}
.pdf-viewer__title{font-size:13.5px; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:40vw;}
.pdf-viewer__controls{display:flex; align-items:center; gap:6px; flex-wrap:wrap;}
.pdf-viewer__btn{
  background:rgba(255,255,255,0.08); border:none; color:#fff; border-radius:7px; padding:7px 10px;
  font-size:13px; cursor:pointer; display:flex; align-items:center; gap:6px; font-family:var(--sans);
  text-decoration:none; transition:background .15s ease;
}
.pdf-viewer__btn:hover{background:rgba(255,255,255,0.18);}
.pdf-viewer__btn:disabled{opacity:0.35; cursor:default; pointer-events:none;}
.pdf-viewer__btn--download{background:var(--blue-600);}
.pdf-viewer__btn--download:hover{background:var(--blue-500);}
.pdf-viewer__btn--close{font-size:18px; line-height:1; padding:6px 11px;}
.pdf-viewer__page{font-size:12.5px; color:var(--gray-300); font-family:var(--mono); white-space:nowrap; padding:0 2px;}
.pdf-viewer__body{flex:1; overflow:auto; display:flex; justify-content:center; padding:24px;}
.pdf-viewer__body canvas{background:#fff; box-shadow:0 6px 24px rgba(0,0,0,0.4); flex-shrink:0;}
@media(max-width:640px){
  .pdf-viewer__title{max-width:100%; flex-basis:100%;}
  .pdf-viewer__toolbar{padding:8px 10px;}
  .pdf-viewer__body{padding:10px;}
}

/* honeypot: fora da viewport, invisível a humanos, presente a bots */
.hp-field{position:absolute; left:-9999px; top:-9999px; opacity:0;}

/* ---------- Forms (compartilhado: contato, login, painel) ---------- */
.form-row{margin-bottom:16px;}
.form-row--grid{display:grid; grid-template-columns:1fr 1fr; gap:14px;}
.form-label{display:block; font-size:12.5px; font-weight:600; color:var(--gray-800); margin-bottom:6px;}
.form-label__optional{font-weight:400; color:var(--gray-500);}
.form-input{
  width:100%; border:1px solid var(--gray-300); border-radius:8px; padding:10px 12px; font-size:14px;
  font-family:var(--sans); color:var(--gray-900); background:var(--white); transition:border-color .15s ease, box-shadow .15s ease;
}
.form-input:focus{outline:none; border-color:var(--navy-700); box-shadow:0 0 0 3px rgba(15,23,42,0.12);}
.form-textarea{resize:vertical; min-height:90px;}
.form-error{color:#b3413f; font-size:13px; background:#fdecec; border:1px solid #f3c8c6; padding:9px 12px; border-radius:8px; margin-bottom:14px;}
.form-hint{font-size:12px; color:var(--gray-500); margin-top:6px;}

@media(max-width:560px){
  .form-row--grid{grid-template-columns:minmax(0,1fr);}
}

/* Painel de filtros de /questoes-de-concurso — múltiplos campos
   combináveis (materia/tema/banca/ano/origem/busca), no espírito do
   filtro de banco de questões do QConcursos, mas sem replicar campos que
   o catálogo não tem (disciplina, modalidade, nível...). */
.qrt-filtros{
  background:var(--gray-50); border:1px solid var(--gray-200); border-radius:14px;
  padding:20px 22px; margin-bottom:28px;
}
/* Filtrar troca o resultado por fetch, sem recarregar a página (ver
   qrt-filtros-ajax.js) — este fade é o único feedback visual de que algo
   está acontecendo entre o clique e a troca. */
#qbFiltrosArea{transition:opacity .15s ease;}
.qrt-filtros--carregando{opacity:0.5; pointer-events:none;}
.qrt-filtros__grid{
  /* minmax(0, 1fr) e não só "1fr": uma faixa "1fr" pura tem mínimo
     implícito "auto" (o min-content do próprio conteúdo), então o grid
     para de distribuir o espaço nas frações declaradas assim que a soma
     dos mínimos já enche o container — em tela larga, isso prendia cada
     coluna no tamanho do seu próprio conteúdo (Matéria larga, Origem
     espremida a ~48px, cortando a seleção) em vez de dividir 1.4:1:1:1:1:1:1
     de verdade. minmax(0, 1fr) zera esse piso e devolve o fr pra fração. */
  display:grid; grid-template-columns:minmax(0,1.4fr) repeat(6, minmax(0,1fr)); gap:14px 16px; margin-bottom:16px;
}
.qrt-filtros__campo{display:flex; flex-direction:column; gap:6px;}
.qrt-filtros__campo span{font-size:12px; font-weight:600; color:var(--gray-600); text-transform:uppercase; letter-spacing:0.02em;}
.qrt-filtros__actions{display:flex; gap:10px; align-items:center;}
/* Chips dos filtros ativos — cada um remove só o seu próprio filtro (é um
   link pro mesmo GET sem aquele parâmetro, não um botão com JS), igual ao
   "Limpar filtros" ao lado mas granular. */
.qrt-filtros__chips{display:flex; gap:8px; flex-wrap:wrap; margin-top:14px;}
.qrt-chip{
  display:inline-flex; align-items:center; gap:6px; font-size:12.5px; font-weight:600;
  color:var(--blue-600); background:var(--blue-50); border:1px solid var(--blue-100);
  padding:5px 10px; border-radius:99px; text-decoration:none; transition:background .12s ease;
}
.qrt-chip:hover{background:var(--blue-100);}
.qrt-chip .icon{width:11px; height:11px;}

/* ---------- Dropdown de múltipla seleção com busca (Matéria/Tema/Banca/
   Ano/Dificuldade do catálogo de questões) — checkboxes reais, o JS só
   cuida de abrir/fechar, filtrar a lista e enviar o form ao fechar com
   mudança (ver qrt-multiselect.js). */
.qrt-multiselect{position:relative;}
.qrt-multiselect__trigger{
  display:flex; align-items:center; justify-content:space-between; gap:8px;
  width:100%; text-align:left; cursor:pointer; background:var(--white); font-family:var(--sans);
}
.qrt-multiselect__chevron{transition:transform .15s ease; flex-shrink:0; color:var(--gray-500);}
.qrt-multiselect__trigger[aria-expanded="true"] .qrt-multiselect__chevron{transform:rotate(180deg);}
.qrt-multiselect__label{overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.qrt-multiselect__panel{
  position:absolute; top:calc(100% + 6px); left:0; min-width:260px; max-width:340px; z-index:160;
  background:var(--white); border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:0 12px 32px rgba(15,23,42,0.18); padding:10px; display:flex; flex-direction:column; gap:8px;
}
.qrt-multiselect__panel[hidden]{display:none;}
.qrt-multiselect__busca{display:flex; align-items:center; gap:8px; border:1px solid var(--line); border-radius:8px; padding:7px 10px;}
.qrt-multiselect__busca .icon{color:var(--gray-500); flex-shrink:0;}
.qrt-multiselect__busca input{border:none; outline:none; font-size:13.5px; width:100%; font-family:var(--sans);}
.qrt-multiselect__lista{max-height:260px; overflow-y:auto; display:flex; flex-direction:column; gap:1px;}
.qrt-multiselect__opcao{
  display:flex; align-items:center; gap:8px; padding:7px 8px; border-radius:7px; cursor:pointer;
  font-size:13.5px; color:var(--navy-900);
}
.qrt-multiselect__opcao:hover{background:var(--gray-100);}
.qrt-multiselect__opcao input{accent-color:var(--blue-600); width:15px; height:15px; flex-shrink:0;}
.qrt-multiselect__opcao[hidden]{display:none;}

@media(max-width:860px){
  .qrt-filtros__grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);}
  .qrt-filtros__campo--busca{grid-column:1 / -1;}
}
@media(max-width:560px){
  .qrt-multiselect__panel{left:0; right:0; max-width:none;}
}
@media(max-width:560px){
  .qrt-filtros__grid{grid-template-columns:minmax(0,1fr);}
}

/* ---------- Barra de resultados + promo + cards de questão
   (/questoes-de-concurso) — cada questão aparece INTEIRA na listagem
   (enunciado + alternativas + gabarito), não um card curto que linka pra
   outro lugar; ver questoes_catalogo.html sobre por quê (inspirado no
   banco de questões do QConcursos). A página de detalhe por questão
   continua existindo, sem mudança — é o permalink (ícone de link no
   cabeçalho do card) que mantém o SEO de 1.185 páginas indexáveis. */
.qrt-resultados-bar{
  display:flex; align-items:center; justify-content:space-between;
  font-size:13.5px; color:var(--gray-500); margin-bottom:16px;
}

.qb-promo{
  display:flex; align-items:center; justify-content:space-between; gap:18px; flex-wrap:wrap;
  background:var(--navy-950); color:#fff; border-radius:14px; padding:20px 24px; margin-bottom:24px;
}
.qb-promo strong{font-size:15px;}
.qb-promo p{margin:4px 0 0; font-size:13.5px; color:var(--gray-300);}
.qb-promo .btn{flex-shrink:0;}

.qb-list{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:18px;}
.qb-card{
  background:var(--white); border:1px solid var(--gray-200); border-radius:14px;
  padding:22px 24px; scroll-margin-top:84px;
}
.qb-card__head{display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:8px;}
.qb-card__num{
  display:inline-flex; align-items:center; justify-content:center; width:26px; height:26px;
  border-radius:50%; background:var(--navy-950); color:#fff; font-size:12px; font-weight:700; flex-shrink:0;
}
.qb-card__permalink{
  font-family:var(--mono); font-size:12px; color:var(--gray-500); text-decoration:none;
  display:inline-flex; align-items:center; gap:4px;
}
.qb-card__permalink:hover{color:var(--blue-600);}
.qb-card__dificuldade{
  font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.03em;
  padding:3px 9px; border-radius:99px; margin-left:auto;
}
.qb-card__dificuldade--facil{background:#DCFCE7; color:#166534;}
.qb-card__dificuldade--medio{background:#FEF9C3; color:#854D0E;}
.qb-card__dificuldade--dificil{background:#FFE4D5; color:#9A3412;}
.qb-card__dificuldade--muito_dificil{background:#FEE2E2; color:#991B1B;}
.qb-card__tags{font-size:12.5px; margin:0 0 4px;}
.qb-card__tags a{color:var(--blue-600); text-decoration:none; font-weight:600;}
.qb-card__tags a:hover{text-decoration:underline;}
.qb-card__meta{font-size:12.5px; color:var(--gray-500); margin:0 0 14px;}
.qb-card__meta a{color:var(--blue-600); text-decoration:none; font-weight:600;}
.qb-card__meta a:hover{text-decoration:underline;}
.qb-card__enunciado{font-size:15px; line-height:1.7; color:var(--navy-900); margin:0 0 16px;}
.qb-card__alts{list-style:none; margin:0 0 16px; padding:0; display:flex; flex-direction:column; gap:8px;}
.qb-card__alt{display:flex; align-items:flex-start; gap:10px; font-size:14.5px; line-height:1.6; color:var(--gray-700); border-radius:10px; padding:4px 6px; transition:background .12s ease;}
.qb-card__alt-letra{
  flex-shrink:0; width:24px; height:24px; border-radius:50%; border:1.5px solid var(--gray-300);
  display:inline-flex; align-items:center; justify-content:center; font-size:12px; font-weight:700; color:var(--gray-600);
}
/* Alternativas clicáveis: tanto a lista do Teste de Nivelamento (loga e
   responde de verdade) quanto qualquer outra pra quem não tem conta
   (clicar manda pro modal de login) -- ver questoes-publicas-responder.js.
   Só vira "cursor:default" depois de respondida de verdade. */
.qb-card__alts[data-selecionavel]:not(.is-respondida) .qb-card__alt{cursor:pointer;}
.qb-card__alts[data-selecionavel]:not(.is-respondida) .qb-card__alt:hover{background:var(--gray-100);}
.qb-card__alt.is-selecionada{background:var(--blue-50);}
.qb-card__alt.is-selecionada .qb-card__alt-letra{background:var(--blue-600); border-color:var(--blue-600); color:#fff;}
.qb-card__alt.is-correta{background:#F0FDF4;}
.qb-card__alt.is-correta .qb-card__alt-letra{background:#DCFCE7; border-color:#16A34A; color:#166534;}
.qb-card__alt.is-correta{color:var(--navy-900); font-weight:600;}
.qb-card__alt.is-escolhida-errada{background:#FEF2F2;}
.qb-card__alt.is-escolhida-errada .qb-card__alt-letra{background:#FEE2E2; border-color:#DC2626; color:#991B1B;}
/* Clicou em Responder sem escolher alternativa -- um tremor rápido no
   botão, sem precisar de toast/alert pra um caso tão leve. */
.qb-card__responder--aviso{animation:qb-aviso-tremor .4s ease;}
@keyframes qb-aviso-tremor{
  0%, 100%{transform:translateX(0);}
  25%{transform:translateX(-4px);}
  75%{transform:translateX(4px);}
}
.qb-card__actions{display:flex; align-items:center; gap:10px; flex-wrap:wrap;}
.qb-card__teste-tag{
  display:inline-flex; align-items:center; gap:6px; font-size:13px; font-weight:600; color:var(--blue-600);
}
.qb-card__resultado{
  font-size:14px; line-height:1.7; color:var(--gray-700); background:var(--gray-50);
  border-radius:10px; padding:16px 18px; margin-top:14px;
}
.qb-card__resultado p{margin:0 0 10px;}
.qb-card__resultado p:last-child{margin-bottom:0;}
@media(max-width:560px){
  .qb-card{padding:18px 16px;}
  .qb-promo{flex-direction:column; align-items:flex-start;}
}

/* ---------- Tema escuro da aba "Questões" em /questoes-de-concurso ----------
   Mesmo mecanismo das outras abas do Banco de Questões (ver studies-panel.css,
   bloco "Tema escuro da aba Questões"): tudo isto vive dentro do mesmo
   .sp-content.is-questoes que Cadernos e Banco completo, então precisa do
   mesmo tratamento — senão o catálogo público (pensado pra fundo claro)
   sobra como um retângulo branco entre as outras duas abas, já escuras. */
.sp-content.is-questoes .qrt-filtros{background:rgba(255,255,255,0.04); border-color:rgba(255,255,255,0.1);}
.sp-content.is-questoes .qrt-filtros__campo span{color:rgba(255,255,255,0.5);}
.sp-content.is-questoes .qrt-multiselect__trigger{background:rgba(255,255,255,0.05); border-color:rgba(255,255,255,0.14); color:#fff;}
.sp-content.is-questoes .qrt-multiselect__chevron{color:rgba(255,255,255,0.5);}
.sp-content.is-questoes .qrt-multiselect__panel{background:var(--navy-900); border-color:rgba(255,255,255,0.14); box-shadow:0 12px 32px rgba(0,0,0,0.5);}
.sp-content.is-questoes .qrt-multiselect__busca{border-color:rgba(255,255,255,0.14);}
.sp-content.is-questoes .qrt-multiselect__busca input{background:transparent; color:#fff;}
.sp-content.is-questoes .qrt-multiselect__busca input::placeholder{color:rgba(255,255,255,0.4);}
.sp-content.is-questoes .qrt-multiselect__opcao{color:rgba(255,255,255,0.85);}
.sp-content.is-questoes .qrt-multiselect__opcao:hover{background:rgba(255,255,255,0.08);}
.sp-content.is-questoes .qrt-chip{background:rgba(59,130,246,0.16); border-color:rgba(59,130,246,0.3); color:#93C5FD;}
.sp-content.is-questoes .qrt-chip:hover{background:rgba(59,130,246,0.26);}
.sp-content.is-questoes .qrt-resultados-bar{color:rgba(255,255,255,0.6);}
.sp-content.is-questoes .qb-list .qb-card{background:rgba(255,255,255,0.04); border-color:rgba(255,255,255,0.1);}
.sp-content.is-questoes .qb-card__permalink{color:rgba(255,255,255,0.5);}
.sp-content.is-questoes .qb-card__permalink:hover{color:var(--blue-500);}
.sp-content.is-questoes .qb-card__meta{color:rgba(255,255,255,0.5);}
.sp-content.is-questoes .qb-card__enunciado{color:#fff;}
.sp-content.is-questoes .qb-card__alt{color:rgba(255,255,255,0.78);}
.sp-content.is-questoes .qb-card__alt-letra{border-color:rgba(255,255,255,0.25); color:rgba(255,255,255,0.7);}
.sp-content.is-questoes .qb-card__alts[data-selecionavel]:not(.is-respondida) .qb-card__alt:hover{background:rgba(255,255,255,0.06);}
.sp-content.is-questoes .qb-card__alt.is-selecionada{background:rgba(59,130,246,0.16);}
.sp-content.is-questoes .qb-card__alt.is-correta{background:rgba(16,185,129,0.18); color:#D1FAE5;}
.sp-content.is-questoes .qb-card__alt.is-correta .qb-card__alt-letra{background:#10B981; border-color:#10B981; color:#04241B;}
.sp-content.is-questoes .qb-card__alt.is-escolhida-errada{background:rgba(239,68,68,0.16);}
.sp-content.is-questoes .qb-card__alt.is-escolhida-errada .qb-card__alt-letra{background:#EF4444; border-color:#EF4444; color:#2B0707;}
.sp-content.is-questoes .qb-card__resultado{background:rgba(255,255,255,0.04); color:rgba(255,255,255,0.78);}
.sp-content.is-questoes .entity-placeholder{background:rgba(255,255,255,0.03); border-color:rgba(255,255,255,0.18); color:var(--gray-400);}
/* O resto da página pública (hero, CTAs fora da aba) continua claro de
   propósito: só o conteúdo DENTRO do seletor de abas vira escuro. */

/* ---------- Auth (login) ---------- */
.auth-wrap{
  min-height:calc(100vh - var(--nav-offset) - var(--nav-h) - 20px - 90px); display:flex; align-items:center; justify-content:center;
  background:linear-gradient(160deg, var(--navy-950) 0%, var(--navy-800) 75%, var(--navy-700) 140%);
  padding:48px 20px;
}
.auth-card{
  background:var(--white); border-radius:16px; box-shadow:var(--shadow-lg); width:100%; max-width:400px;
  padding:34px 30px;
}
.auth-card__title{font-size:22px; margin-bottom:6px;}
.auth-card__subtitle{color:var(--gray-700); font-size:13.5px; margin-bottom:24px;}
.auth-card .btn{width:100%; justify-content:center; margin-top:6px;}
/* Aviso de "voce escolheu o plano X", so para quem chega por /planos.

   Deliberadamente discreto: e contexto de compra, nao uma segunda vitrine.
   Usa o verde da marca numa faixa clara, a mesma familia do .auth-flash
   logo abaixo, para nao parecer um elemento estranho colado no card.

   O card do login tem 400px de largura maxima e some para 100% no celular;
   o nome e o preco ficam em linhas proprias, entao "Tax Pro Completo -
   R$ 89,90/mes" nunca precisa caber lado a lado numa tela de 390px. */
.auth-plano{
  display:block; margin:-10px 0 22px; padding:12px 14px; border-radius:11px;
  background:rgba(16,185,129,0.08); border:1px solid rgba(16,185,129,0.22);
}
.auth-plano__rotulo{
  display:block; font-size:11px; font-weight:700; letter-spacing:.08em;
  text-transform:uppercase; color:var(--blue-600); margin-bottom:3px;
}
.auth-plano__nome{display:block; font-size:16px; line-height:1.3; color:var(--navy-900);}
.auth-plano__preco{display:block; font-size:13px; color:var(--gray-700); margin-top:1px;}
.auth-flash{
  border-radius:8px; padding:10px 12px; font-size:13px; margin-bottom:18px;
}
.auth-flash--error{background:#fdecec; border:1px solid #f3c8c6; color:#b3413f;}
.auth-flash--info{background:var(--gray-50); border:1px solid var(--gray-200); color:var(--navy-800);}

.auth-avatar-picker{display:flex; flex-direction:column; align-items:center; gap:8px; margin-bottom:22px;}
.auth-avatar-picker__circle{position:relative; width:76px; height:76px;}
.auth-avatar-picker__preview{
  width:76px; height:76px; border-radius:50%; display:flex; align-items:center; justify-content:center;
  background:linear-gradient(135deg, var(--blue-500) 0%, var(--blue-600) 100%); font-size:24px; font-weight:700;
  color:#fff; letter-spacing:0.02em;
}
.auth-avatar-picker__btn{
  position:absolute; right:-2px; bottom:-2px; width:26px; height:26px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:var(--blue-500); color:var(--navy-950); border:2px solid var(--white); cursor:pointer; padding:0;
}
.auth-avatar-picker__btn:hover{background:var(--blue-600);}
.auth-avatar-picker__btn .icon{width:12px; height:12px;}
.auth-avatar-picker__hint{font-size:12px; color:var(--gray-500);}

/* ---------- Dashboard ---------- */
.dash-shell{background:var(--gray-50); min-height:calc(100vh - var(--nav-offset) - var(--nav-h) - 20px - 90px);}
/* .wrap herda 1180px do site público (--maxw em site.css), pensado pra
   leitura de texto — o painel administrativo é um dashboard, não página de
   leitura, e sobrava muito vazio dos dois lados em monitor largo. Escopado
   só aqui: nunca mexer em --maxw direto, usado em outras ~50 páginas. */
.dash-shell .wrap{max-width:1600px;}
.dash-header{padding:32px 0 20px;}
.dash-header__title{font-size:26px; margin-bottom:4px;}
.dash-header__subtitle{color:var(--gray-700); font-size:14px;}
.dash-stats{display:grid; grid-template-columns:repeat(4,1fr); gap:14px; margin:20px 0 28px;}
.dash-stats > *{min-width:0;}
.dash-stat{background:var(--white); border:1px solid var(--line); border-radius:12px; padding:16px 18px; box-shadow:var(--shadow-sm);}
.dash-stat__num{font-family:var(--serif); font-size:24px; color:var(--navy-900); font-weight:600;}
.dash-stat__label{font-size:12px; color:var(--gray-500); text-transform:uppercase; letter-spacing:0.04em; margin-top:2px;}
.dash-stat--warn .dash-stat__num{color:#b3752f;}
.dash-stat--danger .dash-stat__num{color:#b3413f;}

.dash-table-wrap{background:var(--white); border:1px solid var(--line); border-radius:12px; overflow-x:auto; overflow-y:hidden; box-shadow:var(--shadow-sm); margin-bottom:40px;}
.dash-table{width:100%; border-collapse:collapse;}
.dash-table th{
  text-align:left; font-size:11px; text-transform:uppercase; letter-spacing:0.05em; color:var(--gray-500);
  padding:12px 16px; border-bottom:1px solid var(--line); background:var(--gray-50); font-weight:600;
}
.dash-table td{padding:0; border-bottom:1px solid var(--gray-100); font-size:13.8px; vertical-align:middle;}
.dash-table tr:last-child td{border-bottom:none;}
/* .cp-td (tabelas com uma célula por coluna, ex.: Registro de Horas) precisa
   de mais especificidade que ".dash-table td" acima pra não perder o
   padding — sem isso o texto de colunas adjacentes fica colado. */
.dash-table td.cp-td{padding:12px 16px;}
.dash-row-link{
  display:flex; align-items:center; gap:12px; padding:13px 16px; text-decoration:none; color:inherit;
}
.dash-row-link:hover{background:var(--gray-50);}
.dash-row--unread .dash-row-link{font-weight:600;}
.dash-row--unread{background:rgba(15,23,42,0.03);}
.dash-col-flags{display:flex; gap:6px; flex-shrink:0;}
.dash-col-main{flex:1; min-width:0;}
.dash-col-email{color:var(--gray-700); font-size:12.5px; margin-top:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;}
.dash-col-subject{color:var(--navy-900); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;}
.dash-col-date{flex-shrink:0; font-family:var(--mono); font-size:11.5px; color:var(--gray-500); white-space:nowrap;}
.dash-col-actions{flex-shrink:0; display:flex; gap:6px;}

.badge{display:inline-flex; align-items:center; gap:4px; font-size:10.5px; font-weight:600; padding:3px 8px; border-radius:99px; letter-spacing:0.02em; white-space:nowrap;}
.badge--new{background:var(--gray-100); color:var(--navy-800);}
.badge--answered{background:#e4f3e5; color:#3f8a45;}
.badge--pending{background:var(--gray-100); color:var(--gray-700);}
.badge--late{background:#fdecec; color:#b3413f;}

.icon-btn{
  width:32px; height:32px; border-radius:8px; border:1px solid var(--gray-200); background:var(--white);
  display:flex; align-items:center; justify-content:center; cursor:pointer; color:var(--gray-700); flex-shrink:0;
}
.icon-btn:hover{background:var(--gray-100);}
.icon-btn--danger:hover{background:#fdecec; color:#b3413f; border-color:#f3c8c6;}
.icon-btn .icon{width:16px; height:16px;}

.dash-empty{padding:48px 20px; text-align:center; color:var(--gray-500); font-size:14px;}

.detail-card{background:var(--white); border:1px solid var(--line); border-radius:14px; box-shadow:var(--shadow-sm); padding:28px; margin-bottom:24px;}
.detail-grid{display:grid; grid-template-columns:repeat(2,1fr); gap:16px; margin:18px 0 22px;}
.detail-field__label{font-size:11px; text-transform:uppercase; letter-spacing:0.05em; color:var(--gray-500); margin-bottom:4px;}
.detail-field__value{font-size:14.5px; color:var(--navy-900);}
.detail-message{background:var(--gray-50); border:1px solid var(--gray-200); border-radius:10px; padding:16px 18px; font-size:14px; line-height:1.6; white-space:pre-wrap;}
.detail-actions{display:flex; gap:10px; flex-wrap:wrap; margin-top:20px;}
.back-link{display:inline-flex; align-items:center; gap:6px; color:var(--navy-800); text-decoration:none; font-size:13.5px; font-weight:600; margin-bottom:18px;}
.back-link:hover{color:var(--navy-900);}

/* ---------- Painel do gestor: usuários e acessos ---------- */
.badge--taxpro{background:linear-gradient(135deg, #F5D888 0%, #D4AF37 100%); color:#5c4610;}
.btn--sm{padding:7px 14px; font-size:12.5px;}

/* As abas do painel administrativo não cabiam numa linha de celular e
   empurravam a página inteira para o lado — eram a única causa de rolagem
   lateral em /painel/. `flex-wrap` deixa quebrar: numa tela estreita elas
   ocupam duas ou três linhas, todas visíveis, em vez de exigir arrasto. */
.dash-tabs{display:flex; flex-wrap:wrap; gap:6px; margin-bottom:16px;}
.dash-tab{
  font-size:13px; font-weight:600; color:var(--gray-600); text-decoration:none; padding:7px 14px;
  border-radius:99px; border:1px solid transparent;
}
.dash-tab:hover{background:var(--gray-100); color:var(--navy-900);}
.dash-tab.is-active{background:var(--navy-900); color:#fff;}

.dash-search{display:flex; gap:10px; align-items:stretch; margin-bottom:20px; flex-wrap:wrap;}
.dash-search .tema-search-wrap{flex:1; min-width:220px;}

.dash-user-avatar{
  flex-shrink:0; width:38px; height:38px; border-radius:50%; display:flex; align-items:center; justify-content:center;
  background:var(--navy-900); color:#fff; font-size:13px; font-weight:700;
}
.dash-user-avatar--lg{width:52px; height:52px; font-size:17px;}
.dash-user-name{display:block; font-size:14.5px; font-weight:600; color:var(--navy-900); overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.dash-user-email{display:block; font-size:12.5px; color:var(--gray-500); overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.dash-user-badges{display:flex; gap:6px; flex-shrink:0;}

.dash-access-row{display:flex; align-items:center; justify-content:space-between; gap:16px; flex-wrap:wrap;}
.dash-access-row__title{font-size:15px; font-weight:700; color:var(--navy-900);}
.dash-access-row__desc{font-size:13px; color:var(--gray-600); margin-top:3px; max-width:52ch; line-height:1.5;}

.dash-course-list{display:flex; flex-direction:column; gap:8px;}
.dash-course-item{
  display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap;
  border:1px solid var(--line); border-radius:10px; padding:12px 16px; background:var(--gray-50);
}
.dash-course-item.is-granted{background:#e8f3ea; border-color:#bfe0c7;}
.dash-course-item__info{min-width:0; flex:1;}
.dash-course-item__title{display:block; font-size:14px; font-weight:600; color:var(--navy-900);}
.dash-course-item__meta{display:block; font-size:11.5px; color:#3f8a45; margin-top:2px;}
.dash-course-item__meta--muted{color:var(--gray-500);}
.dash-course-item__form{display:flex; align-items:center; gap:8px; flex-shrink:0;}
.dash-course-item__nota{width:180px; padding:7px 10px; font-size:12.5px;}
@media(max-width:560px){
  .dash-course-item__nota{width:100%;}
  .dash-course-item__form{width:100%;}
}

/* confirm-delete panel (double validation, in-page, no browser alerts) */
.confirm-panel{
  border:1px solid #f3c8c6; background:#fff7f6; border-radius:12px; padding:18px 20px; margin-top:16px;
}
.confirm-panel__title{font-weight:600; color:#8f2f2d; margin-bottom:6px; font-size:14.5px;}
.confirm-panel__text{font-size:13.2px; color:var(--gray-700); margin-bottom:14px;}
.confirm-panel .form-input{max-width:280px;}
.confirm-panel__actions{display:flex; gap:10px; margin-top:14px;}

/* aprovar-notícia panel (mesmo mecanismo do confirm-panel acima, mas sem a
   conotação de perigo — é uma aprovação, não uma exclusão) */
.review-panel{
  border:1px solid var(--line); background:var(--gray-50); border-radius:12px; padding:18px 20px; margin-top:16px;
}
.review-panel__title{font-weight:600; color:var(--navy-900); margin-bottom:6px; font-size:14.5px;}
.review-panel__text{font-size:13.2px; color:var(--gray-700); margin-bottom:14px;}
.review-panel .form-input{max-width:480px;}
.review-panel__actions{display:flex; gap:10px; margin-top:14px;}

@media(max-width:780px){
  .dash-stats{grid-template-columns:repeat(2,1fr);}
  .detail-grid{grid-template-columns:minmax(0,1fr);}
}

.pagination{display:flex; gap:6px; justify-content:center; padding:18px 0 40px;}
.pagination a, .pagination span{
  min-width:34px; height:34px; display:flex; align-items:center; justify-content:center; border-radius:8px;
  font-size:13px; text-decoration:none; color:var(--navy-900); border:1px solid var(--line); background:var(--white);
}
.pagination a:hover{background:var(--gray-50);}
.pagination .is-current{background:var(--navy-900); color:#fff; border-color:var(--navy-900);}
.pagination .is-disabled{opacity:.4; pointer-events:none;}

/* ---------- Zona escura da home (hero → hub-grid → wce → stats-section) ----------
   Os hub-cards e os wce-cards já eram escuros (fotos + overlay navy);
   quem ficava claro era só o "chão" entre eles (fundo padrão da página,
   --gray-50), criando uma emenda visível contra os cantos arredondados
   escuros dos cards nas margens largas (>1400px, onde o padrão de fundo
   pontilhado do body aparece — ver body.page-bg-network mais abaixo).
   .home-hub-zone fecha essa emenda: mesmo navy-950 chapado do
   .hero-stack (que agora termina achatado, sem clarear) e do
   .stats-section logo depois, formando uma faixa escura contínua. */
.home-hub-zone{background:var(--navy-950); padding-top:8px;}

/* Catálogo de Cursos da home usa .section--alt (compartilhada com /guia
   e a página de nota fiscal) — escopado pelo id="cursos" pra não afetar
   as outras páginas. Mesmo navy-950 chapado do resto da faixa escura;
   texto solto (fora dos course-card, que já são brancos e
   auto-contidos) precisa virar claro, senão herda o --navy-900 padrão
   de h2/h3 e some. */
#cursos.section--alt{background-color:var(--navy-950); border-color:rgba(255,255,255,0.08);}
#cursos .courses-head h2{color:#fff;}
#cursos .section__desc{color:var(--gray-300);}
#cursos .course-track__head h3{color:#fff;}

/* ---------- /calculadora: zona escura da Nota Fiscal Explicada ----------
   O sócio apontou que o merge da Nota Fiscal Explicada pra dentro da
   calculadora não deixou nenhuma separação visual — a calculadora e a
   explicação eram as duas .section--alt (branca), então branco emendava
   com branco. #anatomia/#duvidas (a antiga página standalone) viram um
   bloco escuro próprio, mesmo navy-950 do resto do site, com os
   componentes que nasceram pra fundo claro (cst-structure-note, nf-legend,
   o accordion de FAQ .theme) ganhando uma variante translúcida aqui —
   escopada pelo id, igual o #cursos acima, pra não mudar esses
   componentes nas outras páginas que os usam sobre fundo branco. O
   nf-receipt (o "recibo modelo") fica como está: branco sobre o navy lê
   como papel de verdade, não precisa de variante escura. */
.section--notas-escuras{background:var(--navy-950); position:relative;}
.section--notas-escuras .section__eyebrow{color:#6EE7B7;}
.section--notas-escuras .section__title{color:#fff;}
.section--notas-escuras .section__desc{color:var(--gray-300);}
.section--notas-escuras .cst-structure-note{background:rgba(255,255,255,0.06); border-color:rgba(255,255,255,0.14);}
.section--notas-escuras .cst-structure-note .icon{color:#6EE7B7;}
.section--notas-escuras .cst-structure-note p{color:var(--gray-200);}
.section--notas-escuras .cst-structure-note a{color:#6EE7B7;}
.section--notas-escuras .nf-legend__body strong{color:#fff;}
.section--notas-escuras .nf-legend__body p{color:var(--gray-300);}
.section--notas-escuras .theme{background:rgba(255,255,255,0.05); border-color:rgba(255,255,255,0.14);}
.section--notas-escuras .theme[open]{border-color:rgba(110,231,183,0.45);}
.section--notas-escuras .theme__icon-wrap{background:rgba(255,255,255,0.1); color:#6EE7B7;}
.section--notas-escuras .theme__title{color:#fff;}
.section--notas-escuras .theme__tags{color:var(--gray-400);}
.section--notas-escuras .theme__chevron{color:var(--gray-400);}
.section--notas-escuras .theme[open] .theme__chevron{color:#6EE7B7;}
.section--notas-escuras .tutorial__content p{color:var(--gray-300);}

/* ---------- Hub (nova home em "/") ----------
   Vitrine premium: 1 card hero (Guia) + 2 linhas de 3 cards secundários,
   todos com a mesma linguagem visual (glass icon, categoria, overlay,
   CTA com seta) — o hero se destaca por escala/composição, não por um
   padrão visual diferente. */
.hub-grid{
  display:grid; grid-template-columns:repeat(3,1fr); gap:20px; padding:40px 0 70px;
}
.hub-card{
  position:relative; display:flex; flex-direction:column; justify-content:flex-end;
  min-height:250px; border-radius:22px; overflow:hidden; text-decoration:none; color:inherit;
  background-color:var(--navy-900); background-position:center;
  /* "cover" (não uma % fixa) de propósito: a razão de aspecto do card varia
     demais entre breakpoints pra confiar num único percentual — o card
     "featured" (Guia), por exemplo, é bem baixo/largo no desktop (3 colunas)
     e bem estreito/alto no mobile (1 coluna); um percentual calibrado pra um
     extremo deixa uma faixa sólida de background-color aparecer no outro
     (ver histórico: já tentamos width-based e depois height-based, ambos
     quebravam em algum breakpoint). "cover" sempre preenche o card inteiro
     nos dois eixos, não importa a proporção. */
  background-size:cover;
  box-shadow:0 8px 24px rgba(15,23,42,0.22);
  transition:transform .28s ease, box-shadow .28s ease;
  isolation:isolate;
}
.hub-card::before{
  content:""; position:absolute; inset:0; z-index:0;
  /* mais escuro do lado do texto (esquerda/baixo), leve teal do lado oposto (topo/direita) */
  background:
    radial-gradient(circle at 92% 4%, rgba(16,185,129,0.22), transparent 42%),
    linear-gradient(200deg, rgba(6,10,20,0.5) 0%, rgba(6,10,20,0.72) 45%, rgba(6,10,20,0.94) 100%);
}
.hub-card:hover{
  transform:translateY(-5px) scale(1.015); box-shadow:0 20px 40px rgba(16,185,129,0.16), 0 8px 20px rgba(15,23,42,0.3);
}
.hub-card__icon{
  position:relative; z-index:1; width:38px; height:38px; margin:20px 0 0 22px; border-radius:11px;
  background:rgba(255,255,255,0.1); border:1px solid rgba(255,255,255,0.22); color:#6EE7B7;
  display:flex; align-items:center; justify-content:center; flex-shrink:0;
  backdrop-filter:blur(6px); transition:border-color .2s ease, background .2s ease;
}
.hub-card__icon .icon{width:18px; height:18px;}
.hub-card:hover .hub-card__icon{background:rgba(16,185,129,0.22); border-color:rgba(110,231,183,0.5);}
.hub-card__body{position:relative; z-index:1; padding:16px 22px 22px;}
.hub-card__category{
  display:block; font-family:var(--mono); font-size:10.5px; font-weight:600; letter-spacing:0.07em;
  text-transform:uppercase; color:#6EE7B7; margin-bottom:6px;
}
.hub-card__title{font-size:17px; color:#fff; font-family:var(--sans); font-weight:600; line-height:1.3;}
.hub-card__desc{font-size:13px; color:var(--gray-300); line-height:1.55; margin-top:6px; max-width:42ch;}
.hub-card__cta{
  display:inline-flex; align-items:center; gap:6px; font-size:12.5px; font-weight:600; color:#fff;
  margin-top:14px; opacity:0.85; transition:opacity .2s ease, gap .2s ease;
}
.hub-card__cta .icon{width:13px; height:13px; color:#6EE7B7;}
.hub-card:hover .hub-card__cta{opacity:1; gap:9px;}
.hub-card--guia{background-image:url('/static/img/hub-card-guia-bg.webp');}
.hub-card--calculadora{background-image:url('/static/img/hub-card-calculadora-bg.webp');}
.hub-card--comparador{background-image:url('/static/img/hub-card-comparador-bg.webp');}
.hub-card--glossario{background-image:url('/static/img/hub-card-glossario-bg.webp');}
.hub-card--cst{background-image:url('/static/img/hub-card-cst-bg.webp');}
.hub-card--notas{background-image:url('/static/img/hub-card-notas-bg.webp');}
.hub-card--nf{background-image:url('/static/img/nf-card-bg.jpg');}
.hub-card--featured{
  grid-column:span 3; min-height:300px; background-position:center 30%;
}
.hub-card--featured .hub-card__body{padding:22px 34px 34px; max-width:640px;}
.hub-card--featured .hub-card__icon{width:44px; height:44px; margin:26px 0 0 28px;}
.hub-card--featured .hub-card__icon .icon{width:21px; height:21px;}
.hub-card--featured .hub-card__title{font-size:clamp(22px,2.6vw,28px);}
.hub-card--featured .hub-card__desc{font-size:14px; max-width:58ch;}
@media(max-width:900px){
  .hub-grid{grid-template-columns:1fr 1fr;}
  .hub-card--featured{grid-column:span 2;}
}
@media(max-width:640px){
  .hub-grid{grid-template-columns:minmax(0,1fr); gap:16px;}
  .hub-card--featured{grid-column:span 1;}
  .hub-card--featured .hub-card__body{padding:18px 22px 22px;}
}

/* ---------- Por Que Escolher TAXEDU (proposta de valor por público) ----------
   Três "portas de entrada" para o ecossistema (Estudantes/Profissionais/
   Advogados) — cards escuros premium (mesma linguagem do hero: navy +
   esmeralda + vidro fumê), foto no topo com fade pro corpo escuro do
   card, texto sempre à esquerda (nada centralizado). */
.wce{
  /* Mesmo navy-950 chapado de .home-hub-zone/.hero-stack/.stats-section —
     antes era claro (--gray-50), o que deixava os wce-card (já escuros)
     flutuando sobre uma ilha clara entre duas seções escuras. */
  padding:72px 0 80px;
  background:var(--navy-950);
}
/* Os .wce__* de cabecalho sairam junto com a marcacao: a secao de perfis
   passou a usar .secao__head, que e a escala unica da Home. */

.wce-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:28px;}

.wce-card{
  position:relative; display:flex; flex-direction:column; text-align:left; text-decoration:none;
  background:linear-gradient(145deg, rgba(30,41,59,0.9), rgba(51,65,85,0.55));
  border:1px solid rgba(255,255,255,0.12); border-radius:24px; overflow:hidden;
  box-shadow:0 20px 44px rgba(0,0,0,0.35);
  transition:transform .3s ease, box-shadow .3s ease, border-color .3s ease;
}
.wce-card::after{
  content:""; position:absolute; inset:0; pointer-events:none; z-index:0;
  background:radial-gradient(circle at 88% 8%, rgba(16,185,129,0.10), transparent 55%);
  transition:background .3s ease;
}
.wce-card:hover{transform:translateY(-5px); border-color:rgba(255,255,255,0.16); box-shadow:0 28px 56px rgba(15,23,42,0.22);}
.wce-card:hover::after{background:radial-gradient(circle at 88% 8%, rgba(16,185,129,0.16), transparent 58%);}
.wce-card--highlight{border-color:rgba(16,185,129,0.30);}
.wce-card--highlight:hover{border-color:rgba(16,185,129,0.45);}

.wce-card__num{
  position:absolute; top:20px; left:24px; z-index:2; font-family:var(--mono); font-size:13px; font-weight:600;
  color:rgba(255,255,255,0.45); text-shadow:0 1px 3px rgba(0,0,0,0.5);
}
.wce-card__tag{
  position:absolute; top:20px; right:24px; z-index:2; font-family:var(--mono); font-size:10px; font-weight:700;
  letter-spacing:0.08em; text-transform:uppercase; color:var(--navy-950); background:var(--blue-500);
  padding:4px 10px; border-radius:99px;
}

.wce-card__media{position:relative; height:230px; flex-shrink:0; overflow:hidden;}
.wce-card__media img{width:100%; height:100%; object-fit:cover; display:block; transition:transform .35s ease;}
.wce-card__media::after{
  content:""; position:absolute; inset:0;
  background:linear-gradient(to bottom, rgba(15,23,42,0) 45%, rgba(15,23,42,0.94) 100%);
}
.wce-card:hover .wce-card__media img{transform:translateY(-3px) scale(1.015);}

.wce-card__body{position:relative; z-index:1; padding:8px 28px 30px; display:flex; flex-direction:column; flex:1;}
.wce-card__category{font-size:12.5px; font-weight:600; letter-spacing:0.12em; text-transform:uppercase; color:var(--blue-500); margin-bottom:10px;}
.wce-card__title{font-size:clamp(22px,2.4vw,26px); font-weight:600; letter-spacing:-0.025em; line-height:1.15; color:#fff; margin-bottom:10px;}
.wce-card__desc{font-size:14.5px; line-height:1.6; color:var(--gray-300); margin-bottom:18px;}
.wce-card__divider{height:1px; width:70%; margin-bottom:18px; background:linear-gradient(90deg, rgba(16,185,129,0.4), rgba(255,255,255,0.05), transparent);}
.wce-card__benefits{list-style:none; margin:0 0 22px; padding:0; display:flex; flex-direction:column; gap:9px; flex:1;}
.wce-card__benefits li{position:relative; padding-left:16px; font-size:14px; color:rgba(255,255,255,0.82); line-height:1.4;}
.wce-card__benefits li::before{content:""; position:absolute; left:0; top:7px; width:5px; height:5px; border-radius:50%; background:var(--blue-500);}
.wce-card__cta{display:inline-flex; align-items:center; gap:6px; font-size:14.5px; font-weight:600; color:var(--gray-300); transition:color .22s ease;}
.wce-card__cta .icon{width:14px; height:14px; transition:transform .22s ease;}
.wce-card:hover .wce-card__cta{color:var(--blue-500);}
.wce-card:hover .wce-card__cta .icon{transform:translateX(4px);}
.wce-card:focus-visible{outline:2px solid var(--blue-500); outline-offset:3px;}

@media(max-width:980px){
  .wce-grid{grid-template-columns:1fr 1fr;}
  .wce-card:nth-child(3){grid-column:span 2;}
}
@media(max-width:640px){
  .wce{padding:52px 0 60px;}
  .wce-grid{grid-template-columns:1fr; gap:20px;}
  .wce-card:nth-child(3){grid-column:span 1;}
  .wce-card__media{height:190px;}
  .wce-card__body{padding:8px 22px 24px;}
  .wce-card__title{font-size:22px;}
}

/* ---------- Prévia dos painéis (telas reais, uma por persona) ----------
   Mesmo navy-950 chapado da zona escura contínua (ver comentário em
   .wce acima) — esta seção entra entre "Para quem é" e "Ferramentas",
   que já eram escuras, então não abre nem fecha emenda nenhuma. */
.paineis-secao{background:var(--navy-950);}

.painel-preview{
  display:flex; align-items:center; gap:clamp(32px, 5vw, 64px);
  padding:clamp(26px, 4vw, 40px) 0;
}
.painel-preview--reverse{flex-direction:row-reverse;}
.painel-preview + .painel-preview{border-top:1px solid rgba(255,255,255,0.08);}

.painel-preview__media{flex:1 1 56%; min-width:0;}
.painel-preview__copy{flex:1 1 38%; min-width:0;}

/* O "navegador" em volta do print é o que diz "isto é a plataforma de
   verdade, não uma ilustração" — sem ele, um recorte de tela solto
   parece só mais uma imagem decorativa entre as outras da página. */
.browser-frame{
  border-radius:16px; overflow:hidden; background:var(--navy-900);
  border:1px solid rgba(255,255,255,0.1);
  box-shadow:0 30px 60px rgba(0,0,0,0.45), 0 0 48px rgba(16,185,129,0.08);
}
.browser-frame__bar{
  display:flex; align-items:center; gap:6px; padding:11px 14px;
  background:rgba(255,255,255,0.04); border-bottom:1px solid rgba(255,255,255,0.08);
}
.browser-frame__dot{width:9px; height:9px; border-radius:50%; background:rgba(255,255,255,0.16); flex-shrink:0;}
.browser-frame__bar-url{
  margin-left:8px; font-family:var(--mono); font-size:11.5px; color:rgba(255,255,255,0.35);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.browser-frame img{display:block; width:100%; height:auto;}

.painel-preview__tag{
  display:block; font-family:var(--mono); font-size:11.5px; font-weight:700;
  letter-spacing:0.08em; text-transform:uppercase; color:var(--blue-300);
  margin-bottom:10px;
}
.painel-preview__copy h3{
  font-size:clamp(22px, 2.4vw, 28px); font-weight:600; letter-spacing:-0.02em;
  color:#fff; margin:0 0 12px;
}
.painel-preview__copy > p{font-size:15px; line-height:1.65; color:var(--gray-300); margin:0 0 20px; max-width:46ch;}
.painel-preview__list{list-style:none; margin:0 0 26px; padding:0; display:flex; flex-direction:column; gap:9px;}
.painel-preview__list li{position:relative; padding-left:18px; font-size:14px; line-height:1.4; color:rgba(255,255,255,0.82);}
.painel-preview__list li::before{
  content:""; position:absolute; left:0; top:7px; width:5px; height:5px; border-radius:50%; background:var(--blue-500);
}

@media(max-width:900px){
  .painel-preview, .painel-preview--reverse{flex-direction:column; align-items:stretch; gap:22px; padding:22px 0;}
  .painel-preview__media, .painel-preview__copy{flex:none;}
}

/* ---------- Stats section (ICMS/PIS/Cofins em números) ---------- */
.stats-section{background:var(--navy-950); padding:64px 0;}
.stats-section__inner{display:grid; grid-template-columns:1fr 1.1fr; gap:56px; align-items:center;}
.stats-section__map{display:flex; justify-content:center;}
.stats-section__map-img{width:100%; max-width:340px; height:auto;}
.stats-section__title{font-size:clamp(24px,3vw,32px); color:#fff; margin:16px 0 12px; line-height:1.2;}
.stats-section__title em{font-style:normal; color:var(--blue-500);}
.stats-section__desc{font-size:15px; line-height:1.6; color:var(--gray-300); max-width:52ch; margin-bottom:32px;}
.stats-grid{display:grid; grid-template-columns:1fr 1fr; gap:28px 40px; margin-bottom:20px;}
.stat-item{display:flex; flex-direction:column; gap:6px;}
.stat-item__num{font-family:var(--serif); font-weight:700; font-size:clamp(28px,3.4vw,38px); color:var(--blue-500); line-height:1;}
.stat-item__label{font-size:13.5px; color:var(--gray-300); line-height:1.5;}
.stat-item--wide{grid-column:1 / -1; border-top:1px solid rgba(255,255,255,0.12); padding-top:20px;}
.stats-section__source{font-size:12px; color:var(--gray-500);}
.stats-section__source a{color:var(--gray-300); text-decoration:underline;}
.stats-section__source a:hover{color:#fff;}
@media(max-width:860px){
  .stats-section__inner{grid-template-columns:minmax(0,1fr); gap:32px; text-align:center;}
  .stats-section__map-img{max-width:260px;}
  .stats-section__desc{margin-left:auto; margin-right:auto;}
  .stats-grid{text-align:left;}
}

/* ---------- Comparação internacional (mapa mundial + mapa do Brasil) ---------- */
.intl-map-section{margin-bottom:48px;}
.intl-map-section__head{text-align:center; margin-bottom:20px;}
.intl-map-section__head h2{display:inline-flex; align-items:center; gap:10px; font-size:20px; margin-bottom:6px;}
.intl-map-section__head h2 .icon{width:20px; height:20px; color:var(--blue-600);}
.intl-map-section__head p{font-size:13.5px; color:var(--gray-600);}

.br-map{width:100%; max-width:640px; height:auto; margin:0 auto; display:block; overflow:visible;}
.br-map-wrap{display:flex; justify-content:center; padding:8px 0 20px;}

/* ---------- Mapa no hero do hub (lado a lado com o texto, sem moldura) ---------- */
.hero__map{display:flex; justify-content:center; position:relative; z-index:2;}
.br-state{cursor:pointer; filter:drop-shadow(0 2px 4px rgba(15,23,42,.25)); transition:filter .18s ease;}
.br-state__wall{fill:var(--navy-800);}
.br-state__face{fill:url(#topFace); stroke:var(--line); stroke-width:0.8;}
.br-state__rim{fill:none; stroke:var(--navy-950); stroke-width:6;}
.br-state__lift{transition:transform .18s ease;}
.br-state:hover .br-state__lift,
.br-state:focus-visible .br-state__lift{transform:translateY(-6px);}
.br-state:hover,
.br-state:focus-visible{filter:drop-shadow(0 12px 18px rgba(15,23,42,.5));}
.br-state:focus-visible{outline:none;}
.br-state:focus-visible .br-state__face{stroke:var(--navy-700); stroke-width:2;}

/* ---------- Página de estado / país (placeholder) ---------- */
.entity-hero{display:flex; align-items:center; gap:20px; padding:44px 0 8px;}
.entity-hero__flag{width:96px; height:66px; object-fit:cover; border-radius:8px; border:1px solid rgba(255,255,255,0.25); box-shadow:var(--shadow-md);}
.entity-placeholder{
  background:var(--gray-50); border:1px dashed var(--gray-300); border-radius:14px; padding:40px 28px;
  text-align:center; color:var(--gray-500); font-size:14px; margin:28px 0;
}

/* ---------- Tools row (Agenda / Atualizações) ---------- */
.tools-row-section{padding-top:8px;}
.tools-row{display:grid; grid-template-columns:1fr 1fr; gap:20px; align-items:start;}
.tool-panel{background:var(--white); border:1px solid var(--line); border-radius:14px; padding:22px 22px 20px; box-shadow:var(--shadow-sm);}
.tool-panel h3{font-size:15.5px; color:var(--navy-900); display:flex; align-items:center; gap:8px; margin-bottom:16px; font-family:var(--sans); font-weight:700;}
.tool-panel h3 .icon{width:17px; height:17px; color:var(--blue-600); flex-shrink:0;}
.tool-panel__head{display:flex; align-items:center; justify-content:space-between; margin-bottom:16px; flex-wrap:wrap; gap:8px;}
.tool-panel__head h3{margin-bottom:0;}
.tool-panel__month{font-size:11.5px; font-weight:700; color:var(--gray-500); text-transform:uppercase; letter-spacing:0.04em; min-width:76px; text-align:center;}
.tool-panel__month-nav{display:flex; align-items:center; gap:6px;}
.tool-panel__month-btn{
  display:flex; align-items:center; justify-content:center; width:22px; height:22px; border-radius:6px; flex-shrink:0;
  background:var(--gray-100); border:1px solid var(--gray-200); color:var(--gray-700); text-decoration:none; transition:background .15s ease;
}
.tool-panel__month-btn:hover{background:var(--gray-200);}
.tool-panel__month-btn .icon{width:11px; height:11px;}
.tool-panel__month-btn--prev .icon{transform:scaleX(-1);}
.tool-panel__month-btn--disabled{opacity:0.35; pointer-events:none;}
.tool-panel--loading{opacity:0.5; transition:opacity .15s ease; pointer-events:none;}
.tool-panel__source{display:block; margin-top:14px; font-size:11px; color:var(--gray-500); text-decoration:none; border-top:1px solid var(--line); padding-top:12px;}
.tool-panel__source:hover{color:var(--blue-600);}
.tool-panel__source--static{border-top:none; padding-top:0; margin-top:10px; line-height:1.5;}
@media(max-width:980px){
  .tools-row{grid-template-columns:minmax(0,1fr);}
}

/* Agenda de Obrigações — mini calendário */
.mini-cal__weekdays{display:grid; grid-template-columns:repeat(7,1fr); gap:2px; margin-bottom:6px;}
.mini-cal__weekdays span{font-size:10.5px; color:var(--gray-500); text-align:center; font-weight:700;}
.mini-cal__week{display:grid; grid-template-columns:repeat(7,1fr); gap:2px; margin-bottom:2px;}
.mini-cal__day{
  display:flex; align-items:center; justify-content:center; aspect-ratio:1; border-radius:50%;
  font-size:12.5px; color:var(--gray-800); cursor:default;
}
.mini-cal__day--empty{visibility:hidden;}
.mini-cal__day--marked{background:var(--gray-100); font-weight:700; cursor:help;}
.mini-cal__day--today{background:var(--blue-500); color:#fff; font-weight:700;}
.mini-cal__day--concentrado{box-shadow:0 0 0 2px var(--blue-600); cursor:help;}
.mini-cal__legend{display:flex; gap:16px; margin-top:12px; font-size:11px; color:var(--gray-500); flex-wrap:wrap;}
.mini-cal__legend span{display:inline-flex; align-items:center; gap:5px;}
.mini-cal__dot{width:8px; height:8px; border-radius:50%; display:inline-block;}
.mini-cal__dot--today{background:var(--blue-500);}
.mini-cal__dot--marked{background:var(--gray-300);}
.mini-cal__dot--concentrado{background:transparent; box-shadow:0 0 0 2px var(--blue-600);}
.agenda-unavailable-note{
  font-size:12px; line-height:1.55; color:var(--gray-600); background:var(--gray-50); border:1px dashed var(--gray-200);
  border-radius:8px; padding:10px 12px; margin-top:12px;
}
.agenda-unavailable-note a{color:var(--blue-600); font-weight:600;}

/* Consulta Tributária por NCM (seção própria, full-width) — entra na
   mesma faixa escura contínua do topo da home (mesmo navy-950 de
   .home-hub-zone/.wce/.stats-section), não fica como ilha clara. */
.ncm-search-section{padding:80px 0; background-color:var(--navy-950);}
.ncm-search-section__content{max-width:1180px;}
.ncm-search-section__title{font-size:40px; margin-bottom:36px; text-align:center; color:#fff;}
.ncm-search-form{display:flex; gap:12px; max-width:900px; margin:0 auto; align-items:center;}
.ncm-input, .ncm-select{
  flex:1; padding:12px 16px; border:1px solid var(--gray-200); border-radius:9px;
  font:inherit; font-size:14px; color:var(--navy-900); background:var(--white);
  transition:border-color .2s ease, box-shadow .2s ease, background .2s ease;
}
.ncm-input::placeholder{color:var(--gray-400);}
.ncm-input:focus, .ncm-select:focus{
  outline:none; border-color:var(--blue-600); box-shadow:0 0 0 3px rgba(5,150,105,0.1); background:var(--gray-50);
}
.ncm-button{
  display:inline-flex; align-items:center; gap:6px; padding:12px 32px; background:var(--blue-600); color:#fff;
  border:none; border-radius:9px; font-weight:600; font-size:14px; cursor:pointer; white-space:nowrap;
  transition:background .2s ease, transform .2s ease, box-shadow .2s ease;
}
.ncm-button .icon{width:15px; height:15px;}
.ncm-button:hover{background:var(--blue-500); transform:translateY(-2px); box-shadow:0 4px 12px rgba(5,150,105,0.3);}
.ncm-search-section__note{font-size:12px; color:var(--gray-400); text-align:center; margin-top:20px;}
.ncm-search-section .ncm-result{
  max-width:900px; margin:24px auto 0; text-align:left;
  background:var(--white); border-radius:14px; padding:20px 22px; box-shadow:var(--shadow-md);
}
@media(max-width:768px){
  .ncm-search-section{padding:56px 0;}
  .ncm-search-section__title{font-size:28px; margin-bottom:24px;}
  .ncm-search-form{flex-direction:column; gap:8px;}
  .ncm-input, .ncm-select, .ncm-button{width:100%;}
  .ncm-button{padding:14px 24px; justify-content:center;}
}
.ncm-result{margin-top:18px; padding-top:16px; border-top:1px solid var(--line);}
.ncm-result__badge{display:inline-block; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.03em; padding:5px 11px; border-radius:99px; margin-bottom:10px;}
.ncm-result__badge--zero{background:var(--blue-100); color:var(--blue-600);}
.ncm-result__badge--reducao{background:var(--blue-50); color:var(--blue-600);}
.ncm-result__badge--seletivo{background:#fdecec; color:#b3413f;}
.ncm-result__badge--padrao{background:var(--gray-100); color:var(--gray-700);}
.ncm-result__produto{font-size:13.5px; font-weight:700; color:var(--navy-900); margin-bottom:4px;}
.ncm-result__explicacao{font-size:13px; color:var(--gray-700); line-height:1.55; margin-bottom:12px;}
.ncm-result__rates{display:flex; gap:24px; margin-bottom:10px; flex-wrap:wrap;}
.ncm-result__rates > div{display:flex; flex-direction:column; gap:2px;}
.ncm-result__rate-label{font-size:10.5px; color:var(--gray-500); text-transform:uppercase; letter-spacing:0.03em;}
.ncm-result__rates strong{font-size:19px; color:var(--navy-900); font-family:var(--serif);}
.ncm-result__note{font-size:12px; color:var(--gray-500); margin-bottom:8px;}
.ncm-result__base{font-size:11px; color:var(--gray-500);}

/* ---------------------------------------- Consulta Fiscal (NCM/NBS) */
/* Página dedicada /consulta-fiscal (Etapa 5 do simulador). Reaproveita
   .ncm-search-form/.ncm-input/.ncm-button (acima) pro campo de busca —
   só o resultado ganha classes próprias, porque o contrato é diferente
   do antigo .ncm-result__badge--*: nunca um "tratamento" escolhido com
   confiança, só status explícito (ver app/ncm_search.py).
   Cores pensadas pra fundo CLARO (como .ncm-result original): o corpo da
   página abaixo do .article-hero é --gray-50, igual cfop.html/glossario.html
   — não o navy-950 translúcido do antigo widget na home. */
.consulta-fiscal-wrap{max-width:900px; padding:44px 28px 80px;}
.consulta-fiscal-painel{
  background:var(--white); border:1px solid var(--gray-200);
  border-radius:18px; padding:clamp(22px, 2.5vw, 34px); box-shadow:var(--shadow-md);
}
.consulta-fiscal-nota{font-size:12.5px; color:var(--gray-500); margin-top:16px; line-height:1.6;}
.consulta-fiscal-result{margin-top:24px; padding-top:20px; border-top:1px solid var(--line);}
.consulta-fiscal-result__status{
  display:inline-block; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.04em;
  padding:5px 11px; border-radius:99px; margin-bottom:12px; background:var(--blue-50); color:var(--blue-600);
}
/* Única cor "de alerta" (vermelho) desta tela: reservada pro caso em que
   mais de uma hipótese de enquadramento existe e NENHUMA foi escolhida —
   o ponto onde o usuário tem mais risco de supor um resultado errado. */
.consulta-fiscal-result__status--atencao{background:#fdecec; color:#b3413f;}
.consulta-fiscal-result__status--vazio{background:var(--gray-100); color:var(--gray-600);}
.consulta-fiscal-result__aviso{
  font-size:13.5px; color:var(--gray-700); line-height:1.6; background:var(--gray-50);
  border:1px solid var(--gray-200); border-radius:10px; padding:12px 14px; margin-bottom:16px;
}
.consulta-fiscal-ficha{margin-bottom:18px;}
.consulta-fiscal-codigo{font-family:var(--mono); font-size:13px; color:var(--blue-600); margin-bottom:6px;}
/* A descrição oficial (Classif/Siscomex) é o "achado" da busca — tratada
   como manchete, não como mais uma linha de ficha técnica entre outras. */
.consulta-fiscal-titulo-oficial{
  font-family:var(--serif); font-size:22px; font-weight:600; color:var(--navy-900);
  line-height:1.3; margin-bottom:4px;
}
.consulta-fiscal-fonte-oficial{font-size:11px; color:var(--gray-500); text-transform:uppercase; letter-spacing:0.03em;}
.consulta-fiscal-tags{display:inline-flex; flex-wrap:wrap; gap:6px; vertical-align:middle;}
.consulta-fiscal-tag{
  display:inline-block; background:var(--blue-50); color:var(--blue-600);
  font-size:11px; font-weight:600; padding:2px 9px; border-radius:99px;
}
/* Percentual histórico em destaque — só aparece quando existe UMA
   hipótese sem conflito (ver consulta-fiscal.js::renderEstimativa).
   Âmbar (mesma paleta de .badge-live/.dash-stat--warn), não verde: isto
   nunca é uma confirmação, é um dado catalogado ainda sem revisão. */
.consulta-fiscal-estimativa{
  background:#fff6e6; border:1px solid #f3d9a4; border-radius:12px;
  padding:14px 16px; margin:16px 0;
}
.consulta-fiscal-estimativa__rotulo{
  font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.03em;
  color:#b3752f; margin-bottom:4px;
}
.consulta-fiscal-estimativa__valor{font-family:var(--serif); font-size:26px; font-weight:700; color:var(--navy-900); margin-bottom:6px;}
.consulta-fiscal-estimativa__efetiva{font-size:13px; font-weight:600; color:#8a5f26; margin-bottom:6px;}
.consulta-fiscal-estimativa__aviso{font-size:12.5px; color:#8a5f26; line-height:1.6;}
/* Alíquota cheia de referência (consulta-fiscal.js::renderAliquotaReferencia)
   — CBS e IBS em destaque lado a lado, com uma barra de proporção embaixo,
   em vez de só um texto corrido "CBS X% + IBS Y%". Cores emprestadas do
   resto do site (azul de link, verde de confirmação), não uma 3ª paleta. */
.consulta-fiscal-aliquota-grid{display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; margin-bottom:10px;}
.consulta-fiscal-aliquota-item{display:flex; flex-direction:column; align-items:flex-start;}
.consulta-fiscal-aliquota-item__valor{font-family:var(--serif); font-size:28px; font-weight:700; line-height:1.1;}
.consulta-fiscal-aliquota-item--cbs .consulta-fiscal-aliquota-item__valor{color:#2563EB;}
.consulta-fiscal-aliquota-item--ibs .consulta-fiscal-aliquota-item__valor{color:#059669;}
.consulta-fiscal-aliquota-item--total .consulta-fiscal-aliquota-item__valor{color:var(--navy-900);}
.consulta-fiscal-aliquota-item__rotulo{font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.03em; color:var(--gray-600);}
.consulta-fiscal-aliquota-operador{font-family:var(--serif); font-size:20px; font-weight:600; color:#c9a876; align-self:center;}
.consulta-fiscal-aliquota-bar{display:flex; height:8px; border-radius:99px; overflow:hidden; background:var(--gray-200); margin-bottom:10px;}
.consulta-fiscal-aliquota-bar__seg--cbs{background:#2563EB;}
.consulta-fiscal-aliquota-bar__seg--ibs{background:#059669;}
/* No mobile, "CBS + IBS = Total" não cabe numa linha só — sem isto o "="
   quebrava sozinho, longe do "30% TOTAL" que vem logo depois dele.
   flex-basis:100% no operador força ELE a abrir a 2ª linha, levando o
   item seguinte (Total) junto — truque padrão de "quebra controlada" em
   flex-wrap, sem precisar mudar a ordem do HTML. */
@media(max-width:560px){
  .consulta-fiscal-aliquota-operador:last-of-type{flex-basis:100%; margin-top:2px;}
}
.consulta-fiscal-hipotese{
  background:var(--gray-50); border:1px solid var(--gray-200);
  border-radius:12px; padding:14px 16px; margin-bottom:10px;
}
.consulta-fiscal-hipotese__titulo{font-size:13.5px; font-weight:700; color:var(--navy-900); margin-bottom:6px;}
.consulta-fiscal-hipotese__linha{font-size:12.5px; color:var(--gray-600); line-height:1.6; margin-bottom:2px;}
.consulta-fiscal-hipotese__linha strong{color:var(--gray-700);}
/* Estimativa calculada em cima da redução citada por ESTA hipótese
   (consulta-fiscal.js::renderEstimativaDaHipotese) — destaque âmbar, igual
   .consulta-fiscal-estimativa, porque continua sendo um número não
   confirmado, só que específico do item, não a alíquota cheia genérica. */
.consulta-fiscal-hipotese__estimativa{
  font-size:13px; color:#8a5f26; background:#fff6e6; border:1px solid #f3d9a4;
  border-radius:8px; padding:6px 10px; margin:8px 0;
}
.consulta-fiscal-aliquota{
  margin-top:14px; font-size:12.5px; color:var(--gray-600); line-height:1.6;
  background:var(--gray-50); border-radius:10px; padding:12px 14px;
}
.consulta-fiscal-aviso-catalogo{font-size:11.5px; color:var(--gray-500); margin-top:16px; line-height:1.6;}

/* Atualizações — notícias e legislação */
.tool-panel--news{display:flex; flex-direction:column;}
.news-tabs{display:flex; margin-bottom:14px; border-bottom:1px solid var(--line);}
.news-tab{
  background:none; border:none; font:inherit; font-size:13px; font-weight:700; color:var(--gray-500);
  padding:0 2px 10px; margin-right:18px; cursor:pointer; border-bottom:2px solid transparent;
}
.news-tab.active{color:var(--navy-900); border-bottom-color:var(--blue-500);}
.news-panel{display:none; flex-direction:column; gap:14px;}
.news-panel.active{display:flex;}
.news-item{display:flex; flex-direction:column; gap:3px; text-decoration:none; padding-bottom:12px; border-bottom:1px solid var(--gray-100);}
.news-item:last-child{border-bottom:none; padding-bottom:0;}
.news-item__tag{font-size:10.5px; font-weight:700; color:var(--blue-600); text-transform:uppercase; letter-spacing:0.03em;}
.news-item__title{font-size:13.5px; font-weight:700; color:var(--navy-900); line-height:1.4;}
.news-item:hover .news-item__title{color:var(--blue-600);}
.news-item__meta{font-size:11px; color:var(--gray-500);}
.news-more-link{
  display:flex; align-items:center; justify-content:center; gap:8px; margin-top:16px; padding:14px;
  border-radius:12px; border:1px dashed var(--line); background:var(--gray-50);
  font-size:13.5px; font-weight:700; color:var(--blue-600); text-decoration:none; transition:border-color .15s ease, background .15s ease;
}
.news-more-link:hover{border-color:var(--blue-500); background:var(--blue-50);}

/* ---------- Catálogo de Cursos ---------- */
.courses-head{margin-bottom:24px; max-width:70ch;}
.courses-head h2{display:flex; align-items:center; gap:10px; margin-bottom:8px; flex-wrap:wrap;}
.courses-more-link{
  display:flex; align-items:center; justify-content:center; gap:8px; margin-top:28px; padding:16px;
  border-radius:12px; border:1px dashed var(--line); background:var(--gray-50);
  font-size:13.5px; font-weight:700; color:var(--blue-600); text-decoration:none; transition:border-color .15s ease, background .15s ease;
}
.courses-more-link:hover{border-color:var(--blue-500); background:var(--blue-50);}
.courses-more-link .icon{width:13px; height:13px;}

/* ---------- Ferramentas práticas (fim do /guia) ---------- */
.tools-more-link{
  display:flex; align-items:center; justify-content:center; gap:8px; margin-top:20px; padding:14px;
  border-radius:12px; border:1px dashed var(--line); background:var(--gray-50);
  font-size:13.5px; font-weight:700; color:var(--blue-600); text-decoration:none; transition:border-color .15s ease, background .15s ease;
}
.tools-more-link:hover{border-color:var(--blue-500); background:var(--blue-50);}
.tools-more-link .icon{width:13px; height:13px;}
.badge-soon{font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.03em; color:var(--blue-600); background:var(--blue-50); border:1px solid var(--blue-100); padding:4px 10px; border-radius:99px; vertical-align:middle;}
.course-tabs{display:flex; flex-wrap:wrap; margin-bottom:24px; border-bottom:1px solid var(--line); padding-bottom:0;}
.course-tab{background:none; border:none; font:inherit; font-size:13.5px; font-weight:700; color:var(--gray-500); padding:8px 4px 12px; margin-right:20px; cursor:pointer; border-bottom:2px solid transparent;}
.course-tab.active{color:var(--navy-900); border-bottom-color:var(--blue-500);}
.course-grid{display:grid; grid-template-columns:repeat(4,1fr); gap:20px;}
.course-card{background:var(--white); border:1px solid var(--line); border-radius:14px; overflow:hidden; box-shadow:var(--shadow-sm); transition:transform .15s ease, box-shadow .15s ease;}
.course-card:hover{transform:translateY(-3px); box-shadow:var(--shadow-md);}
.course-card__cover{
  position:relative; height:110px; display:flex; align-items:center; justify-content:center;
  background:linear-gradient(135deg, var(--navy-900) 0%, var(--navy-700) 100%);
}
.course-card__cover .icon{width:34px; height:34px; color:var(--blue-500);}
/* A capa virou <img> para poder ser preguiçosa (background-image nao pode).
   object-fit:cover faz o mesmo enquadramento que background-size:cover fazia.

   O z-index e obrigatorio, nao decorativo: o ::before do degrade e o primeiro
   filho da caixa, entao SEM z-index a imagem (que vem depois na marcacao)
   pintaria por cima dele e o escurecimento sumiria. Camadas, de baixo para
   cima: imagem 0, degrade 1, selos 2. */
.course-card__cover-img{
  position:absolute; inset:0; width:100%; height:100%; object-fit:cover;
  display:block; z-index:0;
}
.course-card__badge{position:absolute; top:10px; right:10px; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:0.03em; color:#fff; background:rgba(16,185,129,0.85); padding:3px 8px; border-radius:99px;}
.course-card__body{padding:16px 18px 18px;}
.course-card__trilha{
  display:flex; align-items:center; gap:5px; font-size:11px; font-weight:700; text-transform:uppercase;
  letter-spacing:0.03em; color:var(--blue-600); margin-bottom:6px;
}
.course-card__trilha .icon{width:12px; height:12px;}
.course-card--locked .course-card__trilha{color:var(--gray-500);}
.course-card__title{font-size:14.5px; line-height:1.35; color:var(--navy-900); margin-bottom:6px; min-height:38px; font-family:var(--sans); font-weight:700;}
.course-card__instrutor{font-size:12px; color:var(--gray-500); margin-bottom:8px;}
.course-card__price{display:flex; align-items:baseline; gap:8px; margin-bottom:14px;}
.course-card__price strong{font-size:16.5px; color:var(--navy-900);}
.course-card__price s{font-size:12px; color:var(--gray-500);}
.course-card__cta{display:block; text-align:center; width:100%; font-size:13px; padding:9px 0;}

.badge-live{color:#b3752f; background:#fff6e6; border-color:#f3d9a4;}

/* ---------- Trilhas de cursos (níveis sequenciais, tipo grade de faculdade) ---------- */
.course-track{margin-bottom:36px;}
.course-track:last-child{margin-bottom:0;}
.course-track__head{display:flex; align-items:center; gap:10px; margin-bottom:14px;}
.course-track__head .icon{width:20px; height:20px; color:var(--blue-600);}
.course-track__head h3{font-size:15.5px; font-weight:700; color:var(--navy-900);}
.course-grid--track{grid-template-columns:repeat(4,1fr);}
.course-grid--teaser{grid-template-columns:repeat(2,1fr); max-width:620px;}

.course-card__level{
  position:absolute; top:10px; left:10px; font-family:var(--mono); font-size:10px; font-weight:700;
  color:#fff; background:rgba(15,23,42,0.55); padding:3px 8px; border-radius:99px; z-index:2;
}
.course-card--live{border-color:#f3d9a4; box-shadow:0 0 0 1px rgba(179,117,47,0.08), var(--shadow-sm);}
.course-card--live .course-card__cover{position:relative;}
.course-card--live .course-card__cover::before{content:""; position:absolute; inset:0; z-index:1; background:linear-gradient(180deg, rgba(4,20,15,0.05) 0%, rgba(4,20,15,0.55) 100%);}
.course-card__badge--live{background:#b3752f; position:relative; z-index:2;}

.course-card--locked{opacity:0.85;}
.course-card--locked .course-card__cover{
  position:relative; filter:grayscale(85%);
}
.course-card--locked .course-card__cover::before{content:""; position:absolute; inset:0; z-index:1; background:rgba(15,23,42,0.5);}
.course-card__lock-icon{
  position:relative; z-index:2; width:36px; height:36px; border-radius:50%; display:flex; align-items:center;
  justify-content:center; background:rgba(255,255,255,0.15); border:1px solid rgba(255,255,255,0.35);
}
.course-card__lock-icon .icon{width:16px; height:16px; color:#fff;}
.course-card--locked .course-card__title{color:var(--gray-500);}
.course-card__locked-hint{font-size:12px; color:var(--gray-500); line-height:1.5; margin-bottom:14px; min-height:36px;}
.course-card__cta--disabled{opacity:0.55; cursor:not-allowed; pointer-events:none;}

/* ---------- Catálogo de cursos: filtros combináveis (/cursos) ---------- */
.catalog-filters{display:flex; flex-wrap:wrap; gap:10px; margin-bottom:10px;}
.catalog-filters__search{flex:2 1 260px; margin:0;}
.catalog-filters__select{flex:1 1 170px; width:auto; min-width:0; cursor:pointer;}
.catalog-filters__count{font-size:12.5px; color:var(--gray-500); margin-bottom:20px;}
.catalog-filters__empty{
  text-align:center; color:var(--gray-500); font-size:14px; padding:48px 20px;
  border:1px dashed var(--gray-300); border-radius:12px; margin-bottom:20px;
}
.course-card--catalog-hidden{display:none !important;}
.course-grid--catalog{grid-template-columns:repeat(4,1fr); margin-bottom:8px;}

@media(max-width:980px){
  .course-grid{grid-template-columns:repeat(2,1fr);}
  .course-grid--track{grid-template-columns:repeat(2,1fr);}
  .course-grid--catalog{grid-template-columns:repeat(2,1fr);}
}
@media(max-width:600px){
  .course-grid{grid-template-columns:minmax(0,1fr);}
  .course-grid--catalog{grid-template-columns:minmax(0,1fr);}
  .catalog-filters{flex-direction:column;}
  .catalog-filters__search, .catalog-filters__select{flex:1 1 auto; width:100%;}
}

/* ---------- Card de propaganda: Panorama da Empresa (usado em hub.html,
   logo abaixo do catálogo de cursos, e em /minha-area) ---------- */
.up-upsell{
  position:relative; overflow:hidden; border-radius:16px; padding:26px 28px 24px; color:#fff;
  background:linear-gradient(150deg, var(--navy-950) 0%, var(--navy-800) 70%, var(--blue-600) 190%);
}
.up-upsell::before{
  content:""; position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(circle at 90% 0%, rgba(16,185,129,0.28) 0%, rgba(16,185,129,0) 55%);
}
.up-upsell--panorama{
  background-image:url('/static/img/panorama-empresa-bg.webp');
  background-size:cover; background-position:center;
}
.up-upsell--panorama::before{
  background:
    linear-gradient(90deg, rgba(15,23,42,0.96) 0%, rgba(15,23,42,0.88) 38%, rgba(15,23,42,0.6) 68%, rgba(15,23,42,0.35) 100%),
    radial-gradient(circle at 90% 0%, rgba(16,185,129,0.28) 0%, rgba(16,185,129,0) 55%);
}
.up-upsell > *{position:relative; z-index:1;}
.up-upsell__badge{
  display:inline-block; font-family:var(--mono); font-size:10.5px; letter-spacing:0.06em; text-transform:uppercase;
  color:var(--navy-950); background:var(--blue-500); padding:4px 10px; border-radius:99px; margin-bottom:14px; font-weight:700;
}
.up-upsell__title{font-family:var(--serif); font-size:22px; margin-bottom:8px; color:#fff;}
.up-upsell__desc{font-size:14px; line-height:1.65; color:var(--gray-200); max-width:56ch; margin-bottom:16px;}
.up-upsell__price{display:flex; align-items:baseline; gap:8px; margin-bottom:16px;}
.up-upsell__price-value{font-family:var(--serif); font-size:30px; font-weight:700; color:var(--blue-500);}
.up-upsell__price-note{font-size:12.5px; color:var(--gray-300);}
.up-upsell__disclaimer{
  display:flex; align-items:flex-start; gap:8px; font-size:12.5px; line-height:1.6; color:var(--gray-300);
  background:rgba(255,255,255,0.06); border:1px solid rgba(255,255,255,0.14); border-radius:10px;
  padding:12px 14px; margin-bottom:18px; max-width:64ch;
}
.up-upsell__disclaimer .icon{color:var(--blue-500); flex-shrink:0; margin-top:2px;}
.up-upsell__disclaimer strong{color:#fff;}

/* ---------- Página /planos: grade de planos ---------- */
.pricing-hero{background:linear-gradient(165deg, #060C1A 0%, var(--navy-950) 55%); padding:64px 0 48px; overflow:hidden;}
.pricing-hero__inner{
  max-width:1180px; margin:0 auto; display:grid; grid-template-columns:1.15fr 1fr; gap:32px; align-items:center;
}
.pricing-hero__kicker{
  display:inline-flex; align-items:center; gap:8px; font-family:var(--mono); font-size:11.5px;
  letter-spacing:0.09em; text-transform:uppercase; color:var(--gray-200);
  background:rgba(255,255,255,0.08); border:1px solid rgba(255,255,255,0.15);
  padding:6px 12px; border-radius:99px; margin-bottom:18px;
}
.pricing-hero h1{font-size:clamp(28px,4vw,42px); font-weight:600; color:#fff; line-height:1.15; letter-spacing:-0.02em; margin-bottom:14px;}
.pricing-hero__desc{font-size:15.5px; color:var(--gray-200); line-height:1.6; max-width:52ch;}
.pricing-hero__art{display:flex; justify-content:center;}
.pricing-hero__art img{
  display:block; width:min(100%, 380px); height:auto;
  filter:drop-shadow(0 20px 40px rgba(0,0,0,0.5)) drop-shadow(0 0 27px rgba(16,185,129,0.19));
}
@media(max-width:860px){
  .pricing-hero__inner{grid-template-columns:1fr; text-align:center;}
  .pricing-hero__desc{margin-left:auto; margin-right:auto;}
  .pricing-hero__art{display:none;}
}

/* Envolve cards + tabela comparativa + Panorama + nota final num único
   fundo escuro contínuo com o hero, em vez de "flutuarem" sobre o
   fundo claro padrão do site (ver body em site.css). */
.pricing-page-dark{background:var(--navy-950); padding-bottom:8px;}

.pricing-grid{
  display:grid; grid-template-columns:repeat(4, 1fr); gap:20px; align-items:stretch;
  max-width:1180px; margin:-28px auto 0; padding:0 24px;
}
@media(max-width:980px){.pricing-grid{grid-template-columns:repeat(2, 1fr);}}
@media(max-width:640px){.pricing-grid{grid-template-columns:1fr;}}

.pricing-card{
  position:relative; display:flex; flex-direction:column;
  background:linear-gradient(160deg, #0A1120 0%, var(--navy-950) 55%, #0C1F1A 100%);
  border:1px solid rgba(255,255,255,0.08);
  border-radius:20px; padding:28px 24px 24px; box-shadow:0 10px 28px rgba(2,6,16,0.4);
}
.pricing-card > *{position:relative; z-index:1;}
/* O halo/faixa de luz precisam de overflow:hidden pra não vazar quadrado
   pra fora do border-radius arredondado — mas isso não pode valer pro
   card inteiro, senão o selo "Mais completo" (que flutua cruzando a
   borda de propósito, tipo o card de referência) fica cortado ao meio.
   Por isso o clip vive só num wrapper interno, não no .pricing-card.
   (Esta regra vem DEPOIS de ".pricing-card > *" de propósito — mesma
   especificidade, então a ordem no arquivo decide, e position:absolute
   precisa vencer o position:relative genérico de cima.) */
.pricing-card__glow{position:absolute; inset:0; z-index:0; overflow:hidden; border-radius:inherit; pointer-events:none;}
/* Cada fita fica no seu próprio elemento (não uma única imagem de fundo
   em .pricing-card__glow) porque cada canto precisa de uma máscara de
   desvanecimento própria — sem isso a borda retangular da imagem
   aparece como um corte reto no meio do card (ver captura de tela do
   usuário: o efeito parava seco em vez de sumir suavemente). */
.pricing-card__glow-tr, .pricing-card__glow-bl{position:absolute; background-repeat:no-repeat; opacity:0.55;}
.pricing-card__glow-tr{
  top:-30px; right:-40px; width:230px; height:230px;
  background-image:url('/static/img/brand/pricing-card-glow-tr.webp');
  background-position:top right; background-size:contain;
  -webkit-mask-image:radial-gradient(circle at top right, #000 0%, #000 40%, transparent 72%);
  mask-image:radial-gradient(circle at top right, #000 0%, #000 40%, transparent 72%);
}
.pricing-card__glow-bl{
  bottom:-40px; left:-50px; width:250px; height:250px;
  background-image:url('/static/img/brand/pricing-card-glow-bl.webp');
  background-position:bottom left; background-size:contain;
  -webkit-mask-image:radial-gradient(circle at bottom left, #000 0%, #000 40%, transparent 72%);
  mask-image:radial-gradient(circle at bottom left, #000 0%, #000 40%, transparent 72%);
}
.pricing-card--highlight{
  background:transparent; border-color:rgba(16,185,129,0.45); box-shadow:0 16px 40px rgba(5,150,105,0.28);
}
.pricing-card__badge{
  /* Flutua cruzando a borda de cima do card de propósito (metade fora,
     metade dentro), igual ao card de referência — por isso não pode
     estar dentro do wrapper com overflow:hidden do halo (.pricing-card__glow). */
  position:absolute; z-index:2; top:-14px; left:50%; transform:translateX(-50%); white-space:nowrap;
  background:var(--blue-600); color:#fff; font-size:10.5px; font-weight:700; letter-spacing:0.02em;
  padding:4px 12px; border-radius:99px; box-shadow:0 4px 12px rgba(5,150,105,0.4);
}
.pricing-card__name{font-size:19px; font-weight:700; color:#fff; margin-bottom:6px;}
.pricing-card__desc{font-size:12.8px; color:var(--gray-400); line-height:1.55; min-height:34px; margin-bottom:18px;}
.pricing-card__price-label{display:block; font-size:11.5px; color:var(--gray-400); margin-bottom:2px;}
.pricing-card__price{display:flex; align-items:baseline; gap:5px; margin-bottom:20px;}
.pricing-card__price[hidden]{display:none;}
.pricing-card__price-value{font-family:var(--serif); font-size:30px; font-weight:700; color:#fff;}
.pricing-card__price-period{font-size:12.5px; color:var(--gray-400);}
.pricing-card__features{list-style:none; margin:0 0 22px; padding:0; display:flex; flex-direction:column; gap:11px; flex:1;}
.pricing-card__features li{display:flex; align-items:flex-start; gap:8px; font-size:12.8px; color:var(--gray-300); line-height:1.5;}
.pricing-card__features .icon{width:15px; height:15px; color:#10B981; flex-shrink:0; margin-top:2px;}
.pricing-card .btn{width:100%; justify-content:center; border-radius:999px;}
.pricing-card .btn.btn--primary{background:var(--blue-600); border-color:var(--blue-600); color:#fff;}
.pricing-card .btn.btn--primary:hover{background:#047857;}

/* ---------- Página /planos: tabela comparativa (fundo escuro, divisórias
   claras, checks em verde) ---------- */
.compare-section{background:var(--navy-950); padding:56px 0 64px; margin-top:56px;}
/* Mesma largura de .pricing-grid--tres (1360px, não os 1180px do .wrap
   padrão) — senão a tabela fica visivelmente mais estreita e puxada pra
   esquerda em relação aos cards logo acima dela. */
.compare-section .wrap{max-width:1360px;}
.compare-section__title{font-size:clamp(22px,2.8vw,30px); font-weight:600; color:#fff; text-align:center; margin-bottom:32px;}
.compare-table-wrap{overflow-x:auto; -webkit-overflow-scrolling:touch;}
.compare-table{width:100%; min-width:760px; border-collapse:collapse;}
.compare-table th, .compare-table td{
  border:1px solid rgba(255,255,255,0.12); padding:14px 18px; text-align:center; vertical-align:middle;
}
.compare-table thead th{border-top:none; padding-top:6px; padding-bottom:18px;}
.compare-table__row-label{text-align:left !important; color:var(--gray-200); font-size:13.5px; max-width:280px;}
.compare-table thead .compare-table__row-label{border-left:none; border-top:none; border-bottom:1px solid rgba(255,255,255,0.12);}
.compare-table tbody tr:first-child td{border-top:1px solid rgba(255,255,255,0.12);}
.compare-table__plan{display:block; font-size:14.5px; font-weight:700; color:#fff; margin-bottom:2px;}
.compare-table__price{display:block; font-size:12px; color:var(--gray-400); margin-bottom:12px;}
.compare-table__yes{width:18px; height:18px; color:#10B981;}
.compare-table__no{color:var(--gray-500); font-size:15px;}
.compare-table__col--highlight{background:rgba(16,185,129,0.07); border-left:1px solid rgba(16,185,129,0.35); border-right:1px solid rgba(16,185,129,0.35);}
@media(max-width:760px){
  .compare-table th, .compare-table td{padding:11px 12px; font-size:12.5px;}
}
.compare-section__note{text-align:center; font-size:12.5px; color:var(--gray-400); margin:-20px 0 28px;}

/* Grade de 3 planos (ver .pricing-grid acima, que é a de 4). Três cards
   dentro do mesmo max-width:1180px da grade de 4 sobrava espaço vazio nas
   telas largas — aqui ela é mais larga E os cards ganham mais respiro
   (padding maior, nome e preço maiores), porque com uma coluna a menos dá
   pra deixar cada um mais presente em vez de só esticar o espaço entre eles. */
.pricing-grid--tres{grid-template-columns:repeat(3, 1fr); max-width:1360px; gap:28px;}
.pricing-grid--tres .pricing-card{padding:36px 32px 30px;}
.pricing-grid--tres .pricing-card__name{font-size:23px;}
.pricing-grid--tres .pricing-card__desc{font-size:13.8px; min-height:44px;}
.pricing-grid--tres .pricing-card__price-value{font-size:36px;}
.pricing-grid--tres .pricing-card__features li{font-size:13.8px;}
@media(max-width:980px){.pricing-grid--tres{grid-template-columns:1fr; max-width:520px;}}

/* Abas Mês/Semestre/Ano dentro de cada .pricing-card (ver js/planos-ciclo.js).
   Reaproveita o .course-tab usado em sub-navegação pelo site inteiro, só com
   cores para o cartão escuro — o visual claro padrão dele (texto cinza,
   sublinhado azul) desapareceria num fundo navy. */
.pricing-card__ciclos{display:flex; gap:4px; margin-bottom:14px; background:rgba(255,255,255,0.05); border-radius:10px; padding:3px;}
.pricing-card__ciclo-tab{flex:1; margin:0; padding:7px 4px; border-radius:8px; border-bottom:none; text-align:center; font-size:12px; font-weight:600; color:var(--gray-400);}
.pricing-card__ciclo-tab.active{background:rgba(16,185,129,0.16); color:#fff;}
.pricing-card__ciclo-tab:focus-visible{outline:2px solid #10B981; outline-offset:2px;}

/* ---------- Closing CTA (final da página) ---------- */
.closing-cta{background:linear-gradient(135deg, var(--navy-900) 0%, var(--navy-950) 100%); padding:56px 0;}
.closing-cta__inner{display:flex; align-items:center; justify-content:space-between; gap:32px; flex-wrap:wrap;}
.closing-cta h2{color:#fff; font-size:26px; margin-bottom:8px;}
.closing-cta p{color:var(--gray-300); font-size:14.5px; max-width:52ch; line-height:1.6; margin:0;}
.closing-cta .btn{flex-shrink:0;}

/* ---------- Páginas de país/estado (Comparação Internacional) ---------- */
.entity-content{max-width:760px; padding:48px 28px 70px; margin:0 auto;}
.entity-section{margin-bottom:44px;}
.entity-section__title{font-size:20px; margin-bottom:14px;}
.entity-section__lede{font-size:15.5px; line-height:1.7; color:var(--gray-800); margin-bottom:12px;}
.entity-tag{
  display:inline-block; font-family:var(--mono); font-size:11px; letter-spacing:0.06em; text-transform:uppercase;
  color:var(--blue-600); background:var(--blue-50); border:1px solid var(--blue-100);
  padding:5px 12px; border-radius:99px;
}

/* Tabela de alíquotas — navy + esmeralda, conforme identidade da marca */
.rate-table{background:var(--navy-950); border-radius:14px; padding:6px 22px; box-shadow:var(--shadow-md);}
.rate-table__row{display:grid; grid-template-columns:1.2fr 0.7fr 1.7fr; gap:18px; align-items:center; padding:16px 0; border-bottom:1px solid rgba(255,255,255,0.08);}
.rate-table__row:last-child{border-bottom:none;}
.rate-table__name{font-size:14px; font-weight:700; color:#fff;}
.rate-table__rate{font-family:var(--serif); font-weight:700; font-size:21px; color:var(--blue-500);}
.rate-table__note{font-size:12.5px; color:var(--gray-300); line-height:1.5;}
@media(max-width:640px){
  .rate-table{padding:4px 18px;}
  .rate-table__row{grid-template-columns:minmax(0,1fr); gap:4px; padding:16px 0;}
  .rate-table__rate{font-size:19px;}
}

/* Comparativo direto com o Brasil */
.compare-grid{display:flex; flex-direction:column; gap:14px;}
.compare-item{background:var(--blue-50); border:1px solid var(--blue-100); border-radius:14px; padding:18px 22px;}
.compare-item__row{display:flex; align-items:center; gap:18px;}
.compare-item__side{display:flex; flex-direction:column; gap:2px; flex:1;}
.compare-item__value{font-family:var(--serif); font-weight:700; font-size:26px; color:var(--navy-900);}
.compare-item__side--brasil .compare-item__value{color:var(--blue-600);}
.compare-item__label{font-size:11.5px; color:var(--gray-700); text-transform:uppercase; letter-spacing:0.03em; font-weight:600;}
.compare-item__vs{font-size:11.5px; color:var(--gray-500); font-weight:700; flex-shrink:0;}
.compare-item__legenda{font-size:13px; color:var(--gray-700); line-height:1.55; margin-top:10px; padding-top:10px; border-top:1px solid var(--blue-100);}
@media(max-width:520px){
  .compare-item__row{flex-direction:column; align-items:flex-start; gap:10px;}
  .compare-item__vs{display:none;}
}

/* Curiosidade tributária */
.curiosidade-box{
  display:flex; align-items:flex-start; gap:14px; background:var(--navy-900); color:#fff;
  border-radius:14px; padding:20px 22px;
}
.curiosidade-box .icon{width:22px; height:22px; color:var(--blue-500); flex-shrink:0; margin-top:2px;}
.curiosidade-box p{font-size:14.5px; line-height:1.65; margin:0; color:var(--gray-100);}

.entity-sources{font-size:12px; color:var(--gray-500); margin-bottom:24px;}
.entity-sources a{color:var(--gray-700); text-decoration:underline;}
.entity-sources a:hover{color:var(--blue-600);}

.entity-placeholder .badge-soon{display:inline-block; margin-bottom:12px;}

/* Comércio exterior — importação/exportação por país */
.trade-meta{font-size:13.5px; color:var(--gray-700); line-height:1.8; margin-bottom:18px;}
.trade-meta strong{color:var(--navy-900);}
.trade-meta a{color:var(--blue-600); font-weight:600; text-decoration:underline;}
.trade-grid{display:grid; grid-template-columns:1fr 1fr; gap:20px;}
@media(max-width:640px){ .trade-grid{grid-template-columns:minmax(0,1fr);} }
.trade-col{background:var(--blue-50); border:1px solid var(--blue-100); border-radius:14px; padding:18px 20px;}
.trade-col__title{font-size:15px; font-weight:700; color:var(--navy-900); margin:0;}
.trade-col h4{font-size:11.5px; text-transform:uppercase; letter-spacing:0.03em; color:var(--gray-600); font-weight:700; margin:16px 0 6px;}
.trade-aliquota{font-size:13px; color:var(--gray-800); line-height:1.6; margin:10px 0 0;}
.trade-list{margin:0; padding-left:18px; font-size:12.8px; color:var(--gray-700); line-height:1.6;}
.trade-list li{margin-bottom:4px;}
.trade-list--restrito li{color:#8a3a37;}

/* ---------- Mapa mundial 3D (Comparação Internacional) ----------
   Mesma técnica de relevo do mapa do Brasil (.br-state em site.css):
   parede (wall) fixa + grupo que eleva no hover (lift) contendo a face
   com gradiente e um "vinco" interno (rim, stroke grosso clicado à
   própria forma). Ids do SVG prefixados com "world"/"w" para não colidir
   com os do mapa do Brasil, que fica na mesma página. ---------- */
.wm3d-map{width:100%; max-width:900px; height:auto; margin:0 auto; display:block; overflow:visible;}
.wm3d-map-wrap{display:flex; justify-content:center; padding:8px 0 20px;}
.wm3d-country__wall{fill:var(--navy-800);}
.wm3d-country__face{fill:var(--gray-300); stroke:var(--navy-900); stroke-width:0.5;}
.wm3d-country__rim{fill:none; stroke:var(--navy-950); stroke-width:1.5;}
.wm3d-country__lift{transition:transform .18s ease;}

/* Indisponível: cor neutra, sem elevação, sem clique */
.wm3d-country--locked{cursor:not-allowed;}
.wm3d-country--locked .wm3d-country__face{fill:var(--gray-300);}

/* Disponível: mesmo comportamento 3D do mapa do Brasil, em escala menor */
.wm3d-country--available{cursor:pointer; filter:drop-shadow(0 1px 2px rgba(15,23,42,.3)); transition:filter .18s ease;}
.wm3d-country--available .wm3d-country__face{fill:url(#worldTopFace);}
.wm3d-country--available:hover .wm3d-country__lift,
.wm3d-country--available:focus-visible .wm3d-country__lift{transform:translateY(-3px);}
.wm3d-country--available:hover,
.wm3d-country--available:focus-visible{filter:drop-shadow(0 6px 10px rgba(15,23,42,.55));}
.wm3d-country--available:focus-visible{outline:none;}
.wm3d-country--available:focus-visible .wm3d-country__face{stroke:var(--navy-700); stroke-width:1;}

.wm-map-legend{display:flex; gap:20px; justify-content:center; margin-top:14px; font-size:12px; color:var(--gray-600); flex-wrap:wrap;}
.wm-map-legend span{display:inline-flex; align-items:center; gap:6px;}
.wm-map-legend__dot{display:inline-block; width:10px; height:10px; border-radius:50%; flex-shrink:0;}

/* ---------- Seção de destaque: carrossel de fotos + cadastro + propaganda ---------- */
.featured-section{padding:56px 0;}
/* minmax(0, ...) em vez de só 1.7fr/1fr: sem isso, o grid track nunca
   encolhe abaixo do conteúdo mínimo do card (ex.: o título do artigo em
   destaque), o que vazava a coluna pra ~550px e forçava a página inteira a
   rolar na horizontal em telas estreitas — mesma correção aplicada no
   breakpoint mobile logo abaixo. */
.featured-grid{display:grid; grid-template-columns:minmax(0,1.7fr) minmax(0,1fr); gap:32px; align-items:start;}

.article-carousel-wrap--photo{position:relative;}
.article-track--photo{display:flex; overflow-x:auto; scroll-snap-type:x mandatory; scrollbar-width:none; border-radius:16px;}
.article-track--photo::-webkit-scrollbar{display:none;}
.article-slide-photo{
  position:relative; flex:0 0 100%; scroll-snap-align:start; min-height:440px; border-radius:16px;
  background-size:cover; background-position:center; display:flex; flex-direction:column; justify-content:space-between;
  text-decoration:none; overflow:hidden;
}
.article-slide-photo::before{
  content:""; position:absolute; inset:0;
  background:linear-gradient(180deg, rgba(15,23,42,0.15) 0%, rgba(15,23,42,0.35) 45%, rgba(15,23,42,0.92) 100%);
}
.article-slide-photo__tag{
  position:relative; z-index:1; align-self:flex-start; margin:22px 0 0 26px; font-size:12px; font-weight:700;
  text-transform:uppercase; letter-spacing:0.05em; color:#fff; background:rgba(255,255,255,0.14);
  border:1px solid rgba(255,255,255,0.3); padding:6px 14px; border-radius:99px;
}
.article-slide-photo__content{position:relative; z-index:1; padding:0 30px 30px; max-width:85%;}
.article-slide-photo__content h3{
  font-size:clamp(22px,2.6vw,32px); line-height:1.25; color:#fff; font-weight:700; margin-bottom:10px;
}
.article-slide-photo__byline{font-size:13px; color:var(--gray-300);}
.article-dots--overlay{position:absolute; right:20px; bottom:20px; z-index:2; display:flex; gap:6px;}
.article-dots--overlay .article-dot{background:rgba(255,255,255,0.4);}
.article-dots--overlay .article-dot.active{background:var(--blue-500);}

.featured-catalog-link{
  display:inline-flex; align-items:center; gap:8px; margin-top:16px; font-size:13.5px; font-weight:700;
  color:var(--navy-900); text-decoration:none; border-bottom:1px solid var(--line); padding-bottom:2px;
}
.featured-catalog-link:hover{color:var(--blue-600); border-color:var(--blue-600);}
.featured-catalog-link .icon{width:15px; height:15px; color:var(--blue-600);}

.featured-col-side{display:flex; flex-direction:column; gap:20px;}
.newsletter-card{background:var(--white); border:1px solid var(--line); border-radius:16px; padding:26px 24px; box-shadow:var(--shadow-sm);}
.newsletter-card h3{font-size:17px; line-height:1.35; color:var(--navy-900); margin-bottom:18px;}
.newsletter-card h3 em{font-style:normal; color:var(--blue-600);}
.newsletter-form{display:flex; flex-direction:column; gap:14px;}
.newsletter-form__field{display:flex; flex-direction:column; gap:6px; font-size:12px; font-weight:700; color:var(--gray-500);}
.newsletter-form__field input{
  font:inherit; font-size:14px; font-weight:400; color:var(--navy-900);
  border:1px solid var(--line); border-radius:9px; padding:10px 12px; background:var(--white);
}
.newsletter-form__field input:focus{outline:none; border-color:var(--navy-700); box-shadow:0 0 0 3px rgba(15,23,42,0.08);}
.newsletter-form__submit{width:100%; justify-content:center; padding:11px 0;}
.newsletter-form__note{font-size:11px; color:var(--gray-500); line-height:1.5;}
.newsletter-form__note a{color:var(--gray-700); text-decoration:underline;}
.newsletter-form__error{font-size:12.5px; color:#b3413f; background:#fdecec; border:1px solid #f3c8c6; padding:8px 10px; border-radius:8px;}

.ad-banner{display:block; border-radius:16px; overflow:hidden; box-shadow:var(--shadow-sm);}
.ad-banner img{width:100%; height:auto; display:block;}

@media(max-width:900px){
  .featured-grid{grid-template-columns:minmax(0,1fr);}
  .article-slide-photo{min-height:340px;}
}

/* ---------- Catálogo de Artigos (/artigos) ---------- */
.article-catalog-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:20px; margin-bottom:8px;}
.article-catalog-card{
  position:relative; display:flex; flex-direction:column; justify-content:flex-end; min-height:220px;
  border-radius:14px; overflow:hidden; text-decoration:none; background-color:var(--navy-900);
  background-size:cover; background-position:center; box-shadow:0 4px 16px rgba(15,23,42,0.16);
  transition:transform .2s ease, box-shadow .2s ease;
}
.article-catalog-card:hover{transform:translateY(-3px); box-shadow:0 12px 28px rgba(16,185,129,0.2), 0 6px 16px rgba(15,23,42,0.25);}
.article-catalog-card--hidden{display:none !important;}
.article-catalog-card::before{
  content:""; position:absolute; inset:0;
  background:
    radial-gradient(circle at 88% 6%, rgba(16,185,129,0.25), transparent 45%),
    linear-gradient(180deg, rgba(15,23,42,0.3) 0%, rgba(15,23,42,0.6) 55%, rgba(15,23,42,0.93) 100%);
}
.article-catalog-card__tag{
  position:relative; z-index:1; align-self:flex-start; margin:16px 0 0 18px; font-size:10.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:0.04em; color:#fff; background:rgba(255,255,255,0.16);
  border:1px solid rgba(255,255,255,0.3); padding:5px 11px; border-radius:99px;
}
.article-catalog-card__body{position:relative; z-index:1; padding:14px 18px 18px;}
.article-catalog-card__body h3{font-size:16px; line-height:1.35; color:#fff; font-weight:700; margin-bottom:6px;}
.article-catalog-card__body p{font-size:12px; color:var(--gray-300);}
@media(max-width:900px){
  .article-catalog-grid{grid-template-columns:repeat(2,1fr);}
}
@media(max-width:600px){
  .article-catalog-grid{grid-template-columns:minmax(0,1fr);}
}

/* ---------- Busca global (caixa no nav) ---------- */
.nav-search{position:relative;}
.nav-search__toggle{
  width:36px; height:36px; border-radius:50%; border:none; background:rgba(255,255,255,0.08); color:#fff;
  display:flex; align-items:center; justify-content:center; cursor:pointer; flex-shrink:0;
  transition:background .15s ease;
}
.nav-search__toggle:hover, .nav-search__toggle[aria-expanded="true"]{background:rgba(255,255,255,0.18);}
.nav-search__toggle .icon{width:17px; height:17px;}
.nav-search__panel{
  position:absolute; top:calc(100% + 10px); right:0; width:360px; max-width:90vw;
  background:var(--white); border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:0 12px 32px rgba(15,23,42,0.22); padding:12px; z-index:150;
}
.nav-search__form{display:flex; align-items:center; gap:8px; border:1px solid var(--line); border-radius:8px; padding:8px 12px;}
.nav-search__form .icon{width:15px; height:15px; color:var(--gray-500); flex-shrink:0;}
.nav-search__form input{border:none; outline:none; font-size:14px; width:100%; font-family:var(--sans); color:var(--navy-900); background:none;}
.nav-search__results{margin-top:8px; max-height:60vh; overflow-y:auto;}
.nav-search__result{
  display:flex; flex-direction:column; gap:2px; padding:10px; border-radius:8px; text-decoration:none;
  transition:background .12s ease;
}
.nav-search__result:hover{background:var(--gray-100);}
.nav-search__result-tipo{font-family:var(--mono); font-size:10px; letter-spacing:0.04em; text-transform:uppercase; color:var(--blue-600); font-weight:600;}
.nav-search__result strong{font-size:13.5px; color:var(--navy-900); line-height:1.3; font-weight:600;}
.nav-search__result-desc{font-size:12px; color:var(--gray-500); line-height:1.4; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;}
.nav-search__see-all{display:block; text-align:center; font-size:12.5px; font-weight:600; color:var(--blue-600); text-decoration:none; padding:10px; border-top:1px solid var(--line); margin-top:4px;}
.nav-search__see-all:hover{text-decoration:underline;}
.nav-search__empty{font-size:12.5px; color:var(--gray-500); padding:10px;}
@media(max-width:560px){
  .nav-search__panel{position:fixed; top:calc(var(--nav-offset) + var(--nav-h) + 10px); left:12px; right:12px; width:auto;}
}

/* A barra de busca sempre visível no desktop (.nav-search--bar) foi
   removida por pedido explícito — "fica mais elegante ficar só a
   lupinha [...] e caso eu clique nela aparece a caixa de texto". A busca
   volta a ser só ícone + painel revelado por clique em qualquer largura;
   as regras base de .nav-search mais acima já cobrem esse comportamento,
   sem precisar de nada extra aqui. */

/* ---------- Dropdowns do nav (Ferramentas / Conteúdo / Administração) ---------- */
.nav-more{position:relative;}
.nav-more__toggle{
  display:flex; align-items:center; gap:4px; background:none; border:none; cursor:pointer;
  color:var(--gray-300); text-decoration:none; font-size:13.5px; font-weight:500; font-family:var(--sans);
  padding:9px 12px; border-radius:7px; transition:all .15s ease; white-space:nowrap;
}
.nav-more__toggle:hover, .nav-more__toggle[aria-expanded="true"]{color:#fff; background:rgba(255,255,255,0.08);}
.nav-more__caret{width:13px; height:13px; transition:transform .15s ease;}
.nav-more__toggle[aria-expanded="true"] .nav-more__caret{transform:rotate(180deg);}
.nav-more__panel{
  position:absolute; top:calc(100% + 10px); left:0; min-width:230px;
  background:var(--white); border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:0 12px 32px rgba(15,23,42,0.22); padding:6px; z-index:150;
  display:flex; flex-direction:column; gap:1px;
}
.nav-more__panel[hidden]{display:none;}
.nav-more__panel a{
  display:flex; align-items:center; gap:8px;
  color:var(--navy-900); text-decoration:none; font-size:13.5px; font-weight:500;
  padding:9px 12px; border-radius:7px; white-space:nowrap;
}
.nav-more__panel a .icon{color:var(--gray-500); flex-shrink:0;}
/* .nav__links a:hover (site.css) forca color:#fff pensando em fundo escuro
   -- o dropdown aqui tem fundo claro, entao precisa reafirmar a cor escura
   no hover, senao o texto fica branco sobre cinza claro e some. */
.nav-more__panel a:hover{background:var(--gray-100); color:var(--blue-500);}
.nav-more__panel a:hover .icon{color:var(--blue-500);}
@media(max-width:1024px){
  .nav-more__toggle{width:100%; justify-content:space-between; padding:13px 14px; font-size:15px; border-bottom:1px solid rgba(255,255,255,0.06); border-radius:0;}
  .nav-more__panel{
    position:static; box-shadow:none; border:none; background:none; border-radius:0; min-width:0;
    padding:0 0 0 14px; margin-top:2px;
  }
  .nav-more__panel a{color:var(--gray-300); padding:12px 14px; font-size:15px; border-bottom:1px solid rgba(255,255,255,0.06); border-radius:0;}
  .nav-more__panel a:hover{background:rgba(255,255,255,0.06); color:var(--blue-500);}
  .nav-more__panel a:hover .icon{color:var(--blue-500);}
}

/* ---------- Página de resultados de busca (/busca) ---------- */
.search-page-form{display:flex; align-items:center; gap:10px; border:1px solid var(--line); border-radius:10px; padding:10px 16px; margin-bottom:28px; box-shadow:var(--shadow-sm);}
.search-page-form .icon{width:17px; height:17px; color:var(--gray-500); flex-shrink:0;}
.search-page-form input{flex:1; border:none; outline:none; font-size:15px; font-family:var(--sans); color:var(--navy-900); background:none;}
.search-results-list{display:flex; flex-direction:column; gap:10px;}
.search-result-item{
  display:block; padding:16px 18px; border:1px solid var(--line); border-radius:var(--radius);
  text-decoration:none; box-shadow:var(--shadow-sm); transition:border-color .15s ease, transform .15s ease;
}
.search-result-item:hover{border-color:var(--blue-600); transform:translateY(-1px);}
.search-result-item__tipo{
  display:inline-block; font-family:var(--mono); font-size:10.5px; letter-spacing:0.04em; text-transform:uppercase;
  color:var(--blue-600); font-weight:600; margin-bottom:6px;
}
.search-result-item h3{font-size:15.5px; color:var(--navy-900); margin-bottom:4px;}
.search-result-item p{font-size:13px; color:var(--gray-700); line-height:1.5;}

/* ---------- Tour guiado de boas-vindas (Regime de Estudos / Painel da Empresa) ----------
   Motor genérico em onboarding-tour.js — o recorte no fundo escurecido é feito
   com um box-shadow gigante no próprio .onb-tour-spotlight, então o overlay
   em si fica totalmente transparente (só bloqueia cliques na página). */
.onb-tour-overlay{
  position:fixed; inset:0; z-index:700; opacity:0; transition:opacity .2s ease; pointer-events:auto;
}
.onb-tour-overlay.is-open{opacity:1;}
.onb-tour-spotlight{
  position:fixed; border-radius:10px; pointer-events:none;
  box-shadow:0 0 0 9999px rgba(15,23,42,0.62); border:2px solid var(--blue-500);
  transition:top .25s ease, left .25s ease, width .25s ease, height .25s ease;
}
.onb-tour-card{
  position:fixed; width:320px; max-width:calc(100vw - 32px); background:var(--white); color:var(--navy-900);
  border-radius:14px; padding:18px 20px; box-shadow:0 18px 48px rgba(15,23,42,0.32);
  transition:top .25s ease, left .25s ease;
}
.onb-tour__step{font-family:var(--mono); font-size:10.5px; letter-spacing:0.04em; text-transform:uppercase; color:var(--blue-600); font-weight:700; margin-bottom:6px;}
.onb-tour__title{font-size:16px; margin-bottom:6px;}
.onb-tour__text{font-size:13.5px; color:var(--gray-700); line-height:1.5; margin-bottom:16px;}
.onb-tour__actions{display:flex; align-items:center; justify-content:space-between; gap:10px;}
.onb-tour__skip{background:none; border:none; color:var(--gray-500); font-size:12px; cursor:pointer; padding:4px 0; text-decoration:underline;}
.onb-tour__nav{display:flex; gap:8px;}
.onb-tour__nav .btn{padding:8px 14px; font-size:12.5px;}
.onb-tour-replay{
  display:inline-flex; align-items:center; gap:6px; background:none; border:1px solid var(--line); color:var(--gray-600);
  font-size:11.5px; font-weight:600; padding:6px 10px; border-radius:8px; cursor:pointer;
}
.onb-tour-replay:hover{border-color:var(--blue-500); color:var(--blue-600);}
.onb-tour-replay .icon{width:13px; height:13px;}

/* ---------- Fundo decorativo nas bordas laterais (Calculadora, CST, Notas
   Técnicas, Glossário) — só aparece na margem fora do conteúdo (--maxw),
   nunca atrás do texto: pseudo-elementos fixos, largura calculada pela
   sobra de viewport, e z-index negativo (pintado atrás do conteúdo em
   fluxo normal, na frente do próprio fundo da página). ---------- */
body.page-bg-network::before,
body.page-bg-network::after{
  content:""; position:fixed; top:0; bottom:0; width:calc((100vw - var(--maxw)) / 2 + 80px);
  background-image:url('/static/img/backgrounds/network-plexus.webp');
  background-size:cover; background-repeat:no-repeat; opacity:0.4; filter:blur(1.5px) saturate(0.9);
  pointer-events:none; z-index:-1;
}
/* Vinheta radial em vez de um recorte reto — some suavemente nos quatro
   lados (topo, base e a borda voltada pro conteúdo), sem parecer cortada.
   Zona sólida bem menor (0-30%) e o resto (30-100%) é só esmaecimento —
   transição bem mais longa e gradual do que um recorte que só começa a
   sumir depois de 60% da imagem. */
body.page-bg-network::before{
  left:0; background-position:left center;
  -webkit-mask-image:radial-gradient(ellipse 100% 100% at 15% 50%, black 0%, transparent 90%);
  mask-image:radial-gradient(ellipse 100% 100% at 15% 50%, black 0%, transparent 90%);
}
body.page-bg-network::after{
  right:0; background-position:right center;
  -webkit-mask-image:radial-gradient(ellipse 100% 100% at 85% 50%, black 0%, transparent 90%);
  mask-image:radial-gradient(ellipse 100% 100% at 85% 50%, black 0%, transparent 90%);
}
@media (max-width:1400px){
  body.page-bg-network::before, body.page-bg-network::after{display:none;}
}
/* Variante só da home — troca a textura padrão (verde sobre branco)
   por uma versão mais suave (ondas cinza-azuladas), fornecida pelo
   usuário, sem tocar em nenhum fundo de seção/card. As outras páginas
   com .page-bg-network (Calculadora, CST, Notas Técnicas, Glossário)
   continuam com a textura original. Como essa versão já é clara, ela
   funde direto no --gray-50 do body sem precisar de nenhum fundo
   sólido por trás (um fundo sólido aqui é que criava um corte reto
   contra o --gray-50 do resto da página). */
body.page-bg-network--dark::before,
body.page-bg-network--dark::after{
  background-image:url('/static/img/backgrounds/network-plexus-dark.webp');
  opacity:0.45; filter:blur(2px);
}
/* O body claro (--gray-50) por trás da pílula do nav aparecia como uma
   borda/canto branco em toda página de cabeçalho escuro (.article-hero,
   .pricing-hero): a pílula é position:fixed com respiro próprio (margem +
   arredondamento), e esse respiro só tinha o body embaixo. Tingir o body
   INTEIRO de escuro (como body.home-v2 faz, mais abaixo) quebraria
   páginas como Termos de Uso/Política de Privacidade, cujo texto é cinza
   escuro pensado pra um fundo claro — ficaria ilegível. Em vez disso, uma
   faixa fixa e pequena, só atrás do respiro do nav, cobre exatamente o
   que precisa sem tocar no resto do fundo da página.
   z-index:0 (nunca negativo): o <html> tem background próprio, então o
   <body> deixa de ser "o elemento que forma o stacking context" e vira só
   mais uma caixa estática — a ordem de pintura do CSS desenha o fundo de
   um descendente estático (o background:--gray-50 do body) DEPOIS de
   qualquer stacking context com z-index negativo. Com z-index:-1 esta
   faixa pintava atrás do cinza claro do body e nunca aparecia — só não
   dava pra notar em telas estreitas porque o degradê do .pricing-hero por
   acaso já cobria a área. Em telas largas (nav mais baixo, menos texto
   quebrando linha) o respiro ficava maior que a área coberta pelo hero, e
   o branco aparecia por baixo da pílula inteira.
   position:absolute (NUNCA fixed): a pílula (.nav) já tem fundo próprio
   semi-opaco com blur (ver .nav::before, rgba(15,23,42,0.74)) — ela não
   precisa de nada atrás pra ficar legível, nem sobre o herói escuro nem
   depois, rolando por cima de conteúdo claro (compare com o nav da ROIT,
   que faz exatamente isso). Com position:fixed este backdrop acompanhava
   o scroll pra sempre: ao rolar a página passando do herói escuro pra
   uma seção clara, sobrava uma faixa azul-marinho colada no topo da
   viewport, por cima do fundo branco — exatamente o efeito "preso" que
   não deveria existir. Como absolute, ele fica ancorado ao topo do
   DOCUMENTO (não da viewport): cobre o respiro só enquanto esse trecho
   inicial está à vista e rola pra fora de vista junto com o resto do
   herói, do jeito que já acontece com o degradê do .hero/.pricing-hero. */
.nav-top-backdrop{
  position:absolute; top:0; left:0; right:0; height:132px; z-index:0; pointer-events:none;
}
body.page-bg-network--dark .nav-top-backdrop{background:var(--navy-950);}

/* Fundo de /questoes-de-concurso — uma imagem só (faixas de vidro verde
   nas bordas, centro branco), fornecida pronta pelo usuário, não a
   textura+máscara de .page-bg-network acima (que existe pra esticar uma
   textura infinita; esta imagem já nasce com as bordas combinando e o
   centro limpo, então só precisa ficar fixa atrás do conteúdo). Troca o
   próprio `background` do body (não ::before/::after): com
   background-attachment:fixed, a imagem não rola junto com a página —
   fica sempre visível por trás, do jeito que o usuário pediu. */
body.page-bg-questoes{
  background-image:url('/static/img/backgrounds/bg-questoes-ondas.webp');
  background-attachment:fixed; background-position:center; background-size:cover; background-repeat:no-repeat;
}
@media(max-width:860px){
  /* Fixed background no mobile tem custo de repaint alto (Safari/iOS em
     especial) e, numa tela estreita, as faixas das bordas já ficam fora
     de vista mesmo — sem ganho visual que justifique o custo. */
  body.page-bg-questoes{background-attachment:scroll;}
}

/* ---------- Ocultar visualmente ----------
   Some da tela sem sair da árvore de acessibilidade: o elemento continua
   focável e clicável. É a alternativa a `display:none` para campos de
   arquivo disparados por script — com `display:none` o Safari do iPhone
   pode recusar abrir o seletor, e o campo some da navegação por teclado. */
.visually-hidden{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0 0 0 0); clip-path:inset(50%); white-space:nowrap; border:0;
}

/* ---------- Campo de @ ----------
   O arroba fica FORA do campo, como prefixo fixo: assim a pessoa não precisa
   digitá-lo, não pode apagá-lo por engano, e o valor enviado é sempre só o
   identificador. A normalização no servidor ainda remove um "@" digitado à
   mão, porque é o gesto natural de quem está acostumado com redes sociais. */
.handle-field{position:relative; display:block;}
.handle-field__at{
  position:absolute; left:12px; top:50%; transform:translateY(-50%);
  font-size:14px; font-weight:600; color:var(--gray-500); pointer-events:none;
}
.handle-field__input{padding-left:26px !important;}

/* ---------- Cor por tipo ----------
   Uma cor por tipo, todas no mesmo registro: saturação baixa e luminosidade
   parecida, para a estante continuar calma com dezoito cores em cena. A cor
   NÃO preenche o cartão — aparece num ponto de 6px na linha de contexto e,
   quando não há capa, tinge de leve a cartela. Cartão colorido inteiro
   viraria bloco de cor e roubaria a vez da arte das capas.

   O valor mora aqui, e não no modelo, porque é apresentação. A mesma regra
   serve o cartão da estante e o cartaz da ficha — ambos carregam .sp-tipo. */
.sp-tipo{--tipo:var(--gray-500);}
.sp-tipo[data-tipo="filme"]{--tipo:#4C5C96;}
.sp-tipo[data-tipo="curta"]{--tipo:#5F7D96;}
.sp-tipo[data-tipo="animacao"]{--tipo:#4E8C8C;}
.sp-tipo[data-tipo="serie"]{--tipo:#3F7A63;}
.sp-tipo[data-tipo="minisserie"]{--tipo:#6B8F55;}
.sp-tipo[data-tipo="novela"]{--tipo:#A8617A;}
.sp-tipo[data-tipo="anime"]{--tipo:#8A5FA8;}
.sp-tipo[data-tipo="documentario"]{--tipo:#7A6A4F;}
.sp-tipo[data-tipo="docusserie"]{--tipo:#96835E;}
.sp-tipo[data-tipo="reality"]{--tipo:#B0794C;}
.sp-tipo[data-tipo="programa"]{--tipo:#6E6E8C;}
.sp-tipo[data-tipo="especial"]{--tipo:#A85F4C;}
.sp-tipo[data-tipo="livro"]{--tipo:#2F5D73;}
.sp-tipo[data-tipo="hq"]{--tipo:#B04A46;}
.sp-tipo[data-tipo="manga"]{--tipo:#5C5C7A;}
.sp-tipo[data-tipo="revista"]{--tipo:#7A8C3F;}
.sp-tipo[data-tipo="audiolivro"]{--tipo:#4F7A8C;}
.sp-tipo[data-tipo="podcast"]{--tipo:#8C5578;}

/* ---------- Amigos ---------- */
.fr-add{margin-bottom:26px;}
.fr-add__row{display:flex; gap:10px; align-items:center; flex-wrap:wrap;}
.fr-add__row .handle-field{flex:1; min-width:200px;}
.fr-titulo{margin:26px 0 12px;}

.fr-lista{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:8px;}
.fr-linha{
  display:flex; align-items:center; gap:12px; padding:10px 14px;
  background:var(--white); border:1px solid var(--line); border-radius:12px;
}
/* O link cobre foto e nome; as ações ficam FORA dele — um botão dentro de um
   link é marcação inválida e o clique fica ambíguo. */
.fr-linha__link{
  display:flex; align-items:center; gap:12px; flex:1; min-width:0;
  text-decoration:none; color:inherit;
}
.fr-linha__link:hover .fr-linha__id strong{color:var(--blue-600);}
.fr-linha__avatar{
  width:40px; height:40px; border-radius:50%; flex:0 0 auto; overflow:hidden;
  display:flex; align-items:center; justify-content:center;
  background:var(--gray-100); color:var(--gray-500); font-weight:700; font-size:14px;
}
.fr-linha__avatar img{width:100%; height:100%; object-fit:cover; display:block;}
.fr-linha__id{display:flex; flex-direction:column; min-width:0;}
.fr-linha__id strong{font-size:14px; color:var(--navy-900); transition:color .16s ease;}
.fr-linha__handle{
  font-family:var(--mono); font-size:11.5px; color:var(--gray-500);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.fr-linha__acoes{display:flex; align-items:center; gap:8px; flex:0 0 auto;}
.fr-linha__recusar{
  appearance:none; background:none; border:0; padding:6px 8px; cursor:pointer;
  font-family:inherit; font-size:12.5px; color:var(--gray-500); transition:color .16s ease;
}
.fr-linha__recusar:hover{color:#DC2626;}
/* "Ver perfil" é a ação principal da linha; "Desfazer" fica em cinza, como
   está, para as duas não competirem. */
.fr-linha__ver{
  padding:6px 8px; font-size:12.5px; font-weight:600; color:var(--blue-600);
  text-decoration:none; white-space:nowrap;
}
.fr-linha__ver:hover{text-decoration:underline;}
@media (max-width:560px){
  .fr-linha{flex-wrap:wrap;}
  .fr-linha__acoes{width:100%; justify-content:flex-end;}
}

/* ---------- Perfil visitado ----------
   Somente leitura: nada aqui tem estado de clique, nem cursor de ponteiro.
   Se um dia alguém acrescentar uma ação nesta tela, vai precisar inventar o
   estilo dela — o que é justamente o atrito desejado. */
/* Só topo e base: o atalho `padding` zerava o recuo lateral que .wrap dá
   (0 28px), e a página encostava nas bordas da tela em qualquer largura. */
.fr-visita{padding-top:32px; padding-bottom:70px;}
.fr-visita__voltar{
  display:inline-flex; align-items:center; gap:6px; margin-bottom:18px;
  font-size:13px; color:var(--gray-500); text-decoration:none;
}
.fr-visita__voltar:hover{color:var(--navy-900);}
.fr-visita__head{
  display:flex; align-items:center; gap:18px; flex-wrap:wrap; margin-bottom:32px;
  padding:22px 24px; border-radius:16px; color:#fff;
  background:linear-gradient(135deg, var(--navy-950) 0%, var(--navy-800) 100%);
}
.fr-visita__avatar{
  width:76px; height:76px; border-radius:16px; flex:0 0 auto; overflow:hidden;
  display:flex; align-items:center; justify-content:center; background:var(--navy-800);
  border:2px solid var(--blue-500); box-shadow:0 0 0 4px rgba(16,185,129,0.15);
}
.fr-visita__avatar img{width:100%; height:100%; object-fit:cover; display:block;}
.fr-visita__inicial{font-size:24px; font-weight:700; color:var(--blue-500);}
.fr-visita__id{flex:1; min-width:0;}
.fr-visita__id h1{font-size:22px; margin:0; color:#fff;}
.fr-visita__handle{font-family:var(--mono); font-size:13px; color:var(--blue-500); margin:2px 0 0;}
.fr-visita__ocupacao{font-size:13px; color:var(--gray-300); margin:4px 0 0;}
.fr-visita__nivel{display:flex; align-items:center; gap:8px; flex-wrap:wrap;}
.fr-visita__nivel-rotulo{font-size:13px; color:var(--gray-300);}
.fr-visita__nivel-valor{
  width:34px; height:34px; border-radius:50%; display:flex; align-items:center; justify-content:center;
  border:2px solid var(--blue-500); font-weight:700; color:#fff;
}
.fr-visita__nivel-nome{font-size:13px; color:var(--gray-300);}

/* Ação sobre a pessoa, à direita do cartão de identidade. Botão de contorno
   claro sobre o fundo escuro — o .btn--ghost do site é feito para fundo claro
   e sumiria aqui. */
.fr-visita__acoes{display:flex; flex-wrap:wrap; gap:8px;}
.fr-visita__acao{
  display:inline-flex; align-items:center; padding:9px 16px; border-radius:10px;
  font-size:13px; font-weight:600; text-decoration:none; white-space:nowrap;
  color:#fff; border:1px solid rgba(255,255,255,0.28); background:rgba(255,255,255,0.06);
  transition:background .16s ease, border-color .16s ease;
}
.fr-visita__acao:hover{background:rgba(255,255,255,0.14); border-color:rgba(255,255,255,0.5);}

/* Linha de números — o resumo do perfil numa olhada. Sem moldura: são fatos,
   não cartões clicáveis, e emoldurar cada um viraria ruído.
   Valor e rótulo na MESMA linha, separados por um fio: empilhados, cada par
   virava um bloquinho e os quatro juntos pareciam quatro cartões sem borda,
   ocupando duas alturas de texto para dizer quatro números. */
.fr-numeros{
  list-style:none; margin:18px 0 0; padding:0;
  display:flex; flex-wrap:wrap; align-items:baseline; gap:10px 0;
}
.fr-numero{
  display:flex; align-items:baseline; gap:7px;
  padding:0 18px; border-left:1px solid var(--line);
}
.fr-numero:first-child{padding-left:0; border-left:none;}
.fr-numero__valor{font-family:var(--mono); font-size:20px; font-weight:700; color:var(--navy-900); line-height:1.1;}
.fr-numero__rotulo{font-size:12.5px; color:var(--gray-500); letter-spacing:0.01em;}

/* Cada seção num cartão, como o resto do site (Minha Área, painéis). Soltas
   no fundo da página, Competências/Conquistas/Biblioteca não tinham onde
   começar e onde terminar — a tela parecia um documento, não um perfil. */
.fr-visita__secao{
  margin-top:20px; padding:22px 24px; background:var(--white);
  border:1px solid var(--line); border-radius:16px;
}

/* Coluna estreita (Competências + Conquistas) ao lado da Biblioteca. O limite
   de 420px é o do próprio radar (max-width:400px + respiro): abaixo disso ele
   encolhe e os rótulos dos eixos ficam pequenos demais para ler. */
.fr-visita__colunas{
  display:grid; grid-template-columns:minmax(300px, 420px) minmax(0, 1fr);
  gap:20px; align-items:start; margin-top:20px;
}
.fr-visita__coluna{display:flex; flex-direction:column; gap:20px; min-width:0;}
/* O espaçamento entre cartões passa a ser o gap do grid — a margem de cada
   seção somaria a ele e desalinharia o topo das duas colunas. */
.fr-visita__colunas .fr-visita__secao{margin-top:0;}
@media (max-width:1000px){
  /* Volta à pilha na ordem de leitura: quem tem a tela estreita prefere ver
     a estante inteira a ver duas colunas espremidas. */
  .fr-visita__colunas{grid-template-columns:1fr;}
}
.fr-visita__titulo{font-size:17px; margin:0 0 4px;}
.fr-visita__nota{font-size:13.5px; color:var(--gray-600); margin:0 0 20px;}

/* Prateleiras (Audiovisual · Leitura · Áudio) — mesma etiqueta discreta da
   estante do dono, mas escrita aqui: esta página estende base.html e não
   carrega o CSS do Organizador (ver o comentário em .fr-item__blank). */
/* Ações do visitante (convidar para uma equipe). Ficam logo abaixo da
   identidade, separadas das seções de conteúdo. */
.fr-visita__acoes{display:flex; flex-wrap:wrap; gap:10px; margin:16px 0 4px;}
.fr-visita__acao{font-size:13px;}

/* Conquistas — lista de insígnias já desbloqueadas, sem as que faltam. */
.fr-conquistas{
  list-style:none; margin:16px 0 0; padding:0; display:grid; gap:12px;
  grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));
}
/* Nome em cima, data embaixo. Lado a lado, a data empurrada para a direita
   espremia o nome e o quebrava no meio da palavra ("Maratonis/ta"). */
.fr-conquista{
  display:grid; grid-template-columns:auto 1fr; align-items:center; gap:2px 11px;
  padding:12px 14px; background:var(--white); border:1px solid var(--line);
  border-radius:12px; min-width:0;
}
.fr-conquista .up-achv-badge{width:26px; height:26px; flex-shrink:0; grid-row:span 2;}
.fr-conquista__nome{font-size:13px; font-weight:600; color:var(--navy-900); min-width:0;}
.fr-conquista__data{font-family:var(--mono); font-size:10.5px; color:var(--gray-400);}

/* Sem teto, o radar cresce até a largura do cartão e domina a página. O
   perfil do dono limita a 460px; aqui, num cartão mais estreito, 400 cabe
   melhor. Centralizado porque é um gráfico, não um bloco de texto. */
.fr-visita__secao .dsp--so-radar .cp-chart{display:flex; justify-content:center;}
.fr-visita__secao .dsp--so-radar .cp-chart svg{width:100%; max-width:400px; height:auto;}

/* Sugestões da busca de amigos — foto e nome antes de enviar o convite. */
.fr-add__row{position:relative;}
.fr-sugestoes{
  position:absolute; z-index:30; left:0; right:0; top:calc(100% + 6px);
  list-style:none; margin:0; padding:6px; max-height:296px; overflow-y:auto;
  background:var(--white); border:1px solid var(--line); border-radius:12px;
  box-shadow:0 12px 28px rgba(15,23,42,.14);
}
.fr-sugestoes[hidden]{display:none;}
.fr-sugestao{
  display:flex; align-items:center; gap:10px; padding:8px 10px; border-radius:9px;
  cursor:pointer; min-width:0;
}
.fr-sugestao:hover,
.fr-sugestao.is-ativa{background:var(--gray-50);}
.fr-sugestao__foto{
  width:34px; height:34px; border-radius:50%; flex:0 0 auto; overflow:hidden;
  display:flex; align-items:center; justify-content:center;
  background:var(--navy-800); color:#fff; font-size:12px; font-weight:700;
}
.fr-sugestao__foto img{width:100%; height:100%; object-fit:cover; display:block;}
.fr-sugestao__id{display:flex; flex-direction:column; min-width:0; line-height:1.3;}
.fr-sugestao__id strong{font-size:13.5px; color:var(--navy-900); overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.fr-sugestao__handle{font-family:var(--mono); font-size:11.5px; color:var(--gray-500);}
.fr-sugestao__situacao{
  margin-left:auto; flex:0 0 auto; font-size:10.5px; color:var(--gray-500);
  background:var(--gray-100); border-radius:999px; padding:3px 8px; white-space:nowrap;
}

/* Cabeçalho de seção com ação à direita (Biblioteca -> "Ver completa"). */
.fr-visita__secao-head{display:flex; align-items:flex-start; justify-content:space-between; gap:16px; flex-wrap:wrap;}
.fr-visita__ver-tudo{
  font-size:13px; font-weight:600; color:var(--blue-600); text-decoration:none;
  white-space:nowrap; padding-top:2px;
}
.fr-visita__ver-tudo:hover{text-decoration:underline;}
/* Quantos títulos daquela prateleira ficaram de fora da prévia. */
.fr-shelf__resto{margin:14px 0 0; font-size:12.5px;}
.fr-shelf__resto a{color:var(--gray-500); text-decoration:none;}
.fr-shelf__resto a:hover{color:var(--navy-900); text-decoration:underline;}

/* Barra de filtros da biblioteca do amigo. */
.fr-bib-bar{display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap; margin-bottom:4px;}
.fr-bib-filtros{display:flex; align-items:center; gap:10px; flex-wrap:wrap;}
.fr-bib-total{font-family:var(--mono); font-size:12px; color:var(--gray-400); white-space:nowrap;}

.fr-shelf{margin-top:34px;}
.fr-shelf:first-of-type{margin-top:18px;}
.fr-shelf__titulo{
  display:flex; align-items:center; gap:10px; margin:0;
  font-family:var(--mono); font-size:11px; font-weight:500; letter-spacing:.14em;
  text-transform:uppercase; color:var(--gray-500);
}
.fr-shelf__titulo::after{content:""; flex:1; height:1px; background:var(--line);}
.fr-shelf__contagem{font-family:var(--mono); font-size:11px; letter-spacing:0; color:var(--gray-400);}
.fr-grid{
  list-style:none; margin:0; padding:0; display:grid; gap:26px 20px; margin-top:18px;
  grid-template-columns:repeat(auto-fill, minmax(176px, 1fr));
}
.fr-item{display:flex; flex-direction:column; gap:9px; min-width:0;}
.fr-item__capa{
  position:relative; aspect-ratio:2/3; border-radius:10px; overflow:hidden;
  background:var(--gray-100); display:flex; align-items:center; justify-content:center;
  box-shadow:inset 0 0 0 1px rgba(15,23,42,.07);
}
.fr-item__capa img{width:100%; height:100%; object-fit:cover; display:block;}
/* Sem capa, o título faz as vezes da arte — mesma solução da estante do dono,
   mas com estilo próprio: esta página estende base.html e não carrega o CSS
   do Organizador. Depender dele deixaria a tela quebrada se alguém mexesse
   lá sem lembrar daqui. */
.fr-item__blank{
  position:relative; display:flex; align-items:center; justify-content:center;
  width:100%; height:100%; padding:24px 16px; box-sizing:border-box; text-align:center;
  font-size:15px; font-weight:400; line-height:1.62; letter-spacing:.09em;
  text-transform:uppercase; color:var(--tipo, var(--gray-500));
  background:var(--gray-100);
  background:color-mix(in srgb, var(--tipo, var(--gray-500)) 7%, var(--white));
}
.fr-item__blank::before{
  content:""; position:absolute; inset:10px; border-radius:5px; pointer-events:none;
  border:1px solid var(--gray-300);
  border-color:color-mix(in srgb, var(--tipo, var(--gray-500)) 32%, var(--white));
}
.fr-item__blank-txt{
  display:-webkit-box; -webkit-line-clamp:5; -webkit-box-orient:vertical;
  overflow:hidden; overflow-wrap:anywhere;
}
.fr-item__dot{
  display:inline-block; width:6px; height:6px; border-radius:50%;
  background:var(--tipo); margin-right:7px; vertical-align:middle;
  position:relative; top:-1px;
}
.fr-item__titulo{
  font-size:13px; font-weight:600; color:var(--navy-900); line-height:1.4; overflow-wrap:anywhere;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.fr-item__meta{
  font-size:11.5px; color:var(--gray-500); line-height:1.4; margin-top:-5px;
  display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
/* Estrelas como imagem, não como controle: sem cursor, sem hover, sem foco. */
.fr-stars{display:flex; align-items:center; gap:1px;}
.fr-star{width:13px; height:13px; fill:var(--gray-300); flex:0 0 auto;}
.fr-star.is-on{fill:var(--navy-900);}
.fr-stars__out{font-family:var(--mono); font-size:11.5px; color:var(--gray-400); margin-left:5px;}
@media (max-width:560px){
  /* No estreito o nível cabia na MESMA linha do nome e o espremia — "Rodrigo
     Teste" quebrava em duas linhas com o selo colado ao lado. Largura cheia
     empurra cada bloco para a própria linha. */
  .fr-visita__head{padding:18px; gap:14px;}
  .fr-visita__avatar{width:60px; height:60px; border-radius:14px;}
  .fr-visita__id{flex-basis:calc(100% - 74px);}
  .fr-visita__nivel,
  .fr-visita__acoes{width:100%;}
  .fr-visita__acao{flex:1; justify-content:center;}
  /* Continua em fila, só que sem os fios: com o rótulo AO LADO do valor cada
     item ficou largo o bastante para quebrar sozinho em 2 por linha, e a
     grade de duas colunas fixas passou a esticar os pares até as bordas. O
     fio some porque, ao quebrar, ele abriria a linha de baixo. */
  .fr-numeros{gap:10px 22px;}
  .fr-numero{padding:0; border-left:none;}
  .fr-visita__secao{padding:18px;}
}
@media (max-width:520px){
  .fr-grid{grid-template-columns:repeat(2, 1fr); gap:20px 14px;}
  .fr-shelf{margin-top:28px;}
  .fr-star{width:12px; height:12px;}
}

/* ---------- Assinatura (Stripe): botões de /planos e página "Minha
   assinatura" ----------
   O botão de assinar virou um <form> POST (o checkout precisa ser um POST
   com token CSRF). `display:contents` faz o form sumir da caixa: o <button>
   segue sendo filho direto do .pricing-card, e o `flex:1` da lista de
   recursos continua empurrando o botão para o rodapé do card como antes. */
.pricing-cta-form{display:contents;}
/* A margem de baixo existe por causa do `margin:-28px` do .pricing-grid: os
   cartões sobem para encavalar no hero, e sem essa folga eles subiam por
   cima do aviso — a mensagem era renderizada e ficava ilegível atrás deles.
   O z-index garante o resto se a margem mudar um dia. */
.pricing-flashes{padding-top:28px; margin-bottom:36px; position:relative; z-index:2;}
.pricing-flash{
  border-radius:12px; padding:12px 16px; font-size:13.5px; line-height:1.5;
  border:1px solid rgba(255,255,255,0.12); background:rgba(255,255,255,0.04); color:var(--gray-300);
}
.pricing-flash--error{border-color:rgba(239,68,68,0.4); background:rgba(239,68,68,0.1); color:#FCA5A5;}
.pricing-flash + .pricing-flash{margin-top:10px;}

/* Faixa de quem já assina, no topo de /planos. Verde e discreta: é
   informação, não alerta — a pessoa fez tudo certo, só precisa saber onde
   trocar de plano em vez de tentar assinar de novo. */
.pricing-assinante{
  display:flex; align-items:flex-start; gap:10px;
  border:1px solid rgba(16,185,129,0.35); background:rgba(16,185,129,0.08);
  border-radius:12px; padding:13px 16px; font-size:13.5px; line-height:1.55; color:var(--gray-300);
}
.pricing-assinante .icon{width:15px; height:15px; color:#10B981; flex-shrink:0; margin-top:3px;}
/* Aviso de quem voltou do Stripe sem concluir. Cinza, nao verde nem vermelho:
   nao houve erro e nao ha nada comemorar -- a pessoa so mudou de ideia, e uma
   tarja colorida faria parecer que algo quebrou. Mesma caixa do aviso de
   assinante logo acima, para nao introduzir uma forma nova na pagina. */
.pricing-retomar{
  border:1px solid rgba(255,255,255,0.16); background:rgba(255,255,255,0.05);
  border-radius:12px; padding:13px 16px; font-size:13.5px; line-height:1.55; color:var(--gray-300);
}
.pricing-retomar strong{color:#fff; font-weight:600;}
.pricing-assinante strong{color:#fff; font-weight:600;}
.pricing-assinante a{color:#6EE7B7; text-decoration:underline;}

/* O cartão do plano que a pessoa já tem: mesma caixa dos outros botões, mas
   sem ação — clicar nele não levaria a lugar nenhum. */
.pricing-cta--atual{
  display:inline-flex; align-items:center; justify-content:center;
  background:rgba(255,255,255,0.06) !important; border:1px solid rgba(255,255,255,0.18) !important;
  color:var(--gray-300) !important; cursor:default;
}
.pricing-cta--atual:hover{background:rgba(255,255,255,0.06) !important; transform:none;}

.sub-page{max-width:760px; padding:48px 20px 80px;}
.sub-page--narrow{max-width:600px;}
.sub-page__head{margin-bottom:26px;}
.sub-page__title{font-size:28px; font-weight:700; color:var(--navy-950); margin:0 0 6px;}
.sub-page__desc{font-size:14.5px; color:var(--gray-500); line-height:1.6; margin:0;}
.sub-page__foot{margin-top:28px; font-size:12.5px; color:var(--gray-400); line-height:1.6;}

.sub-card{
  background:var(--white); border:1px solid var(--line); border-radius:16px;
  padding:26px 26px 24px; box-shadow:0 6px 20px rgba(15,23,42,0.05);
}
.sub-card + .sub-card{margin-top:18px;}
.sub-card__head{display:flex; align-items:flex-start; justify-content:space-between; gap:16px; flex-wrap:wrap;}
.sub-card__label{display:block; font-size:11.5px; text-transform:uppercase; letter-spacing:0.06em; color:var(--gray-400); margin-bottom:4px;}
.sub-card__plan{font-size:21px; font-weight:700; color:var(--navy-950); margin:0;}
.sub-card__desc{font-size:14px; color:var(--gray-500); line-height:1.65; margin:10px 0 0;}
.sub-card__actions{display:flex; align-items:center; gap:14px; flex-wrap:wrap; margin-top:22px;}
/* Mesmo motivo do .pricing-cta-form: o botão que abre o Portal do Cliente
   precisa ser um POST com token CSRF, e sem isto o <form> em volta dele
   esticaria por toda a linha, empurrando a dica de texto para baixo. */
.sub-card__actions form{display:contents;}
.sub-card__hint{font-size:12.5px; color:var(--gray-400); line-height:1.5;}

.sub-badge{
  font-size:11.5px; font-weight:600; padding:5px 11px; border-radius:999px; white-space:nowrap;
  background:var(--blue-50); color:var(--blue-600); border:1px solid var(--blue-100);
}
.sub-badge--alert{background:#FEF3C7; color:#B45309; border-color:#FDE68A;}

.sub-facts{display:flex; flex-wrap:wrap; gap:12px 40px; margin:20px 0 0;}
.sub-fact dt{font-size:11.5px; text-transform:uppercase; letter-spacing:0.05em; color:var(--gray-400); margin-bottom:3px;}
.sub-fact dd{margin:0; font-size:15px; font-weight:600; color:var(--navy-900);}

.sub-note{display:flex; align-items:flex-start; gap:9px; margin:18px 0 0; padding:12px 14px; border-radius:10px; font-size:13.2px; line-height:1.55;}
.sub-note .icon{flex-shrink:0; margin-top:2px;}
.sub-note--alert{background:#FFFBEB; border:1px solid #FDE68A; color:#92400E;}

.sub-history{margin-top:30px;}
.sub-history__title{font-size:14px; font-weight:600; color:var(--gray-500); margin:0 0 12px;}
.sub-history__list{list-style:none; margin:0; padding:0; border:1px solid var(--line); border-radius:12px; overflow:hidden;}
.sub-history__item{display:flex; align-items:center; gap:14px; flex-wrap:wrap; padding:12px 16px; background:var(--white); font-size:13.5px;}
.sub-history__item + .sub-history__item{border-top:1px solid var(--line);}
.sub-history__plan{font-weight:600; color:var(--navy-900); flex:1; min-width:140px;}
.sub-history__status{color:var(--gray-500);}
.sub-history__date{color:var(--gray-400); font-variant-numeric:tabular-nums;}

@media (max-width:560px){
  .sub-page{padding:32px 16px 60px;}
  .sub-card{padding:22px 18px;}
  .sub-card__actions{align-items:stretch; flex-direction:column;}
  .sub-card__actions .btn{width:100%; justify-content:center;}
}

/* ---------- "Sair" do menu ----------
   Virou um <form> POST (como GET, qualquer site conseguia derrubar a sessão
   do visitante — ver auth.logout). O display:contents tira o form da caixa,
   então o botão continua sendo filho direto de .nav__links como os <a>
   vizinhos, e as regras abaixo repetem exatamente a aparência deles. */
.nav__sair-form{display:contents;}
.nav__sair{
  font-family:inherit; background:none; border:none; cursor:pointer;
  display:inline-flex; align-items:center; gap:10px;
  color:var(--gray-300); font-size:13.5px; font-weight:500;
  padding:9px 12px; border-radius:7px; transition:all .15s ease; white-space:nowrap;
}
.nav__sair:hover{color:#fff; background:rgba(255,255,255,0.08);}

/* ---------- Mapa mental interativo dos módulos de curso ----------
   Ver app/static/js/mapa-mental.js. As caixas são posicionadas por
   `transform`, e é nele que a transição acontece — mexer em `top`/`left`
   dispararia relayout a cada quadro, e a animação engasgaria num mapa
   grande. As linhas ficam num SVG atrás, redesenhadas pelo JS. */
/* O mapa cresce para a direita conforme os ramos abrem, e um mapa fundo
   passa de qualquer largura de tela. Ele rola dentro da própria caixa: sem
   isto, empurra o corpo da página e o site inteiro ganha barra horizontal. */
.mm{position:relative; padding-bottom:6px;}
.mm__viewport{
  overflow:auto; cursor:grab;
  /* A janela acompanha a altura do conteúdo ao afastar, mas não cresce ao
     aproximar — ver dimensionar() no JS. */
  transition:height .56s cubic-bezier(.22,1,.36,1);
}
.mm--arrastando .mm__viewport{cursor:grabbing;}
/* Enquanto se arrasta, o texto não pode entrar em seleção: o cursor viraria
   barra e o gesto pareceria quebrado no meio. */
.mm--arrastando, .mm--arrastando *{user-select:none;}
.mm__viewport::-webkit-scrollbar{height:8px; width:8px;}
.mm__viewport::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.16); border-radius:99px;}
.mm__viewport::-webkit-scrollbar-track{background:transparent;}
/* Existe só para dar ao scroll a extensão do mapa já ampliado: um elemento
   com `scale` continua ocupando o tamanho original no fluxo. */
.mm__sizer{
  position:relative; margin:0 auto;
  transition:width .56s cubic-bezier(.22,1,.36,1),
             height .56s cubic-bezier(.22,1,.36,1);
}

/* Barra de ferramentas: aproximar, afastar e abrir/recolher tudo. Fica à
   direita porque a raiz do mapa nasce à esquerda. */
.mm__ferramentas{
  position:absolute; top:10px; right:10px; z-index:2;
  display:flex; flex-direction:column; gap:6px;
}
.mm__ferramenta{
  width:30px; height:30px; padding:0; cursor:pointer;
  display:flex; align-items:center; justify-content:center;
  background:var(--navy-800); color:var(--gray-200);
  border:1px solid rgba(255,255,255,0.12); border-radius:8px;
  box-shadow:0 2px 8px rgba(2,6,16,0.3);
  transition:background .2s ease, border-color .2s ease, color .2s ease;
}
.mm__ferramenta:hover:not(:disabled){
  background:var(--navy-700); border-color:rgba(110,231,183,0.45); color:#6EE7B7;
}
.mm__ferramenta:focus-visible{outline:2px solid #6EE7B7; outline-offset:2px;}
.mm__ferramenta:disabled{opacity:.4; cursor:default;}
.mm__ferramenta svg{width:16px; height:16px; display:block;}
.mm__ferramenta path{
  fill:none; stroke:currentColor; stroke-width:1.8;
  stroke-linecap:round; stroke-linejoin:round;
}
/* O palco tem largura e altura trocadas pelo JS a cada abertura. Sem
   transição aqui, a moldura do mapa saltava para o tamanho novo num quadro
   só enquanto as caixas ainda deslizavam — o corte seco que fazia a
   animação inteira parecer bruta, por mais suave que fosse a das caixas. */
.mm__palco{
  position:relative;
  /* Canto superior esquerdo: é a origem que o cálculo de zoom no JS assume
     ao recentralizar a janela. Com o padrão (centro), aproximar deslocaria
     o mapa além do que a conta prevê. */
  transform-origin:0 0;
  transition:width .56s cubic-bezier(.22,1,.36,1),
             height .56s cubic-bezier(.22,1,.36,1),
             transform .28s cubic-bezier(.22,1,.36,1);
}
.mm__linhas{position:absolute; top:0; left:0; overflow:visible; pointer-events:none;}
.mm__linhas path{
  fill:none; stroke:rgba(110,231,183,0.45); stroke-width:1.6;
  stroke-linecap:round;
}
.mm__nos{position:absolute; top:0; left:0;}

.mm__no{
  position:absolute; top:0; left:0;
  /* `width:max-content` é obrigatório aqui. Um elemento absoluto dentro de
     um contêiner sem largura (.mm__nos) encolhe até a maior PALAVRA, e o
     max-width não segura isso — as caixas saíam quebradas em quatro linhas
     quando o texto cabia em uma. Com max-content, a caixa pede o tamanho do
     texto e só então o max-width impõe a quebra. */
  width:max-content; max-width:260px;
  display:inline-flex; align-items:center;
  padding:11px 15px; border-radius:11px;
  font-family:var(--sans); font-size:13.5px; line-height:1.4; text-align:left;
  background:var(--navy-800); color:var(--gray-100);
  border:1px solid rgba(255,255,255,0.09);
  box-shadow:0 4px 14px rgba(2,6,16,0.28);
  /* easeOutQuint (.22,1,.36,1): sai rápido e passa a maior parte do tempo
     desacelerando, então o nó "assenta" no lugar em vez de parar seco. Meio
     segundo é bastante para uma caixa que anda ~250px, e é o que separa o
     movimento elegante do apressado. A opacidade fecha antes do percurso
     (.34s de .56s): a caixa já está legível enquanto ainda desliza. */
  transition:transform .56s cubic-bezier(.22,1,.36,1),
             opacity .34s cubic-bezier(.33,1,.68,1),
             background .2s ease, border-color .2s ease;
  will-change:transform, opacity;
}
button.mm__no{cursor:pointer;}
button.mm__no:hover{background:var(--navy-700); border-color:rgba(110,231,183,0.4);}
button.mm__no:focus-visible{outline:2px solid #6EE7B7; outline-offset:2px;}

.mm__no--raiz{background:#312e4d; border-color:rgba(167,139,250,0.3); font-weight:600; font-size:14px;}
.mm__no[data-nivel="2"]{background:#1f3a2e; border-color:rgba(16,185,129,0.22);}
.mm__no[data-nivel="3"]{background:#1b3328; border-color:rgba(16,185,129,0.18);}
.mm__no--folha{box-shadow:0 3px 10px rgba(2,6,16,0.22);}

/* A seta fica FORA da caixa, encostada no início da linha que sai dela —
   é onde o olho procura o controle de abrir/fechar, e é assim no material
   de referência. Posicionada por `margin-top` e não por `translateY`,
   porque o `transform` precisa ficar livre para a rotação do estado. */
.mm__seta{
  position:absolute; right:-21px; top:50%; margin-top:-9px;
  width:18px; height:18px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:#1b2534; border:1px solid rgba(255,255,255,0.14);
  transition:transform .46s cubic-bezier(.22,1,.36,1), background .25s ease,
             border-color .25s ease;
}
.mm__seta svg{width:12px; height:12px; display:block;}
.mm__seta path{
  fill:none; stroke:var(--gray-200); stroke-width:1.7;
  stroke-linecap:round; stroke-linejoin:round;
}
/* Fechada aponta para o conteúdo escondido; aberta aponta de volta ao pai. */
.mm__no--aberto .mm__seta{
  transform:rotate(180deg);
  background:#16352a; border-color:rgba(110,231,183,0.45);
}
.mm__no--aberto .mm__seta path{stroke:#6EE7B7;}
button.mm__no:hover .mm__seta{border-color:rgba(110,231,183,0.55);}

.mm__ajuda{margin-top:14px; font-size:12.5px; color:var(--gray-500);}

@media (prefers-reduced-motion:reduce){
  .mm__no, .mm__seta, .mm__palco, .mm__sizer, .mm__viewport{transition:none;}
}
/* O JS também respeita esta preferência: sem ela, a cascata entre irmãos é
   desligada e todos assumem a posição final de uma vez. */

/* ==========================================================================
   HOME — reorganização visual
   ==========================================================================

   Só a Home usa este bloco: tudo aqui está preso a `.home-v2`, que é a classe
   do <body> dessa página. Nenhuma regra escapa para o resto do site, e é por
   isso que dá para mexer no ritmo e na tipografia sem conferir cinco telas a
   cada linha.

   O que este arquivo resolve, em ordem de importância:

     1. RITMO. As seções tinham 64px de respiro fixo; a página inteira lia
        como uma lista. Agora o espaço entre seções cresce com a tela
        (60px no celular, até 130px no monitor grande), que é o que separa
        "muito conteúdo" de "conteúdo amontoado".

     2. UMA ESCALA TIPOGRÁFICA SÓ. Antes cada seção tinha o seu tamanho de
        título. Aqui existem três tamanhos — eyebrow, título de seção,
        descrição — e toda seção usa os mesmos.

     3. A ILUSTRAÇÃO DO HERO NO CELULAR. Ela era `position:absolute` e sumia
        abaixo de 980px: a imagem principal da Home não existia no telefone.
   ========================================================================== */

/* ---------------------------------------------------------------- ritmo */
.home-v2 .home-secao{
  padding-block: clamp(60px, 9vw, 130px);
}
/* Duas caixas iguais coladas (debates + panorama) nao precisam do respiro
   inteiro entre elas: o assunto e o mesmo, e o vao dobrado parecia falha.

   A regra antiga era `.home-secao + .home-secao:not([id])`, usando "nao tem
   id" como atalho para "e a segunda de duas caixas iguais". Nao e a mesma
   coisa: pegava tambem os Numeros, as Atualizacoes e a PRIMEIRA das duas
   caixas, e as tres ficavam sem respiro nenhum em cima, coladas na secao
   anterior. Agora diz exatamente o que quer dizer. */
.home-v2 .home-secao--escura + .home-secao--escura{padding-top:0;}

/* Os artigos SAO a continuacao de "Reforma Tributaria em movimento" — por
   isso nao tem cabecalho proprio. Entao encostam nela de proposito, em vez
   de abrir um respiro de secao que sugeriria um assunto novo. */
.home-v2 .featured-section{padding-top:0; padding-bottom:clamp(60px, 9vw, 130px);}

/* O fechamento tambem entra no ritmo; estava com os 56px originais. */
.home-v2 .closing-cta{padding-block:clamp(60px, 9vw, 130px);}

/* ------------------------------------------------------ superfície */
/* O body da Home é CLARO de propósito (--gray-50 com a textura suave); quem
   é escuro são as seções, cada uma pintando o próprio navy-950. As três
   seções novas — mapa, consultas e atualizações — precisam fazer o mesmo:
   sem isto, o título branco delas cai direto no fundo claro do body e vira
   texto branco sobre branco. Foi o que aconteceu, e só o print mostrou:
   toda medição de layout dava certo, porque o problema não era de layout. */
.home-v2 .mapa-secao,
.home-v2 .consultas-secao,
.home-v2 .atualizacoes-secao{background:var(--navy-950);}

/* ------------------------------------------------ cabeçalho de seção */
/* Um só, usado por todas as seções — antes cada uma tinha o próprio. */
.home-v2 .secao__head{
  max-width:62ch; margin:0 auto clamp(32px, 4vw, 56px); text-align:center;
}
.home-v2 .secao__eyebrow{
  display:inline-flex; align-items:center; gap:8px; margin-bottom:14px;
  font-size:12.5px; font-weight:600; letter-spacing:.1em; text-transform:uppercase;
  color:var(--blue-300);
}
.home-v2 .secao__eyebrow .dot{
  width:6px; height:6px; border-radius:50%; background:var(--blue-500);
}
.home-v2 .secao__title{
  font-size:clamp(30px, 4vw, 48px); line-height:1.12; letter-spacing:-0.02em;
  margin:0 0 16px; color:#fff;
}
.home-v2 .secao__title em{color:var(--blue-300); font-style:normal;}
.home-v2 .secao__desc{
  font-size:clamp(16px, 1.3vw, 19px); line-height:1.65;
  color:var(--gray-300); margin:0;
}

/* ------------------------------------------------------------------ hero */
/* 45% texto / 55% imagem, como pedido. A ilustração entra no grid em vez de
   flutuar por cima — era assim que ela desaparecia no celular. */
.home-v2 .hero-v2{
  /* O nav virou 2 linhas (~116px no desktop, era 64px no .hero base) --
     sem reduzir aqui, a mesma ilustração/texto de sempre passa a sobrar
     menos espaço acima da dobra, lendo como "fora de enquadramento"
     mesmo sem nada ter mudado no hero em si. Recupera parte do espaço
     vertical que o nav mais alto tomou. */
  padding-top:36px;
  padding-bottom:0;
  /* A ilustracao passa da base do hero de proposito (margem negativa la
     embaixo). O .hero tem overflow:hidden por causa da arte que ANTES era
     absoluta; aqui ela esta no fluxo, entao o corte so servia para cortar a
     imagem rente, justo onde a mascara ainda estava dissolvendo. */
  overflow:visible;
  /* MESMA cor do resto do site, chapada.

     O .hero base tem um degrade que termina em navy-700 e, por cima, dois
     halos brancos no ::after. Enquanto o hero ocupava a tela inteira isso
     era profundidade; com ele terminando logo abaixo da ilustracao, a faixa
     clara e o halo de baixo eram cortados rente na borda e viravam uma
     emenda horizontal dura contra o navy-950 da secao seguinte.

     Fundo igual dos dois lados da borda = nao existe borda. */
  background:var(--navy-950);
}
.home-v2 .hero-v2::after{display:none;}
.home-v2 .hero-v2__inner{
  grid-template-columns:minmax(0, 45fr) minmax(0, 55fr);
  gap:clamp(24px, 4vw, 64px); align-items:center;
}
.home-v2 .hero-v2 h1{
  font-size:clamp(42px, 5vw, 68px); line-height:1.05; letter-spacing:-0.03em;
  margin:0 0 20px;
}
.home-v2 .hero-v2 .hero__lede{
  font-size:clamp(16px, 1.4vw, 19px); line-height:1.65; max-width:52ch;
}
.home-v2 .hero-v2__ctas{margin-top:30px; display:flex; gap:12px; flex-wrap:wrap;}
.home-v2 .hero-intro__cta-note{margin-top:16px;}

.home-v2 .hero-v2__art{
  position:static; display:flex; justify-content:center; align-items:center;
  pointer-events:none;
  /* A sombra fica no PAI, nunca no <img>: um `filter` no próprio elemento
     seria aplicado ANTES de qualquer recorte de caixa, e o brilho apareceria
     cortado reto na lateral. */
  filter:drop-shadow(0 20px 40px rgba(0,0,0,0.5)) drop-shadow(0 0 27px rgba(16,185,129,0.19));
}
.home-v2 .hero-v2__art img{
  display:block; width:100%; max-width:560px; height:auto;
  /* SEM máscara, de propósito.

     A arte anterior (902×1650) terminava num fio de circuito solitário: da
     metade para baixo só 7% dos pixels estavam acesos, e esse fio descia
     sozinho para dentro da seção seguinte — daí a máscara que o dissolvia
     entre 62% e 88% da altura.

     A arte nova (1040×1300) termina em base, anéis e reflexo: nessa mesma
     faixa 35% a 44% dos pixels estão acesos, e o pico de brilho está em 90%
     da altura. A máscara antiga cortaria bem no meio da base — era esse o
     corte brusco. Ela já se apaga sozinha: o alfa médio cai de 154 em 90%
     para 2 nos últimos 2%, e as bordas laterais ficam em alfa 1. Não há o
     que dissolver.

     A margem negativa fica, bem menor: só o bastante para o reflexo do chão
     encostar na seção de baixo em vez de deixar um vazio entre as duas. */
  margin-bottom:clamp(-70px, -5vw, -24px);
}

/* --------------------------------------------------------- perfis (wce) */
/* Os três cards passam a ser a mesma caixa. O do meio mantém o selo, mas
   perde o tamanho maior: três alturas diferentes diziam que um perfil vale
   mais que os outros. */
.home-v2 .wce-grid{gap:clamp(18px, 2vw, 28px); align-items:stretch;}
.home-v2 .wce-card{
  display:flex; flex-direction:column; height:100%;
  border-radius:18px; transform:none;
  transition:transform .2s ease, border-color .2s ease;
}
.home-v2 .wce-card--highlight{transform:none; box-shadow:none;}
.home-v2 .wce-card:hover{transform:translateY(-4px);}
.home-v2 .wce-card__body{display:flex; flex-direction:column; flex:1; padding:clamp(24px, 2vw, 32px);}
/* O CTA encosta na base de todos, então as três linhas terminam juntas
   mesmo com descrições de tamanhos diferentes. */
.home-v2 .wce-card__cta{margin-top:auto; padding-top:18px;}
.home-v2 .wce-card__media img{width:100%; height:auto; display:block;}

/* ---------------------------------------------------------- ferramentas */
.home-v2 .hub-grid{gap:clamp(16px, 1.6vw, 22px);}

/* ---------------------------------------------------------------- mapa */
/* Empilhado, não lado a lado: o widget (mapa + painel) já tem seu próprio
   layout interno responsivo (ver mapa-showcase.css) e precisa da largura
   cheia da seção pra render bem — o texto fica inteiro em cima, full width. */
.home-v2 .mapa-secao__inner{
  display:grid; grid-template-columns:1fr;
  gap:clamp(24px, 4vw, 40px);
}
.home-v2 .mapa-secao__copy{max-width:68ch;}
.home-v2 .mapa-secao__copy .secao__title{text-align:left;}
.home-v2 .mapa-secao__copy .hero__ctas{margin-top:24px; display:flex; gap:12px; flex-wrap:wrap;}
.home-v2 .mapa-secao__mapa{position:relative; z-index:2; width:100%;}

/* -------------------------------------------------------------- números */
.home-v2 .stats-section__title{
  font-size:clamp(30px, 4vw, 48px); line-height:1.12; letter-spacing:-0.02em;
}
.home-v2 .stats-section__desc{max-width:48ch;}
.home-v2 .stats-grid{margin-top:clamp(24px, 3vw, 40px);}
/* O número é o que fica; o rótulo explica. A distância entre os dois tamanhos
   é o que faz a diferença ser lida como hierarquia e não como desalinho. */
.home-v2 .stat-item__num{font-size:clamp(30px, 3.4vw, 44px); letter-spacing:-0.02em;}
.home-v2 .stat-item__label{font-size:13.5px; line-height:1.5;}
.home-v2 .stats-section__source{margin-top:clamp(20px, 2vw, 28px); font-size:12.5px;}

/* ------------------------------------------------------------ consultas */
/* Só a agenda de obrigações mora aqui agora — a consulta por NCM/NBS
   ganhou página própria em /consulta-fiscal (ver app/templates/
   consulta_fiscal/consulta.html). Grid de 1 coluna só, mantida (em vez de
   virar um <div> solto) pra herdar o mesmo espaçamento/alinhamento das
   outras seções da home sem duplicar regra. */
.home-v2 .consultas-grid{display:grid; grid-template-columns:1fr;}
.home-v2 .consultas-grid .tool-panel{border-radius:18px; padding:clamp(22px, 2.2vw, 30px);}

/* ---------------------------------------------------------- atualizações */
/* Data, fonte e categoria viram uma linha só, abaixo do título. Antes a
   etiqueta vinha ANTES do título e era a primeira coisa lida de cada item —
   o que importa é a manchete. */
.home-v2 .tool-panel--news{
  background:rgba(255,255,255,0.04); border:1px solid rgba(255,255,255,0.1);
  border-radius:18px; padding:clamp(20px, 2vw, 30px);
}
/* As abas foram escritas para o painel BRANCO original: "ativa" era
   navy-900. Com o painel escuro, a aba selecionada ficava navy sobre navy --
   some justamente a que indica onde voce esta. Aqui elas se invertem. */
.home-v2 .news-tabs{border-bottom-color:rgba(255,255,255,0.12);}
.home-v2 .news-tab{color:var(--gray-400);}
.home-v2 .news-tab:hover{color:var(--gray-200);}
.home-v2 .news-tab.active{color:#fff;}

.home-v2 .news-item{
  display:flex; flex-direction:column; gap:6px;
  padding:16px 0; border-bottom:1px solid rgba(255,255,255,0.07);
}
.home-v2 .news-item:last-child{border-bottom:none;}
.home-v2 .news-item__title{
  font-size:clamp(15px, 1.2vw, 17px); line-height:1.45; color:#fff; font-weight:600;
}
/* Era a unica interacao instantanea da pagina: todas as outras levam entre
   150 e 200ms, e esta trocava de cor num piscar. */
.home-v2 .news-item__title{transition:color .18s ease;}
.home-v2 .news-item:hover .news-item__title{color:var(--blue-300);}
.home-v2 .news-item__meta{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  font-size:12px; color:var(--gray-400);
}
.home-v2 .news-item__tag{
  font-size:10.5px; letter-spacing:.05em; text-transform:uppercase;
  padding:2px 8px; border-radius:999px;
  background:rgba(16,185,129,0.14); color:var(--blue-300);
}
.home-v2 .news-more-link{
  border-color:rgba(255,255,255,0.14); background:rgba(255,255,255,0.03); color:var(--blue-300);
}
.home-v2 .news-more-link:hover{border-color:var(--blue-400); background:rgba(255,255,255,0.06);}
/* O card da newsletter e' BRANCO. O subtitulo entrou depois do titulo, entao
   o respiro sai do h3 e passa para ca -- e a cor tem de ser a de texto
   secundario sobre claro, nao a da secao escura em volta. */
.home-v2 .newsletter-card h3{margin-bottom:8px;}
.home-v2 .newsletter-card__sub{
  font-size:14px; line-height:1.6; color:var(--gray-600); margin:0 0 18px;
}

/* As duas caixas de oferta (debates e Panorama) sao lidas de ponta a ponta:
   numa largura de 1200px a linha passa de 130 caracteres. */
.home-v2 .wrap--estreito{max-width:900px;}

/* ============================================ o fio claro entre as secoes */
/* O `body` do site e claro (--gray-50). Na Home, onde TODAS as secoes sao
   navy-950, esse claro nunca deveria aparecer — e aparecia, como um fio
   branco atravessando a pagina inteira na base do hero.

   O motivo e sub-pixel: a base do hero cai em 653,0125px, nao em 653. O
   navegador antialiasa essa linha, e ao misturar os dois blocos navy ele
   mistura tambem o que esta ATRAS deles, que era o body quase branco. Dava
   um fio de um pixel exatamente na emenda — e so ali, porque e a unica
   fronteira que calha de cair numa fracao.

   Foi por isso que trocar a cor dos dois lados nao resolveu (testei com os
   dois em #123456 e o fio continuou): a cor que vazava nao era de nenhum
   dos dois. Com o body escuro, a emenda mistura navy com navy e some — nesta
   e em qualquer outra fronteira que caia numa fracao depois. */
body.home-v2{background:var(--navy-950);}

/* =========================================================== fundo unico */
/* Tres secoes nao tinham fundo proprio e deixavam passar o `body`, que e
   claro (#F8FAFC): os artigos, as rodas de debate e o Panorama. No meio de
   uma pagina escura isso lia como buraco, e as caixas escuras de debate e
   Panorama viravam ilhas dentro de uma faixa branca.

   Vale so na Home (.home-v2). O /guia reaproveita o mesmo partial de artigos
   e continua claro, como sempre foi. */
/* `background-color`, nunca o atalho `background`: as secoes vizinhas tem
   imagem de fundo, e o atalho apagaria essa imagem junto. */
.home-v2 .featured-section,
.home-v2 .home-secao--escura{background-color:var(--navy-950);}

/* O que estava DENTRO dessas secoes foi desenhado para fundo claro. Trocar a
   cor do bloco sem trocar a do conteudo so mudaria o lugar do problema. */
.home-v2 .featured-catalog-link{color:#fff; border-bottom-color:rgba(255,255,255,0.25);}
.home-v2 .featured-catalog-link:hover{color:var(--blue-300); border-bottom-color:var(--blue-300);}
.home-v2 .featured-catalog-link .icon{color:var(--blue-300);}

/* O cartao da newsletter passa a ser a mesma superficie translucida dos
   paineis de consulta, em vez do cartao branco. */
.home-v2 .newsletter-card{
  background:rgba(255,255,255,0.04); border-color:rgba(255,255,255,0.1);
  box-shadow:none;
}
.home-v2 .newsletter-card h3{color:#fff;}
.home-v2 .newsletter-card h3 em{color:var(--blue-300);}
.home-v2 .newsletter-card__sub{color:var(--gray-300);}
.home-v2 .newsletter-form__field{color:var(--gray-300);}
.home-v2 .newsletter-form__field input{
  background:rgba(255,255,255,0.06); border-color:rgba(255,255,255,0.14); color:#fff;
}
.home-v2 .newsletter-form__field input::placeholder{color:var(--gray-400);}
.home-v2 .newsletter-form__field input:focus{
  border-color:var(--blue-500); box-shadow:0 0 0 3px rgba(16,185,129,0.18);
}
.home-v2 .newsletter-form__note{color:var(--gray-400);}
.home-v2 .newsletter-form__note a{color:var(--gray-200);}

/* Os Numeros sao a unica secao que nao usa .secao__head: o cabecalho dela
   mora dentro do .stats-section__inner, que vira `text-align:center` abaixo
   de 860px. Resultado: no celular todas as secoes alinhavam a esquerda e
   esta ficava centralizada, sozinha. */
@media(max-width:768px){
  .home-v2 .stats-section__inner{text-align:left;}
  .home-v2 .stats-section__desc{margin-left:0; margin-right:0;}
}

/* Debates e Panorama sao blocos de OFERTA, nao capitulos — o titulo deles
   fica menor que os 48px das secoes de proposito. Mas 22px era tamanho de
   titulo de card, perdido numa faixa de pagina inteira: existiam tres
   escalas de titulo na Home em vez de duas. */
.home-v2 .up-upsell__title{font-size:clamp(22px, 2.6vw, 30px); line-height:1.2;}
/* O texto desses dois blocos estava em 14px enquanto TODA descricao da pagina
   esta em ~19px. Dentro de um card de /planos 14px faz sentido; numa faixa de
   900px de largura era a mesma frase pedindo para ser lida com mais esforco
   que as outras. */
.home-v2 .up-upsell__desc{font-size:clamp(15px, 1.2vw, 17px); line-height:1.65;}

/* ------------------------------------------------------------ fechamento */
.home-v2 .closing-cta__inner{align-items:center; gap:clamp(24px, 3vw, 48px);}
.home-v2 .closing-cta h2{
  font-size:clamp(26px, 3vw, 38px); line-height:1.18; letter-spacing:-0.02em;
  max-width:22ch;
}
.home-v2 .closing-cta__acoes{display:flex; gap:12px; flex-wrap:wrap; flex-shrink:0;}

/* --------------------------------------------------------------- hovers */
/* Curtos e pequenos: 180ms e alguns pixels. Nada saltando. */
.home-v2 .hub-card{transition:transform .18s ease, border-color .18s ease, background .18s ease;}
.home-v2 .hub-card:hover{transform:translateY(-3px);}
@media (prefers-reduced-motion:reduce){
  .home-v2 .hub-card:hover,
  .home-v2 .wce-card:hover{transform:none;}
}

/* ================================================================ tablet */
@media(max-width:1024px){
  .home-v2 .hero-v2__inner{grid-template-columns:1fr; gap:8px;}
  /* Coluna única: a ilustração vem DEPOIS da mensagem. Acima dela, um PNG
     alto de 360px de largura passa de 650px de altura e o título começaria
     fora da primeira tela. */
  .home-v2 .hero-v2__art{order:0; justify-content:center; margin-top:24px;}
  .home-v2 .hero-v2__art img{max-width:380px; margin-bottom:clamp(-60px,-6vw,-20px);}
  .home-v2 .consultas-grid{grid-template-columns:1fr;}
}

/* ================================================================ celular */
@media(max-width:768px){
  /* A ilustração CONTINUA aparecendo — só menor, e DEPOIS do texto.
     Escondê-la era jogar fora a imagem que dá identidade à página justo em
     quem mais acessa por ela; deixá-la em cima era pior ainda: o PNG é alto
     (902×1650), então a 78vw de largura ele ficava com 535px de altura e
     empurrava o título e os botões para fora da primeira tela. Aqui ela vem
     abaixo da mensagem e se dissolve na seção seguinte. */
  .home-v2 .hero-v2__art{
    display:flex; justify-content:center; order:0; margin-top:20px;
    /* Mesmo brilho do desktop, só mais fraco: num desenho pequeno o halo de
       40px/27px de blur do desktop lê como neon, não como luz. */
    filter:drop-shadow(0 10px 18px rgba(0,0,0,0.45)) drop-shadow(0 0 14px rgba(16,185,129,0.14));
  }
  .home-v2 .hero-v2__art img{max-width:min(54vw, 210px); margin-bottom:clamp(-24px,-4vw,-8px);}
  .home-v2 .hero-v2 h1{font-size:clamp(26px, 7.2vw, 34px);}
  .home-v2 .hero-v2 .hero__lede{font-size:15px; margin-bottom:20px;}
  .home-v2 .hero__eyebrow{margin-bottom:16px;}
  .home-v2 .hero-v2__ctas .btn{flex:1 1 100%; justify-content:center; padding:12px 18px; font-size:12px;}
  .home-v2 .secao__head{text-align:left;}
  .home-v2 .closing-cta__inner{flex-direction:column; align-items:flex-start;}
  .home-v2 .closing-cta__acoes .btn{flex:1 1 100%; justify-content:center;}
  .home-v2 .closing-cta h2{max-width:none;}
}

@media(max-width:430px){
  /* Nada pode encostar na borda. */
  .home-v2 .consulta-painel{padding:20px 18px;}
  .home-v2 .wce-card__body{padding:22px 20px;}
}

/* ---------- Aviso de cookies (partials/consentimento.html) ----------
   Faixa fixa no rodapé da janela. "Recusar" e "Aceitar" com o mesmo peso
   visual: o aviso não empurra a resposta. */
.consentimento{
  position:fixed; left:16px; right:16px; bottom:16px; z-index:1200;
  display:flex; align-items:center; gap:14px 20px; flex-wrap:wrap;
  max-width:880px; margin:0 auto; padding:14px 18px; border-radius:14px;
  background:#0b1324; color:rgba(255,255,255,0.86); border:1px solid rgba(16,200,144,0.4);
  box-shadow:0 18px 40px rgba(0,0,0,0.45); font-size:13.5px; line-height:1.5;
}
.consentimento[hidden]{display:none;}
.consentimento__texto{margin:0; flex:1 1 360px;}
.consentimento__texto strong{color:#fff;}
.consentimento__texto a{color:#10C890; text-decoration:underline;}
.consentimento__acoes{display:flex; gap:10px; flex:0 0 auto;}
.consentimento__botao{
  min-width:112px; padding:9px 16px; border-radius:9px; cursor:pointer;
  font-family:inherit; font-size:13.5px; font-weight:600; color:#fff;
  background:rgba(255,255,255,0.08); border:1px solid rgba(255,255,255,0.35);
}
.consentimento__botao:hover{background:rgba(255,255,255,0.16);}
.consentimento__botao:focus-visible{outline:2px solid #10C890; outline-offset:2px;}
@media (max-width: 560px){
  .consentimento{left:10px; right:10px; bottom:10px; padding:12px 14px;}
  .consentimento__acoes{width:100%;}
  .consentimento__botao{flex:1;}
}

/* ---------- Documentos legais (Termos / Política, versionados) ----------
   O texto tem tabelas de até 6 colunas: a coluna fica mais larga que a de
   um artigo e cada tabela rola de lado dentro da própria caixa. */
.doc-legal{max-width:880px;}
.doc-legal__texto h3{font-size:18px; font-weight:600; margin:26px 0 10px; color:var(--navy-900);}
.doc-legal__texto ol{margin:0 0 20px 22px; padding:0;}
.doc-legal__texto ol li{font-size:16px; line-height:1.65; color:var(--gray-800); margin-bottom:8px; list-style:decimal;}
.doc-legal__texto .mt-tabela{overflow-x:auto; margin:0 0 22px; border:1px solid var(--gray-200, #e2e8f0); border-radius:10px;}
.doc-legal__texto table{width:100%; border-collapse:collapse; font-size:14px; line-height:1.5; min-width:560px;}
.doc-legal__texto th{background:#0F172A; color:#fff; text-align:left; font-weight:600; padding:9px 12px;}
.doc-legal__texto td{padding:9px 12px; border-top:1px solid var(--gray-200, #e2e8f0); vertical-align:top; color:var(--gray-800);}
.doc-legal__texto tr:nth-child(even) td{background:rgba(15,23,42,0.03);}
.doc-legal__aviso{margin:0 0 22px; padding:12px 16px; border-radius:10px; background:#fff7e6; border:1px solid #f5d38a; color:#5c3d00; font-size:14.5px;}
.doc-legal__aviso a{color:#0b6b51; font-weight:600;}
.doc-legal__sumario{margin:0 0 28px; padding:14px 18px; border-radius:12px; background:rgba(15,23,42,0.04); border:1px solid var(--gray-200, #e2e8f0); font-size:14.5px;}
.doc-legal__sumario ol{margin:8px 0 0 20px; padding:0; columns:2; column-gap:28px;}
.doc-legal__sumario li{list-style:none; margin-bottom:4px; break-inside:avoid;}
.doc-legal__sumario a{color:var(--navy-900);}
.doc-legal__cookies{margin:0 0 18px; font-size:14.5px;}
.doc-legal__historico{margin-bottom:28px;}
.doc-legal__historico h2{font-size:20px; margin:0 0 10px;}
.doc-legal__historico ul{list-style:none; margin:0; padding:0;}
.doc-legal__historico li{padding:10px 0; border-bottom:1px solid var(--gray-200, #e2e8f0); font-size:15px;}
.doc-legal__historico small{color:var(--gray-500, #64748b);}
.doc-legal__vigente{display:inline-block; margin-left:6px; padding:1px 8px; border-radius:99px; font-size:11.5px; font-weight:700; color:#03110c; background:#10C890;}
@media (max-width: 640px){ .doc-legal__sumario ol{columns:1;} }
