/* ══════════════════════════════════════════════════════════════════════════
   campaigns.css — só o que é exclusivo da listagem de campanhas.
   Depende de tokens.css + base.css + components.css.

   Reaproveita sem redeclarar: .container .section .sec-head .eyebrow .btn
   .input .select .chip .cgrid .ccard .progress .skel .empty .sheet .sr-only

   Nenhum valor de cor literal. Nenhum raio, sombra, duração ou easing fora
   dos tokens. Prefixo .cp- em tudo que nasce aqui.
   ══════════════════════════════════════════════════════════════════════════ */

/* Altura do header (estado rolado), altura da barra de filtros e largura da
   coluna lateral — usadas pelo sticky da barra, pelo sticky da coluna e pelo
   alinhamento do bloco "load more".
   --cp-bar é um FALLBACK medido (barra numa linha). O script da página
   remede a altura real no boot e a cada resize e sobrescreve o valor no
   <html>; se o JS falhar, este número continua valendo. */
:root {
  --cp-head: 66px;
  --cp-bar:  86px;
  --cp-side: 236px;
}
@media (max-width: 960px) {
  :root { --cp-head: 60px; }
}

/* ══ 01 · PAGE HEADER ═════════════════════════════════════════════════════
   Compacto sobre --wash. Sem hero: a página é uma ferramenta, não um
   manifesto. O único destaque é a linha de números.                        */
.cp-head {
  background: var(--wash);
  padding-block: clamp(2.5rem, 6vw, 4.5rem) clamp(2rem, 4.5vw, 3.25rem);
}
.cp-head-in { display: flex; flex-direction: column; gap: var(--sp-3); }
.cp-head-in h1 { max-width: 18ch; }
.cp-head-sub { color: var(--ink-3); font-size: var(--fs-lg); max-width: var(--measure); }

.cp-head-stat {
  display: flex; flex-wrap: wrap; align-items: baseline;
  gap: var(--sp-2) var(--sp-6);
  margin-top: var(--sp-4);
  font-size: var(--fs-sm); color: var(--muted); font-weight: 600;
}
.cp-head-stat[hidden] { display: none; }
.cp-head-stat > span { display: inline-flex; align-items: baseline; gap: var(--sp-2); }
.cp-head-stat > span + span::before {
  content: ""; width: 5px; height: 5px; border-radius: 50%;
  background: var(--lime-500); align-self: center;
  margin-right: var(--sp-1); flex: 0 0 auto;
}
.cp-head-stat b {
  font-family: var(--f-display); font-weight: 800;
  font-size: var(--fs-h3); letter-spacing: var(--tr-head);
  color: var(--ink); font-variant-numeric: tabular-nums;
}

/* ══ 02 · FILTER BAR ══════════════════════════════════════════════════════
   Sticky logo abaixo do header. Sólida — sob um header translúcido, uma
   segunda camada translúcida vira sopa.                                    */
.cp-bar {
  position: sticky; top: var(--cp-head); z-index: var(--z-sticky);
  background: var(--white);
  border-bottom: 1px solid var(--line);
}
/* No mobile o header é fixo e some ao descer. Enquanto ele está lá, a barra
   encosta logo abaixo dele; quando ele some, a barra sobe para o topo e não
   deixa uma faixa de card passando por cima. .is-hidden é posto por ui.js no
   header, que é irmão anterior de <main> — só leitura, nada é alterado lá.
   A sombra faz a barra ler como toolbar flutuante nos dois estados. */
@media (max-width: 960px) {
  .cp-bar {
    box-shadow: var(--sh-sm);
    transition: top var(--d) var(--ease);
  }
  .site-header.is-hidden ~ #main .cp-bar { top: 0; }
}

.cp-bar-in {
  display: flex; align-items: center; flex-wrap: wrap;
  gap: var(--sp-3);
  padding-block: var(--sp-4);
}

.cp-search { position: relative; flex: 1 1 240px; min-width: 0; max-width: 380px; }
.cp-search > svg {
  position: absolute; left: var(--sp-4); top: 50%; transform: translateY(-50%);
  color: var(--subtle); pointer-events: none;
}
.cp-search .input { padding-left: 2.75rem; border-radius: var(--r-pill); }

.cp-sort { margin-left: auto; min-width: 0; }
.cp-sort .select {
  width: auto; min-width: 200px;
  border-radius: var(--r-pill); font-weight: 600;
}

/* .btn é display:inline-flex (autor) e ganha do [hidden] da folha do
   navegador — o estado escondido precisa de uma regra de autor. */
.cp-filters-btn { position: relative; }
.cp-filters-btn[hidden] { display: none; }
.cp-fbadge {
  display: inline-grid; place-items: center;
  min-width: 20px; height: 20px; padding-inline: var(--sp-1);
  border-radius: var(--r-pill);
  background: var(--green-800); color: var(--white);
  font-size: 0.6875rem; font-weight: 700; font-variant-numeric: tabular-nums;
}
.cp-fbadge[hidden] { display: none; }

/* Acima de 1024 a coluna lateral assume e o botão some. */
@media (min-width: 1024px) { .cp-filters-btn { display: none; } }

/* Abaixo de 640 a busca ocupa a primeira linha e "Filters" + ordenação
   dividem a segunda. O botão fica no tamanho do texto e a sobra vai toda
   para o <select> — o rótulo "Sort: Most Funded" precisa caber inteiro. */
@media (max-width: 640px) {
  .cp-search { flex: 1 1 100%; max-width: none; }
  .cp-filters-btn { flex: 0 0 auto; }
  .cp-sort { flex: 1 1 160px; margin-left: 0; }
  .cp-sort .select { width: 100%; min-width: 0; }
}

/* ══ 03 · SIDEBAR + GRID ══════════════════════════════════════════════════ */
.cp-body { padding-block: var(--sp-10) var(--sp-8); }

.cp-layout { display: grid; gap: var(--sp-8); align-items: start; }
@media (min-width: 1024px) {
  .cp-layout { grid-template-columns: var(--cp-side) minmax(0, 1fr); gap: var(--sp-12); }
}

.cp-side { display: none; }
.cp-side[hidden] { display: none; }
@media (min-width: 1024px) {
  .cp-side {
    display: block;
    position: sticky; top: calc(var(--cp-head) + var(--cp-bar) + var(--sp-6));
    max-height: calc(100dvh - var(--cp-head) - var(--cp-bar) - var(--sp-10));
    overflow-y: auto;
    background: var(--wash); border-radius: var(--r-lg); padding: var(--sp-6);
  }
}

/* Grupos de filtro — mesma marcação na coluna lateral e no bottom-sheet.
   Ambos vivem sobre --wash, então o estado ativo lê igual nos dois.       */
.cp-fgroup + .cp-fgroup {
  margin-top: var(--sp-5); padding-top: var(--sp-5);
  border-top: 1px solid var(--line);
}
.cp-flabel {
  font-family: var(--f-body); font-size: var(--fs-eyebrow); font-weight: 700;
  letter-spacing: var(--tr-eyebrow); text-transform: uppercase;
  color: var(--muted); margin-bottom: var(--sp-3);
}
.cp-fopt {
  width: 100%; display: flex; align-items: center; gap: var(--sp-3);
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--r-sm);
  font-size: var(--fs-sm); font-weight: 600; color: var(--ink-3);
  text-align: left; line-height: 1.35;
  transition: background var(--d-fast) var(--ease), color var(--d-fast) var(--ease);
}
.cp-fopt + .cp-fopt { margin-top: 2px; }
.cp-fopt::before {
  content: ""; width: 8px; height: 8px; border-radius: 50%;
  background: var(--line); flex: 0 0 auto;
  transition: background var(--d-fast) var(--ease), transform var(--d-fast) var(--ease);
}
.cp-fopt:hover { background: var(--white); color: var(--forest); }
.cp-fopt:hover::before { background: var(--lime-500); }
.cp-fopt[aria-pressed="true"] {
  background: var(--green-800); color: var(--white); font-weight: 700;
}
.cp-fopt[aria-pressed="true"]::before { background: var(--glow-200); transform: scale(1.2); }
.cp-fopt-n {
  margin-left: auto; font-size: var(--fs-xs); font-weight: 600;
  color: var(--muted); font-variant-numeric: tabular-nums;
}
.cp-fopt[aria-pressed="true"] .cp-fopt-n { color: var(--glow-200); }

/* Linha de resultados — o contador é a região viva da página. */
.cp-results {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: var(--sp-3);
  min-height: 34px; margin-bottom: var(--sp-6);
}
.cp-count { font-size: var(--fs-sm); color: var(--muted); }
.cp-count b {
  font-family: var(--f-display); font-weight: 800; font-size: var(--fs-h4);
  color: var(--ink); font-variant-numeric: tabular-nums;
}
.cp-chips { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.cp-chips .chip svg { opacity: .65; }
.cp-chips .chip:hover svg { opacity: 1; }
.cp-chip-clear { border-style: dashed; }

.cp-noscript {
  color: var(--ink-3); font-size: var(--fs-sm);
  background: var(--wash); border-radius: var(--r-md);
  padding: var(--sp-5); max-width: var(--measure);
}

/* Troca de filtro: fade curto, sem piscar. base.css já zera a duração sob
   prefers-reduced-motion; o JS também pula a espera.                      */
.cp-grid { transition: opacity var(--d-fast) var(--ease); }
.cp-grid.is-fading { opacity: 0; }

/* ══ 04 · PAGINAÇÃO (Load more) ═══════════════════════════════════════════ */
.cp-more { padding-bottom: var(--sec-y-sm); }
.cp-more[hidden] { display: none; }
.cp-more-in {
  display: flex; flex-direction: column; align-items: center; gap: var(--sp-4);
  text-align: center;
}
@media (min-width: 1024px) {
  .cp-more-in { margin-left: calc(var(--cp-side) + var(--sp-12)); }
}
.cp-more-track { width: min(260px, 100%); }
.cp-more-text {
  font-size: var(--fs-xs); color: var(--muted); font-weight: 600;
  font-variant-numeric: tabular-nums;
}
.cp-more-btn[hidden] { display: none; }

/* ══ BOTTOM-SHEET DE FILTROS (mobile) ═════════════════════════════════════
   Usa .sheet-backdrop/.sheet de components.css; aqui só ancora embaixo.   */
.cp-sheetwrap { place-items: end center; padding: 0; }
.cp-sheet {
  width: 100%; max-width: 560px;
  max-height: 88dvh; overflow: hidden;
  display: flex; flex-direction: column; gap: var(--sp-5);
  padding: var(--sp-6) var(--sp-6) var(--sp-5);
  border-radius: var(--r-xl) var(--r-xl) 0 0;
  transform: translateY(100%);
}
.cp-sheetwrap.is-open .cp-sheet { transform: none; }
.cp-sheet-head { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4); }
.cp-sheet-head h2 { font-size: var(--fs-h3); }
.cp-sheet-body {
  flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch;
  background: var(--wash); border-radius: var(--r-md); padding: var(--sp-4);
}
.cp-sheet-foot {
  display: flex; gap: var(--sp-3);
  padding-top: var(--sp-4); border-top: 1px solid var(--line);
}
/* "Clear all" fica do tamanho do texto e toda a sobra vai para a ação
   principal, cujo rótulo cresce com a contagem ("Show 69 campaigns"). Com
   flex:1 1 0 nos dois, a 360px esse rótulo estourava o padding do botão e
   encostava na borda da pílula. */
.cp-sheet-foot .btn { flex: 0 0 auto; }
.cp-sheet-foot .btn--primary { flex: 1 1 auto; padding-inline: var(--sp-4); }

/* Sob prefers-reduced-motion o sheet aparece já no lugar. */
@media (prefers-reduced-motion: reduce) {
  .cp-sheet { transform: none; }
}
