/* ============================================================
   DAYSE AMARILIO — protótipo home (Fase 2)
   Mobile-first. Tokens do docs/01-DESIGN-SYSTEM.md
   ============================================================ */

/* ---------- Campton (texto) — auto-hospedada, licença webfont ---------- */
@font-face{font-family:'Campton';font-style:normal;font-weight:400;font-display:swap;src:url('/assets/fonts/campton-book.woff2') format('woff2')}
@font-face{font-family:'Campton';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/campton-medium.woff2') format('woff2')}
@font-face{font-family:'Campton';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/campton-semibold.woff2') format('woff2')}
@font-face{font-family:'Campton';font-style:normal;font-weight:700;font-display:swap;src:url('/assets/fonts/campton-bold.woff2') format('woff2')}
@font-face{font-family:'Campton';font-style:italic;font-weight:400;font-display:swap;src:url('/assets/fonts/campton-book-italic.woff2') format('woff2')}
@font-face{font-family:'Campton';font-style:italic;font-weight:500;font-display:swap;src:url('/assets/fonts/campton-medium-italic.woff2') format('woff2')}

/* ---------- Oswald (títulos) — auto-hospedada desde 13/08/2026, licença OFL ----------
   Vinha do `fonts.googleapis.com` em 15 HTML. Saiu porque o Google ROTOU as URLs
   dos subconjuntos no meio de uma sessão: o CSS de uma borda apontava um `.woff2`
   que outra borda ainda não servia, e a bateria acusou 404 em `/quem-sou` e
   `/revistas`. Passou sozinho em minutos — e é exatamente esse o problema: uma
   dependência que quebra e conserta sozinha não dá para depurar nem para
   confiar. A Campton já era auto-hospedada; agora as duas famílias vêm do mesmo
   lugar que o resto do site.

   SÃO DOIS ARQUIVOS, não seis. O Oswald é fonte VARIÁVEL: o Google entrega o
   MESMO `.woff2` para 500, 600 e 700 (md5 conferido) e só muda o `font-weight`
   de cada `@font-face`. O que separa os dois arquivos é o SUBCONJUNTO, não o
   peso — daí a `unicode-range`, copiada do CSS do Google sem alterar. O eixo
   declarado é `500 700`, que é a faixa que este site usa; o arquivo é o recorte
   que o Google serve para `wght@500;600;700`, e não o 200..700 inteiro.

   Cirílico e vietnamita ficaram de fora de propósito: um site em português
   nunca casaria aquelas `unicode-range`, e o navegador jamais baixaria os
   arquivos. Se algum dia entrar conteúdo nesses alfabetos, é acrescentar os
   `@font-face` — não há nada de errado com eles, só não servem aqui. */
@font-face{font-family:'Oswald';font-style:normal;font-weight:500 700;font-display:swap;
  src:url('/assets/fonts/oswald-var.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Oswald';font-style:normal;font-weight:500 700;font-display:swap;
  src:url('/assets/fonts/oswald-var-ext.woff2') format('woff2');
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}

:root{
  /* ============ COR — rampa da marca ============
     Só os degraus REALMENTE usados moram aqui. Tints que seguem o EIXO continuam
     sem token: são gerados na hora com color-mix(in srgb,var(--e) N%,#fff), que
     segue a cor do tema em vez de fixar uma cor. Ver docs/01-DESIGN-SYSTEM.md §1.5.
     Os dois tints da MARCA (-100/-200) têm token porque não seguem tema nenhum:
     são um valor só, repetido em ~26 lugares — e o valor é um color-mix mesmo.
     A rampa inteira e o porquê de cada degrau estão em docs/29. */
  /* da marca — os hexes vieram dos SVGs da assinatura nova */
  --turquesa-500:#2EB7BD;   /* fundo só com tinta escura: 2,43:1 com branco */
  --petroleo-600:#047B98;   /* tinta sobre claro: 4,89:1 */
  --ambar-500:#F7A815;      /* = o antigo --laranja-500: 1,01 de diferença */
  --roxo-600:#5A328A;       /* rebaixado de cor da marca a cor de eixo: 9,30:1 */
  /* derivados — casados por LUMINÂNCIA com os degraus roxos que substituem, para
     que o site troque de cor sem trocar de peso e nada que passava deixe de passar */
  --turquesa-300:#7FD3D7;   /* realce sobre escuro:  9,00:1 no --petroleo-900 */
  --turquesa-400:#1D959C;   /* borda/foco sobre claro: 3,60:1 (era --roxo-400, 3,65) */
  --petroleo-700:#045A72;   /*  7,75:1  (era --roxo-600,  7,83) */
  --petroleo-800:#04455A;   /* 10,48:1  (era --roxo-700, 10,95) */
  --petroleo-900:#032833;   /* 15,50:1  (era --roxo-900, 15,59) */
  --roxo-800:#4B2D70;       /* 11,00:1  (era --roxo-700, 10,95) — 2º degrau do eixo */
  --petroleo-200:color-mix(in srgb,var(--petroleo-700) 34%,#fff); /* 1,78 (era --roxo-200, 1,80) */
  --petroleo-100:color-mix(in srgb,var(--petroleo-700) 14%,#fff); /* 1,25 (era --roxo-100, 1,27) */
  --ambar-600:#E07E0B;
  --magenta-500:#E6197D;
  --ciano-500:#12B5C4;
  --amarelo-500:#F7C600; --amarelo-300:#FBD84E;
  --lavanda:#9B59D0; --violeta:#7A3FF2; --indigo:#4A2A9E;
  /* ============ FUNDO ESCURO DO SITE — uma cor só, editável ============
     Hero, CTA/fecho e rodapé dividem a MESMA cor. Quem escolhe é o painel
     "Cor do site" (⚙️ → Azulejo), que publica no KV e escreve `--fundo-1`
     inline no <html>; os outros dois degraus saem daqui, sozinhos.

     Por que derivar em vez de pedir três cores: o degradê tem de escurecer de
     cima para baixo, e é a queda que segura o texto branco. Se as três fossem
     escolhidas à mão, uma escolha infeliz apagaria o hero. Assim quem edita
     mexe em UMA cor e a forma da rampa é lei.

     Os percentuais não são chutados: reproduzem a rampa de petróleo do docs/29
     a menos de um décimo — 78% do --petroleo-700 dá 10,37:1 com branco (contra
     os 10,48 do --petroleo-800) e 44% dá 15,53 (contra 15,50 do --petroleo-900). */
  --fundo-1:var(--petroleo-700);                          /* topo do degradê */
  --fundo-2:color-mix(in srgb,var(--fundo-1) 78%,#000);   /* meio */
  --fundo-3:color-mix(in srgb,var(--fundo-1) 44%,#000);   /* base — e o rodapé */
  /* ============ REALCE — o destaque da AÇÃO e do contorno ============
     O botão Apoie, o WhatsApp flutuante, a moldura do carrossel, a bolinha
     ativa, o "hl" do fecho, a sobrancelha. Editável em ⚙️ → Cores.

     O VALOR É O ÂMBAR DA MARCA, que é o que já estava publicado nos botões —
     e não o --amarelo-500, que é a cor do EIXO GUARÁ. Usar o amarelo aqui
     recriaria um token com dois trabalhos: trocar o destaque do site
     repintaria o Guará junto. Mesma separação que --tinta e --tinta-fundo já
     tinham exigido (docs/29 §4).

     Dois degraus derivados, para o painel continuar pedindo UMA cor só:
       -claro  69% + branco → texto de realce sobre fundo escuro (4,79:1 no hero)
       -forte  86% + preto  → o hover dos botões (o antigo --ambar-600) */
  --realce:var(--ambar-500);
  --realce-claro:color-mix(in srgb,var(--realce) 69%,#fff);
  --realce-forte:color-mix(in srgb,var(--realce) 86%,#000);
  /* neutros */
  --tinta:#12262E;                          /* texto do corpo: 14,64:1 no papel */
  --tinta-fundo:var(--fundo-3);             /* FUNDO escuro (rodapé) — era --tinta */
  /* os mesmos hexes em componentes r,g,b — só para os rgba() de sombra e borda,
     que precisam de alfa. Um espelho, sim, mas de UM valor cada, comentado ao lado
     do original: antes eram 30 literais soltos pelo arquivo. */
  --tinta-rgb:18,38,46;                     /* = --tinta        #12262E */
  --petroleo-900-rgb:3,40,51;               /* = --petroleo-900 #032833 */
  --petroleo-700-rgb:4,90,114;              /* = --petroleo-700 #045A72 */
  --tinta-60:#6B6577; --papel:#FAF7F2; --branco:#FFFFFF;
  --sobre-turquesa:#04302F;                 /* texto escuro sobre fundo turquesa: 5,87:1 */
  /* cor de marca de terceiros (não é paleta nossa — não derivar nada daqui) */
  --c-whatsapp:#25D366; --c-facebook:#1877F2; --c-x:#111;

  /* ============ COR POR TEMA — FONTE ÚNICA ============
     Nenhum hex temático pode existir fora deste bloco. Consumido por:
       1. style="--e:…;--e-ink:…" nas páginas (quem-sou, apoiar)
       2. os blocos #guara/#saude/… que pintam os componentes do eixo
       3. js/util.js, que LÊ estes tokens em tempo de execução (sem espelho manual)
     Par fixo: cor de FUNDO (--th-x) + cor de TEXTO sobre claro (--th-x-ink). */
  /* eixos do site e "faces" de quem-sou */
  --th-saude:var(--turquesa-500);        --th-saude-ink:#0A7C82;
  /* terceiro membro do par, e só a saúde tem: texto SOBRE o fundo sólido do eixo.
     `--th-x-ink` é tinta sobre CLARO; sobre o turquesa cheio ela não tem contraste.
     Mora aqui, junto do eixo, para não virar um `#04302F` solto em cada uso.
     Desde docs/29 o eixo Saúde e a MARCA compartilham o turquesa, de propósito:
     o eixo deixou de ser visualmente exclusivo e volta a ser com um token só. */
  --th-saude-sobre:var(--sobre-turquesa);
  /* o roxo saiu da marca e ficou aqui: Transversal e Legislativo continuam roxos,
     nos dois degraus de sempre — é o que os mantém distintos um do outro. */
  --th-roxo:var(--roxo-600);            --th-roxo-ink:var(--roxo-600);
  --th-roxo2:var(--violeta);            --th-roxo2-ink:var(--indigo);
  --th-mulher:var(--magenta-500);       --th-mulher-ink:#A8125C;
  --th-laranja:var(--ambar-500);        --th-laranja-ink:#B4650A;
  --th-guara:var(--amarelo-500);        --th-guara-ink:#8F5E00;
  --th-legislativo:var(--roxo-800);     --th-legislativo-ink:var(--roxo-800);
  --th-idade:var(--lavanda);            --th-idade-ink:#6B3AA0;
  --th-esporte:var(--violeta);          --th-esporte-ink:#5A29C0;
  --th-mulheres:var(--magenta-500);     --th-mulheres-ink:#B01060;
  --th-educacao:var(--indigo);          --th-educacao-ink:var(--indigo);
  /* categorias do BLOG — taxonomia PRÓPRIA, não é a dos eixos.
     Onde o nome coincide (Educação, Concurso) o valor diverge de propósito:
     no site "Educação" é índigo e "Concurso" é laranja; no blog são ciano e magenta. */
  --tag-saude:var(--th-saude);          --tag-saude-ink:var(--th-saude-ink);
  --tag-mulher:var(--th-mulher);        --tag-mulher-ink:var(--th-mulher-ink);
  --tag-guara:var(--th-guara);          --tag-guara-ink:var(--th-guara-ink);
  --tag-educacao:var(--ciano-500);      --tag-educacao-ink:#0A6E77;
  --tag-enfermagem:var(--violeta);      --tag-enfermagem-ink:var(--indigo);
  --tag-editais:var(--th-laranja);      --tag-editais-ink:var(--th-laranja-ink);
  --tag-lutas:var(--roxo-600);          --tag-lutas-ink:var(--roxo-600);
  --tag-assistencia:var(--ambar-600);   --tag-assistencia-ink:#8F4E06;
  --tag-concurso:var(--magenta-500);    --tag-concurso-ink:var(--th-mulher-ink);
  --tag-padrao:var(--petroleo-700);     --tag-padrao-ink:var(--petroleo-800);

  /* ============ TIPOGRAFIA ============ */
  --font-titulo:'Oswald',system-ui,sans-serif;
  --font-texto:'Campton',system-ui,sans-serif;

  /* ============ FORMA ============ */
  --raio-sm:12px; --raio-md:20px; --raio-lg:32px; --raio-pill:999px;
  --sombra-sm:0 3px 12px rgba(var(--petroleo-900-rgb),.22);     /* botão sobreposto a um card */
  --sombra-card:0 6px 24px rgba(var(--tinta-rgb),.10);   /* repouso */
  --sombra-hover:0 16px 40px rgba(var(--tinta-rgb),.18); /* elevado */
  --sombra-pop:0 16px 44px rgba(var(--petroleo-900-rgb),.28);   /* popovers e menus */

  /* ============ ESPAÇO (base 4) ============
     Definida na Fase 1, APLICADA na Fase 2 (ver docs/06-AUDITORIA-CSS.md).
     Nenhum padding/gap/margin novo deve usar valor fora desta escala. */
  --sp-1:4px;  --sp-2:8px;  --sp-3:12px; --sp-4:16px;
  --sp-5:20px; --sp-6:24px; --sp-7:32px; --sp-8:40px;
  --sp-9:48px; --sp-10:56px;--sp-11:64px;--sp-12:72px;

  /* ============ MOVIMENTO ============
     Aplicados de verdade na vistoria de 05/08/2026: até então --t-rapida,
     --t-lenta e --ease-mola estavam DEFINIDOS e nunca lidos — a curva da mola
     aparecia escrita à mão em 4 lugares, e uma delas com .34,1.5 em vez de
     .34,1.56 (deriva de cópia; a que sobrou literal é a do .hdr-social-pop). */
  --t-rapida:.15s; --t-media:.2s; --t-lenta:.3s;
  --ease-mola:cubic-bezier(.34,1.56,.64,1);

  /* ============ CAMADAS ============
     Só a pilha GLOBAL vira token — o que precisa ser comparado entre partes distantes
     do documento. z-index local dentro de um stacking context isolado (hero, divisor,
     card) continua literal 0–5: ali o número já é auto-explicativo. */
  --z-sticky:50;         /* header fixo */
  --z-pop:60;            /* subnav e popover de redes, ancorados no header */
  --z-flutuante:80;      /* WhatsApp flutuante */
  --z-menu:200;          /* menu de compartilhar (posicionado no body) */
  --z-edicao:1200;       /* dock da engrenagem */
  --z-edicao-frame:1280; /* alças de redimensionar */
  --z-edicao-guia:1290;  /* linha de solta + frame de escala */
  --z-edicao-alta:1300;  /* barrinha de bloco e painéis */
  --z-toast:1400;        /* feedback — sempre por cima de tudo */

  /* ============ LAYOUT ============ */
  --container:1200px;
  --container-header:1320px;   /* SÓ o cabeçalho — a assinatura inteira mede 380px */
  --header-h:64px;
  --azulejo-h:42px;
  /* ---- AZULEJO: camada de padrão no hero, nos divisores e no CTA ----
     Uma faixa por área: modo de mesclagem, opacidade e nº de linhas (quantas
     faixas do SVG cabem na altura da seção). São estes tokens que o controlador
     do modo edição (botão "Azulejo") sobrescreve no <html>. */
  --az-src-eixos:url('/assets/svg/azulejo-eixos.svg');
  --az-src-bg:url('/assets/svg/azulejo-bg.svg');
  --az-hero-blend:lighten;    --az-hero-op:.30;    --az-hero-rows:1.5;
  --az-claro-blend:multiply;  --az-claro-op:.30;   --az-claro-rows:1;
  --az-escuro-blend:lighten;  --az-escuro-op:.30;  --az-escuro-rows:1;
  --az-cta-blend:lighten;     --az-cta-op:.30;     --az-cta-rows:1.5;
}

/* camada comum às três áreas — cada uma define --az-img/--az-blend/--az-op/--az-rows */
.hero::before,.divisor::after,.cta::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:var(--az-img) center bottom/auto calc(100% / var(--az-rows)) repeat;
  mix-blend-mode:var(--az-blend);opacity:var(--az-op);
}
.hero{--az-img:var(--az-src-bg);--az-blend:var(--az-hero-blend);--az-op:var(--az-hero-op);--az-rows:var(--az-hero-rows)}
.cta{--az-img:var(--az-src-bg);--az-blend:var(--az-cta-blend);--az-op:var(--az-cta-op);--az-rows:var(--az-cta-rows)}
/* o topo das subpáginas usa a caixa do .cta, mas é hero: segue o azulejo do hero */
.cta--hero{--az-blend:var(--az-hero-blend);--az-op:var(--az-hero-op);--az-rows:var(--az-hero-rows)}
.divisor{--az-img:var(--az-src-eixos);--az-blend:var(--az-escuro-blend);--az-op:var(--az-escuro-op);--az-rows:var(--az-escuro-rows)}
/* eixos de cor CLARA: clarear lava o azulejo e derruba o texto — ali ele escurece */
.dv-guara,.dv-saude,.dv-concurso{--az-blend:var(--az-claro-blend);--az-op:var(--az-claro-op);--az-rows:var(--az-claro-rows)}

/* ---------- reset enxuto ---------- */
*,*::before,*::after{box-sizing:border-box}
*{margin:0}

/* ============================================================
   `[hidden]` MANDA — regra de base, e ela existe por reincidência
   ------------------------------------------------------------
   O `display:none` do atributo `hidden` vem da folha do NAVEGADOR, e QUALQUER
   `display` declarado por nós o atropela. Isso derrubou três coisas em dois
   dias, sempre do mesmo jeito: o elemento era marcado como escondido, o
   JavaScript acreditava, e ele continuava na tela.

     17/08  `.kpi-modal{display:grid}`   o modal fechado seguia por cima da
                                         página, comendo todo clique
     18/08  `.mold-solta{display:flex}`  a área de soltar não sumia com a foto
     18/08  `.btn{display:inline-flex}`  o botão de câmera aparecia no
                                         computador, onde ele não funciona

   Consertar caso a caso já falhou duas vezes, então a regra sobe para a base.
   O `!important` é o que a torna imune a qualquer `display` de componente —
   que é exatamente o problema que ela resolve.
   ============================================================ */
[hidden]{display:none !important}
html{scroll-behavior:smooth}
body{
  font-family:var(--font-texto);
  color:var(--tinta);
  /* base do recorte dos ícones: o papel. Cards e badges sobrescrevem por herança. */
  --ic-recorte:var(--papel);
  background:var(--ic-recorte);
  line-height:1.6;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
  overflow-wrap:break-word;
}
/* anti-overflow: filhos de grid/flex podem encolher abaixo do conteúdo */
.hero-grid>*,.counters-grid>*,.seg-grid>*,.header-inner>*{min-width:0}
/* textura de papel bem sutil */
body::before{
  content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;opacity:.5;
  background-image:radial-gradient(rgba(var(--tinta-rgb),.025) 1px,transparent 1px);
  background-size:4px 4px;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
h1,h2,h3{font-family:var(--font-titulo);line-height:1.02;letter-spacing:.01em}
:focus-visible{outline:3px solid var(--petroleo-700);outline-offset:3px;border-radius:6px}

.container{width:100%;max-width:var(--container);margin-inline:auto;padding-inline:var(--sp-6)}
@media (min-width:768px){.container{padding-inline:var(--sp-7)}}
section[id]{scroll-margin-top:calc(var(--header-h) + var(--azulejo-h) + 12px)}

/* ============================================================
   COMPONENTES-BASE — a receita compartilhada, extraída uma vez
   ------------------------------------------------------------
   Estas regras agrupam o que 9 cards, 37 rótulos e 9 botões-círculo
   repetiam cada um por conta própria. Cada componente abaixo mantém
   SÓ o que é dele (padding, acento, cor).

   As classes .card e .rotulo existem para o código NOVO: um card
   novo é `class="card"` + o que for específico, sem copiar a receita
   de novo. Os nomes legados seguem na lista enquanto a marcação não
   migrar — migrar é opcional, o CSS já está consolidado.

   .campo e .circulo saíram na vistoria de 05/08/2026: eram apelidos
   da mesma ideia que NENHUMA marcação chegou a usar (0 ocorrências em
   5 listas). Apelido sem uso não é ponto de extensão — é seletor que
   toda regra futura tem de carregar sem saber por quê.
   ============================================================ */

/* --- CARD: fundo, raio e elevação de repouso --- */
.card,.seg-card,.stat,.prog,.cat,.law,.region,.step,.faq-item,.post-card{
  /* --ic-recorte acompanha o fundo por CONSTRUÇÃO: é a mesma variável nas duas
     linhas, então não há como divergirem. Ver docs/11 §13 (cor do recorte). */
  --ic-recorte:var(--branco);
  background:var(--ic-recorte);border-radius:var(--raio-md);box-shadow:var(--sombra-card);
}
/* --- CARD elevável: sobe no hover. A distância é por componente (--elev). --- */
.card--elev,.seg-card,.prog,.step,.post-card{
  transition:transform var(--t-media),box-shadow var(--t-media);
}
.card--elev:hover,.seg-card:hover,.prog:hover,.step:hover,.post-card:hover{
  transform:translateY(var(--elev,-4px));box-shadow:var(--sombra-hover);
}
.seg-card{--elev:-6px}
.post-card{--elev:-3px}

/* --- RÓTULO: Oswald caixa-alta. O tracking/tamanho/peso fica em cada um. --- */
.rotulo,.btn,.nav-desktop a,.mm-link,.eyebrow,.hero-pill,.section-kicker,.counter-cta,
.seg-name,.seg-go,.divisor-eixo,.divisor-frase,.subeixo-name,.prog h3,.prog h4,.prog .tag,
.cat-role,.sub-label,.carreiras h4,.region-head b,.cta-kicker,.cta-social-label,
.dayse-edit-bar .deb-status,.dayse-toast,.step-title,.field > label,.checks-label,.form-ok h3,
.faq-q,.chip-toggle,.facets-lead,.side-block h3,.post-tag,
.share-menu .sm-head,.post-share-bar .psb-label,.post-back,
.post-article h2,.post-article h3,.post-article h4,.editor h3,.adm-status,.adm-btn{
  font-family:var(--font-titulo);text-transform:uppercase;
}

/* --- BOTÃO: o clicável sem borda (a base de tudo que se clica e não tem contorno) --- */
.btn,.btn--sutil,.menu-toggle,.carousel-dots button,.deb-btn,.dayse-blk-tools button,
.bk-create,.bk-del{border:0;cursor:pointer}
/* forma pílula */
.btn,.btn--sutil,.badge,.deb-btn,.bk-create,
.divisor-eixo,.prog .tag,.law-badge,.post-tag,.adm-status,.chip{border-radius:var(--raio-pill)}
/* BADGE de tema: tinta e fundo derivados de --e (o tint segue o eixo, não é cor fixa) */
.badge--tema,.prog .tag,.law-badge{color:var(--e-ink,var(--e));background:color-mix(in srgb,var(--e) 13%,white)}
/* tom SUTIL — roxo claro sobre claro (ações secundárias do painel).
   `.az-reset`, `.bk-restore` e `.dp-item button` eram TRÊS APELIDOS deste mesmo
   botão, e apareciam juntos nas três listas acima. Na vistoria de 05/08/2026 a
   marcação passou a dizer `class="btn--sutil az-reset"` e cada um ficou só com o
   que é dele (largura e respiro, adiante). Custou uma palavra em 8 templates do
   próprio main.js e tirou 9 menções de seletor de 3 listas — e um botão sutil
   novo agora não precisa de linha nenhuma de CSS. */
.btn--sutil{font:600 .74rem var(--font-texto);background:var(--petroleo-100);color:var(--petroleo-800)}
.btn--sutil:hover{background:var(--petroleo-700);color:#fff}
/* tom SUCESSO — tiffany (publicar, criar backup) */
.btn--sucesso,.deb-btn.deb-publish,.bk-create{background:var(--turquesa-500);color:var(--sobre-turquesa)}
.btn--sucesso:hover,.deb-btn.deb-publish:hover,.bk-create:hover{background:var(--turquesa-300)}
/* tom CONTORNO — borda fina roxa sobre fundo claro */
.btn--contorno,.adm-btn,.editor-toolbar button,.chip-toggle{
  font-weight:600;color:var(--petroleo-800);cursor:pointer;line-height:1}
.btn--contorno,.adm-btn,.editor-toolbar button{background:var(--papel);border-radius:8px}
.btn--contorno:hover,.adm-btn:hover,.editor-toolbar button:hover{border-color:var(--turquesa-400)}
/* desabilitado: a opacidade ainda diverge por componente (.4/.5/.6) — ver 06-AUDITORIA §13 */
.btn[disabled],.deb-btn[disabled],.bk-create[disabled],.adm-btn:disabled{cursor:default}

/* --- GRADE auto-fit: uma largura mínima por grade, um mecanismo só --- */
.grade-auto,.prog-grid,.law-grid,.region-grid{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,var(--min,240px)),1fr));
}
.prog-grid{--min:265px}
.law-grid{--min:245px}
.region-grid{--min:215px}

/* --- CAMPO: superfícies de entrada (input, textarea, select, editor, checkbox) --- */
/* a borda fina roxa é a mesma em campo, card de contorno, FAQ e linha do painel */
.btn--contorno,.adm-btn,.editor-toolbar button,.chip-toggle,
.field input,.field textarea,.field select,.blog-search input,.editor,.check,
.faq-item,.adm-row{border:1.5px solid var(--petroleo-100)}
/* tipografia de campo */
.field input,.field textarea,.field select,.blog-search input,.editor{
  font-family:var(--font-texto);font-size:1rem;color:var(--tinta);
}
/* superfície clara de raio pequeno */
.field input,.field textarea,.field select,.editor,.check{
  background:var(--papel);border-radius:var(--raio-sm);
}

/* --- ÍCONE DE TRAÇO: a receita de todo SVG de contorno do site ---
   Estava escrita 16 vezes. As exceções — cor do ícone da busca e do "copiar",
   espessura do toast/chevron/voltar — sobrescrevem nas próprias regras, adiante. */
.ico-traco,.counter-ico svg,.prog-ico svg,.cat-ico svg,.dayse-toast svg,.dayse-blk-tools button svg,.deb-ico svg,.deb-backup svg,.bk-del svg,.step-badge svg,.form-ok svg,.faq-chevron,.post-share svg,.post-share-bar .psb-copy svg,.post-back svg,.share-menu .sm-copy svg,.blog-search svg{
  fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;
}

/* --- COMPARTILHAR: o popover (.sm-*) e a barra do post (.psb-*) dividem
   as cores de marca, o item clicável, o ícone e o rótulo. --- */
.sm-wa,.post-share-bar .psb-wa{background:var(--c-whatsapp)}
.sm-fb,.post-share-bar .psb-fb{background:var(--c-facebook)}
.sm-x,.post-share-bar .psb-x{background:var(--c-x)}
.sm-copy,.post-share-bar .psb-copy{background:var(--petroleo-700)}
.share-menu a,.share-menu button,.post-share-bar a,.post-share-bar button{
  align-items:center;font-family:var(--font-texto);border:none;cursor:pointer;text-decoration:none;
}
.share-menu .sm-ico svg,.post-share-bar svg{width:16px;height:16px}
.share-menu .sm-head,.post-share-bar .psb-label{letter-spacing:.05em;color:var(--tinta-60)}

/* --- CÍRCULO: contêiner redondo de ícone. O tamanho e a cor ficam em cada um. --- */
.hdr-social,.hdr-social-pop a,.counter-ico,.social a,.wa-float,.dayse-gear,
.step-n,.post-share,.share-menu .sm-ico{
  display:grid;place-items:center;border-radius:50%;
}

/* ---------- botões ---------- */
.btn{display:inline-flex;align-items:center;gap:.5em;justify-content:center;
  font-weight:600;letter-spacing:.03em;padding:.7em 1.2em;font-size:.9rem;transition:transform .18s,box-shadow .18s,background .18s}
.btn-lg{padding:.85em 1.6em;font-size:1.05rem}
/* a tinta acompanha o realce: nos eixos escuros (roxo do Transversal) o texto
   escuro sumiria, e o JS troca para branco. `transition` porque a cor muda ao
   ROLAR — sem ela o botão pisca de uma cor para outra. */
.btn-cta{background:var(--realce);color:var(--realce-ink,var(--tinta));
  transition:background .25s,color .25s,transform .2s,box-shadow .2s}
.btn-cta:hover{background:var(--realce-forte);transform:translateY(-2px);box-shadow:var(--sombra-hover)}
/* O 40222 é SEMPRE branco, e um pouco maior que o rótulo ao lado. Era
   `--realce-claro`, que muda com a seção — o número da urna mudando de cor
   conforme a rolagem é a única coisa desta página que não pode variar. Branco
   sobre `--tinta` dá 14,64:1. */
.btn-num b{background:var(--tinta);color:#fff;border-radius:8px;
  padding:.05em .4em;letter-spacing:.06em;font-size:1.1em}
.btn-ghost{background:transparent;color:var(--branco);border:2px solid rgba(255,255,255,.55)}
.btn-ghost:hover{background:rgba(255,255,255,.14);transform:translateY(-2px)}
/* TOM DO EIXO: o botão veste a cor da frente a que pertence, lendo o `--e` que o
   elemento já traz — o mesmo mecanismo das seções. Não é `.btn--saude` de
   propósito: os outros tons têm nome de PAPEL (cta, ghost, sutil, sucesso), e um
   nome de eixo abriria a porta para `.btn--guara`, `.btn--concurso` e a
   proliferação que o docs/08 §3.3 já cobra. `--e-sobre` é o texto sobre a cor
   cheia; sem ele, branco, que serve para os eixos escuros. */
.btn--eixo{background:var(--e);color:var(--e-sobre,#fff)}
.btn--eixo:hover{background:color-mix(in srgb,var(--e) 86%,var(--tinta));
  transform:translateY(-2px);box-shadow:var(--sombra-hover)}

/* ============================================================
   HEADER
   ============================================================ */
/* --- PULAR PARA O CONTEÚDO ---
   Fora da tela até receber foco. `position:absolute` e não `clip`: o link é o
   primeiro filho do `.header-inner`, que é flex — no fluxo ele abriria uma
   coluna de largura zero e um `gap` a mais entre a marca e a borda. Absoluto,
   ele sai do fluxo e o cabeçalho fica pixel a pixel o que era.
   O contêiner é o `.site-header`, que é `position:sticky` e portanto já é o
   bloco de referência de um filho absoluto. */
.pular{position:absolute;left:-9999px;top:0;z-index:calc(var(--z-sticky) + 1);
  padding:var(--sp-2) var(--sp-4);border-radius:0 0 var(--raio-sm) 0;
  background:var(--petroleo-800);color:#fff;
  font-family:var(--font-titulo);text-transform:uppercase;
  letter-spacing:.04em;font-size:.82rem;line-height:1.4}
.pular:focus{left:0}
/* O <main> recebe o foco só para RECEBÊ-LO (tabindex=-1, posto pela borda). Não
   é um controle, então a moldura de 3px em volta da página inteira seria ruído:
   o retorno visual de ter pulado é o conteúdo passando a rolar dali. */
main:focus{outline:none}
/* SEM `border-bottom`. Ela existia para separar o cabeçalho branco do conteúdo,
   e virou defeito: o último elemento do cabeçalho é a FAIXA DE AZULEJOS, então a
   borda caía DEPOIS dela, entre a faixa e o hero escuro — uma risca clara de 1px
   atravessando a página inteira.

   Medido: o header fechava em 129px enquanto --header-h (74) + --azulejo-h (54)
   dão 128. O 1px sobrando era ela, e `rgba(tinta,.06)` sobre o branco dá 242 de
   brilho — exatamente o que a captura a 9x mostrou entre a faixa (138) e o hero
   (80).

   Nada se perdeu: quem separa o cabeçalho do conteúdo é a própria faixa, e ao
   rolar entra a sombra do `.scrolled`, que é o sinal de elevação de verdade. */
.site-header{
  position:sticky;top:0;z-index:var(--z-sticky);background:var(--branco);
  transition:box-shadow .2s;
}
.site-header.scrolled{box-shadow:0 6px 22px rgba(var(--tinta-rgb),.10)}
.header-inner{display:flex;align-items:center;gap:var(--sp-3);height:var(--header-h)}
.brand{display:flex;align-items:center;gap:var(--sp-2);font-family:var(--font-titulo)}
/* A assinatura VEM EM DOIS ARQUIVOS e o CSS escolhe qual aparece (docs/29 §5):
   a inteira, com o 40222, só cabe junto do menu desktop acima de --bp-assinatura;
   abaixo disso entra a curta, que é o mesmo desenho sem o número. É isso que
   permite mostrar a assinatura completa SEM empurrar o menu para o hambúrguer
   nos notebooks de 1280px. As duas têm o mesmo alt: `display:none` não vai para
   a árvore de acessibilidade, então nunca são anunciadas as duas. */
/* A ASSINATURA VESTE A COR DA SEÇÃO (18/08/2026).

   Era um <img>, e <img> não obedece a CSS: as duas cores estavam chumbadas no
   arquivo (#047B98 = --petroleo-600 no traço, #2EB7BD = --turquesa-500 no
   acento). Agora são duas camadas MASCARADAS sobre um <span>:

     ::before  máscara = o próprio assinatura*.svg. O alfa dele já é a silhueta
               inteira, então esta camada não custou um byte novo de rede.
     ::after   máscara = assinatura*-realce.svg, só as duas formas do acento
               (937 B), gerado pelo tools/build-assinatura-realce.py.

   As cores saem de --sec-tinta/--sec-cor, que o azPintarSecao() só declara
   enquanto uma seção domina a tela. Fora daí o var() cai no fallback e a marca
   volta ao turquesa — é por isso que o padrão mora AQUI e não no :root: no
   hero, no blog e no /apoiar não existe seção, e herdar --realce faria o logo
   nascer âmbar em toda página. --sec-tinta é o par "sobre claro" da cor
   (--e-ink), não a cor cheia: o amarelo do Guará é fundo de bolinha, mas como
   traço sobre papel branco não passa de 1,5:1. */
.brand-assin{height:34px;display:block;flex:0 0 auto;position:relative}
.brand-assin::before,.brand-assin::after{content:"";position:absolute;inset:0;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-size:contain;mask-size:contain;
  -webkit-mask-position:left center;mask-position:left center;
  transition:background-color var(--t-media)}
.brand-assin::before{background-color:var(--sec-tinta,var(--petroleo-600));
  -webkit-mask-image:var(--assin);mask-image:var(--assin)}
.brand-assin::after{background-color:var(--sec-acento,var(--turquesa-500));
  -webkit-mask-image:var(--assin-realce);mask-image:var(--assin-realce)}
/* a proporção substitui o width:auto que o <img> dava de graça */
.brand-assin--curta{aspect-ratio:2047/370;
  --assin:url(../assets/svg/assinatura-curta.svg);
  --assin-realce:url(../assets/svg/assinatura-curta-realce.svg)}
.brand-assin--cheia{aspect-ratio:3512/370;
  --assin:url(../assets/svg/assinatura.svg);
  --assin-realce:url(../assets/svg/assinatura-realce.svg);
  display:none}
/* símbolo quadrado + nome numa linha: sobrou nos PAINÉIS (entrar, gerenciar, crm,
   capas, novo-post), que têm cabeçalho próprio e não passam pelo partial. A
   assinatura nova não serve lá: a 25px de altura o "deputada distrital" some. */
.brand-logo{height:34px;width:auto;display:block;flex:0 0 auto}
.brand-wordmark{height:21px;width:auto;display:block;flex:0 0 auto}

/* O GAP DO MENU É MEDIDO, NÃO ESCOLHIDO. Com o oitavo item (Projetos,
   16/08/2026) o menu passou a transbordar a própria caixa — e transbordar aqui
   não corta: o texto entra POR CIMA do botão Apoie, porque o `.header-inner` é
   flex e deixa o nav encolher. A medida é `scrollWidth - clientWidth`; a altura
   engana (com `nowrap` ela fica em 33px mesmo transbordando 109px).

   Transbordo medido com 8 itens, por gap:
     gap 24px → 1440:12  1366:12  1280:0  1180: 1  1100:56  1024:109
     gap 20px → 1440: 0  1366: 0  1280:0  1180: 0  1100:36  1024: 88
     gap 12px → todos 0 até 1100                            1024: 49
   Daí as três faixas abaixo. A 1024 nem o gap de 8px basta (29px sobrando):
   só cabe encolhendo a fonte junto — e ali o menu JÁ transbordava 40px com
   sete itens, antes deste commit. Abaixo de 1024 vale o hambúrguer. */
.nav-desktop{display:none;margin-left:auto;gap:var(--sp-3)}
/* `nowrap` porque o menu tem um item de DUAS PALAVRAS ("Quem sou"), e ele é o
   primeiro a ceder: sem isto o rótulo racha em "QUEM / SOU", o menu passa de
   33px para 58px de altura e, a 1024px, "Revistas" entra por cima do botão
   Apoie. Medido em 16/08/2026 ao acrescentar o oitavo item (Projetos): a quebra
   aparecia em 1440, 1180 e 1100 por causa dele, e a 1024 JÁ acontecia com sete.
   Com `nowrap` o menu fica em uma linha nas seis larguras medidas (1440 → 1024)
   sem precisar apertar o gap de 24px. Abaixo de 1024 vale o hambúrguer. */
.nav-desktop a{font-weight:500;letter-spacing:.04em;font-size:.98rem;color:var(--tinta);padding:var(--sp-1);position:relative;white-space:nowrap}
/* A faixa estreita vem DEPOIS da regra acima de propósito: mesma
   especificidade, e quem vem por último ganha. Na primeira tentativa ela
   estava antes e o `font-size` simplesmente não valeu — a medição acusou
   39px de transbordo com a regra "aplicada". */
@media (max-width:1179.98px){ .nav-desktop{gap:10px} .nav-desktop a{font-size:.92rem} }
.nav-desktop a::after{
  content:"";position:absolute;left:0;right:100%;bottom:-2px;height:3px;border-radius:3px;
  background:var(--petroleo-700);transition:right .25s;
}
.nav-desktop a:hover::after,.nav-desktop a.active::after{right:0}
.nav-desktop a.active{color:var(--petroleo-800)}

/* Só o CTA do HEADER some no mobile (vira hambúrguer). Reaparece ≥1024px (ver breakpoints).
   Os outros "Apoie" (hero e menu mobile) seguem as regras normais de .btn e ficam visíveis. */
.hdr-cta{display:none;margin-left:var(--sp-2)}
.btn-cta.btn-num span{font-weight:600}

/* Redes "colapsadas" na barra — surgem ao lado do Apoie quando rola além do hero.
   O wrap cresce de 0→--bolinha (mola) e some sem deixar buraco quando está no topo.

   `--bolinha` é UM número para as duas caixas de propósito. Antes eram dois
   literais que precisavam concordar e não concordavam: a régua de toque de 44px
   engordou o botão no celular (`@media(max-width:640px)`, lá embaixo) e deixou o
   wrap em 42 — e como o wrap é `overflow:hidden`, o círculo saía com **2px
   raspados no lado direito**. Medido a 390px em 17/08/2026: wrap client=42,
   scroll=44, botão 44x44, `border-radius:50%` — um corte reto num círculo.
   Com o token, encolher ou crescer a bolinha é mexer num lugar só. */
.hdr-social-wrap{--bolinha:42px;
  position:relative;display:flex;align-items:center;width:0;overflow:hidden;
  transition:width .42s var(--ease-mola)}
body.past-hero .hdr-social-wrap{width:var(--bolinha)}
.hdr-social-wrap.open{overflow:visible}
.hdr-social{width:var(--bolinha);height:var(--bolinha);flex:0 0 auto;padding:0;
  /* mesma regra da assinatura: veste a cor da seção enquanto houver uma, e cai
     no petróleo da marca no resto do site. A tinta do ícone não é #fff fixo —
     sobre o amarelo do Guará ela some; quem escolhe é a luminância, medida no
     azPintarSecao(). */
  border:0;cursor:pointer;background:var(--sec-cor,var(--petroleo-700));color:var(--sec-sobre,#fff);
  /* `visibility` junto do `opacity`, como o .hdr-social-pop logo abaixo já faz.
     Só com opacity:0 o botão continua FOCÁVEL: no topo da home, quem navega por
     Tab perdia o foco num controle invisível (medido: activeElement caía nele).
     A transição inclui visibility para não estalar. */
  opacity:0;visibility:hidden;transform:scale(.5);
  transition:opacity var(--t-lenta) ease .08s,transform .35s var(--ease-mola) .08s,visibility .35s,background var(--t-media),color var(--t-media)}
.hdr-social svg{width:20px;height:20px;display:block}
body.past-hero .hdr-social{opacity:1;visibility:visible;transform:scale(1)}
.hdr-social:hover,.hdr-social[aria-expanded="true"]{background:var(--ambar-500);color:var(--tinta)}

/* popover que expande as 5 redes */
.hdr-social-pop{
  position:absolute;top:calc(100% + 12px);right:0;z-index:var(--z-pop);
  display:flex;gap:var(--sp-1);padding:var(--sp-2);
  background:var(--branco);border:1px solid rgba(var(--tinta-rgb),.08);border-radius:16px;
  box-shadow:0 16px 36px rgba(var(--tinta-rgb),.20);
  opacity:0;visibility:hidden;transform:translateY(-10px) scale(.94);transform-origin:top right;
  transition:opacity .2s ease,transform .28s cubic-bezier(.34,1.5,.64,1),visibility .28s;
}
.hdr-social-wrap.open .hdr-social-pop{opacity:1;visibility:visible;transform:none}
.hdr-social-pop a{width:40px;height:40px;flex:0 0 auto;color:var(--petroleo-800);background:rgba(var(--petroleo-700-rgb),.08);
  opacity:0;transform:scale(.4) translateY(-6px);
  transition:transform var(--t-lenta) var(--ease-mola),opacity .25s,background var(--t-media),color var(--t-media)}
.hdr-social-wrap.open .hdr-social-pop a{opacity:1;transform:none}
.hdr-social-pop a:hover,.hdr-social-pop a:focus-visible{background:var(--ambar-500);color:#fff;transform:translateY(-2px)}
.hdr-social-pop .social-ico{width:19px;height:19px;fill:currentColor}
.hdr-social-wrap.open .hdr-social-pop a:nth-child(1){transition-delay:.05s}
.hdr-social-wrap.open .hdr-social-pop a:nth-child(2){transition-delay:.10s}
.hdr-social-wrap.open .hdr-social-pop a:nth-child(3){transition-delay:.15s}
.hdr-social-wrap.open .hdr-social-pop a:nth-child(4){transition-delay:.20s}
.hdr-social-wrap.open .hdr-social-pop a:nth-child(5){transition-delay:.25s}

/* mobile: o botão fica junto do hambúrguer, à direita */
@media(max-width:1023px){
  .hdr-social-wrap{margin-left:auto}
  .menu-toggle{margin-left:0}
}

/* toggle mobile */
.menu-toggle{
  margin-left:auto;width:44px;height:44px;display:grid;place-items:center;gap:var(--sp-1);
  background:transparent;
}
.menu-toggle span{display:block;width:24px;height:3px;border-radius:3px;background:var(--petroleo-800);transition:.25s}
.menu-toggle[aria-expanded="true"] span:nth-child(1){transform:translateY(8px) rotate(45deg)}
.menu-toggle[aria-expanded="true"] span:nth-child(2){opacity:0}
.menu-toggle[aria-expanded="true"] span:nth-child(3){transform:translateY(-8px) rotate(-45deg)}

.mobile-menu{
  display:flex;flex-direction:column;gap:var(--sp-2);padding:var(--sp-3) var(--sp-6) var(--sp-5);
  background:var(--papel);border-bottom:1px solid rgba(var(--tinta-rgb),.08);
  animation:slideDown .25s ease;
}
.mobile-menu[hidden]{display:none}
@keyframes slideDown{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
.mm-link{letter-spacing:.04em;
  font-size:1.25rem;font-weight:600;padding:var(--sp-3) var(--sp-4);border-radius:var(--raio-sm);
  border-left:6px solid transparent;background:var(--branco);box-shadow:var(--sombra-card)}
.mm-guara{border-left-color:var(--amarelo-500)}
.mm-saude{border-left-color:var(--ciano-500)}
.mm-concurso{border-left-color:var(--ambar-500)}
.mm-transversal{border-left-color:var(--th-roxo)}
.mm-cta{margin-top:var(--sp-1)}

/* ============================================================
   FAIXA DE AZULEJOS (frieze) — logo abaixo do header
   Altura fixa; ladrilhos de mesma altura encaixados lado a lado.
   Preenchida/embaralhada em js/main.js.
   ============================================================ */
.azulejos{
  display:flex;flex-wrap:nowrap;align-items:flex-start;
  height:var(--azulejo-h);overflow:hidden;line-height:0;background:var(--branco);
}
/* +2px de sobra vertical, cortada pelo overflow → some qualquer linha/sliver na base
   (borda, arredondamento sub-pixel ou desenho que não chega ao fim do viewBox).
   São <svg><use href="#az-N"> (não <img>): é o que deixa as formas lerem os
   tokens --az-cor-* do :root. Ver docs/09. */
.azulejos img,.azulejos svg{height:calc(100% + 2px);width:auto;display:block;flex:0 0 auto;user-select:none;pointer-events:none}

/* ============================================================
   HERO
   ============================================================ */
.hero{
  position:relative;overflow:hidden;isolation:isolate;
  background:
    radial-gradient(120% 90% at 80% -10%, var(--fundo-1) 0%, var(--fundo-2) 45%, var(--fundo-3) 100%);
  color:var(--branco);padding:var(--sp-8) 0 var(--sp-9);
}
/* azulejo no fundo do hero: atrás das formas (z 1) e do conteúdo (z 2) */
.hero::before{z-index:0}
.hero-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-6);position:relative;z-index:2}
.eyebrow{letter-spacing:.18em;
  font-size:var(--eyebrow-size,.8rem);font-weight:500;color:var(--realce-claro);margin-bottom:var(--sp-2)}
/* line-height 1,02 e não os 0,95 de antes: a 2ª linha tem MAIÚSCULA ACENTUADA
   (o Ú de SAÚDE) e a 1ª tem hastes altas. Medido a 1440px: com 0,95 as caixas
   das duas linhas se cruzavam em 20px e o acento encostava no I de VERDADEIRA.
   Oswald desenha o acento alto; quem apertar isto de novo vai reencostar. */
.hero-title{
  font-size:clamp(2.1rem,9vw,4.6rem);font-weight:700;text-transform:uppercase;line-height:1.02;
}
/* "A VERDADEIRA" em branco, "VOZ DA SAÚDE" no turquesa claro. Não é o
   --turquesa-500 da marca: sobre o topo do degradê ele daria 1,85:1. O
   --turquesa-300 dá 4,50:1 no ponto MAIS CLARO do hero e 9,01:1 na base. */
.hero-title .hl{color:var(--turquesa-300)}
/* largura casada pelo JS (heroAlign) — a 1ª linha encolhe até bater com a 2ª */
.hero-title .hero-l1{display:inline-block;font-size:var(--l1-size,1em);color:var(--branco)}
/* nowrap só quando o alinhamento JS está ativo (mede/escala em 1 linha) */
.hero-fitted .hero-l1,.hero-fitted .eyebrow{white-space:nowrap}
.hero-lead{
  margin-top:var(--sp-4);font-size:clamp(1rem,3.5vw,1.18rem);color:rgba(255,255,255,.9);max-width:46ch;
}
.hero-lead strong{color:var(--branco)}
.hero-actions{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin-top:var(--sp-6)}

/* carrossel */
.hero-media{position:relative;max-width:100%}
.carousel{position:relative;max-width:100%}
.carousel-track{
  display:flex;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;scroll-behavior:smooth;
  gap:0;border-radius:var(--raio-lg);
  border:4px solid var(--realce);transition:border-color .25s;
  box-shadow:0 20px 50px rgba(0,0,0,.35);
  -ms-overflow-style:none;scrollbar-width:none;
}
.carousel-track::-webkit-scrollbar{display:none}
.slide{
  min-width:100%;scroll-snap-align:center;aspect-ratio:4/3;overflow:hidden;
  display:grid;place-items:end start;position:relative;background:var(--petroleo-800);
}
.slide img{grid-area:1/1;width:100%;height:100%;object-fit:cover;object-position:center 22%;display:block}
/* pill branco POR foto do hero — elemento em cima da foto, texto editável/independente,
   levemente à direita e girado (não encaixado); responsivo (quebra sem vazar da tela) */
.hero-pill{position:absolute;z-index:3;bottom:16px;right:7%;left:auto;max-width:80%;margin:0;
  background:#fff;color:var(--petroleo-900);
  font-weight:600;font-size:clamp(.74rem,1.7vw,1.02rem);line-height:1.16;letter-spacing:.005em;
  padding:var(--sp-2) var(--sp-4);border-radius:22px;box-shadow:0 10px 26px rgba(var(--tinta-rgb),.30);
  transform:rotate(-2deg);text-align:left}
@media(max-width:560px){.hero-pill{right:5%;max-width:86%;bottom:12px}}

.carousel-dots{display:flex;gap:var(--sp-2);justify-content:center;margin-top:var(--sp-3)}
.carousel-dots button{width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.4);transition:.2s;padding:0}
.carousel-dots button.active{background:var(--realce);width:26px;border-radius:6px}

/* (as formas geométricas soltas do hero — círculos, quarto de círculo e estrelas —
   saíram quando o azulejo virou o padrão de fundo) */

/* ============================================================
   CONTADORES
   ============================================================ */
.counters{background:var(--branco);color:var(--tinta);padding:var(--sp-7) 0}
/* A sobrancelha "3 anos de mandato" mudou de casa em 10/08/2026: era a primeira
   linha da faixa de KPIs, que saiu da home, e passou a abrir os cartões de eixo.
   O nome acompanhou — ela não é mais "dos contadores". */
.section-kicker{text-align:center;letter-spacing:.1em;font-size:.9rem;color:var(--tinta-60);margin-bottom:var(--sp-2)}
.section-kicker b{color:var(--ambar-600)}
/* FLEX centrado, e não grid de colunas fixas: apagar um cartão no modo edição
   deixava um buraco à direita, porque `repeat(4,1fr)` reserva as 4 pistas
   existam 4 itens ou 2. Com flex + justify-content:center, os que sobram se
   recentralizam sozinhos — 3 itens ocupam 75% da largura, centrados. A base
   (50% / 25%) é a mesma proporção do grid de antes, então com o número cheio
   de cartões nada muda de aparência. Vale para os KPIs (.counters-grid, hoje
   fora da home mas de pé para outras páginas) e para os eixos (.seg-grid). */
.counters-grid{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--sp-5) var(--sp-3)}
.counters-grid>*{flex:0 1 calc(50% - var(--sp-3) / 2)}
.counter{text-align:center;display:block;color:inherit;padding:var(--sp-2) var(--sp-1);border-radius:var(--raio-md);transition:transform .2s,background .2s}
/* cada KPI puxa a cor do seu eixo */
.counter[href="#saude"]{--e:var(--th-saude);--e-ink:var(--th-saude-ink)}
.counter[href="#guara"]{--e:var(--th-guara);--e-ink:var(--th-guara-ink)}
.counter[href="#concurso"]{--e:var(--th-saude);--e-ink:var(--th-saude-ink)}  /* "9.400 nomeações na saúde" → cor da Saúde */
.counter[href="#legislativo"]{--e:var(--th-legislativo);--e-ink:var(--th-legislativo-ink)}
/* ícone temático em badge no topo de cada KPI */
.counter-ico{width:46px;height:46px;margin:0 auto var(--sp-2);--ic-recorte:color-mix(in srgb,var(--e) 16%,#fff);background:var(--ic-recorte);color:var(--e-ink,var(--petroleo-700))}
.counter-ico svg{width:24px;height:24px}
a.counter:hover .counter-ico{background:color-mix(in srgb,var(--e) 26%,#fff)}
a.counter:hover{transform:translateY(-4px);background:color-mix(in srgb,var(--e) 12%,white)}
a.counter:hover .counter-label{color:var(--tinta)}
.counter-cta{display:inline-flex;align-items:center;gap:var(--sp-1);margin-top:var(--sp-2);letter-spacing:.05em;font-size:.72rem;color:var(--e-ink,var(--petroleo-700));opacity:0;transform:translateY(-3px);transition:.2s}
a.counter:hover .counter-cta,a.counter:focus-visible .counter-cta{opacity:1;transform:none}
.counter-cta svg{width:13px;height:13px}
.counter-num{
  display:block;font-family:var(--font-titulo);font-weight:700;line-height:1;
  font-size:clamp(1.75rem,7.5vw,3.4rem);color:var(--e-ink,var(--petroleo-800));white-space:nowrap;
}
.counter-label{
  display:block;margin-top:var(--sp-1);font-size:.82rem;font-weight:500;color:var(--tinta-60);
  text-transform:uppercase;letter-spacing:.04em;
}

/* ============================================================
   CARDS DE SEGUIMENTO
   ============================================================ */
.segments{padding:var(--sp-9) 0}
.section-head{text-align:center;margin-bottom:var(--sp-7)}
.section-title{font-size:clamp(1.55rem,6vw,2.6rem);text-transform:uppercase;color:var(--petroleo-800)}
.section-sub{color:var(--tinta-60);margin-top:var(--sp-1);font-size:1.05rem}


.seg-grid{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--sp-4)}
.seg-grid>*{flex:0 1 100%}
.seg-card{
  position:relative;display:flex;flex-direction:column;gap:var(--sp-1);
  padding:var(--sp-6) var(--sp-5);overflow:hidden;
  border-top:6px solid var(--e,var(--petroleo-700));
}
.seg-card::before{
  content:"";position:absolute;width:120px;height:120px;border-radius:50%;
  /* com fallback: um cartão SEM eixo (o que nasce do "+") não tem `--e`, e sem
     isto o anel caía em currentColor — um aro escuro que ninguém pediu */
  right:-34px;top:-34px;background:none;border:12px solid var(--e,var(--petroleo-700));opacity:.2;transition:.25s;
}
.seg-card:hover::before{transform:scale(1.35)}
.seg-head{display:flex;align-items:center;gap:var(--sp-3)}
.seg-ico{color:var(--e);flex:none;line-height:0}
.seg-ico svg{width:30px;height:30px;display:block}
.seg-name{font-weight:700;font-size:1.5rem;color:var(--petroleo-900)}
.seg-num{font-family:var(--font-titulo);font-weight:700;color:var(--e);font-size:1.08rem}
.seg-go{margin-top:var(--sp-2);letter-spacing:.05em;font-size:.85rem;color:var(--tinta-60);display:inline-flex;align-items:center;gap:var(--sp-1)}
.seg-go svg{width:14px;height:14px}
.seg-card:hover .seg-go{color:var(--e)}
.seg-guara{--e:var(--th-guara)}
.seg-saude{--e:var(--th-saude)}
.seg-concurso{--e:var(--th-laranja)}
.seg-transversal{--e:var(--th-roxo)}

/* ============================================================
   NAV — SUBMENU (Transversal)
   ============================================================ */
.nav-item{position:relative;display:flex;align-items:center}
.subnav{
  position:absolute;top:100%;left:-14px;min-width:210px;background:var(--branco);
  border-radius:var(--raio-md);box-shadow:var(--sombra-hover);padding:var(--sp-2);
  display:flex;flex-direction:column;gap:var(--sp-1);opacity:0;visibility:hidden;
  transform:translateY(6px);transition:.18s;z-index:var(--z-pop);
}
.nav-item:hover .subnav,.nav-item:focus-within .subnav{opacity:1;visibility:visible;transform:none}
.subnav a{
  font-family:var(--font-texto);text-transform:none;letter-spacing:0;font-weight:600;
  font-size:.95rem;padding:var(--sp-2) var(--sp-3);border-radius:10px;border-left:5px solid var(--e,var(--petroleo-700));
}
.subnav a::after{display:none}
.subnav a:hover{background:var(--petroleo-100)}
.sn-idade{--e:var(--th-idade)} .sn-esporte{--e:var(--th-esporte)}
.sn-mulheres{--e:var(--th-mulheres)} .sn-educacao{--e:var(--th-educacao)}

/* submenu no mobile */
.mm-sub{display:flex;flex-direction:column;gap:var(--sp-1);margin:0 0 var(--sp-1) var(--sp-3);padding-left:var(--sp-3);border-left:3px solid rgba(var(--tinta-rgb),.12)}
.mm-sublink{font-family:var(--font-texto);font-weight:600;font-size:1rem;padding:var(--sp-2) var(--sp-3);border-radius:10px;border-left:5px solid var(--e);background:var(--branco);box-shadow:var(--sombra-card)}

/* ============================================================
   SEÇÕES DE EIXO (Fase 3 — estrutura + divisores)
   ============================================================ */
.divisor{position:relative;overflow:hidden;min-height:44vh;display:flex;align-items:flex-end;padding:var(--sp-7) 0;color:#fff;
  /* isolate: prende o blend do azulejo dentro do divisor */
  isolation:isolate}
.divisor-inner{position:relative;z-index:2}
.divisor-eixo{display:inline-flex;align-items:center;gap:var(--sp-2);letter-spacing:.16em;font-size:.82rem;font-weight:600;
  padding:var(--sp-1) var(--sp-3);background:rgba(255,255,255,.20);margin-bottom:var(--sp-4)}
.divisor-frase{font-weight:700;font-size:clamp(1.9rem,6.5vw,3.6rem);line-height:.98;max-width:18ch}
.divisor-frase .q{opacity:.45}
/* Camada da FOTO (fica atrás). Placeholder tracejado até a foto real entrar.
   Para usar a foto: adicionar a classe .has-foto no .divisor e definir
   --dv-foto: url("assets/img/div-<eixo>.webp") (inline ou por classe). */
.divisor{background:var(--dv-color)}
.divisor-media{position:absolute;inset:0;z-index:0;
  background:repeating-linear-gradient(45deg,#d8d2ca 0 15px,#cec7bf 15px 30px)}
.divisor.has-foto .divisor-media{background:var(--dv-foto) center top/cover no-repeat}
/* Overlay em degradê alpha da cor-tema.
   MOBILE (base): foto revelada em cima, cor forte embaixo (atrás do texto).
   --dv-mask espelha as MESMAS paradas do degradê em alpha puro: é ela que
   guia o azulejo (.divisor::after), pra ele acompanhar o overlay. */
.divisor.has-foto{
  --dv-mask:linear-gradient(180deg, transparent 0%, rgba(0,0,0,.45) 40%, #000 82%)}
.divisor.has-foto .divisor-overlay{position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg, transparent 0%,
    color-mix(in srgb, var(--dv-color) 45%, transparent) 40%,
    var(--dv-color) 82%)}
/* divisores sem foto (placeholder tracejado): cor forte embaixo, revela em cima */
.divisor:not(.has-foto){
  --dv-mask:linear-gradient(180deg, rgba(0,0,0,.30) 0%, rgba(0,0,0,.80) 46%, #000 84%)}
.divisor:not(.has-foto) .divisor-overlay{position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,
    color-mix(in srgb, var(--dv-color) 30%, transparent) 0%,
    color-mix(in srgb, var(--dv-color) 80%, transparent) 46%,
    var(--dv-color) 84%)}
/* Azulejo por cima (foto + degradê), recortado pela --dv-mask: fica acima do
   overlay (z-index 1 + ordem no DOM) e abaixo do texto (z 2). */
.divisor::after{
  z-index:1;
  -webkit-mask-image:var(--dv-mask);mask-image:var(--dv-mask);
}
.dv-guara{--dv-color:var(--amarelo-500);color:var(--tinta)}
.dv-saude{--dv-color:var(--ciano-500)}
.dv-concurso{--dv-color:var(--ambar-500);color:var(--tinta)}
.dv-transversal{--dv-color:var(--th-roxo)}
/* Mulheres não é eixo, é subeixo do Transversal — por isso reaproveita a FOTO
   do Transversal e troca só a cor. O token é o mesmo `--th-mulher` que pinta a
   seção na home: mudar a cor da pauta lá muda a barra aqui, sem tocar neste
   arquivo. Ver a página /acoes-mulheres. */
.dv-mulheres{--dv-color:var(--th-mulher)}
/* A pílula padrão é branco a 20%, e sobre o magenta ela CLAREIA o fundo: o
   rótulo de 13px caiu para 3,44:1, medido no pixel renderizado (o valor do
   token não serve — atrás há foto sob degradê). Escurecer em vez de clarear
   resolve sem mudar a linguagem da peça. */
.dv-mulheres .divisor-eixo{background:rgba(0,0,0,.34)}
.dv-legislativo{--dv-color:var(--th-legislativo)}
/* (o "escurecer em vez de clarear" dos eixos claros está lá em cima, na camada
   do azulejo — .dv-guara/.dv-saude/.dv-concurso sobrescrevem --az-*.) */
/* mostra o rosto: enquadra a parte de cima do retrato (a imagem "desce") */
.dv-legislativo .divisor-media{background-position:center 22% !important}
.dv-guara .divisor-eixo,.dv-concurso .divisor-eixo{background:rgba(var(--tinta-rgb),.14)}

/* (.eixo-body / .eixo-num-big são definidos uma única vez, na seção
   "CONTEÚDO DOS EIXOS" logo abaixo.) */

/* subeixos da Transversal */
/* padding-BLOCK, não o atalho `padding`: estes elementos também são .container,
   e o atalho zeraria o padding-inline dele — o conteúdo dos eixos encostava na
   borda da tela em todos os breakpoints (vistoria 01/08/2026). */
.subeixos{padding-block:var(--sp-8) var(--sp-7)}
.subeixo{padding:var(--sp-6) 0;border-top:1px solid rgba(var(--tinta-rgb),.09)}
.subeixo:first-child{border-top:0;padding-top:var(--sp-1)}
.subeixo-head{display:flex;align-items:center;justify-content:center;gap:var(--sp-3)}
.subeixo-ico{color:var(--e);flex:none;line-height:0}
.subeixo-ico svg{width:26px;height:26px}
.subeixo-name{font-weight:700;font-size:clamp(1.3rem,4vw,1.8rem);color:var(--petroleo-900)}
.subeixo-frase{color:var(--tinta-60);font-style:italic;margin-top:var(--sp-1);text-align:center}
.subeixo-num{margin-top:var(--sp-1);font-family:var(--font-titulo);font-weight:700;font-size:1.08rem;color:var(--e);text-align:center}
/* A porta para a página de pauta. Veste a cor do subeixo (--e) em vez do realce
   do site: aqui ela é a última coisa depois dos cartões, e o botão de realce
   competiria com o "Apoie" do cabeçalho a poucos centímetros. */
.subeixo-mais{margin-top:var(--sp-5);text-align:center}
/* 44px é a régua de alvo de toque do projeto, e o `.btn--contorno` sozinho para
   em 40 (medido). No dedo a diferença é a de acertar e a de errar. */
.subeixo-mais .btn{min-height:44px;border-color:var(--e);color:var(--e-ink,var(--e))}
.subeixo-mais .btn:hover{background:var(--e);color:var(--sobre-e,#fff);border-color:var(--e)}
.subeixo-mais .btn svg{width:18px;height:18px}
.subeixo>.stat-grid,.subeixo>.prog-grid,.subeixo>.law-grid{margin-top:var(--sp-4)}
.se-idade{--e:var(--th-idade)} .se-esporte{--e:var(--th-esporte)}
.se-mulheres{--e:var(--th-mulheres)} .se-educacao{--e:var(--th-educacao)}

/* ============================================================
   FASE 4 — CONTEÚDO DOS EIXOS (componentes)
   ============================================================ */
/* idem .subeixos: padding-block preserva a calha lateral do .container */
.eixo-body{padding-block:var(--sp-8) var(--sp-7);text-align:left}
.eixo-intro{text-align:center;max-width:58ch;margin:0 auto var(--sp-2)}
.block-note{text-align:center;color:var(--tinta-60);font-size:clamp(1rem,2.5vw,1.1rem);max-width:54ch;margin:var(--sp-5) auto 0}
.eixo-num-big{font-family:var(--font-titulo);font-weight:700;font-size:clamp(2.1rem,7vw,3.3rem);color:var(--e-ink,var(--petroleo-800));line-height:1}
.eixo-num-big span{display:block;font-family:var(--font-texto);font-weight:500;font-size:clamp(1rem,2.5vw,1.12rem);color:var(--tinta-60);text-transform:none;margin-top:var(--sp-3)}

.block{padding:var(--sp-7) 0}
.block-title{text-align:center;font-size:clamp(1.25rem,4vw,1.8rem);text-transform:uppercase;color:var(--petroleo-900);margin-bottom:var(--sp-5)}
.block-title::before{content:"";display:block;width:46px;height:5px;border-radius:3px;background:var(--e,var(--petroleo-700));margin:0 auto var(--sp-3)}

/* cards de valor (R$) — distribuição balanceada (~metade por linha, máx 5).
   --cols/--cols-sm são definidos por JS por grid = mín(5, teto(N/2)). */
.stat-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-3)}
@media(min-width:560px){.stat-grid{grid-template-columns:repeat(var(--cols-sm,3),minmax(0,1fr))}}
@media(min-width:960px){.stat-grid{grid-template-columns:repeat(var(--cols,4),minmax(0,1fr))}}
.stat{padding:var(--sp-4);border-top:5px solid var(--e,var(--petroleo-700));min-width:0}
.stat-num{display:block;font-family:var(--font-titulo);font-weight:700;font-size:clamp(1.3rem,4.6vw,2rem);color:var(--e-ink,var(--petroleo-800));line-height:1;white-space:nowrap}
.stat-label{display:block;margin-top:var(--sp-1);font-size:.88rem;color:var(--tinta-60);font-weight:500;line-height:1.35}

/* ---- KPI QUE COLAPSA (17/08/2026) ----------------------------------------
   Quem manda no `.colapsavel` é o `montarColapsoKPI()` do main.js: só ganha a
   classe o cartão que tem TEMA e algo além dele. Aqui é só a aparência.

   O corte são DUAS LINHAS, e elas mostram exatamente o tema — ele vem sempre
   seguido de `<br><br>`, então ou a segunda linha é a linha em branco (tema
   curto), ou as duas são do próprio tema (tema que quebra). Nos dois casos o
   corpo some. Medido a 390px: a grade do Guará ia a 2621px com cartões de até
   882px; colapsada, 453px.

   É `max-height` e NÃO `-webkit-line-clamp`, e isso foi decidido olhando a
   captura: o clamp acrescenta reticências no fim do trecho cortado, e como a
   segunda linha é a linha em branco, sobrava um "…" solto embaixo do tema,
   parecendo erro de digitação. O chevron já diz que há mais.

   NADA DE `display:none` no corpo: colapsar por altura mantém o texto na DOM,
   legível por leitor de tela e por buscador. */
.stat{position:relative}
.stat.colapsavel .stat-label{max-height:2.7em;overflow:hidden}   /* 2 × line-height 1.35 */

/* O CARTÃO NÃO ESTICA MAIS. A primeira versão abria em pé, e no hover — e as
   duas coisas somadas ficaram ruins: abrir empurrava tudo que vinha abaixo, e
   com o hover a página pulava ao simples passar do mouse. O detalhe passou a
   abrir em MODAL (17/08/2026, a pedido), então aqui não há estado "aberto":
   o cartão fica sempre do tamanho do número e do tema. */

.stat-abrir{
  position:absolute;right:var(--sp-2);bottom:var(--sp-2);
  width:32px;height:32px;display:grid;place-items:center;
  padding:0;border:0;border-radius:50%;cursor:pointer;
  background:rgba(var(--petroleo-700-rgb),.08);color:var(--e-ink,var(--petroleo-800));
  transition:background var(--t-media),transform var(--t-media)}
.stat-abrir svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2.2;
  stroke-linecap:round;stroke-linejoin:round;transition:transform var(--t-media)}
.stat-abrir:hover,.stat-abrir:focus-visible{background:rgba(var(--petroleo-700-rgb),.16)}
/* o chevron cresce um pouco ao passar o mouse — a seta não gira mais, porque
   girar prometia "vou expandir aqui" e o que acontece é abrir uma janela */
.stat.colapsavel:hover .stat-abrir{transform:scale(1.12)}
/* alvo de toque sem engordar o círculo (a régua do docs/16) */
.stat-abrir::after{content:"";position:absolute;inset:-6px}

/* NO MODO EDIÇÃO O CARTÃO FICA ABERTO. Colapsado, o gabinete não alcançaria o
   texto que quer editar — e a seta ali só atrapalharia o clique que põe o
   cursor. */
body.dayse-editing .stat.colapsavel .stat-label{max-height:none;overflow:visible}
body.dayse-editing .stat-abrir{display:none}

/* ---- O MODAL DO KPI --------------------------------------------------------
   O texto entra CLONADO (ver `kpiAbrir` no main.js): o original é editável, e
   movê-lo faria o Publicar fotografar um cartão vazio.

   `--e-ink` vem do cartão de origem, então o número no topo sai na cor do eixo
   — o modal é daquele KPI, não uma janela genérica. */
/* `[hidden]` PRECISA VENCER O `display:grid`, e esta linha não é zelo: o
   `display:none` do atributo vem da folha do NAVEGADOR, e qualquer `display`
   de autor o atropela. Sem ela o modal nunca sumia — ficava com o véu e a
   caixa por cima da página, interceptando todo clique: nada mais fechava, o
   chevron não reabria, e a página parecia travada. E os testes não pegavam,
   porque conferiam o ATRIBUTO `hidden`, que estava certo, em vez do que se vê.
   Achado em 17/08/2026 com `elementFromPoint` no centro da tela. */
.kpi-modal[hidden]{display:none}
.kpi-modal{position:fixed;inset:0;z-index:var(--z-toast);display:grid;place-items:center;padding:var(--sp-4)}
.kpi-veu{position:absolute;inset:0;background:rgba(var(--petroleo-700-rgb),.55);backdrop-filter:blur(2px)}

/* ABERTO POR HOVER, O MODAL NÃO PODE INTERCEPTAR O PONTEIRO — e isto não é
   refinamento, é o que impede um LAÇO: o véu cobre a tela inteira, inclusive o
   cartão; assim que ele aparecesse, o ponteiro passaria a estar sobre o véu, o
   `mouseout` do cartão dispararia e o modal fecharia — para abrir de novo no
   quadro seguinte. Só a caixa recebe ponteiro, e é ela que precisa: entrar nela
   é o que conta como "ainda estou no hover". O resto atravessa para a página.
   O véu também fica mais leve: janela que aparece sem clique não deve escurecer
   o site inteiro. */
.kpi-modal.por-hover{pointer-events:none}
.kpi-modal.por-hover .kpi-caixa{pointer-events:auto}
.kpi-modal.por-hover .kpi-veu{background:rgba(var(--petroleo-700-rgb),.22);backdrop-filter:none}
.kpi-modal.por-hover .kpi-x{display:none}   /* sem clique não há o que fechar à mão */
.kpi-caixa{
  position:relative;width:min(640px,100%);max-height:min(80vh,720px);overflow:auto;
  background:var(--branco);border-radius:var(--raio-md);
  border-top:5px solid var(--e,var(--petroleo-700));
  padding:var(--sp-6) var(--sp-6) var(--sp-7);box-shadow:0 24px 64px rgba(0,0,0,.28)}
.kpi-caixa:focus{outline:none}
.kpi-num{margin:0 0 var(--sp-3);font-family:var(--font-titulo);font-weight:700;
  font-size:clamp(1.6rem,5vw,2.4rem);line-height:1;color:var(--e-ink,var(--petroleo-800))}
.kpi-texto{display:block;font-size:1rem;line-height:1.55;color:var(--tinta)}
.kpi-x{position:absolute;top:var(--sp-3);right:var(--sp-3);
  width:40px;height:40px;display:grid;place-items:center;padding:0;border:0;border-radius:50%;
  cursor:pointer;background:rgba(var(--petroleo-700-rgb),.08);color:var(--petroleo-800);
  transition:background var(--t-media)}
.kpi-x:hover,.kpi-x:focus-visible{background:rgba(var(--petroleo-700-rgb),.18)}
.kpi-x svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.2;
  stroke-linecap:round;stroke-linejoin:round}
/* A ROLAGEM NÃO TRAVA. A versão anterior travava com o modal fixado, e isso
   tornava impossível o comportamento pedido em seguida — "rolar para longe
   fecha": sem rolagem, não há evento de rolagem. Quem fecha é o rolar. */

/* ---- AVISO DE RASCUNHO (17/08/2026) ---------------------------------------
   Fica GRUDADO embaixo e atravessa a largura: o defeito que ele existe para
   contar — "o que você vê é local, e publicar apagaria o que está no ar" — é o
   tipo de coisa que ninguém procura, então tem de encontrar a pessoa.
   Discreto no caso informativo, âmbar no caso em que há conteúdo a perder. */
.dayse-rascunho{
  position:fixed;left:0;right:0;bottom:0;z-index:var(--z-menu);
  display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;
  padding:var(--sp-3) var(--sp-4);
  background:var(--petroleo-800);color:#fff;
  box-shadow:0 -6px 24px rgba(0,0,0,.18);font-size:.92rem}
.dayse-rascunho.grave{background:var(--ambar-500);color:var(--tinta)}
.dayse-rascunho svg{width:22px;height:22px;flex:0 0 auto;
  fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.dayse-rascunho p{margin:0;flex:1 1 260px;line-height:1.35}
.dayse-rascunho button{
  flex:0 0 auto;min-height:36px;padding:0 var(--sp-4);cursor:pointer;
  border-radius:999px;border:1px solid currentColor;background:transparent;color:inherit;
  font:inherit;font-weight:600}
.dayse-rascunho button[data-ver]{background:currentColor}
.dayse-rascunho button[data-ver]:hover{opacity:.85}
/* o texto do botão cheio precisa contrastar com o próprio fundo herdado */
.dayse-rascunho button[data-ver]{color:var(--petroleo-800)}
.dayse-rascunho.grave button[data-ver]{color:var(--ambar-500)}
.dayse-rascunho button[data-manter]:hover{background:rgba(255,255,255,.14)}
.dayse-rascunho.grave button[data-manter]:hover{background:rgba(0,0,0,.08)}

/* cards de programa */
.prog-grid{gap:var(--sp-4)}
/* `align-content:start` NÃO é enfeite. Sem ele o valor é `normal`, que em grade
   se comporta como `stretch`: as linhas de altura automática incham para
   preencher o cartão, e como os cartões da fileira têm todos a altura do mais
   alto, cada um distribui a sobra de um jeito. Medido em 12/08 na grade das
   Mulheres: ícones começando a 20, 24 e 30px do topo e parágrafos a 74, 85 e
   103 — em cartões de altura idêntica (179px). O conteúdo se ancora no TOPO; a
   sobra vai toda para o rodapé do cartão, onde ninguém a lê como desalinho. */
.prog{padding:var(--sp-5);min-width:0;
  display:grid;grid-template-columns:auto 1fr;column-gap:var(--sp-3);row-gap:var(--sp-3);
  align-items:center;align-content:start}
.prog-ico{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;--ic-recorte:color-mix(in srgb,var(--e) 15%,white);background:var(--ic-recorte);color:var(--e-ink,var(--e));grid-column:1;grid-row:1}
.prog-ico svg{width:23px;height:23px}
.prog h3,.prog h4{font-weight:600;font-size:1.18rem;color:var(--petroleo-900);line-height:1.06;grid-column:2;grid-row:1;margin:0}
.prog p{font-size:.94rem;color:var(--tinta-60);line-height:1.55;grid-column:1 / -1;grid-row:2;margin:0}
.prog .tag{grid-column:1 / -1;grid-row:3;justify-self:start;margin:0;letter-spacing:.04em;font-size:.72rem;padding:var(--sp-1) var(--sp-3)}
/* SELO VAZIO NÃO APARECE PARA O VISITANTE. O "+" da entrega clona o último
   cartão e esvazia o texto; se o molde tiver selo de lei, o clone nasce com um
   selo em branco — uma pílula colorida de 20px dizendo nada. E o `.tag` não é
   unidade (não tem botão de apagar), então ficaria lá para sempre.
   Escondê-lo só FORA do modo edição preserva as duas coisas: o visitante não vê
   sobra, e quem edita continua vendo o "escreva aqui" e pode pôr a lei. */
body:not(.dayse-editing) .prog .tag:empty{display:none}

/* categorias com ícone (cargo maior, número abaixo) */
.cat-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-3)}
@media(min-width:820px){.cat-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
/* variante: 1 card por linha no mobile */
@media(max-width:559px){.cat-grid--1col{grid-template-columns:minmax(0,1fr)}}
.cat{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);border-left:4px solid var(--e,var(--petroleo-700));min-width:0}
.cat-ico{width:40px;height:40px;border-radius:11px;display:grid;place-items:center;--ic-recorte:color-mix(in srgb,var(--e) 15%,white);background:var(--ic-recorte);color:var(--e-ink,var(--e));flex:none}
/* "Também produzimos": o número ocupa o lugar do ícone (badge à esquerda) */
.cat--num .cat-ico{font-family:var(--font-titulo);font-weight:700;font-size:1.15rem;letter-spacing:.01em}
.cat-ico svg{width:21px;height:21px}
.cat-text{display:flex;flex-direction:column;gap:var(--sp-1);min-width:0}
.cat-role{font-weight:600;font-size:1.02rem;color:var(--petroleo-900);line-height:1.05}
.cat-num{font-family:var(--font-titulo);font-weight:700;font-size:.9rem;color:var(--e-ink,var(--petroleo-800))}
.carreiras{margin-top:var(--sp-5)}
.sub-label,.carreiras h4{font-size:1.05rem;color:var(--e-ink,var(--petroleo-800));text-align:center;margin:var(--sp-6) 0 var(--sp-3)}
.carreiras h4{margin:0 0 var(--sp-3)}
.block-title + .sub-label{margin-top:0}
.chip-row{display:flex;flex-wrap:wrap;gap:var(--sp-2);justify-content:center}
.chip{font-weight:600;font-size:.85rem;color:var(--petroleo-900);background:var(--branco);box-shadow:var(--sombra-card);padding:var(--sp-2) var(--sp-3)}
/* quebra-linha p/ equilibrar chips: no PC, se passaria de 5 numa linha, divide
   em 2 linhas (ponto de quebra inserido por js/main.js). No mobile fica natural. */
.chip-br{display:none}
@media(min-width:640px){.chip-row .chip-br{display:block;flex-basis:100%;width:100%;height:0;margin:0;padding:0;border:0}}

/* cards de lei */
.law-grid{gap:var(--sp-3)}
.law{padding:var(--sp-4) var(--sp-5);border-left:5px solid var(--e,var(--petroleo-700));min-width:0}
.law-badge{display:inline-block;font-family:var(--font-titulo);font-weight:600;font-size:.76rem;letter-spacing:.02em;padding:var(--sp-1) var(--sp-2);margin-bottom:var(--sp-2)}
.law p{font-size:.92rem;color:var(--tinta);line-height:1.5}

/* regiões (mapa do Guará) */
.region-grid{gap:var(--sp-3)}
.region{padding:var(--sp-4);border-top:4px solid var(--e);min-width:0}
.region-head{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.region-head b{color:var(--petroleo-900);font-size:1.02rem}
.region-head span{font-family:var(--font-titulo);color:var(--e-ink,var(--e));font-weight:700;white-space:nowrap}
.region p{font-size:.83rem;color:var(--tinta-60);line-height:1.5}

/* grades equilibradas: com >5 itens, quebra em 2 linhas de N/2 no PC (a classe
   .grid-balanced é posta por js/main.js). Grades com até 5 itens mantêm o auto-fit. */
.grid-balanced{grid-template-columns:1fr}
@media(min-width:560px){.grid-balanced{grid-template-columns:repeat(var(--cols-sm,2),minmax(0,1fr))}}
@media(min-width:960px){.grid-balanced{grid-template-columns:repeat(var(--cols,3),minmax(0,1fr))}}

/* galeria em carrossel */
.carousel--gal{max-width:840px;margin-inline:auto}
.carousel--gal .carousel-track{border:0;box-shadow:var(--sombra-card);border-radius:var(--raio-md)}
/* galerias de fotos ("A saúde na rua", "O Guará em movimento"): a foto inteira
   cabe na altura da tela — sem cortar as verticais; centrada e fixa no box
   (sem rolagem vertical dentro do box). */
.carousel--gal .slide{aspect-ratio:auto;height:min(70vh,86vw);background:#1c1033;display:block}
.carousel--gal .slide img{width:100%;height:100%;object-fit:contain;object-position:center}
.carousel--gal .carousel-dots button{background:rgba(var(--tinta-rgb),.22)}
.carousel--gal .carousel-dots button.active{background:var(--e,var(--petroleo-700))}

/* cor-tema por eixo p/ os componentes */
#guara{--e:var(--th-guara);--e-ink:var(--th-guara-ink)}
#saude{--e:var(--th-saude);--e-ink:var(--th-saude-ink)}
#concurso{--e:var(--th-laranja);--e-ink:var(--th-laranja-ink)}
#transversal{--e:var(--th-roxo);--e-ink:var(--th-roxo-ink)}
#legislativo{--e:var(--th-legislativo);--e-ink:var(--th-legislativo-ink)}
#melhor-idade{--e:var(--th-idade);--e-ink:var(--th-idade-ink)}
#esporte{--e:var(--th-esporte);--e-ink:var(--th-esporte-ink)}
#mulheres{--e:var(--th-mulheres);--e-ink:var(--th-mulheres-ink)}
#educacao{--e:var(--th-educacao);--e-ink:var(--th-educacao-ink)}

/* ============================================================
   CONTATO / CTA + REDES + RODAPÉ + WHATSAPP FLUTUANTE
   ============================================================ */
.svg-sprite{position:absolute;width:0;height:0;overflow:hidden}

/* CTA / contato */
/* .guia-final divide o degradê: é o mesmo bloco roxo de fecho, num cartão. */
.cta,.guia-final{position:relative;overflow:hidden;color:#fff;text-align:center;padding:var(--sp-10) 0;isolation:isolate;
  background:radial-gradient(120% 100% at 50% -20%, var(--fundo-1), var(--fundo-2) 55%, var(--fundo-3))}
/* azulejo no fundo do CTA: atrás da Dayse (z 1) e do texto (z 2) */
.cta::before{z-index:0}
.cta-inner{position:relative;z-index:2;max-width:680px;margin-inline:auto}

/* ---- HERO EM DUPLA: o dizer de um lado, a moldura do outro (18/08/2026) ----
   O `.cta--hero` nasceu centrado e de coluna única, e continua assim em toda
   página — só a /apoiar veste o `.cta--par`, porque só lá existe uma peça que
   vale tanto quanto o texto. O texto perde a centralização junto: bloco de
   texto centrado ao lado de uma imagem fica sem eixo. */
.cta--par .cta-inner{max-width:1060px;display:grid;gap:var(--sp-8);align-items:center;
  grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);text-align:left}
.cta--par .cta-actions{justify-content:flex-start}
.cta--par .cta-lead{margin-inline:0}

/* O cartão é UM link. O "botão" dentro dele é <span class="btn">: veste-se de
   botão, mas não é alvo próprio — dois alvos para o mesmo destino atrapalham
   quem navega por teclado. */
.mold-chamada{display:block;position:relative;text-decoration:none;color:inherit;
  justify-self:center;width:min(340px,100%);
  transition:transform var(--t-media),filter var(--t-media)}
.mold-chamada:hover,.mold-chamada:focus-visible{transform:translateY(-4px)}
.mold-chamada-foto{display:block;width:100%;height:auto;aspect-ratio:1/1;
  border-radius:var(--raio-lg);box-shadow:0 18px 44px rgba(var(--tinta-rgb),.42)}
/* O SELO CAVALGA O CANTO, não o meio de cima: no meio ele tapa o "TÔ COM A
   DAYSE" da própria moldura — a peça perdia a frase que a explica. É ele que
   diz "isto é uma moldura" antes de qualquer texto ser lido. */
.mold-chamada-selo{position:absolute;top:0;left:0;translate:-28% -28%;z-index:2;
  width:56px;height:56px;display:grid;place-items:center;border-radius:50%;
  background:var(--realce);color:var(--realce-ink,var(--tinta));
  box-shadow:0 8px 20px rgba(var(--tinta-rgb),.38)}
.mold-chamada-selo svg{width:28px;height:28px;fill:none;stroke:currentColor;
  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
/* o botão cavalga a borda de baixo, do mesmo jeito: o cartão vira uma peça só */
.mold-chamada-btn{position:absolute;left:50%;bottom:0;translate:-50% 45%;z-index:2;
  white-space:nowrap;gap:var(--sp-2)}
.mold-chamada-btn svg{width:20px;height:20px;flex:0 0 auto;fill:none;stroke:currentColor;
  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.mold-chamada:hover .mold-chamada-btn{background:var(--realce-forte)}
/* a folga de baixo é do botão que cavalga: sem ela ele encosta no que vier */
.cta--par .mold-chamada{margin-bottom:var(--sp-5)}

@media(max-width:820px){
  .cta--par .cta-inner{grid-template-columns:1fr;text-align:center;
    max-width:560px;gap:var(--sp-7)}
  /* desfaz o alinhamento à esquerda da coluna dupla; o centro vem da base */
  .cta--par .cta-actions{justify-content:center}
  .cta--par .cta-lead{margin-inline:auto}
  .mold-chamada{width:min(280px,84%)}
}
.cta-kicker{letter-spacing:.18em;font-size:.8rem;color:var(--realce-claro);margin-bottom:var(--sp-2)}
.cta-title{font-size:clamp(1.9rem,6vw,3rem);text-transform:uppercase}
.cta-title .hl{color:var(--realce)}
.cta-lead{margin:var(--sp-3) auto 0;color:rgba(255,255,255,.9);font-size:clamp(1rem,3vw,1.15rem);max-width:48ch}
.cta-actions{display:flex;flex-wrap:wrap;gap:var(--sp-3);justify-content:center;margin-top:var(--sp-6)}
/* No mobile os botões abrem espaço à direita p/ a Dayse (encolhem/vão pra
   esquerda) — MAS SÓ ONDE A DAYSE ESTÁ. O recorte `.cta-dayse` existe num lugar
   só: o CTA de rodapé montado pelo `_middleware.js`. Os heros de página vestem
   `.cta.cta--hero` e não têm recorte nenhum, então até 18/08/2026 eles abriam
   34% de espaço para ninguém e o botão nascia torto — medido a 390px na
   /apoiar: 58px à esquerda do centro; a 600px, 87px. O `:not()` devolve a eles
   o `justify-content:center` da regra base. */
@media(max-width:720px){
  .cta:not(.cta--hero) .cta-actions{justify-content:flex-start;padding-right:34%}
  .cta-actions .btn{padding-left:var(--sp-4);padding-right:var(--sp-4);font-size:.92rem}
}
.btn-ico{width:20px;height:20px;fill:currentColor}
.cta-social-label{margin-top:var(--sp-7);letter-spacing:.12em;font-size:.78rem;color:var(--petroleo-200)}

/* redes (chips) */
.social{display:flex;flex-wrap:wrap;gap:var(--sp-3);justify-content:center;margin-top:var(--sp-3)}
/* redes no hero: alinhadas à esquerda p/ casar com os botões (fundo roxo, mesmo estilo do CTA) */
.social--hero{justify-content:flex-start;margin-top:var(--sp-4)}
/* assinatura empilhada no topo do hero. NÃO leva `filter:brightness(0) invert(1)`:
   o arquivo já vem branco e turquesa, e o filtro achataria as duas cores em branco
   chapado — era o truque de quando a assinatura era roxa (docs/29 §6).

   QUEM MANDA NO TAMANHO AQUI É O JS, não este `height`: o `heroAlign()` do main.js
   iguala a largura da assinatura à de "mas não sou só.", que é a régua do hero
   inteiro (título, sobrancelha e assinatura na mesma largura). O `height` abaixo
   é só o estado antes do JS rodar e a rede de quem está sem JS. Como o desenho
   novo é empilhado (2,15:1, e não os 7,2:1 do antigo), a MESMA largura dá um
   bloco ~3x mais alto — é isso que se vê no hero, e é de propósito. */
.hero-wordmark{display:block;height:clamp(86px,14vw,150px);max-width:100%;margin:0 0 var(--sp-4);
  /* 1789,24 x 832,06 = o viewBox do arquivo antigo, agora reconstruído por
     posição. A PROPORÇÃO substitui o width:auto que o <img> dava de graça — e
     convive com o heroAlign(), que crava width e deixa height:auto. */
  aspect-ratio:1789.24/832.06;position:relative}
.hw-belt{position:absolute;inset:0}
.hw-parte{position:absolute;left:0;width:100%;height:auto;display:block}
.hw-logo{top:0}
.hw-num{top:47.27%}          /* 393,3 / 832,06 — a folga exata do arquivo de origem */
.hw-bis{display:none}        /* a cópia do logo só serve à esteira do celular */
/* desktop: hero centralizado por completo (texto + CTA + redes no mesmo eixo) */
@media(min-width:1024px){
  .hero-content{text-align:center}
  .hero-wordmark{margin-inline:auto}
  .hero-lead{margin-inline:auto}
  .hero-actions{justify-content:center}
  .social--hero{justify-content:center}
}
/* mobile: Apoie + Conheça lado a lado (dividem a linha, sem quebrar) + redes centralizadas abaixo */
@media(max-width:600px){
  /* A ESTEIRA (18/08/2026).

     No celular a assinatura empilhada come um terço da primeira tela — e ela é
     duas informações, o nome e o número, que não precisam aparecer juntas. Aqui
     elas se revezam numa faixa só: o logo sai de lado PUXANDO o número, e o
     número sai puxando o logo. Não é cruzamento de opacidade; é uma esteira
     rígida, que é o que dá a sensação de arrastar um ao outro.

     O laço fecha sem emenda porque a esteira tem TRÊS peças: logo, número,
     logo. Em -66,666% o que se vê é a terceira peça, quadro idêntico ao de
     translateX(0) — então o retorno ao zero é invisível. Sem essa terceira
     peça, o loop precisaria voltar andando para trás (feio) ou dar um salto
     visível.

     A proporção da faixa é a do NÚMERO (a peça mais alta): com object-fit
     contain, o logo, que é mais baixo, entra inteiro e centrado, e as duas
     peças mantêm a escala relativa que tinham no arquivo original. */
  .hero-wordmark{aspect-ratio:1789.24/438.76;overflow:hidden}
  .hw-belt{display:flex;width:300%;height:100%;
    animation:hw-esteira 12s cubic-bezier(.65,0,.35,1) infinite}
  .hw-parte{position:static;flex:0 0 33.3333%;width:33.3333%;height:100%;
    object-fit:contain;object-position:center}
  .hw-bis{display:block}
  .hero-actions{flex-wrap:nowrap;gap:var(--sp-2)}
  .hero-actions .btn{flex:1 1 0;min-width:0;justify-content:center;white-space:nowrap;padding:.72em .6em;font-size:clamp(.72rem,3.2vw,.92rem)}
  .hero-actions .btn-num b{padding:.05em .32em}
  .social--hero{justify-content:center}
}
.social a{width:46px;height:46px;background:rgba(255,255,255,.10);color:#fff;transition:transform .2s,background .2s,color .2s}
.social a:hover,.social a:focus-visible{background:var(--ambar-500);color:var(--tinta);transform:translateY(-3px)}
.social-ico{width:21px;height:21px;fill:currentColor}

/* rodapé */
.site-footer{background:var(--tinta-fundo);color:#fff;padding:var(--sp-8) 0}
.footer-inner{display:flex;flex-direction:column;gap:var(--sp-4);align-items:center;text-align:center}
.footer-meta{color:rgba(255,255,255,.7);font-size:.9rem}
.footer-meta b{color:var(--realce-claro)}
.footer-mail a{color:rgba(255,255,255,.6);font-size:.85rem}
.footer-mail a:hover{color:#fff;text-decoration:underline}

/* WhatsApp flutuante */
.wa-float{position:fixed;right:16px;bottom:16px;z-index:var(--z-flutuante);width:56px;height:56px;background:var(--realce);color:var(--realce-ink,var(--tinta));box-shadow:0 10px 26px rgba(var(--tinta-rgb),.34);transition:transform .2s,background .25s,color .25s}
.wa-float:hover{transform:translateY(-3px) scale(1.05);background:var(--realce-forte)}
.wa-float svg{width:30px;height:30px;fill:currentColor}
@media (min-width:1024px){.wa-float{width:62px;height:62px;right:24px;bottom:24px}.wa-float svg{width:34px;height:34px}}

/* ============================================================
   SCROLL-REVEAL
   ============================================================ */
.reveal{opacity:0;transform:translateY(22px);transition:opacity .6s ease,transform .6s ease}
.reveal.in{opacity:1;transform:none}
.stillmode .reveal{opacity:1 !important;transform:none !important;transition:none !important}
/* captura determinística: congela o slideshow do hero de "Quem sou" no 1º quadro
   (mesma regra que o prefers-reduced-motion já aplica lá embaixo) */
.stillmode .cta-slideshow span{animation:none}
.stillmode .cta-slideshow span:first-child{opacity:1}
/* modo captura: encurta divisores p/ ver a página inteira sem distorção de vh */
.compact .divisor{min-height:360px}

/* ============================================================
   BREAKPOINTS (min-width — mobile-first)
   ============================================================ */
@media (min-width:640px){
  .counters-grid>*{flex:0 1 calc(25% - var(--sp-3) * 3 / 4)}
  .seg-grid>*{flex:0 1 calc(50% - var(--sp-4) / 2)}
}
@media (min-width:768px){
  .slide{aspect-ratio:16/11}
  /* DESKTOP com foto: foto no painel direito, cor+texto à esquerda, seam em degradê */
  .divisor.has-foto .divisor-media{left:40%;background-position:center}
  .divisor.has-foto{
    --dv-mask:linear-gradient(90deg, #000 0%, #000 38%, transparent 62%)}
  .divisor.has-foto .divisor-overlay{
    background:linear-gradient(90deg, var(--dv-color) 0%, var(--dv-color) 38%, transparent 62%)}
  /* DESKTOP sem foto: cor forte à esquerda → revela o placeholder à direita */
  .divisor:not(.has-foto){
    --dv-mask:linear-gradient(90deg, #000 0%, #000 30%, rgba(0,0,0,.60) 52%, transparent 86%)}
  .divisor:not(.has-foto) .divisor-overlay{
    background:linear-gradient(90deg,
      var(--dv-color) 0%, var(--dv-color) 30%,
      color-mix(in srgb, var(--dv-color) 60%, transparent) 52%,
      color-mix(in srgb, var(--dv-color) 0%, transparent) 86%)}
}
@media (min-width:1024px){
  :root{--header-h:74px;--azulejo-h:54px}
  .brand-assin{height:40px}
  .brand-logo{height:40px}
  .brand-wordmark{height:25px}
  .nav-desktop{display:flex}
  .hdr-cta{display:inline-flex}
  .menu-toggle{display:none}
  .mobile-menu{display:none !important}
  /* (a faixa 1024–1099 volta ao hambúrguer logo abaixo do fecho deste bloco) */
  .hero{padding:var(--sp-11) 0 var(--sp-12)}
  .hero-grid{grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);align-items:center;gap:var(--sp-8)}
  .seg-grid>*{flex:0 1 calc(25% - var(--sp-4) * 3 / 4)}
  .segments{padding:var(--sp-12) 0}
  .divisor{min-height:56vh}
  .subeixos{padding-block:var(--sp-9) var(--sp-8)}
}
/* A ASSINATURA INTEIRA, COM O 40222 — e o cabeçalho ganha um container próprio.
   O `--container` de 1200px é o container do SITE INTEIRO: alargá-lo mudaria a
   medida de leitura de todas as páginas. Só o cabeçalho cresce.
   O ponto de virada (1360px) e a largura (1320px) saíram de medição no Chrome
   COM Oswald carregado — a fonte é condensada e mede diferente. Ver docs/29 §5
   e `node tools/medir-header.mjs`, que refaz a conta.
   Medido: a 1360 a assinatura inteira ocupa 380px e ainda sobram 101px de folga
   no cabeçalho. O limiar real fica por volta de 1310; 1360 é margem de propósito,
   para um item de menu renomeado não estourar a linha. */
@media (min-width:1360px){
  .site-header .container{max-width:var(--container-header)}
  .brand-assin--curta{display:none}
  .brand-assin--cheia{display:block}
}
/* 1024–1099: ESTA FAIXA VOLTA AO HAMBÚRGUER.
   Com o oitavo item (Projetos) o menu não cabe aqui — e o que enganou a
   primeira medição foi eu medir só a HOME: nela o botão de redes tem largura
   0, no resto do site ele ocupa 41px. Medido em /blog, transbordo do menu:
     gap 12px / .98rem → 1024: 73px      gap 10px / .92rem → 1024: 45px
     gap 10px / .86rem → 1024: 25px
   Ou seja: não cabe nem apertando a fonte a 13px. E 1024 é iPad deitado, que
   é touch — encolher mais o texto salvaria o pixel e estragaria o alvo de
   toque (a régua deste projeto é 44px). O hambúrguer já resolve isso, e é o
   que vale um pixel abaixo daqui.
   O `!important` responde ao `display:none !important` do bloco de 1024 acima;
   por isso o `[hidden]` também precisa do dele, senão o menu abriria sozinho. */
@media (min-width:1024px) and (max-width:1099.98px){
  .nav-desktop{display:none}
  .menu-toggle{display:grid}
  .mobile-menu{display:flex !important}
  .mobile-menu[hidden]{display:none !important}
}

@media (min-width:1440px){
  .container{max-width:1240px}
}

/* ============================================================
   MOVIMENTO REDUZIDO
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation:none !important;transition:none !important}
  .reveal{opacity:1;transform:none}
  .carousel-track{scroll-behavior:auto}
}

/* ============================================================
   FOTOS DA REVISTA — base (Dayse PNG) + carimbos flutuantes (overs)
   ============================================================ */
/* Dayse recortada no fundo roxo da CTA ("Fale com o mandato"), sem faixa branca */
.cta-dayse{position:absolute;right:var(--dayse-x,0px);bottom:0;z-index:1;height:min(90%,450px);width:auto;pointer-events:none;filter:drop-shadow(0 12px 30px rgba(0,0,0,.32))}
@media(max-width:720px){.cta-dayse{right:-12%;bottom:0;height:min(70%,310px);opacity:.9}}
/* modo edição: a Dayse pode ser reposicionada horizontalmente (arrastar).
   A posição é guardada em --dayse-x e só vale no wide; no mobile a regra acima vence */
body.dayse-editing .cta-dayse{pointer-events:auto;cursor:ew-resize;touch-action:none}
body.dayse-editing .cta-dayse:hover{outline:2px dashed var(--ambar-500);outline-offset:4px}
.cta-dayse.dayse-dragging-x{cursor:grabbing;outline:2px solid var(--ambar-500);outline-offset:4px}
/* modo edição: arrastar a foto do carrossel dentro do frame p/ reenquadrar (object-position).
   Só nos carrosséis com corte (cover); galerias usam contain (nada a reenquadrar). */
body.dayse-editing .carousel:not(.carousel--gal) .slide img{cursor:grab;touch-action:none}
body.dayse-editing .slide img.dayse-img-panning{cursor:grabbing}
body.dayse-editing .carousel:not(.carousel--gal) .slide::after{content:"arraste · rodinha = zoom";position:absolute;z-index:4;left:8px;top:8px;
  background:rgba(20,8,40,.72);color:#fff;font:600 11px/1 var(--font-titulo);text-transform:uppercase;letter-spacing:.04em;
  padding:var(--sp-1) var(--sp-2);border-radius:8px;pointer-events:none;opacity:0;transition:opacity .15s}
body.dayse-editing .carousel:not(.carousel--gal) .slide:hover::after{opacity:1}
body.dayse-editing .carousel:not(.carousel--gal) .slide:has(.dayse-img-panning)::after{opacity:0}
/* mobile intocado: ignora reposicionamento/escala aplicados no wide */
@media(max-width:720px){.cta-dayse{transform:none !important}}

/* seções posicionadas p/ os carimbos flutuantes (qualquer seção pode hospedar) */
section,footer{position:relative}
.over-stamp{position:absolute;z-index:5;pointer-events:none;width:clamp(110px,13vw,180px);height:auto;filter:drop-shadow(0 8px 18px rgba(0,0,0,.22))}
.over-promessa{right:2%;bottom:8%;transform:rotate(-7deg)}
.over-guara-pediu{right:1.5%;top:7%;transform:rotate(6deg)}
.over-guara-atendeu{left:1.5%;bottom:10%;transform:rotate(-5deg)}
.over-hrgu{right:1.5%;top:24%;transform:rotate(5deg)}
.over-saude-escolas{left:1.5%;bottom:12%;transform:rotate(-6deg)}
.over-hq{right:1.5%;top:16%;transform:rotate(6deg)}
@media(max-width:820px){.over-stamp{display:none}} /* só no desktop, pra não cobrir conteúdo no mobile */
/* no modo edição os carimbos ficam agarráveis p/ posicionar livremente */
body.dayse-editing .over-stamp{pointer-events:auto;cursor:grab;outline:2px dashed var(--turquesa-400);outline-offset:2px}
body.dayse-editing .over-stamp.over-dragging{opacity:.8;cursor:grabbing;z-index:1000}

/* ============================================================
   MODO EDIÇÃO — engrenagem (canto sup. direito) → editar textos
   Ferramenta de rascunho (client-side, salva no navegador).
   ============================================================ */
/* dock: engrenagem + barra juntas no canto sup. direito */
.dayse-edit-dock{
  position:fixed;z-index:var(--z-edicao);
  top:calc(var(--header-h) + var(--azulejo-h) + 12px);right:14px;
  display:flex;flex-direction:row-reverse;align-items:center;gap:var(--sp-2);
}
.dayse-gear{flex:none;width:44px;height:44px;border:0;cursor:pointer;padding:0;
  background:var(--branco);color:var(--petroleo-800);
  box-shadow:var(--sombra-card);transition:transform .25s,background .2s,color .2s}
.dayse-gear svg{width:22px;height:22px;display:block}
.dayse-gear:hover{transform:rotate(35deg)}
.dayse-gear[aria-pressed="true"]{background:var(--petroleo-800);color:#fff;transform:rotate(60deg)}

/* barra ao lado da engrenagem; só aparece no modo edição (bar.hidden) */
.dayse-edit-bar{
  display:flex;align-items:center;gap:var(--sp-2);
  background:var(--petroleo-900);color:#fff;padding:var(--sp-2) var(--sp-2) var(--sp-2) var(--sp-4);
  /* canto arredondado, não pílula: --raio-md é o mesmo do .dayse-panel que abre
     logo abaixo dela, então a barra e o painel passam a ter o mesmo canto. E o
     pill só funcionava numa linha — no celular a barra quebra em 3 (medido:
     362x123) e o raio de 999px virava uma ponta de 61px. */
  border-radius:var(--raio-md);box-shadow:var(--sombra-hover);
}
.dayse-edit-bar[hidden]{display:none}
.dayse-edit-bar .deb-status{letter-spacing:.05em;font-size:.72rem;color:var(--amarelo-300);white-space:nowrap}
.deb-btn{font-family:var(--font-texto);font-weight:600;font-size:.82rem;line-height:1;padding:var(--sp-2) var(--sp-3);background:rgba(255,255,255,.14);color:#fff;transition:background var(--t-rapida)}
.deb-btn:hover{background:rgba(255,255,255,.26)}
.deb-btn.deb-primary{background:var(--amarelo-500);color:var(--petroleo-900)}
.deb-btn.deb-primary:hover{background:var(--amarelo-300)}
/* (o :hover do deb-publish vem do .btn--sucesso, lá em cima — não se repete aqui) */
/* toast de feedback ao Publicar (gira → check verde → some) */
.dayse-toast{position:fixed;z-index:var(--z-toast);top:calc(var(--header-h) + var(--azulejo-h) + 20px);left:50%;
  display:none;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-5);border-radius:var(--raio-pill);
  letter-spacing:.04em;font-weight:600;font-size:.86rem;
  box-shadow:var(--sombra-hover);color:#fff;background:var(--petroleo-800);
  opacity:0;transform:translate(-50%,-10px);transition:opacity .2s,transform .2s;pointer-events:none}
.dayse-toast.on{display:flex;opacity:1;transform:translate(-50%,0)}
.dayse-toast.t-ok{background:var(--turquesa-500);color:var(--sobre-turquesa)}
.dayse-toast.t-err{background:var(--magenta-500)}
.dayse-toast .dt-ico{display:grid;place-items:center}
.dayse-toast svg{width:20px;height:20px;stroke-width:2.4;display:block}
@keyframes dt-rot{to{transform:rotate(360deg)}}
.dayse-toast .dt-spin{animation:dt-rot .8s linear infinite;transform-origin:center}

@media(max-width:560px){
  .dayse-edit-dock{flex-direction:column;align-items:flex-end}
  .dayse-edit-bar{flex-wrap:wrap;justify-content:flex-end;max-width:calc(100vw - 28px)}
  .dayse-edit-bar .deb-status{display:none}
}

body.dayse-editing [data-edit-key]{outline:2px dashed rgba(var(--petroleo-700-rgb),.45);outline-offset:3px;border-radius:5px;cursor:text}
body.dayse-editing [data-edit-key]:hover{outline-color:rgba(var(--petroleo-700-rgb),.8)}
body.dayse-editing [data-edit-key]:focus{outline:2px solid var(--petroleo-700);outline-offset:3px;background:rgba(155,114,212,.10)}
body.dayse-editing [data-edit-key].is-edited{outline-color:var(--ambar-500)}

/* ocultos: fantasma de baixa opacidade no modo edição, some fora dele */
body:not(.dayse-editing) .dayse-hidden{display:none !important}
body.dayse-editing .dayse-hidden{opacity:.4;outline:2px dashed var(--turquesa-400) !important;outline-offset:3px}

/* mini-barra flutuante por bloco (alça + ocultar + deletar) */
.dayse-blk-tools{position:fixed;z-index:var(--z-edicao-alta);display:none;gap:var(--sp-1);padding:var(--sp-1);border-radius:10px;background:var(--petroleo-900);box-shadow:var(--sombra-hover)}
.dayse-blk-tools.on{display:flex}
.dayse-blk-tools button{width:27px;height:27px;border-radius:7px;display:grid;place-items:center;background:transparent;color:#fff;padding:0}
.dayse-blk-tools button:hover{background:rgba(255,255,255,.18)}
.dayse-blk-tools button svg{width:16px;height:16px;display:block}
.dayse-blk-tools .bt-drag{cursor:grab}
.dayse-blk-tools .bt-del:hover{background:var(--magenta-500)}
body.dayse-editing .dayse-blk-hot{outline:2px solid var(--petroleo-700) !important;outline-offset:3px}
.dayse-dragging{opacity:.45}
.dayse-drop-line{position:fixed;z-index:var(--z-edicao-guia);background:var(--ambar-500);border-radius:2px;pointer-events:none;display:none}

/* frame de redimensionamento (títulos e textos livres) */
.dayse-rez{position:fixed;z-index:var(--z-edicao-frame);pointer-events:none;display:none}
.dayse-rez.on{display:block}
.dayse-rez i{position:absolute;pointer-events:auto;background:var(--petroleo-700);opacity:.85}
.dayse-rez .rz-l,.dayse-rez .rz-r{top:0;bottom:0;width:6px;cursor:ew-resize;border-radius:4px}
.dayse-rez .rz-l{left:-3px}
.dayse-rez .rz-r{right:-3px}
.dayse-rez .rz-t,.dayse-rez .rz-b{left:0;right:0;height:6px;cursor:ns-resize;border-radius:4px}
.dayse-rez .rz-t{top:-3px}
.dayse-rez .rz-b{bottom:-3px}

/* frame de ESCALA dos PNGs (carimbos + Dayse do CTA): grip proporcional no canto livre */
.dayse-scale{position:fixed;z-index:var(--z-edicao-guia);pointer-events:none;display:none;outline:2px dashed var(--ambar-500)}
.dayse-scale.on{display:block}
.dayse-scale i{position:absolute;pointer-events:auto;width:16px;height:16px;border-radius:50%;background:var(--ambar-500);border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.35);cursor:nwse-resize}
.dayse-scale.anchor-tl i{right:-9px;bottom:-9px}
.dayse-scale.anchor-br i{left:-9px;top:-9px}

/* botões-ícone da barra + painel ocultos/lixeira */
.deb-ico{padding:var(--sp-2)}
.deb-ico svg{width:15px;height:15px;display:block}
.deb-btn[disabled]{opacity:.4}
.deb-count{font-weight:700}
.dayse-panel{position:fixed;z-index:var(--z-edicao-alta);top:calc(var(--header-h) + var(--azulejo-h) + 64px);right:14px;width:min(300px,calc(100vw - 28px));max-height:60vh;overflow:auto;background:var(--branco);border-radius:var(--raio-md);box-shadow:var(--sombra-hover);padding:var(--sp-3)}
.dayse-panel[hidden]{display:none}
.dayse-panel h4{font:700 .78rem/1 var(--font-titulo);text-transform:uppercase;letter-spacing:.05em;color:var(--petroleo-900);margin:var(--sp-2) var(--sp-1) var(--sp-1)}
.dp-item{display:flex;gap:var(--sp-2);align-items:center;justify-content:space-between;padding:var(--sp-1) var(--sp-2);border-radius:8px;background:var(--papel);margin-bottom:var(--sp-1)}
.dp-item span{font-size:.8rem;color:var(--tinta-60);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dp-item button{flex:none;padding:var(--sp-1) var(--sp-3)}
.dp-empty{font-size:.8rem;color:var(--tinta-60);padding:var(--sp-1)}

/* --- Botão Backup (barra) + painel de checkpoints do site --- */
.deb-backup{display:inline-flex;align-items:center;gap:var(--sp-2)}
.deb-backup svg{width:15px;height:15px;display:block}
.dayse-bk-panel{width:min(340px,calc(100vw - 28px))}
.bk-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.bk-head h4{margin:0}
.bk-create{flex:none;padding:var(--sp-2) var(--sp-3);font:700 .76rem var(--font-texto)}
.bk-create[disabled]{opacity:.6}
.bk-hint{font-size:.74rem;line-height:1.35;color:var(--tinta-60);margin:0 var(--sp-1) var(--sp-2)}

/* --- MODAL DE CORES (barra de edição) ---
   Único painel do editor que NÃO é gaveta lateral. Escolher cor é a tarefa em
   que o site inteiro é a prévia e em que quatro grupos precisam ser comparados
   lado a lado; numa coluna de 320px o conteúdo passava de 1.400px e obrigava a
   rolar para comparar duas cores vizinhas. Lixeira, backup e texto continuam
   gaveta — ali a tarefa é lista, não composição. */
/* O VÉU COMEÇA ONDE O CABEÇALHO ACABA (18/08/2026). A faixa de azulejo é a
   PRÉVIA deste painel, e ela mora dentro do header sticky: medido em 1440x900,
   o modal centralizado tapava 33 dos 54px dela e o véu escurecia o resto. O
   elemento continua cobrindo a tela inteira — é ele que barra o clique no menu
   durante a edição —, mas o escurecimento vive no ::after, que começa em
   --cx-topo-livre (a altura do header, medida pelo editor ao abrir). */
.dayse-cx-fundo{position:fixed;inset:0;z-index:calc(var(--z-edicao-alta) - 1);background:none}
.dayse-cx-fundo::after{content:"";position:absolute;left:0;right:0;bottom:0;
  top:var(--cx-topo-livre,0px);
  background:rgba(var(--petroleo-900-rgb),.55);backdrop-filter:blur(2px)}
.dayse-cx-fundo[hidden]{display:none}
.dayse-az-panel{
  top:calc(var(--cx-topo-livre,0px) + var(--sp-2));left:50%;right:auto;transform:translateX(-50%);
  width:min(1040px,calc(100vw - 32px));
  max-height:calc(100vh - var(--cx-topo-livre,0px) - var(--sp-4) * 2);
  padding:var(--sp-4) var(--sp-5);
  /* sombra mais funda que a da gaveta: aqui há um véu atrás, e o cartão precisa
     descolar dele para não parecer parte do fundo */
  box-shadow:0 24px 70px rgba(var(--petroleo-900-rgb),.45)}
.cx-topo{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);
  margin-bottom:var(--sp-1)}
.cx-topo h4{margin:0;font-size:1rem}
.cx-fechar{flex:none;width:34px;height:34px;display:grid;place-items:center;padding:0;
  border:0;border-radius:50%;background:var(--papel);color:var(--petroleo-800);cursor:pointer}
.cx-fechar:hover{background:var(--petroleo-100)}
.cx-fechar svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;display:block}
.cx-lead{margin-bottom:var(--sp-4)}
/* MULTI-COLUNA, e não grid: 1 coluna no celular, 2 no notebook, 3 na tela larga,
   sem um breakpoint sequer. O grid foi tentado primeiro e as linhas ficavam
   desiguais — "Cores da faixa" é 3x mais alto que os outros e empurrava o
   último bloco sozinho para uma 2ª linha, com um vão enorme ao lado. A
   multi-coluna empilha na vertical e equilibra as alturas. */
.cx-grade{columns:3 260px;column-gap:var(--sp-4)}
.cx-bloco{break-inside:avoid;min-width:0;background:var(--papel);border-radius:var(--raio-sm);
  padding:var(--sp-3) var(--sp-3) var(--sp-2);margin-bottom:var(--sp-4)}
.cx-bloco .bk-head{margin-bottom:var(--sp-1)}
.cx-bloco .az-row:last-child{margin-bottom:var(--sp-2)}
/* dentro do bloco os campos ficam sobre o papel: o branco volta a ser contraste */
.cx-bloco .az-row select,.cx-bloco .az-cor input[type=text]{background:var(--branco)}
/* prévia do destaque: a moldura do carrossel, a bolinha e o texto claro, sobre
   o fundo real do site — é ali que a cor vive e é ali que ela some */
.az-prev{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2) var(--sp-3);padding:var(--sp-3);
  border-radius:10px;margin:0 2px var(--sp-1)}
.az-prev-btn{flex:none;padding:.32em .9em;border-radius:var(--raio-pill);color:var(--tinta);
  font:700 .72rem var(--font-titulo);letter-spacing:.05em;text-transform:uppercase}
.az-prev-moldura{flex:none;width:38px;height:26px;border-radius:6px;border:3px solid}
.az-prev-dot{flex:none;width:22px;height:9px;border-radius:5px;display:block}
.az-prev-txt{font:600 .68rem var(--font-titulo);letter-spacing:.14em;text-transform:uppercase}
.az-hint{font-size:.74rem;line-height:1.35;color:var(--tinta-60);margin:0 var(--sp-1) var(--sp-3)}
.az-row{margin-bottom:var(--sp-3)}
.az-row label{display:block;font:600 .74rem var(--font-texto);color:var(--tinta-60);margin:0 var(--sp-1) var(--sp-1)}
.az-val{float:right;font:700 .74rem var(--font-texto);color:var(--petroleo-800)}
.az-row select{width:100%;padding:var(--sp-2);border-radius:10px;border:1px solid rgba(var(--tinta-rgb),.16);
  background:var(--branco);font:600 .8rem var(--font-texto);color:var(--petroleo-900);cursor:pointer}
.az-row input[type=range]{width:100%;accent-color:var(--petroleo-700);cursor:pointer}
.az-reset{flex:none;padding:var(--sp-1) var(--sp-3)}
/* cores da faixa: 3 lugares (Principal/Destaque/Vazio) — ver docs/09 */
.az-sep{margin:var(--sp-4) 0 var(--sp-2);padding-top:var(--sp-3);border-top:1px solid rgba(var(--tinta-rgb),.10)}
.az-cor{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.az-cor > b{flex:1;min-width:0;font:600 .74rem var(--font-texto);color:var(--tinta-60)}
.az-cor input[type=color]{flex:none;width:34px;height:26px;padding:0;cursor:pointer;
  border:1px solid rgba(var(--tinta-rgb),.2);border-radius:7px;background:none}
.az-cor input[type=text]{flex:none;width:78px;padding:var(--sp-1) var(--sp-2);border-radius:7px;
  border:1px solid rgba(var(--tinta-rgb),.16);background:var(--branco);
  font:600 .72rem ui-monospace,monospace;color:var(--petroleo-900);text-transform:lowercase}
.az-cor input[type=text].ruim{border-color:var(--magenta-500);color:var(--magenta-500)}
.az-sws{display:flex;flex-wrap:wrap;gap:4px;margin:0 0 var(--sp-3) 2px}
.az-sw{width:17px;height:17px;padding:0;border-radius:50%;cursor:pointer;
  border:1px solid rgba(var(--tinta-rgb),.22);transition:transform .12s}
.az-sw:hover,.az-sw:focus-visible{transform:scale(1.25)}
/* --- CORES DA FAIXA: o chip é o alvo da edição (docs/09 §14) ---
   O bloco é LARGO e fica fora da multi-coluna: ele carrega nove chips e uma
   sanfona que abre dentro da fileira. Espremido em 260px, cada clique num chip
   mudava a altura e a `columns` redistribuía os outros blocos — o modal
   inteiro pulava a cada escolha. */
.cx-faixa{width:100%}
.az-pals{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-bottom:var(--sp-2)}
.az-pal{display:flex;align-items:center;gap:5px;padding:var(--sp-1) var(--sp-2);border-radius:var(--raio-pill);
  border:1.5px solid var(--petroleo-100);background:var(--branco);cursor:pointer;
  font:600 .7rem var(--font-texto);color:var(--petroleo-800)}
.az-pal:hover{border-color:var(--turquesa-400)}
.az-pal i{width:11px;height:11px;border-radius:50%;display:block;border:1px solid rgba(var(--tinta-rgb),.18)}
/* preset regravado pelo usuário: some quando ele restaura o de fábrica */
.az-pal.mexido{border-color:var(--turquesa-500)}
.az-pal.mexido::after{content:"•";color:var(--turquesa-500);font-weight:700;margin-left:1px}
/* o eixo ABERTO: é ele que a faixa está mostrando e a página foi buscar */
.az-pal[aria-expanded=true]{background:var(--petroleo-800);border-color:var(--petroleo-800);color:var(--branco)}
.az-pal[aria-expanded=true].mexido::after{color:var(--turquesa-400)}
/* a sanfona quebra a linha da fileira e abre EMBAIXO do chip clicado */
.az-sanfona{flex-basis:100%;min-width:0;margin:var(--sp-1) 0 var(--sp-2);
  padding:var(--sp-3) var(--sp-3) var(--sp-2);border-radius:var(--raio-sm);
  background:var(--branco);border:1.5px solid var(--petroleo-800);
  animation:az-abre .16s ease}
@keyframes az-abre{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.az-sanfona{animation:none}}
/* a base fica sempre visível, abaixo da fileira — é a cor de fora dos eixos */
.az-base{margin-top:var(--sp-2);padding-top:var(--sp-3);border-top:1px dashed rgba(var(--tinta-rgb),.14)}
.az-sub{font-size:.74rem}
.az-nota{font:400 .72rem var(--font-texto);color:var(--tinta-60);
  letter-spacing:0;text-transform:none}
/* as três cores LADO A LADO: no bloco largo cada coluna passa de 300px, e as
   14 amostras da marca cabem numa linha só (medido: 290px) */
.az-tres{display:flex;flex-wrap:wrap;gap:0 var(--sp-4)}
.az-um{flex:1 1 250px;min-width:0}
.az-um .az-sws{margin-bottom:var(--sp-2)}
/* a faixa fica sob um header branco: se as três cores clarearem demais, ela some */
.az-aviso{display:flex;gap:6px;font-size:.72rem;line-height:1.35;color:var(--th-laranja-ink);
  background:color-mix(in srgb,var(--ambar-500) 14%,#fff);
  padding:var(--sp-2);border-radius:8px;margin:0 0 var(--sp-2)}
/* prévia da rampa do fundo: os três degraus que o CSS deriva da cor escolhida.
   Existe para a escolha ser feita OLHANDO o degradê inteiro, e não só o topo. */
.az-rampa{display:flex;height:26px;border-radius:8px;overflow:hidden;margin:0 2px var(--sp-1);
  border:1px solid rgba(var(--tinta-rgb),.18)}
.az-rampa i{flex:1}
.az-rampa-leg{margin-bottom:var(--sp-2)}
.bk-item{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);padding:var(--sp-2);border-radius:8px;background:var(--papel);margin-bottom:var(--sp-1)}
.bk-meta{min-width:0;display:flex;flex-direction:column;gap:var(--sp-1)}
.bk-meta b{font-size:.8rem;color:var(--petroleo-900)}
.bk-tag{font-size:.72rem;color:var(--tinta-60)}
.bk-cover{font-size:.68rem;color:var(--tinta-60);opacity:.8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}
.bk-acts{flex:none;display:flex;align-items:center;gap:var(--sp-1)}
.bk-restore{padding:var(--sp-1) var(--sp-3)}
.bk-del{background:transparent;color:var(--tinta-60);display:grid;place-items:center;padding:var(--sp-1);border-radius:8px}
.bk-del:hover{background:#fff;color:var(--magenta-500)}
.bk-del svg{width:15px;height:15px;display:block}

/* Snapshot do rascunho: seção do painel de backup. A régua acima separa duas
   coisas que não se confundem — backup vai ao SERVIDOR e vale para todos;
   snapshot é um arquivo e não sai deste navegador até alguém mandá-lo. */
.bk-snap{margin-top:var(--sp-3);padding-top:var(--sp-3);border-top:1px solid rgba(var(--tinta-rgb),.14)}
.bk-snap h4{margin:0 0 var(--sp-1)}
.bk-snap-acts{display:flex;gap:var(--sp-1);margin:0 var(--sp-1)}
.bk-snap-btn{flex:1 1 0;min-width:0;display:inline-flex;align-items:center;justify-content:center;
  gap:var(--sp-1);padding:var(--sp-2);text-align:center}
.bk-snap-btn svg{width:15px;height:15px;display:block;flex:none}

/* ============================================================
   PÁGINA APOIADORES (apoiar.html) — form, FAQ, manual "Como apoiar?"
   Tudo sobre os tokens já existentes.
   ============================================================ */
.apoio-sec{padding:clamp(40px,7vw,68px) 0}
.apoio-sec.alt{background:var(--branco)}

/* --- Manual "Como apoiar?" (estilo institucional/Portal: painel, número, ícone de traço) --- */
.manual{display:grid;gap:var(--sp-4);grid-template-columns:1fr}
@media(min-width:760px){.manual{grid-template-columns:repeat(2,1fr)}}
.step{position:relative;display:flex;gap:var(--sp-4);align-items:flex-start;
  border:1.5px solid color-mix(in srgb,var(--e,var(--petroleo-700)) 24%,var(--papel));
  padding:var(--sp-5)}
/* A FAIXA DO CORAÇÃO. Com o botão em posição absoluta no canto de baixo à
   direita (docs/40), o texto do chip mais alto da fileira chega até lá: medido,
   o "Defenda o Guará" tinha o rótulo coberto em repouso, e só ele entre os
   cinco. Reservar a faixa custa altura e resolve para qualquer texto futuro —
   cobrir conteúdo para comemorar um clique é trocar o assunto por confete.
   38px = os 34 do círculo + 4 de respiro. */
.step[data-curtir]{padding-bottom:calc(var(--sp-5) + 38px)}
.step-badge{position:relative;flex:none;width:58px;height:58px;border-radius:16px;display:grid;place-items:center;
  --ic-recorte:color-mix(in srgb,var(--e,var(--petroleo-700)) 14%,#fff);background:var(--ic-recorte);color:var(--e-ink,var(--petroleo-800))}
.step-badge svg{width:28px;height:28px}
.step-n{position:absolute;top:-10px;left:-10px;width:26px;height:26px;--ic-recorte:var(--e-ink,var(--petroleo-800));background:var(--ic-recorte);color:#fff;font-family:var(--font-titulo);font-weight:700;font-size:.9rem;
  box-shadow:var(--sombra-card)}
.step-body{min-width:0}
.step-title{font-weight:700;font-size:1.16rem;color:var(--petroleo-900);line-height:1.05}
.step-desc{margin-top:var(--sp-1);color:var(--tinta-60);font-size:.98rem;line-height:1.45}
.step-extra{margin-top:var(--sp-3);display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.step .social{margin-top:var(--sp-3);justify-content:flex-start;gap:var(--sp-2)}
.step .social a{width:40px;height:40px;background:color-mix(in srgb,var(--e) 14%,#fff);color:var(--e-ink)}
.step .social a:hover{background:var(--e-ink);color:#fff;transform:translateY(-3px)}
/* convite ao material interno: mesmo card, faixa inteira e fundo tingido — lê-se
   como "mais um degrau", não como o 5º gesto de apoio. (.step--largo mora na
   seção do Guia do Mobilizador: é a mesma regra de "ocupa a linha toda".) */
.step--convite{--ic-recorte:color-mix(in srgb,var(--e) 8%,var(--branco));background:var(--ic-recorte);
  border-color:color-mix(in srgb,var(--e) 38%,var(--papel))}
.step--convite .step-title{color:var(--e-ink)}
/* Os dois manuais ficam centrados na faixa — são um PAR de portas, não uma ação
   seguida de outra. Centrado só aqui: o `.step-extra` do passo "Gere ideias"
   tem um botão só, e centrá-lo o desalinharia do texto dele.

   O badge vai para CIMA, e isso não é gosto: `.step` é flex com o badge ao lado,
   então o `.step-extra` centraliza dentro da COLUNA DE TEXTO, não do cartão —
   medido, os botões saíam 37px à direita do centro no desktop e visivelmente
   fora dele no celular, onde o badge come 84px de uma coluna de 230. Compensar
   com margem negativa exigiria saber a largura do badge (58px, escrita noutro
   lugar) e ainda estouraria o cartão no celular. Empilhando, o corpo ocupa a
   faixa inteira e o centro do texto passa a ser o centro do cartão. */
.step--convite{flex-direction:column;align-items:flex-start}
.step--convite .step-body{width:100%}
.step--convite .step-extra{justify-content:center;margin-top:var(--sp-4)}

/* No celular as 5 redes do passo 2 não cabem: o .step-body tem 226px (o badge de
   58px + gap ficam ao lado), e 5x40 + 4x8 pede 232 — quebrava 4+1. Fechando o gap
   para --sp-1: 5x40 + 4x4 = 216, cabe numa linha. Aumentar o ícone para 44 seria o
   contrário do que resolve (pediria 252). Medido a 390px. */
@media(max-width:640px){.step .social{gap:var(--sp-1)}}

/* --- Formulário de apoiador --- */
.form-wrap{max-width:720px;margin-inline:auto}
.form,.guia-ficha{--ic-recorte:var(--branco);background:var(--ic-recorte);border-radius:var(--raio-lg);
  box-shadow:var(--sombra-card);padding:clamp(20px,4vw,30px)}
.form{display:grid;gap:var(--sp-4)}
.form-grid{display:grid;gap:var(--sp-4);grid-template-columns:1fr}
@media(min-width:640px){.form-grid{grid-template-columns:1fr 1fr}}
.field{display:flex;flex-direction:column;gap:var(--sp-1);min-width:0}
.field.full{grid-column:1/-1}
/* `>` e não descendente: o .check TAMBÉM é um <label> dentro de .field (é a opção
   de "Como você quer ajudar?"), e o seletor descendente o capturava junto — dava
   Oswald caixa-alta 12,5px numa opção de formulário, enquanto o MESMO componente no
   Guia do Mobilizador saía Campton 15,2px caixa normal. Medido nas duas páginas.
   O rótulo de campo é filho DIRETO de .field; a opção é neta (.field > .checks >
   .check). O `>` separa os dois sem tocar em nenhum rótulo de verdade. */
.field > label{letter-spacing:.04em;font-size:.78rem;font-weight:600;color:var(--petroleo-800)}
.field .req{color:var(--magenta-500)}
.field input,.field textarea,.field select{padding:var(--sp-3);width:100%;
  transition:border-color var(--t-rapida),box-shadow var(--t-rapida)}
.field textarea{resize:vertical;min-height:110px}
.field input:focus,.field textarea:focus,.field select:focus,.blog-search input:focus,.editor:focus{outline:none;border-color:var(--turquesa-400);
  box-shadow:0 0 0 3px color-mix(in srgb,var(--turquesa-400) 30%,transparent)}
.field input::placeholder,.field textarea::placeholder{color:var(--tinta-60);opacity:.7}
.field-err{color:var(--magenta-500);font-size:.8rem;display:none}
.field.invalid .field-err{display:block}
.field.invalid input,.field.invalid textarea{border-color:var(--magenta-500)}
.checks-label{letter-spacing:.04em;font-size:.78rem;font-weight:600;color:var(--petroleo-800);margin-bottom:var(--sp-1)}
.checks{display:grid;gap:var(--sp-2);grid-template-columns:1fr}
@media(min-width:520px){.checks{grid-template-columns:1fr 1fr}}
.check{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3);cursor:pointer;font-size:.95rem;color:var(--tinta);
  transition:border-color var(--t-rapida),background var(--t-rapida)}
.check:hover{border-color:var(--turquesa-400)}
.check input{width:18px;height:18px;accent-color:var(--petroleo-700);flex:none}
.check:has(input:checked){border-color:var(--turquesa-400);background:var(--petroleo-100)}
.hp{position:absolute!important;left:-9999px;width:1px;height:1px;opacity:0;pointer-events:none}
.form-submit{display:flex;flex-direction:column;gap:var(--sp-2);align-items:center;margin-top:var(--sp-1)}
.form-note{font-size:.82rem;color:var(--tinta-60);text-align:center;max-width:52ch}
.form-err{color:var(--magenta-500);font-size:.85rem;text-align:center;font-weight:600}
.form-ok{display:none;text-align:center;padding:var(--sp-7) var(--sp-5)}
.form-ok svg{width:58px;height:58px;color:var(--turquesa-500);margin-bottom:var(--sp-3)}
.form-ok h3{color:var(--petroleo-800);font-size:1.5rem}
.form-ok p{color:var(--tinta-60);margin-top:var(--sp-2)}
.form-wrap.is-sent .form{display:none}
.form-wrap.is-sent .form-ok{display:block}

/* --- FAQ (acordeão nativo <details>) --- */
.faq{max-width:820px;margin-inline:auto;display:grid;gap:var(--sp-3)}
.faq-item{overflow:hidden}
.faq-item summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-4) var(--sp-5)}
.faq-item summary::-webkit-details-marker{display:none}
.faq-q{font-size:1.05rem;color:var(--petroleo-800);margin:0;font-weight:600;flex:1;min-width:0}
.faq-chevron{flex:none;width:22px;height:22px;color:var(--turquesa-400);stroke-width:2.5;transition:transform .2s}
.faq-item[open] .faq-chevron{transform:rotate(180deg)}
.faq-a{padding:0 var(--sp-5) var(--sp-4) var(--sp-5)}
.faq-a p{color:var(--tinta-60);line-height:1.55;margin:0}
.faq-a p + p{margin-top:var(--sp-2)}

/* --- CELULAR: alvo de toque dos pontinhos e das faces ----------------------
   Os pontinhos do carrossel têm 10x10 — abaixo até do mínimo de 24 da WCAG
   2.5.8 — e são o ÚNICO jeito de trocar a foto à mão. Valem para o carrossel
   do hero e das galerias da home também.

   O alvo cresce por ::after invisível, não mexendo no botão: assim o desenho
   fica PIXEL IDÊNTICO (inclusive a pílula do estado ativo, que tem largura e
   raio próprios e quebraria se eu enchesse o botão de padding).

   E o passo entre eles precisou crescer junto: com gap 8 o passo é 18px, e um
   alvo de 26 encostaria no vizinho — alvo sobreposto é pior que alvo pequeno,
   porque erra sem avisar. Com --sp-4 o passo vai a 26 e os alvos se tocam sem
   invadir. */
@media(max-width:640px){
  .carousel-dots{gap:var(--sp-4)}
  .carousel-dots button{position:relative}
  .carousel-dots button::after{content:"";position:absolute;left:50%;top:50%;
    transform:translate(-50%,-50%);width:26px;height:34px}
}

/* --- Página "Quem sou" (quem-sou.html) --- */
/* JUSTIFICADO, nas duas páginas de uma vez (17/08/2026, a pedido). Estes
   parágrafos são prosa longa numa coluna estreita (585px no desktop), e é aí
   que justificar paga: dá a borda direita reta que o olho usa para achar a
   linha seguinte. `hyphens:auto` não é enfeite — sem hifenizar, justificar
   português nessa largura abre rios de espaço entre as palavras; quem faz o
   navegador saber hifenizar é o `lang="pt-BR"` do <html>. */
.quem-prose p{color:var(--tinta);font-size:1.1rem;line-height:1.62;
  text-align:justify;hyphens:auto;-webkit-hyphens:auto}
.quem-prose p + p{margin-top:var(--sp-3)}
.quem-prose strong{color:var(--petroleo-800)}
/* bloco bio: diagramação estilo hero (frame de fotos à esquerda), mas fundo branco */
.bio-grid{display:grid;gap:var(--sp-6);align-items:start;grid-template-columns:1fr}
@media(min-width:820px){.bio-grid{grid-template-columns:1.02fr 1.1fr;gap:var(--sp-9)}}
.bio-media{position:relative;width:100%;max-width:480px;margin-inline:auto}
@media(min-width:820px){.bio-media{max-width:none;margin:0}}
.bio-content{min-width:0}
/* dots escuros — o carrossel aqui fica sobre o fundo branco da seção */
.carousel--bio .carousel-dots button{background:rgba(var(--tinta-rgb),.2)}
.carousel--bio .carousel-dots button.active{background:var(--petroleo-700)}
/* altura travada p/ caber na tela (as fotos têm orientações diferentes; corta com cover) */
.carousel--bio .slide{aspect-ratio:auto;height:min(52vh,440px);min-width:100%}
.carousel--bio .slide img{object-position:center 25%}

/* hero "Quem sou": fotos do carrossel rodando ao fundo + véu roxo translúcido (estilo divisórias) */
.cta--photos{padding:var(--sp-11) 0}
.cta-slideshow{position:absolute;inset:0;z-index:0;overflow:hidden}
.cta-slideshow span{position:absolute;inset:0;background-size:cover;background-position:center 28%;opacity:0;
  animation:ctaPhotos 24s linear infinite}
.cta-slideshow span:nth-child(1){animation-delay:0s}
.cta-slideshow span:nth-child(2){animation-delay:6s}
.cta-slideshow span:nth-child(3){animation-delay:12s}
.cta-slideshow span:nth-child(4){animation-delay:18s}
@keyframes ctaPhotos{0%{opacity:0}4%{opacity:1}21%{opacity:1}25%{opacity:0}100%{opacity:0}}
/* o roxo persiste por cima das fotos, baixa opacidade (não some) */
.cta--photos::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(180deg,
    color-mix(in srgb,var(--petroleo-900) 50%,transparent) 0%,
    color-mix(in srgb,var(--petroleo-800) 44%,transparent) 45%,
    color-mix(in srgb,var(--petroleo-900) 66%,transparent) 100%)}
.cta--photos .cta-inner{text-shadow:0 2px 16px rgba(20,8,40,.55)}
@media(prefers-reduced-motion:reduce){.cta-slideshow span{animation:none}.cta-slideshow span:first-child{opacity:1}}
/* Os patamares são o repouso: 0-30% e 40-70% são leitura parada, e a troca
   acontece nos 10% entre eles. Sem patamar o movimento vira nervoso. */
@keyframes hw-esteira{
  0%,30%   {transform:translateX(0)}
  40%,70%  {transform:translateX(-33.3333%)}
  80%,100% {transform:translateX(-66.6666%)}
}
/* Parada de medição: a esteira congela no quadro 1. Serve ao ?still, onde o que
   importa é ter SEMPRE o mesmo quadro; não serve a quem pediu menos movimento,
   porque aí o 40222 nunca apareceria — e o número é a informação da campanha.
   Para esse caso a faixa volta a ser o bloco empilhado do desktop. */
.stillmode .hw-belt{animation:none}
@media(max-width:600px) and (prefers-reduced-motion:reduce){
  .hero-wordmark{aspect-ratio:1789.24/832.06;overflow:visible}
  .hw-belt{display:block;width:auto;animation:none}
  .hw-parte{position:absolute;width:100%;height:auto;object-fit:fill}
  .hw-bis{display:none}
}

/* seção "Sou uma, mas não sou só": chips viram abas + painel da face ativa */
.facets-tabs{display:flex;flex-wrap:wrap;gap:var(--sp-2);justify-content:center;margin-bottom:var(--sp-5)}
/* --- CHIP-TOGGLE: uma classe, quatro usos -----------------------------------
   Filtros do blog, faces do "quem sou", abas dos painéis e o índice do manual
   eram QUATRO nomes para o mesmo componente — apareciam juntos, os quatro, em
   quatro listas diferentes (borda, tipografia, fundo, hover, estado). Diferiam
   só em tamanho de letra e respiro, que é o que continua em cada um adiante.

   Na vistoria de 05/08/2026 a marcação passou a dizer `class="chip-toggle
   filter-chip"`, e a receita ficou aqui, uma vez. Um chip novo agora não pede
   linha nenhuma de CSS — e a próxima correção de cascata acerta os quatro.

   As DUAS convenções de estado sobrevivem lado a lado, e de propósito: o índice
   do manual é um <nav> e usa `.active`, que é a convenção de navegação do site
   (nav-desktop, pontinhos do carrossel); o resto usa `.is-active`. Unificar as
   duas mexeria em JS de quatro lugares para ganhar nada — segue no backlog
   (docs/08 §3.3), agora numa linha só em vez de duas listas. */
.chip-toggle{background:var(--branco);border-radius:var(--raio-pill)}
.chip-toggle:hover{border-color:var(--e,var(--turquesa-400))}
.chip-toggle.is-active,.chip-toggle.active{
  background:var(--e,var(--petroleo-700));color:#fff;border-color:var(--e,var(--petroleo-700))}
.filter-chip{letter-spacing:.03em;font-size:.76rem;padding:var(--sp-2) var(--sp-3);transition:var(--t-rapida)}
/* O NÚMERO DE MATÉRIAS no chip de projeto. Ele é a informação que justifica o
   filtro existir — "Banco Vermelho 4" diz que ali há uma história com capítulos.
   Fica `aria-hidden` e um texto por extenso vai ao lado, senão o leitor de tela
   anuncia "Banco Vermelho quatro", que soa a numeração e não a contagem. */
/* ---- DOBRA DA BARRA LATERAL (a caixa de projetos) -------------------------
   `<details>` de verdade, e não uma classe que abre e fecha: só ele já é
   focável, anunciado como "expandido/recolhido" e operável pelo teclado sem
   uma linha de JS. O JS aqui decide só o ESTADO INICIAL. */
.side-dobra summary{list-style:none;cursor:pointer;display:flex;align-items:center;
  gap:var(--sp-2);min-height:44px}
.side-dobra summary::-webkit-details-marker{display:none}
.side-dobra summary h3{margin:0;flex:1 1 auto}
.side-dobra-n{font-size:.78rem;font-variant-numeric:tabular-nums;
  padding:0 .5em;border-radius:var(--raio-pill);
  background:rgba(var(--petroleo-700-rgb),.12);color:var(--petroleo-800)}
/* a seta é a do sprite, como todo ícone daqui — o triângulo nativo foi
   escondido porque ele não obedece à rampa nem ao traço do resto */
.side-dobra-seta{width:18px;height:18px;flex:0 0 auto;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;
  color:var(--petroleo-700);transition:transform var(--t-rapida)}
.side-dobra[open] .side-dobra-seta{transform:rotate(180deg)}
.side-dobra summary:focus-visible{outline:3px solid var(--petroleo-700);outline-offset:3px;border-radius:6px}
.side-dobra > .tl-filters{margin-top:var(--sp-3)}

.filter-n{margin-left:.45em;padding:0 .42em;border-radius:var(--raio-pill);
  font-size:.86em;font-variant-numeric:tabular-nums;
  background:rgba(var(--petroleo-700-rgb),.12);color:var(--petroleo-800)}
.chip-toggle.is-active .filter-n{background:rgba(255,255,255,.26);color:#fff}
/* Texto só para quem ouve. `clip-path` em vez de `clip`, que está obsoleto, e
   NADA de display:none — o que some da tela por display some do leitor junto. */
.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0}
.facet-chip{letter-spacing:.03em;font-size:.84rem;padding:var(--sp-2) var(--sp-4);box-shadow:var(--sombra-card);transition:var(--t-rapida)}
/* As faces são abas de verdade — 31px é pouco para o dedo. TEM de vir depois da
   regra acima: ela usa o atalho `padding`, que reseta padding-block. Pus antes na
   primeira tentativa e não pegou (docs/08 §5, "cascata ao agrupar"). */
@media(max-width:640px){.facet-chip{padding-block:var(--sp-3);min-height:44px}}
.adm-tab{font-size:.76rem;padding:var(--sp-2) var(--sp-3)}
.facets-panels{max-width:760px;margin-inline:auto}
.facets-panels .facet-panel{display:none}
.facets-panels .facet-panel.is-active{display:flex}
.facets-panels .facet-panel:hover{transform:none}
/* widget de faces dentro da coluna direita da intro (logo abaixo do texto) */
.bio-content .facets{margin-top:var(--sp-6)}
.facets-lead{letter-spacing:.02em;color:var(--petroleo-800);font-size:1.25rem;font-weight:700;line-height:1.05;margin-bottom:var(--sp-3)}
.bio-content .facets-tabs{justify-content:flex-start;margin-bottom:var(--sp-4)}
.bio-content .facets-panels{max-width:none;margin:0}

/* AS FACES DESCEM PARA BAIXO DAS FOTOS (17/08/2026, a pedido).
   No celular já era assim — uma coluna só empilha fotos, texto e faces. O
   problema era do desktop: a partir de 820px a `.bio-grid` abre duas colunas, e
   as faces, por morarem dentro do `.bio-content`, ficavam espremidas na coluna
   da DIREITA, ao lado das fotos. Medido a 1440px: x=723, largura 585.

   `display:contents` no `.bio-content` é o que resolve SEM tocar na marcação: o
   div deixa de gerar caixa e seus dois filhos viram itens da grade, o que
   permite pôr o texto na linha 1 e as faces atravessando as duas colunas na
   linha 2. E não tocar na marcação não é preferência — este bloco existe em
   DUAS páginas (a /legado e a cópia na home), cada uma com seus `pathId`
   publicados; mexer no HTML custaria dois remapeamentos de KV. Por CSS, uma
   regra conserta as duas de uma vez.

   O lugar delas é a COLUNA ESQUERDA, na linha de baixo: encaixadas ao lado do
   texto e logo abaixo das fotos. **Não** é a largura toda embaixo de tudo —
   isso foi tentado primeiro e deixava um vazio enorme sob as fotos, porque o
   texto é duas vezes mais alto que elas. Aqui o vazio some: a seção cai de
   1220px para 981px, e as faces ficam em x=132, y=1875, 543 de largura.

   `grid-template-rows:auto 1fr` não é enfeite. Sem isso a grade DISTRIBUI a
   altura do texto — que atravessa as duas linhas — entre as duas, inflando a
   primeira para além das fotos e abrindo 141px de folga entre a foto e o título
   das faces. Com a primeira linha em `auto` ela passa a valer o que a foto
   mede, e a folga cai para os 48px do próprio `gap`. */
@media(min-width:820px){
  .bio-grid{grid-template-rows:auto 1fr}
  .bio-content{display:contents}
  .bio-media{grid-column:1;grid-row:1}
  .bio-content .facets{grid-column:1;grid-row:2;margin-top:0}
  .quem-prose{grid-column:2;grid-row:1 / span 2;min-width:0}
}

/* assinatura clara no rodapé (no lugar do texto "Dayse Amarilio"). Sem `invert`,
   pela mesma razão do .hero-wordmark: o arquivo já é branco e turquesa. */
.footer-logo{height:30px;width:auto;display:block}
/* Blog no menu mobile */
.mm-blog{border-left-color:var(--ambar-500)}
/* item "Quem sou" no menu mobile */
.mm-quem{border-left-color:var(--petroleo-700)}
/* Revistas no menu mobile */
.mm-revistas{border-left-color:var(--turquesa-500)}
/* Projetos no menu mobile — mesmo âmbar que a página veste no `--e`, e o mesmo
   de `--tag-editais`: o recorte da pauta é dominado por edital (medido). */
.mm-projetos{border-left-color:var(--th-laranja)}

/* ============================================================
   PÁGINA GUIA DO MOBILIZADOR (guia-do-mobilizador.html)
   ------------------------------------------------------------
   Material INTERNO de campo. O desenho segue disso: o manual é
   consultado em pé, no celular, antes de sair — então checklist é
   componente de primeira classe, não enfeite.

   Reusa: .card · .card--elev · .rotulo · .check (o checkbox do
   formulário de apoiador) · .grade-auto · .ico-traco · .step (o
   fluxo dos 7 passos É o "Como apoiar?") · .field · .btn--sutil.
   Nenhum hex novo: tudo por --e/--e-ink e color-mix, como o §1.5
   do docs/01 manda. Nenhum espaçamento fora de --sp-*.
   ============================================================ */

/* --- as 3 frentes, no hero roxo --- */
.guia-frentes{display:flex;flex-wrap:wrap;gap:var(--sp-3);justify-content:center;margin-top:var(--sp-7)}
.guia-frente{flex:1 1 160px;display:flex;flex-direction:column;align-items:center;gap:var(--sp-1);
  padding:var(--sp-4) var(--sp-3);border-radius:var(--raio-md);
  --ic-recorte:var(--petroleo-800);background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.16)}
.guia-frente svg{width:30px;height:30px;color:var(--realce-claro);margin-bottom:var(--sp-1)}
.guia-frente-nome{font-size:1rem;letter-spacing:.04em;line-height:1.1;color:#fff}
.guia-frente span{font-size:.82rem;color:rgba(255,255,255,.72);line-height:1.3}

/* --- O MANUAL DA SAÚDE VESTE O VERDE DO EIXO ------------------------------
   O corpo do manual da Saúde já usava `--th-saude` seção por seção; só o hero
   (que é também a CAPA do livreto) e o fecho seguiam a cor da marca, porque
   nascem do `.cta`, que é do site inteiro. Aqui eles viram o verde do eixo.

   POR QUE NÃO O TURQUESA CHEIO, que é "o nosso verde" tal e qual: medido,
   branco sobre `#2EB7BD` dá **2,43:1** e o amarelo do `.hl`, **1,51:1** — capa
   ilegível, e ilegível no papel também. O bloco de tokens já previa isso: a
   Saúde é o único eixo com um TERCEIRO membro no par (`--th-saude-sobre`),
   justamente "texto escuro sobre fundo turquesa". Aqui ele é o outro extremo da
   rampa, e a rampa é a mesma forma do hero da marca — clara em cima, escura
   embaixo, com o mesmo `radial-gradient`.

   Resultado medido no ponto MAIS CLARO da capa: branco **4,98:1** (passa em
   texto normal) e amarelo **3,09:1** (passa em texto grande, que é onde ele
   vive — o `.hl` do título). Nenhum hex novo: tudo sai do bloco de tokens,
   como o `docs/01` §1.5 manda. --- */
body[data-page="guia-do-mobilizador-saude"] .cta--hero,
body[data-page="guia-do-mobilizador-saude"] .guia-final{
  background:radial-gradient(120% 100% at 50% -20%,
    var(--th-saude-ink),
    color-mix(in srgb,var(--th-saude-ink) 62%,var(--th-saude-sobre)) 55%,
    var(--th-saude-sobre))}
/* `--ic-recorte` é a cor de TRÁS do ícone — o que ele "recorta". Deixá-la roxa
   sobre fundo verde faria o vazado dos ícones aparecer em roxo. */
body[data-page="guia-do-mobilizador-saude"] .guia-frente,
body[data-page="guia-do-mobilizador-saude"] .guia-final{--ic-recorte:var(--th-saude-sobre)}

/* --- E O DESTAQUE DESTES DOIS BLOCOS TAMBÉM É DO EIXO  [13/08/2026] ---------
   Faltava a metade de cima do mesmo argumento: o FUNDO destes dois blocos virou
   o verde do eixo, mas o `.hl`, a sobrancelha e os ícones continuavam no ÂMBAR
   DA MARCA. Âmbar sobre verde não é a Saúde vestindo a cor dela — é a marca
   aparecendo por cima. Pedido do dono: o destaque do manual da Saúde é tiffany
   claro; o âmbar fica no manual GERAL, que segue a marca.

   OS DOIS GRAUS SÃO MEDIDOS, e a troca CORRIGE um contraste que já estava
   abaixo do mínimo. Contra o fundo REAL atrás do texto — `rgb(56,126,129)`,
   amostrado do pixel renderizado, não do token, porque o degradê é radial com
   centro ACIMA da caixa e o token é mais claro que o que aparece:

       .hl âmbar (como estava) ...........  2,36:1   REPROVA (texto grande pede 3)
       turquesa-300 puro .................  2,73:1   reprova, mas já é melhor
       turquesa-300 a 72% + branco .......  3,18:1   PASSA  ← o `--realce`
       turquesa-300 a 60% + branco .......  3,41:1          ← o `--realce-claro`

   Redefinir os DOIS é obrigatório, não zelo: `--realce-claro` é declarado no
   `:root` como `color-mix(… var(--realce) …)`, e a substituição de custom
   property acontece no elemento que DECLARA. Redefinir só `--realce` aqui
   deixaria a sobrancelha e os ícones âmbar, com o título tiffany — pior do que
   não mexer.

   Fica preso ao EIXO e não ao painel de cores, igual ao fundo logo acima: quem
   trocar o realce do site não deve repintar a capa da Saúde. --- */
body[data-page="guia-do-mobilizador-saude"] .cta--hero,
body[data-page="guia-do-mobilizador-saude"] .guia-final{
  --realce:color-mix(in srgb,var(--turquesa-300) 72%,#fff);
  --realce-claro:color-mix(in srgb,var(--turquesa-300) 60%,#fff)}

/* --- índice: chips de seção. Fixo só no desktop — no celular, 7 chips
       grudados no topo comem a altura que o texto do manual precisa. --- */
.guia-index{background:var(--branco);border-bottom:1.5px solid var(--petroleo-100);z-index:var(--z-sticky)}
.guia-index-inner{display:flex;align-items:center;gap:var(--sp-3);padding-block:var(--sp-3)}
.guia-index-rot{flex:none;font-size:.72rem;letter-spacing:.14em;color:var(--tinta-60)}
.guia-index-links{display:flex;gap:var(--sp-2);overflow-x:auto;scrollbar-width:none;flex:1;min-width:0}
.guia-index-links::-webkit-scrollbar{display:none}
/* A dica do atalho de teclado (os <kbd> ← → ↑ ↓) saiu da barra em 05/08/2026, a
   pedido. O ATALHO continua valendo — quem descobrir, usa (docs/23) —, e a barra
   fica com o índice e um botão só. Era ela, aliás, que consumia ~140px a partir
   de 1100px e empurrava os 7 chips para fora de vista (docs/27 §7). */
.guia-index-links a{flex:none;font-size:.74rem;letter-spacing:.03em;padding:var(--sp-2) var(--sp-3);
  white-space:nowrap;transition:border-color var(--t-media),background var(--t-media),color var(--t-media)}
/* NO CELULAR a barra é `static` e tem a largura toda para ela — então aqui o
   índice cabe no piso de 12px que o resto do projeto usa (docs/30 §4.1, e o
   `teste-trecho` cobra o mesmo piso no editor) e no alvo de 44px.
   Medido em 12/08/2026, 390px: o rótulo saía a 11,5px e os chips a 11,8px ×
   38px de altura. Escopado em `max-width:1023px` de propósito: acima disso a
   barra é FIXA e divide a linha com o botão de impressão, e os 7 chips já
   estouram a caixa até ~1440px (docs/27 §7) — engordá-los ali pioraria. */
/* `screen and` NÃO é decoração: a página A5 do livreto mede ~560px, ou seja,
   cai dentro deste mesmo `max-width` — e sem o `screen` estas regras engordavam
   o PAPEL junto com o celular. Medido em 12/08/2026: o guia geral passou de 12
   para 13 páginas A5 e pediu uma QUARTA folha, +33% de papel por exemplar, num
   commit que só TIRAVA conteúdo. Conforto de dedo não tem o que fazer na
   gráfica. Vale para o `.guia-num` mais abaixo pelo mesmo motivo. */
@media screen and (max-width:1023px){
  .guia-index-rot{font-size:.78rem}
  /* `min-height` e não mais padding: é o mesmo remédio que o `.guia-copiar` ao
     lado já usa, e o padding sozinho parava em 38px — a regra de 640px logo
     abaixo já mandava `padding-block:var(--sp-3)`, então subir o padding aqui
     só repetia o que já existia. `inline-flex` porque o chip é um <a>: sem ele
     o min-height não pega. */
  .guia-index-links a{font-size:.78rem;min-height:44px;display:inline-flex;align-items:center}
  .guia-index-inner{flex-wrap:wrap}
}
/* `.guia-imprimir` saiu na vistoria de 05/08/2026: o botão separado de imprimir
   virou item do menu do `.guia-pdf` (docs/27 §7) e a classe não existe mais em
   marcação nenhuma — só sobrevivia como valor de `data-slot`, que é outro
   atributo e não casa com seletor de classe. */
.guia-pdf{flex:none;display:none;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);font-size:.8rem}
.guia-pdf svg{width:16px;height:16px}
/* O BOTÃO DE IMPRIMIR NO CELULAR. Ele existia só a partir de 1024px, e com isso
   o telefone não tinha caminho nenhum para a prova do livreto, o A5, as folhas
   A4 nem os dois PDF baixáveis — justo no aparelho que o docs/13 §2 usa para
   justificar o manual existir em HTML.

   Em LINHA PRÓPRIA, e não espremido ao lado dos chips: medido a 320px a tira
   tem 209px e o botão com rótulo pede ~174 — dividir a linha deixaria menos de
   40px de índice. No celular a barra é `static`, então a segunda linha custa
   altura uma vez, no topo da página, e não a cada rolagem.

   DEPOIS da regra base, e não antes: `display:none` mora ali em cima e, com a
   mesma especificidade, quem vem por último vence. É a armadilha §5.5 do
   docs/16 — a mesma em que este arquivo já tinha caído com o `.facet-chip`, e
   em que eu caí de novo em 12/08/2026 antes de medir o botão em 0×0. */
@media screen and (max-width:1023px){
  .guia-pdf{display:inline-flex;flex:1 0 100%;justify-content:center;
    min-height:44px;font-size:.82rem}
  .guia-pdf svg{width:18px;height:18px}
}
/* a seta do menu: 12px e sem o traço de 2px dos ícones de conteúdo */
.guia-pdf-seta{width:12px !important;height:12px !important;stroke-width:2.5;opacity:.6;margin-left:calc(var(--sp-1) * -1)}
.guia-pdf[aria-expanded="true"] .guia-pdf-seta{transform:rotate(180deg)}
.guia-pdf-menu button,.guia-pdf-menu a{width:100%;text-align:left}
/* OS ÍCONES DESTE MENU ESTAVAM INVISÍVEIS, e o motivo é que ele empresta o
   visual do `.share-menu`, que foi feito para OUTRO tipo de ícone. Lá cada item
   é uma rede social: ícone CHEIO, branco, sobre um círculo colorido que a
   própria rede dá (`.sm-wa{background:var(--c-whatsapp)}`, styles:276).
   Aqui os ícones são de TRAÇO (ic-imprimir, ic-livreto, ic-baixar) e não há
   rede que dê cor — então o `fill:currentColor` da folha compartilhada não
   desenhava nada e o círculo ficava branco sobre menu branco.
   Duas linhas resolvem: a cor do círculo vem da marca, e o traço volta a ser
   traço. (Achado em 08/08/2026, ao dobrar o menu de 3 para 6 itens.) */
.guia-pdf-menu .sm-ico{background:var(--petroleo-700)}
.guia-pdf-menu .sm-ico svg{fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round}
/* 1024 e não 900: medido, os 7 chips ocupam 759px e a tira só passa a caber por
   volta de 998px. Abaixo disso o índice transbordava e o item que o scroll-spy
   acende podia ficar fora de vista — chip aceso invisível é pior que chip apagado.
   1024 já é breakpoint desta base; não se inventou um novo (docs/08 §3.1). */
@media(min-width:1024px){
  .guia-index{position:sticky;top:calc(var(--header-h) + var(--azulejo-h));box-shadow:var(--sombra-card)}
  /* a âncora precisa parar ABAIXO do índice, não atrás dele.
     Prefixo, e não igualdade: o manual da Saúde tem o mesmo índice fixo e as
     mesmas âncoras. Com `=` os chips dele rolavam a seção para TRÁS do índice —
     mesma especificidade, uma letra de diferença (docs/26). */
  body[data-page^="guia-do-mobilizador"] section[id]{
    scroll-margin-top:calc(var(--header-h) + var(--azulejo-h) + 68px);
  }
  /* O `.guia-pdf` PRECISA estar aqui. Ele já entrou uma vez só na regra que
     esconde, logo acima, e não nesta, que mostra — resultado: botão invisível
     em TODA largura, e a prova do livreto sem porta de entrada.
     Passou por testes verdes porque `element.click()` dispara em elemento
     escondido: teste de comportamento não vê o que o olho vê. Hoje o
     `teste-guia.mjs` mede a largura do botão, não só o clique. */
  .guia-pdf{display:inline-flex}
}

/* --- kicker "Seção N" --- */
.guia-num{font-size:.74rem;letter-spacing:.18em;color:var(--e-ink,var(--petroleo-700));margin-bottom:var(--sp-1)}
/* No celular o "SEÇÃO N" também sobe ao piso de 12px do projeto — era o último
   texto do manual abaixo dele (11,8px, medido a 320/360/390 em 12/08/2026).
   No desktop fica como está: lá a distância de leitura é outra. */
@media screen and (max-width:1023px){ .guia-num{font-size:.78rem} }

/* --- RÓTULO DE BLOCO: a linha "ícone + nome" que abre nota, fala, bloco e
       coluna. Uma receita; cada um muda só tamanho e espaço embaixo. --- */
.guia-nota-rot,.guia-fala-rot,.guia-bloco-rot,.guia-col-rot{
  display:flex;align-items:center;gap:var(--sp-2);font-size:.82rem;letter-spacing:.12em;
  color:var(--e-ink,var(--petroleo-800));margin-bottom:var(--sp-3)}
.guia-nota-rot svg,.guia-fala-rot svg,.guia-bloco-rot svg,.guia-col-rot svg{
  flex:none;width:22px;height:22px}

/* --- subtítulo dentro da seção --- */
.guia-sub{font-family:var(--font-titulo);text-transform:uppercase;font-size:1.25rem;letter-spacing:.03em;
  color:var(--e-ink,var(--petroleo-800));margin:var(--sp-9) 0 var(--sp-4)}
.guia-sub-nota{margin-top:calc(var(--sp-3) * -1);margin-bottom:var(--sp-4);color:var(--tinta-60);font-size:.92rem}

/* --- ficha do mobilizador (5 campos, gravados só no aparelho) --- */
.guia-ficha{max-width:820px;margin-inline:auto;border-top:4px solid var(--e-ink,var(--petroleo-700))}
.guia-ficha-head{display:flex;align-items:flex-start;gap:var(--sp-4);margin-bottom:var(--sp-5)}
.guia-ficha-head svg{flex:none;width:40px;height:40px;color:var(--e-ink,var(--petroleo-800))}
.guia-ficha-title{font-family:var(--font-titulo);text-transform:uppercase;font-size:1.4rem;color:var(--petroleo-900);line-height:1.05}
.guia-ficha-sub{color:var(--tinta-60);font-size:.92rem;line-height:1.45;margin-top:var(--sp-1)}
.guia-ficha-grid{display:grid;gap:var(--sp-4);grid-template-columns:1fr}
@media(min-width:640px){.guia-ficha-grid{grid-template-columns:1fr 1fr}}
/* --- confirmar e enviar para o CRM ---
   O botão é `btn-cta` (a cor de ação do site) e o aviso vive colado nele: o que
   se está mandando e para onde não pode estar noutra tela. `is-ok`/`is-erro`
   trocam só a cor do texto — a frase é que informa. */
.guia-ficha-envio{display:flex;align-items:center;gap:var(--sp-4);flex-wrap:wrap;
  margin-top:var(--sp-6);padding-top:var(--sp-5);border-top:1.5px solid var(--petroleo-100)}
.guia-ficha-enviar{flex:none;display:inline-flex;align-items:center;gap:var(--sp-2)}
/* JÁ ENVIOU: recolhe o formulário e o botão, e o cabeçalho vira "Olá, Nome".
   O `.guia-ficha-aviso` FICA de pé — é onde o "Pronto! A coordenação recebeu"
   aparece no mesmo instante do envio; escondê-lo junto faria a confirmação
   sumir no tique em que ela chega. O guia.js zera o texto quando não há o que
   dizer. Recolher e não apagar: "Atualizar meus dados" traz tudo de volta. */
.guia-ficha.is-enviada .guia-ficha-grid,
.guia-ficha.is-enviada .guia-ficha-head,
.guia-ficha.is-enviada .guia-ficha-enviar{display:none}
/* O cumprimento. Veste a mesma tipografia do cabeçalho que ele substitui, mas
   em `div`/`span`/`b` — tags fora do SEL, que é o que impede o nome de virar
   conteúdo publicável (ver guia.js). */
.guia-ficha-ola{display:none}
.guia-ficha.is-enviada .guia-ficha-ola{display:block}
.guia-ficha-ola-oi{display:block;font-family:var(--font-titulo);text-transform:uppercase;
  font-size:1.4rem;color:var(--petroleo-900);line-height:1.05}
.guia-ficha-ola-sub{display:block;color:var(--tinta-60);font-size:.92rem;
  line-height:1.45;margin-top:var(--sp-2)}
.guia-ficha.is-enviada .guia-ficha-envio{margin-top:0;border-top:0;padding-top:0}
.guia-ficha-volta{margin-top:var(--sp-4)}
.guia-ficha-enviar svg{width:18px;height:18px}
.guia-ficha-enviar[disabled]{opacity:.55;cursor:progress}
.guia-ficha-aviso{flex:1;min-width:220px;font-size:.84rem;line-height:1.4;color:var(--tinta-60)}
.guia-ficha-aviso b{color:var(--tinta)}
.guia-ficha-aviso.is-ok{color:var(--th-saude-ink)}
.guia-ficha-aviso.is-erro{color:var(--th-mulher-ink)}
@media(max-width:640px){
  .guia-ficha-envio{gap:var(--sp-3)}
  .guia-ficha-enviar{width:100%;justify-content:center;min-height:44px}
}

/* --- cartão de item com ícone (missão · reuniões) --- */
.guia-grade{--min:230px;gap:var(--sp-4)}
.guia-item{padding:var(--sp-5);border-top:3px solid color-mix(in srgb,var(--e,var(--petroleo-700)) 55%,var(--papel))}
.guia-item svg{width:32px;height:32px;color:var(--e-ink,var(--petroleo-800));margin-bottom:var(--sp-3)}
.guia-item-rot{display:block;font-size:1.05rem;letter-spacing:.03em;color:var(--petroleo-900);line-height:1.05}
.guia-item p{margin-top:var(--sp-2);color:var(--tinta-60);font-size:.95rem;line-height:1.45}

/* --- nota / regra: o bloco que o manual escreve em caixa alta --- */
.guia-notas{display:grid;gap:var(--sp-4);grid-template-columns:1fr;margin-top:var(--sp-7)}
@media(min-width:820px){.guia-notas{grid-template-columns:1fr 1fr}}
.guia-nota{border-radius:var(--raio-md);padding:var(--sp-5);
  border-left:5px solid var(--e-ink,var(--petroleo-700));
  --ic-recorte:color-mix(in srgb,var(--e,var(--petroleo-700)) 10%,var(--branco));background:var(--ic-recorte)}
.guia-nota-rot{margin-bottom:var(--sp-2)}
.guia-nota p:not(.guia-nota-rot){color:var(--tinta);font-size:.98rem;line-height:1.55}
.guia-nota b{color:var(--e-ink,var(--petroleo-800))}
.guia-nota--forte{--ic-recorte:color-mix(in srgb,var(--e,var(--petroleo-700)) 15%,var(--branco));background:var(--ic-recorte)}
.guia-nota--alerta{margin-top:var(--sp-7);
  --ic-recorte:color-mix(in srgb,var(--e,var(--magenta-500)) 12%,var(--branco));background:var(--ic-recorte)}
.apoio-sec .guia-nota{margin-top:var(--sp-7)}
.guia-notas .guia-nota{margin-top:0}

/* --- CHECKLIST: o motivo de esta página existir em HTML e não em PDF.
       O .check vem do formulário de apoiador; aqui só o estado marcado
       muda de cor, para seguir o --e da seção em vez do roxo fixo. --- */
.guia-checklist{padding:var(--sp-5);border-top:4px solid var(--e-ink,var(--petroleo-700))}
.guia-check-head{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-4)}
.guia-check-head svg{flex:none;width:26px;height:26px;color:var(--e-ink,var(--petroleo-800))}
.guia-check-title{flex:1;min-width:0;font-size:1.1rem;letter-spacing:.03em;color:var(--petroleo-900);line-height:1.05}
.guia-check-conta{flex:none;font-family:var(--font-titulo);font-size:.78rem;letter-spacing:.06em;
  padding:var(--sp-1) var(--sp-3);white-space:nowrap}
.guia-checklist.is-completo .guia-check-conta{background:var(--turquesa-500);color:var(--sobre-turquesa)}
/* o índice já é chip (os links levam .chip-toggle na marcação);
   aqui fica só o que é do índice: tamanho, respiro e não-quebrar. */
.guia-check-itens{display:grid;gap:var(--sp-2)}
.guia-check-itens .check{align-items:flex-start;line-height:1.4}
.guia-check-itens .check input{margin-top:2px;accent-color:var(--e-ink,var(--petroleo-700))}
.guia-checklist .check:has(input:checked){
  border-color:color-mix(in srgb,var(--e,var(--petroleo-700)) 55%,var(--papel));
  background:color-mix(in srgb,var(--e,var(--petroleo-700)) 12%,var(--branco));
  color:var(--e-ink,var(--petroleo-800));font-weight:500;
}
.guia-check-limpar{margin-top:var(--sp-4);padding:var(--sp-2) var(--sp-4)}
.guia-rotina{--min:290px;gap:var(--sp-4);align-items:start}

/* --- FLUXO de passos: é o .manual do "Como apoiar?". Quando o total é ímpar,
       o último ocupa a linha inteira em vez de ficar órfão na coluna esquerda
       (7 passos no guia geral; os 8 do manual da Saúde fecham a grade sozinhos). --- */
.guia-fluxo .step-title{font-size:1.05rem}
@media(min-width:760px){.step--largo{grid-column:1/-1}}
/* Nem o `.manual` nem o `.guia-checklist` trazem margem própria — no manual
   geral isso nunca apareceu porque um título sempre separava os dois. No da
   Saúde o checklist vem DIRETO depois do fluxo, e medido: 0px de folga, as duas
   bordas coladas parecendo um cartão cortado. */
.guia-fluxo + .guia-checklist{margin-top:var(--sp-7)}

/* --- FALA: o que é feito para ser copiado (script e comentários) --- */
.guia-fala{position:relative;border-left:5px solid var(--e-ink,var(--petroleo-700));padding:var(--sp-5);margin-top:var(--sp-7)}
.guia-fala-txt{font-family:var(--font-texto);font-style:italic;color:var(--tinta);
  font-size:clamp(1rem,2.4vw,1.12rem);line-height:1.6;max-width:62ch}
.guia-fala-txt::before{content:"“";font-family:var(--font-titulo);font-size:2rem;line-height:0;
  color:var(--e-ink,var(--turquesa-400));margin-right:2px;vertical-align:-.35em}
.guia-copiar{margin-top:var(--sp-4);padding:var(--sp-2) var(--sp-4)}
.guia-copiar svg{width:15px;height:15px}
.guia-copiar.is-ok{background:var(--turquesa-500);color:var(--sobre-turquesa)}
.guia-exemplos{--min:250px;gap:var(--sp-4);align-items:start}
.guia-fala--curta{margin-top:0;display:flex;flex-direction:column;height:100%}
.guia-fala--curta .guia-fala-txt{font-size:1rem;flex:1}
.guia-fala--curta .guia-copiar{align-self:flex-start}

/* --- blocos de lista (redes) --- */
.guia-colunas{display:grid;gap:var(--sp-4);grid-template-columns:1fr;align-items:start}
@media(min-width:900px){.guia-colunas{grid-template-columns:1.15fr 1fr}}
.guia-bloco{padding:var(--sp-5);border-top:3px solid color-mix(in srgb,var(--e,var(--petroleo-700)) 55%,var(--papel))}
.guia-bloco-rot{font-size:.88rem;letter-spacing:.1em;margin-bottom:var(--sp-4)}
.guia-bloco-rot svg{width:24px;height:24px}
.guia-bloco-txt{color:var(--tinta);font-size:1.05rem;line-height:1.55}
.guia-bloco--centro{max-width:720px;margin-inline:auto;text-align:center}
.guia-bloco--centro .guia-bloco-rot{justify-content:center}
.guia-lista{display:grid;gap:var(--sp-3);list-style:none}
.guia-lista li{display:flex;align-items:flex-start;gap:var(--sp-3);color:var(--tinta);font-size:.96rem;line-height:1.45}
.guia-lista li svg{flex:none;width:20px;height:20px;margin-top:1px;color:var(--e-ink,var(--petroleo-700))}
@media(min-width:760px){.guia-lista--duas{grid-template-columns:1fr 1fr;gap:var(--sp-3) var(--sp-6)}}
.guia-bloco .guia-social{justify-content:flex-start;margin-top:var(--sp-5);gap:var(--sp-2)}
.guia-bloco .guia-social a{width:40px;height:40px;background:color-mix(in srgb,var(--e) 14%,#fff);color:var(--e-ink)}
.guia-bloco .guia-social a:hover{background:var(--e-ink);color:#fff;transform:translateY(-3px)}

/* --- PODE / NÃO PODE: duas colunas, não uma tabela pareada.
       No .docx elas são uma tabela de 2 colunas, mas as linhas NÃO se
       correspondem item a item — pareá-las na tela inventaria uma
       relação que o manual não faz. --- */
.guia-tabela{display:grid;gap:var(--sp-4);grid-template-columns:1fr;align-items:start}
@media(min-width:820px){.guia-tabela{grid-template-columns:1fr 1fr}}
.guia-col{border-radius:var(--raio-md);padding:var(--sp-5);
  --ic-recorte:color-mix(in srgb,var(--e) 8%,var(--branco));background:var(--ic-recorte);
  border:1.5px solid color-mix(in srgb,var(--e) 32%,var(--papel))}
.guia-col-rot{font-size:1.05rem;letter-spacing:.08em;margin-bottom:var(--sp-4);padding-bottom:var(--sp-3);
  border-bottom:1.5px solid color-mix(in srgb,var(--e) 28%,var(--branco))}
.guia-col-rot svg{width:26px;height:26px}
.guia-col .guia-lista li{font-size:.94rem}
.guia-col--nao .guia-lista li{color:var(--tinta)}

/* --- mensagem final --- */
.guia-final{max-width:760px;margin:var(--sp-9) auto 0;padding:clamp(24px,5vw,40px);
  border-radius:var(--raio-lg);--ic-recorte:var(--petroleo-800);box-shadow:var(--sombra-hover)}
.guia-final svg{width:44px;height:44px;color:var(--realce-claro);margin-bottom:var(--sp-3)}
.guia-final-rot{font-size:.8rem;letter-spacing:.18em;color:var(--realce-claro);margin-bottom:var(--sp-3)}
.guia-final-txt{font-size:clamp(1.05rem,2.6vw,1.25rem);line-height:1.55;color:rgba(255,255,255,.92)}
.guia-final-txt b{color:#fff}

/* --- AS DUAS PÁGINAS QUE SÓ EXISTEM NO LIVRETO ---------------------------
   Anotações (a folha que fecha o múltiplo de 4) e contracapa. Não são de tela
   e não são da folha A4: só a camada LIVRETO A5 as acende. Entram no fim do
   <main> — último filho, para não deslocar `data-edit-key` de nada. --- */
/* Peças que só existem no LIVRETO. A `.livro-marca-capa` entrou em 12/08/2026:
   é a assinatura com o 40222 no pé da capa impressa — na tela o cabeçalho já
   traz a marca a dois dedos dali, e repetir seria ruído. */
.livro-anotacoes,.livro-contracapa,.livro-marca-capa,.livro-capa-arte{display:none}

/* --- CELULAR: alvo de toque ---------------------------------------------
   Este manual é consultado EM PÉ, na rua, com o celular na mão — é o que o
   docs/13 §2 usa para justificar a página existir. Então os controles que se
   aperta ali não podem ter 32px de altura.

   Medido a 390x844: "Copiar" 113x32, "Desmarcar tudo" 176x32, chips do índice
   ~30px de altura, redes 40x40. Passam o mínimo da WCAG 2.5.8 (24px), mas
   ficam abaixo dos 44px que se usa como conforto de toque. O `.check` já
   estava bom (302x47 — o alvo é o rótulo inteiro, não a caixinha de 18px). */
@media(max-width:640px){
  .guia-copiar,.guia-check-limpar{min-height:44px;padding-inline:var(--sp-5)}
  .guia-index-links a{padding-block:var(--sp-3)}
  .guia-bloco .guia-social a{width:44px;height:44px}
}

/* ============================================================
   PROVA DO LIVRETO — a folha de papel, mostrada na tela
   ------------------------------------------------------------
   Quem faz o trabalho pesado aqui NÃO é esta seção: é o
   `css/papel.css`, que o botão liga trocando `media="print"` por
   `media="all"`. A prova mostra a folha de verdade, não uma
   imitação dela — se as duas divergissem, a prova seria pior que
   prova nenhuma.

   O que falta a papel.css para virar prova é só o que a IMPRESSÃO
   ganha de graça e a tela não tem: uma caixa de página e um jeito
   de fragmentar o conteúdo dentro dela.

   O MULTICOLUNA É A PÁGINA. Com altura fixa e `column-fill:auto`,
   o Chrome quebra o conteúdo em colunas do tamanho exato da caixa
   útil de uma A5 (499×733px) — e transborda para a direita,
   criando uma coluna nova por página. É a mesma fragmentação, com
   outro nome: `break-inside:avoid` vale nos dois; o que não vale
   é `break-*:page`, e por isso as quatro quebras forçadas do
   livreto ganham aqui o equivalente em coluna.

   A régua: 148×210mm a 96dpi = 559×794px de folha, 499×733 de
   caixa útil, 30px (8mm) de margem. Duas folhas lado a lado dão
   1118px — o passo de página e a conta do zoom, no js/guia.js.
   ============================================================ */
html.prova{background:#3A3A40}
html.prova body{background:#3A3A40;overflow-x:hidden;overflow-y:auto}
/* a textura de papel do site é `position:fixed`: na prova ela ficaria por cima
   das folhas, parada, enquanto elas rolam */
html.prova body::before{display:none}

/* a engrenagem do modo edição não é da prova, como não é do papel */
html.prova .dayse-edit-ui{display:none !important}
/* O índice vira sumário na página 2 — mas na TELA ele é `position:sticky` a
   partir de 1024px, e sticky numa prova é um cartão flutuando sobre a página:
   medido, ele cobria o primeiro campo da ficha. No papel isto nunca apareceu
   porque impressão trata `sticky` como `static`. */
html.prova .guia-index{position:static;box-shadow:none}

html.prova main{
  /* A CAIXA É DECLARADA EM MILÍMETROS, os mesmos do `@page`: duas folhas de
     148×210mm, margem de 8mm, coluna de 132mm e vão de 16mm (as duas margens
     internas se encontrando na dobra). Em px arredondados a caixa dava 734 de
     altura contra os 733,2 da página impressa, e ¾ de pixel bastam para mover
     uma quebra — a prova fechava em 11 e 13 páginas contra as 12 e 12 do papel.

     LARGURA FIXA, e isto também foi medido: `column-width` é preferência, não
     ordem. Sobrando espaço o Chrome ESTICA as colunas — com `max-width:100vw`
     numa janela de 1440 elas saíam com 648px. Quem ajusta ao monitor é a
     escala, que é pintura e não layout. */
  width:296mm;margin:76px auto 24px;
  height:210mm;padding:8mm;
  columns:132mm;column-gap:16mm;column-fill:auto;
  column-rule:1px dashed rgba(var(--tinta-rgb),.22); /* a dobra/emenda entre páginas */
  /* A BARRA DE ROLAGEM COME ALTURA. `overflow-x:auto` reserva ~15px DENTRO da
     caixa, e a fragmentação passa a acontecer numa página mais baixa que a de
     papel. Escondê-la é o mesmo idioma da tira do índice (`.guia-index-links`),
     e aqui é correção de medida, não de gosto. */
  overflow-x:auto;overflow-y:hidden;scrollbar-width:none;
  background:var(--branco);border-radius:2px;
  box-shadow:0 18px 50px rgba(0,0,0,.45);
  scroll-behavior:smooth;
  /* CABER NA JANELA POR `transform`, NUNCA POR `zoom`.
     `zoom` participa do layout: ele reescala as caixas ANTES da fragmentação, e
     o arredondamento muda de lugar. Medido, e é o defeito mais traiçoeiro desta
     seção: numa janela de 1440 a prova fechava em 12 páginas e numa de 1500, em
     11 — a prova mentia, e mentia diferente em cada monitor.
     `transform` é pintura: o layout continua sendo o de 499×733, e a
     fragmentação sai idêntica à da impressão em qualquer tela. */
  transform:scale(var(--prova-z,1));transform-origin:top center;
  margin-bottom:calc(24px - (1 - var(--prova-z,1)) * 210mm)}
html.prova main::-webkit-scrollbar{display:none}

/* AS QUEBRAS FORÇADAS, EM COLUNA.
   `break-*:page` não existe fora de contexto de página, então cada quebra
   forçada do livreto precisa do equivalente em coluna aqui.

   O SELETOR É COMPRIDO DE PROPÓSITO. A primeira versão era `html.prova .x`, e
   perdia: as regras de papel.css são `html.livreto body[data-page^=…] .x`, mais
   específicas, e continuavam mandando `break-before:page` — que na tela não faz
   nada. O sintoma foi silencioso e só a imagem mostrou: a página de Anotações
   deixava de existir, o título vazava para o pé da página 9 e a pauta escorria
   por duas páginas. A CONTAGEM CONTINUAVA 12, por coincidência — prova que
   confere só o número não confere nada.

   `.prova.livreto` porque a prova SEMPRE liga o livreto junto (js/guia.js). */
html.prova.livreto body[data-page^="guia-do-mobilizador"] .cta--hero,
html.prova.livreto body[data-page^="guia-do-mobilizador"] section[aria-labelledby="ficha-title"]{
  break-after:column}
/* só a contracapa quebra: a pauta agora FLUI a partir de onde o texto acaba,
   preenchendo o branco do fim do miolo (papel.css §6) */
html.prova.livreto body[data-page^="guia-do-mobilizador"] .livro-contracapa{
  break-before:column}

/* a barra da prova. `position:fixed` e fora do <main>, então não entra na
   paginação — e é a única coisa da tela que sobrevive à folha de papel. */
.prova-barra{position:fixed;z-index:var(--z-toast);top:0;left:0;right:0;
  display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-5);
  background:rgba(20,18,26,.92);backdrop-filter:blur(6px);color:#fff}
.prova-rot{font-family:var(--font-titulo);text-transform:uppercase;letter-spacing:.08em;font-size:.9rem}
.prova-info{font-size:.78rem;color:rgba(255,255,255,.62);margin-right:auto}
.prova-nav{width:34px;height:34px;flex:none;border-radius:50%;border:1.5px solid rgba(255,255,255,.28);
  background:none;color:#fff;font-size:1.1rem;line-height:1;cursor:pointer}
.prova-nav:hover{background:rgba(255,255,255,.14)}
/* `background:none` explícito: o `.btn--contorno` traz o branco do papel, e
   sobre a barra escura ele daria branco sobre branco — o mesmo defeito que a
   primeira folha de impressão teve na capa (docs/25 §2). */
.prova-barra .btn{padding:var(--sp-2) var(--sp-4);font-size:.8rem;
  background:none;border-color:rgba(255,255,255,.35);color:#fff}
.prova-barra .btn:hover{background:rgba(255,255,255,.14);color:#fff}
@media(max-width:640px){
  .prova-rot,.prova-info{display:none}
  .prova-barra{gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);justify-content:flex-end}
}

/* --- IMPRESSÃO: as duas regras que valem para o SITE INTEIRO ---------------
   A folha de papel dos manuais mudou de casa: mora em `css/papel.css`, ligada
   por `<link media="print">` nas duas páginas de manual. O motivo está no
   cabeçalho de lá — é o que permite mostrar a folha na TELA, na prova do
   livreto, sem manter duas cópias dela.

   Estas duas ficaram, e não é descuido:

   `@page` não aceita seletor — a CSS não dá como escopá-lo. Sem ele vale a
   margem padrão do diálogo (~1 pol.), que come 20% da folha; A4 com 10mm é o
   papel certo para qualquer página deste site, então declarar é ganho e não
   efeito colateral.

   A barra de edição não deve imprimir em página nenhuma. Foi assim que a
   engrenagem do modo edição apareceu no canto da CAPA na primeira medição —
   `.dayse-edit-ui` é o gancho que todo elemento de edição já carrega. --- */
@media print{
  @page{size:A4;margin:10mm}
  .dayse-edit-ui{display:none !important}
}

/* ============================================================
   PÁGINA REVISTAS (revistas.html) — grade de capas + visualizador
   ------------------------------------------------------------
   Reusa: .card / .card--elev (cartão) · .grade-auto (grade) ·
   .rotulo (títulos) · .btn-cta / .btn--sutil / .btn--contorno ·
   .ico-traco · .apoio-sec · .section-head · .reveal. O menu de
   compartilhar é o .share-menu do main.js, acionado por [data-share] —
   nada de segundo mecanismo. Ver docs/14 §3.
   ============================================================ */

/* --- FUNDO: vinheta em halftone -------------------------------------------
   Duas camadas de pontos na MESMA grade, com raios diferentes e máscaras
   diferentes. É isso que faz o degradê parecer halftone de verdade em vez de
   um pontilhado que só perde opacidade: no meio não há ponto nenhum; a partir
   de ~38% entram os pontos pequenos; da borda para dentro os grandes cobrem os
   pequenos, e o olho lê como ponto CRESCENDO.

   Por que dois pseudo-elementos e não duas camadas de background: `mask-image`
   vale para o elemento inteiro, não por camada — duas máscaras exigem dois
   elementos. O `.apoio-sec` não usava ::before/::after (conferido).

   O prefixo -webkit- vai junto do padrão, como no divisor (docs/08 §0.5). Sem
   suporte a máscara o pior caso é o pontilhado aparecer inteiro, sem vinheta. */
.rev-fundo{position:relative;isolation:isolate;overflow:hidden;
  --ht-passo:9px;
  --ht-cor:color-mix(in srgb,var(--petroleo-700) 38%,transparent)}
.rev-fundo > .container{position:relative;z-index:1}
.rev-fundo::before,.rev-fundo::after{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background-size:var(--ht-passo) var(--ht-passo)}
/* pontos pequenos — entram já no meio-termo */
.rev-fundo::before{
  background-image:radial-gradient(circle,var(--ht-cor) 1px,transparent 1.6px);
  -webkit-mask-image:radial-gradient(ellipse 76% 70% at 50% 46%,transparent 38%,#000 90%);
          mask-image:radial-gradient(ellipse 76% 70% at 50% 46%,transparent 38%,#000 90%)}
/* pontos grandes — só na borda, na mesma grade: o ponto "cresce" */
.rev-fundo::after{
  background-image:radial-gradient(circle,var(--ht-cor) 2.1px,transparent 2.7px);
  -webkit-mask-image:radial-gradient(ellipse 68% 62% at 50% 46%,transparent 60%,#000 100%);
          mask-image:radial-gradient(ellipse 68% 62% at 50% 46%,transparent 60%,#000 100%)}
@media(max-width:640px){.rev-fundo{--ht-passo:7px}}

/* --- grade de capas --- */
/* justify-items + max-width no cartão em vez de trocar o template: com UMA revista
   a trilha 1fr do .grade-auto ocupa a largura toda e a capa virava um cartaz. Assim
   a base continua valendo e o cartão fica do mesmo tamanho, tendo 1 ou 10. */
.rev-grade{--min:260px;gap:var(--sp-6);align-items:start;justify-items:center}
.rev-card{overflow:hidden;display:flex;flex-direction:column;--elev:-6px;max-width:330px;width:100%}
/* .rev-abrir é o GANCHO do JS (está nos dois botões: a capa e o "Folhear").
   O estilo de "botão que é a capa inteira" mora em .rev-capa-btn — senão ele
   atropela o .btn-cta do botão de texto, que foi o que aconteceu. */
.rev-capa-btn{display:block;width:100%;padding:0;background:none;border:0;cursor:pointer;
  position:relative;line-height:0}
.rev-capa{display:block;width:100%;height:auto;background:var(--petroleo-100)}
/* a chamada "Folhear" sobe da base da capa no hover/foco */
.rev-lupa{position:absolute;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;
  gap:var(--sp-2);padding:var(--sp-3);font-family:var(--font-titulo);text-transform:uppercase;
  letter-spacing:.06em;font-size:.82rem;color:#fff;line-height:1;
  background:linear-gradient(to top,color-mix(in srgb,var(--petroleo-900) 88%,transparent),transparent);
  opacity:0;transform:translateY(8px);transition:opacity var(--t-media),transform var(--t-media)}
.rev-lupa svg{width:18px;height:18px}
.rev-card:hover .rev-lupa,.rev-capa-btn:focus-visible .rev-lupa{opacity:1;transform:none}
.rev-card-corpo{padding:var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-2);flex:1}
.rev-card-titulo{font-size:1.1rem;letter-spacing:.03em;color:var(--petroleo-900);line-height:1.05}
.rev-card-resumo{color:var(--tinta-60);font-size:.94rem;line-height:1.45;flex:1}
.rev-card-meta{color:var(--tinta-60);font-size:.82rem}
.rev-card-acoes{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-2);align-items:center}
/* MANDAR PELO ZAP. A cor é o `--c-whatsapp` que a barra do post já usa — o
   verde do WhatsApp é reconhecido antes de o rótulo ser lido, e repetir o
   mesmo token mantém os dois lugares dizendo a mesma coisa. */
.rev-zap{background:var(--c-whatsapp);color:#fff}
.rev-zap:hover,.rev-zap:focus-visible{filter:brightness(.93)}
.rev-zap .btn-ico{fill:currentColor}
.rev-erro{text-align:center;color:var(--magenta-500);font-weight:600;margin-top:var(--sp-5)}
.rev-lista-simples{list-style:none;display:grid;gap:var(--sp-2);margin-top:var(--sp-5);text-align:center}
.rev-lista-simples a{color:var(--petroleo-800);font-weight:600;text-decoration:underline}

/* --- visualizador --- */
.rev-travado,.rev-travado body{overflow:hidden}
/* o visor é modal: a engrenagem do modo edição (z 1200) flutuaria por cima do
   leitor. Some enquanto ele está aberto e volta ao fechar — sem tocar no código
   do modo edição, só na classe que o próprio visor põe no <html>. */
.rev-travado .dayse-gear{display:none}
/* Menu mobile aberto: some com o dock do modo edição. Ele é position:fixed no
   canto superior direito, logo abaixo do cabeçalho — exatamente onde nasce o
   primeiro item do menu, e ficava por cima roubando o toque de "Quem sou".
   Mesmo tratamento que o visor de revistas recebe na linha acima: enquanto há
   uma camada de navegação aberta, a afordância de edição sai da frente. */
body.menu-aberto .dayse-edit-dock{display:none}
.rev-viewer{position:fixed;inset:0;z-index:var(--z-menu);display:flex;flex-direction:column;
  background:color-mix(in srgb,var(--petroleo-900) 96%,#000);color:#fff;--ic-recorte:var(--petroleo-900)}
.rev-viewer[hidden]{display:none}
.rev-topo{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;
  padding:var(--sp-3) var(--sp-4);border-bottom:1px solid rgba(255,255,255,.14)}
.rev-titulo{flex:1;min-width:0;font-size:.9rem;letter-spacing:.06em;color:var(--realce-claro)}
.rev-acoes{display:flex;gap:var(--sp-2);flex-wrap:wrap}
/* o .btn--contorno é claro; aqui ele veste a versão sobre fundo escuro */
.rev-acao{background:rgba(255,255,255,.10);border-color:rgba(255,255,255,.28);color:#fff;
  padding:var(--sp-2) var(--sp-3);font-size:.78rem;gap:var(--sp-2)}
.rev-acao:hover{background:rgba(255,255,255,.20);border-color:rgba(255,255,255,.5)}
.rev-acao svg{width:16px;height:16px}
.rev-tam{font-weight:400;opacity:.7;font-size:.72rem}

.rev-palco{position:relative;flex:1;min-height:0;display:flex;align-items:center;justify-content:center;
  gap:var(--sp-2);padding:var(--sp-3);touch-action:pan-y}
.rev-folhas{display:flex;gap:2px;align-items:center;justify-content:center;height:100%;min-width:0}
.rev-folha{max-height:100%;max-width:100%;width:auto;height:auto;object-fit:contain;
  background:#fff;box-shadow:0 10px 40px rgba(0,0,0,.5)}
.rev-folha[hidden]{display:none}
.rev-seta{flex:none;width:44px;height:44px;display:grid;place-items:center;border:0;cursor:pointer;
  border-radius:50%;background:rgba(255,255,255,.12);color:#fff;transition:background var(--t-media)}
.rev-seta:hover:not(:disabled){background:var(--ambar-500);color:var(--tinta)}
.rev-seta:disabled{opacity:.25;cursor:default}
.rev-seta svg{width:22px;height:22px}
.rev-conta{text-align:center;padding:var(--sp-2) var(--sp-4) var(--sp-4);
  font-family:var(--font-titulo);letter-spacing:.06em;font-size:.8rem;color:rgba(255,255,255,.7)}

/* --- MODO DE LEITURA: clássico × webcomic ---------------------------------
   Duas formas de ler a MESMA revista, e as duas usam as MESMAS imagens de
   página que o `build-revista.py` já gera — nada é renderizado duas vezes.

     clássico   páginas duplas, uma virada por vez (o que sempre existiu)
     webcomic   uma coluna, rolagem contínua, páginas COLADAS

   "Coladas" é decisão sua e muda o CSS todo desta seção: sem `gap`, sem
   sombra, sem borda e com `display:block` nas imagens — o vão de 4px que o
   `inline` deixa embaixo de cada `<img>` apareceria como emenda branca a cada
   página. A revista já traz margem própria; a emenda seria dupla.

   O modo vive numa classe do <html> porque ele muda coisas em dois lugares
   distantes (o palco e as setas), e mora no localStorage porque é preferência
   de quem lê, não do documento. --- */
.rev-modo{display:flex;order:-1;align-items:stretch;
  border:1px solid rgba(255,255,255,.28);border-radius:var(--raio-pill);overflow:hidden}
.rev-modo-btn{display:flex;align-items:center;gap:var(--sp-2);cursor:pointer;
  padding:var(--sp-2) var(--sp-3);border:0;background:none;color:#fff;
  font:600 .78rem var(--font-texto);transition:background var(--t-media),color var(--t-media)}
.rev-modo-btn svg{width:16px;height:16px}
.rev-modo-btn[aria-pressed="true"]{background:var(--ambar-500);color:var(--tinta)}
.rev-modo-btn:hover:not([aria-pressed="true"]){background:rgba(255,255,255,.16)}

/* o ajuste de largura é do webcomic: no clássico ele não quer dizer nada */
.rev-preencher{display:none;order:-1;flex:none;margin-left:var(--sp-2);
  border:1px solid rgba(255,255,255,.28);border-radius:var(--raio-pill)}
html.rev-webcomic .rev-preencher{display:flex}
/* ...e some de novo no celular, porque ali ele também não quer dizer nada: o
   teto de leitura é 820px e a tela é mais estreita que isso, então preencher ou
   não dá exatamente a mesma página. Um botão que não muda nada é pior que botão
   nenhum — quem aperta e não vê diferença conclui que está quebrado.
   860 e não 820: a média query não lê `--rev-largura`, e uma folga evita o
   ponto exato em que o teto começa a valer por 1px. */
@media(max-width:860px){html.rev-webcomic .rev-preencher{display:none}}

.rev-tira{display:none;width:100%;height:100%;overflow-y:auto;overscroll-behavior:contain}
.rev-tira[hidden]{display:none}
/* A COLA. `display:block` mata o vão de linha-base; `vertical-align` não
   bastaria porque a imagem seguinte começaria noutra caixa de linha.
   O `height:auto` mantém a proporção que o `width`/`height` das imagens declara.

   A LARGURA VIROU ESCOLHA DE QUEM LÊ (05/08/2026). O webcomic nasceu ocupando a
   tela inteira — "numa webtoon a página é a tela" — e isso continua sendo o
   PADRÃO, porque é o que já estava valendo. Mas num monitor largo a página fica
   grande demais para ler texto, e era justamente o que o `max-width:820px`
   original resolvia (ao custo de dois terços da tela em preto num 1440).
   Nenhuma das duas está errada: depende da revista e do monitor. Então o botão
   "Preencher" alterna, e a escolha fica no aparelho, como o modo de leitura. */
.rev-tira img{display:block;width:100%;height:auto;background:#fff}
/* sem preencher: largura de leitura, centrada. `--rev-largura` num só lugar
   para o dia em que alguém quiser outro número. */
html.rev-webcomic:not(.rev-cheia) .rev-tira img{
  max-width:var(--rev-largura,820px);margin-inline:auto}
html.rev-webcomic .rev-tira{display:block}
html.rev-webcomic .rev-folhas,
html.rev-webcomic .rev-seta{display:none}
/* o palco deixa de centralizar uma folha e passa a ser a calha da rolagem */
html.rev-webcomic .rev-palco{align-items:stretch;padding:0;touch-action:auto}

@media(max-width:640px){
  .rev-topo{padding:var(--sp-2) var(--sp-3)}
  .rev-titulo{flex:1 0 100%;font-size:.78rem}
  .rev-acao span{display:none}          /* no celular ficam só os ícones */
  .rev-acao{padding:var(--sp-2)}
  .rev-tam{display:none}
  /* As setas SAEM DO FLUXO e flutuam sobre a página. No celular quem limita o
     tamanho da folha é a LARGURA, não a altura: com as setas ocupando 76px + gaps,
     sobravam 274px de 390 e a página saía com 388px de altura num aparelho de 844 —
     medido. Fora do fluxo, a folha pega a largura toda e cresce ~35%. Virar página
     ali é por arrasto, de qualquer forma; a seta é reforço, não o caminho. */
  .rev-palco{padding:var(--sp-2)}
  .rev-seta{position:absolute;top:50%;transform:translateY(-50%);z-index:2;
    width:40px;height:40px;background:color-mix(in srgb,var(--petroleo-900) 70%,transparent)}
  .rev-ant{left:var(--sp-2)}
  .rev-prox{right:var(--sp-2)}
  .rev-seta:disabled{opacity:.18}
  .rev-folhas{width:100%}
}
/* captura determinística: sem transição na chamada da capa (docs/13 §4.3) */
.stillmode .rev-lupa{transition:none}

/* ============================================================
   BLOG / NOTÍCIAS (blog.html + post.html) — sobre os tokens
   ============================================================ */
/* ícone jornalzinho nas fileiras de redes */
.social-news{background:color-mix(in srgb,var(--ambar-500) 26%,transparent)}

/* layout 2 colunas: sidebar (busca+filtros) + timeline */
.blog-layout{display:grid;gap:var(--sp-6);grid-template-columns:1fr}
@media(min-width:920px){
  .blog-layout{grid-template-columns:280px 1fr}
  .blog-main{grid-column:2;grid-row:1}
  .blog-sidebar{grid-column:1;grid-row:1;position:sticky;top:calc(var(--header-h) + var(--azulejo-h) + 16px);align-self:start}
}
.blog-main{min-width:0}
.blog-sidebar{min-width:0;display:grid;gap:var(--sp-4)}
.side-block h3{letter-spacing:.05em;font-size:.82rem;color:var(--petroleo-800);margin-bottom:var(--sp-2)}
.blog-search{position:relative}
.blog-search input{background:var(--branco);
  border-radius:var(--raio-pill);padding:var(--sp-3) var(--sp-4) var(--sp-3) var(--sp-8);width:100%;transition:border-color var(--t-rapida),box-shadow var(--t-rapida)}
.blog-search svg{position:absolute;left:14px;top:50%;transform:translateY(-50%);width:18px;height:18px;stroke:var(--tinta-60);pointer-events:none}

/* filtros por tema */
.tl-filters{display:flex;flex-wrap:wrap;gap:var(--sp-2)}

/* timeline */
.timeline{position:relative;display:grid;gap:var(--sp-5);padding-left:var(--sp-1)}
.timeline::before{content:"";position:absolute;left:6px;top:8px;bottom:8px;width:2px;background:var(--petroleo-100)}
.tl-item{position:relative;padding-left:var(--sp-7)}
.tl-item::before{content:"";position:absolute;left:0;top:26px;width:14px;height:14px;border-radius:50%;
  background:var(--e,var(--turquesa-400));border:3px solid var(--papel);box-shadow:0 0 0 1.5px var(--petroleo-100)}
@media(max-width:560px){.timeline{padding-left:0}.timeline::before{display:none}.tl-item{padding-left:0}.tl-item::before{display:none}}

/* card de post */
.post-card{display:grid;grid-template-columns:190px 1fr;gap:0;
  overflow:hidden;border-left:5px solid var(--e,var(--petroleo-700));color:inherit}
.post-card.no-cover{grid-template-columns:1fr}
.post-cover{width:100%;height:100%;min-height:140px;object-fit:cover;background:color-mix(in srgb,var(--e) 12%,var(--papel));display:block}
.post-body{padding:var(--sp-4)}
.post-tag{display:inline-block;letter-spacing:.04em;font-size:.68rem;font-weight:600;
  color:var(--e-ink,var(--petroleo-800));background:color-mix(in srgb,var(--e,var(--petroleo-700)) 15%,#fff);padding:var(--sp-1) var(--sp-2)}
.post-meta{font-size:.78rem;color:var(--tinta-60);margin-left:var(--sp-2)}
.post-title{font-family:var(--font-titulo);font-size:1.16rem;font-weight:700;color:var(--petroleo-900);line-height:1.14;margin-top:var(--sp-2)}
.post-excerpt{color:var(--tinta-60);font-size:.92rem;line-height:1.45;margin-top:var(--sp-1);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.post-card .seg-go{margin-top:var(--sp-2)}
.post-card:hover .seg-go{color:var(--e,var(--petroleo-700))}
/* Cartão que leva para FORA do site (docs/35). A chamada já DIZ o destino
   ("Ver no Instagram", "Abrir em jornaldebrasilia.com.br"); aqui ela ganha o
   peso que o rótulo genérico não precisa, porque sair do site é decisão, não
   continuação. O nome do domínio pode ser longo — daí o `wrap` e o `break-word`,
   senão ele empurra a largura do cartão inteiro num contêiner estreito. */
.post-card--externo .seg-go{color:var(--e,var(--petroleo-700));font-weight:600;
  flex-wrap:wrap;overflow-wrap:anywhere}
@media(max-width:560px){.post-card{grid-template-columns:1fr}.post-cover{aspect-ratio:16/9;height:auto;min-height:0}}

/* compartilhar — botão no card (sobre o canto do card, fora do <a>) */
.post-share{position:absolute;top:12px;right:12px;z-index:3;width:38px;height:38px;padding:0;
  background:var(--branco);color:var(--petroleo-800);border:none;cursor:pointer;
  box-shadow:var(--sombra-sm);transition:transform .18s,background .18s,color .18s}
.post-share svg{width:18px;height:18px}
.post-share:hover,.post-share:focus-visible{background:var(--e,var(--petroleo-700));color:#fff;transform:scale(1.08)}

/* compartilhar — menu (popover criado via JS; usado no fallback sem Web Share) */
.share-menu{position:fixed;z-index:var(--z-menu);min-width:212px;max-width:calc(100vw - 20px);background:var(--branco);
  border:1px solid var(--petroleo-100);border-radius:var(--raio-md);box-shadow:var(--sombra-pop);
  padding:var(--sp-2);opacity:0;transform:translateY(-6px) scale(.97);transform-origin:top right;pointer-events:none;
  transition:opacity .16s ease,transform .16s ease}
.share-menu.open{opacity:1;transform:none;pointer-events:auto}
.share-menu .sm-head{font-size:.7rem;padding:var(--sp-1) var(--sp-2)}
.share-menu a,.share-menu button{display:flex;gap:var(--sp-3);width:100%;text-align:left;
  font-size:.95rem;color:var(--tinta);background:none;padding:var(--sp-2);border-radius:10px;transition:background .14s}
.share-menu a:hover,.share-menu button:hover,.share-menu a:focus-visible,.share-menu button:focus-visible{background:var(--petroleo-100)}
.share-menu .sm-ico{width:32px;height:32px;flex:none;color:#fff}
.share-menu .sm-ico svg{fill:currentColor}
.share-menu .sm-copy svg{stroke:#fff}   /* o fill:none já vem do .ico-traco */

/* compartilhar — barra dentro do post */
.post-share-bar{max-width:760px;margin:var(--sp-5) auto 0;display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.post-share-bar .psb-label{font-size:.82rem;margin-right:var(--sp-1)}
.post-share-bar a,.post-share-bar button{display:inline-flex;gap:var(--sp-2);font-size:.9rem;font-weight:600;color:#fff;padding:var(--sp-2) var(--sp-4);border-radius:var(--raio-pill);
  transition:transform .16s,filter .16s}
.post-share-bar a:hover,.post-share-bar button:hover{transform:translateY(-2px);filter:brightness(1.06)}
.post-share-bar svg{flex:none}
.post-share-bar .psb-wa svg,.post-share-bar .psb-fb svg,.post-share-bar .psb-x svg{fill:currentColor}
@media(max-width:560px){.post-share-bar{gap:var(--sp-2)}.post-share-bar .psb-txt{display:none}.post-share-bar a,.post-share-bar button{padding:var(--sp-3)}}

.blog-count{color:var(--tinta-60);font-size:.9rem;margin-bottom:var(--sp-3)}
.blog-empty{text-align:center;color:var(--tinta-60);padding:var(--sp-8) var(--sp-2)}
.load-more-wrap{text-align:center;margin-top:var(--sp-6)}

/* post individual (prosa) */
.post-hero-cover{width:100%;max-width:900px;margin:0 auto var(--sp-2);display:block;aspect-ratio:16/9;object-fit:cover;border-radius:var(--raio-lg);box-shadow:var(--sombra-card)}
.post-head{max-width:760px;margin:0 auto var(--sp-6);text-align:center}
.post-head .post-title{font-size:clamp(1.7rem,5vw,2.5rem);margin-top:var(--sp-2)}
.post-back{display:inline-flex;align-items:center;gap:var(--sp-1);letter-spacing:.05em;
  font-size:.82rem;color:var(--petroleo-700);margin-bottom:var(--sp-4)}
.post-back svg{width:15px;height:15px;stroke-width:2.5}
.post-article{max-width:760px;margin-inline:auto}
.post-article p{color:var(--tinta);font-size:1.06rem;line-height:1.7;margin:0 0 var(--sp-4)}
.post-article h2,.post-article h3,.post-article h4{color:var(--petroleo-800);line-height:1.12;margin:var(--sp-6) 0 var(--sp-2)}
.post-article h2{font-size:1.5rem}.post-article h3{font-size:1.25rem}.post-article h4{font-size:1.08rem}
.post-article ul,.post-article ol{margin:0 0 var(--sp-4);padding-left:var(--sp-5);color:var(--tinta)}
.post-article li{margin:var(--sp-1) 0;line-height:1.55}
.post-article img{max-width:100%;height:auto;border-radius:var(--raio-md);margin:var(--sp-3) 0;display:block}
.post-article figure{margin:var(--sp-4) 0}
.post-article figcaption{font-size:.85rem;color:var(--tinta-60);text-align:center;margin-top:var(--sp-1)}
.post-article a{color:var(--petroleo-700);text-decoration:underline}
.post-article strong,.post-article b{color:var(--petroleo-800)}
.post-article blockquote{border-left:4px solid var(--ambar-500);padding-left:var(--sp-4);margin:var(--sp-4) 0;color:var(--tinta-60);font-style:italic}
.post-related{max-width:900px;margin:var(--sp-7) auto 0}

/* link discreto do painel no rodapé */
.footer-admin{margin-top:var(--sp-1)}
.footer-admin a{color:rgba(255,255,255,.34);font-size:.72rem;letter-spacing:.03em}
.footer-admin a:hover{color:rgba(255,255,255,.7);text-decoration:underline}

/* --- CELULAR: alvo de toque do cabeçalho e do rodapé ----------------------
   Os quatro que sobraram das revisões de página, e que são de PARTIAL — valem
   para o site inteiro. Tudo por CSS: mexer na marcação do header/footer
   deslocaria data-edit-key em todas as páginas de uma vez (docs/13 §4.1).

   Medido a 390px, antes: .brand 194x34 · .hdr-social 42x42 ·
   .footer-mail a 199x14 · .footer-admin a 60x12.

   17/08/2026 — a bolinha de redes SAIU deste bloco. Ela estava aqui como
   `width:44px;height:44px`, e era essa linha que a fazia ser recortada pelo
   wrap de 42px. Hoje o tamanho vem do token `--bolinha` (styles:496) e no
   celular ele é 40px: círculo INTEIRO e menor, a pedido, e ainda bem acima do
   piso que a vistoria cobra (24px, WCAG 2.5.8 — `tools/vistoria.mjs`:91).
   A régua de 44 continua valendo para alvo de texto; para um botão isolado num
   canto, um círculo cortado era o pior dos dois mundos.

   Nos links do rodapé cresce o ESPAÇO, não a letra: `padding-block` mantém o
   tamanho do texto — os links de painel continuam discretos, que é o que se
   quer deles — e só a caixa clicável engorda. Aumentar a fonte os deixaria em
   evidência em toda página, o oposto do objetivo.

   Este bloco tem de ficar DEPOIS das regras acima: `.footer-admin a` mora na
   linha logo atrás, e regra de igual especificidade que vem antes perde. Foi
   assim que a correção das faces não pegou na primeira tentativa (docs/08 §5). */
@media(max-width:640px){
  .brand{min-height:44px}
  .hdr-social-wrap{--bolinha:40px}
  .footer-mail a,.footer-admin a{display:inline-block;padding-block:var(--sp-4)}
  /* "Capas" tem 38px porque a palavra é curta; o min-width iguala sem mexer no
     espaçamento entre os links (eles são inline-block, então as caixas não se
     sobrepõem — encostam). */
  .footer-admin a{min-width:44px;text-align:center}
}

/* editor rico do painel (novo-post) */
/* A barra acompanha a rolagem enquanto se escreve. Sem isso ela some de vista num
   post longo — no celular, voltar até ela custa caro.

   `top` = altura do cabeçalho do painel, que é sticky em top:0. Estas páginas NÃO
   têm a faixa de azulejos (conferido), então o offset é só --header-h; usar a soma
   do site público deixaria um vão.

   O sticky vale enquanto o BLOCO DO CONTEÚDO está em cena — o contêiner é o
   `.field` do editor —, então ela aparece ao entrar no campo e vai embora junto
   com ele. Precisa de fundo próprio: sem ele o texto rolaria por baixo dos botões. */
.editor-toolbar{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-bottom:var(--sp-2);
  position:sticky;top:var(--header-h);z-index:3;
  background:var(--branco);padding-block:var(--sp-2);
  border-bottom:1px solid var(--petroleo-100)}
.editor-toolbar button{font-family:var(--font-texto);font-size:.85rem;padding:var(--sp-1) var(--sp-3)}
.editor-toolbar button:hover{background:var(--petroleo-100)}
.editor{padding:var(--sp-3) var(--sp-4);
  min-height:230px;line-height:1.6;overflow:auto}
.editor:empty::before{content:attr(data-placeholder);color:var(--tinta-60);opacity:.7}
.editor p{margin:0 0 var(--sp-3)}
.editor h3{color:var(--petroleo-800);font-size:1.2rem;margin:var(--sp-3) 0 var(--sp-2)}
.editor ul,.editor ol{padding-left:var(--sp-5);margin:0 0 var(--sp-3)}
.editor blockquote{border-left:4px solid var(--ambar-500);padding-left:var(--sp-3);color:var(--tinta-60);font-style:italic;margin:var(--sp-3) 0}
.editor img{max-width:100%;height:auto;border-radius:var(--raio-sm);margin:var(--sp-2) 0}
.editor a{color:var(--petroleo-700);text-decoration:underline}

/* painel de gerência de posts (gerenciar.html) */
.adm-wrap{max-width:920px;margin-inline:auto}
.adm-bar{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:flex-end;margin-bottom:var(--sp-3)}
.adm-bar .blog-search{flex:1;min-width:200px}
.adm-field-search{flex:2;min-width:220px}
.adm-count{color:var(--tinta-60);font-size:.85rem;margin:0 0 var(--sp-2)}
.adm-tabs{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin:0 0 var(--sp-3)}
.adm-tab b{opacity:.65;font-weight:700;margin-left:var(--sp-1)}
.adm-tab.is-active b{opacity:.9}
.adm-list{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-2)}
.adm-row{display:flex;gap:var(--sp-3);align-items:center;min-width:0;background:var(--branco);border-radius:var(--raio-sm);padding:var(--sp-2) var(--sp-3)}
.adm-row.is-hidden{opacity:.62}
.adm-row.is-deleted{opacity:.5;border-style:dashed}
.adm-main{min-width:0;flex:1}
.adm-title{font-weight:600;color:var(--petroleo-900);font-size:.98rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.adm-title a{color:inherit}
.adm-meta{font-size:.77rem;color:var(--tinta-60);margin-top:var(--sp-1)}
.adm-status{font-size:.66rem;letter-spacing:.04em;padding:var(--sp-1) var(--sp-2);flex:none;white-space:nowrap}
.adm-status.ok{background:color-mix(in srgb,var(--th-saude) 16%,#fff);color:var(--th-saude-ink)}

/* --- Painel de cadastros (crm.html) — o que o vocabulário .adm-* não cobria --- */
.crm-exp{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;margin:0 0 var(--sp-4)}
.crm-exp-rot{font-size:.72rem;letter-spacing:.12em;color:var(--tinta-60)}
.crm-nota{font-size:.8rem;color:var(--tinta-60);margin-left:auto}
.crm-row{align-items:flex-start;flex-wrap:wrap;padding:var(--sp-3)}
.crm-row .adm-title{white-space:normal}
.crm-msg{margin-top:var(--sp-2);font-size:.85rem}
.crm-msg summary{cursor:pointer;color:var(--petroleo-800);font-weight:600}
.crm-msg p{margin-top:var(--sp-1);color:var(--tinta);line-height:1.5;white-space:pre-wrap;
  background:var(--papel);border-radius:var(--raio-sm);padding:var(--sp-3)}
.crm-perigo{color:var(--magenta-500);border-color:color-mix(in srgb,var(--magenta-500) 35%,var(--papel))}
.crm-perigo:hover{border-color:var(--magenta-500)}

/* (o `.aviso-aberto` — o aviso de "painel sem senha" — saiu na vistoria de
   05/08/2026: o painel não abre mais sem sessão desde o /entrar, docs/21.) */

/* --- Página de entrada (entrar.html) ---
   Reusa .form, .field, .btn-cta, .form-err e .form-submit. Só o enquadramento
   é novo: um formulário de uma linha não deve ocupar 1.200px. */
.entrar-wrap{max-width:420px;margin-inline:auto}
.entrar-wrap .form{gap:var(--sp-5)}

/* --- Painel de capas (capas.html) --- */
.capas-grade{display:grid;gap:var(--sp-4);grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr))}
.capas-item{display:flex;gap:var(--sp-4);padding:var(--sp-4);align-items:flex-start}
.capas-thumb{flex:none;width:96px;height:auto;border-radius:var(--raio-sm);background:var(--petroleo-100);
  box-shadow:var(--sombra-card)}
.capas-corpo{min-width:0;display:flex;flex-direction:column;gap:var(--sp-2)}
.capas-titulo{font-size:1rem;letter-spacing:.03em;color:var(--petroleo-900);line-height:1.1}
.capas-acoes{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-1)}
/* o <label> É o botão; o <input type=file> fica escondido dentro dele */
.capas-escolher{position:relative;overflow:hidden;font-size:.78rem;padding:var(--sp-2) var(--sp-3)}
.capas-file{position:absolute;inset:0;opacity:0;cursor:pointer;width:100%;height:100%}
.adm-status.hid{background:var(--petroleo-100);color:var(--petroleo-800)}
.adm-status.del{background:color-mix(in srgb,var(--th-mulher) 14%,#fff);color:var(--th-mulher-ink)}
.adm-actions{display:flex;gap:var(--sp-1);flex:none;flex-wrap:wrap;justify-content:flex-end}
.adm-btn{font-size:.7rem;padding:var(--sp-1) var(--sp-2);white-space:nowrap}
.adm-btn:disabled{opacity:.5}
.adm-btn.danger{color:var(--magenta-500)}
.adm-btn.danger:hover{border-color:var(--magenta-500);background:color-mix(in srgb,var(--magenta-500) 8%,#fff)}
.adm-btn.primary{background:var(--petroleo-700);color:#fff;border-color:var(--petroleo-700)}
.adm-btn.primary:hover{background:var(--petroleo-800);border-color:var(--petroleo-800)}

/* editor de categorias inline (gerenciar) */
.adm-cats{background:var(--papel);border:1.5px dashed var(--petroleo-200);border-radius:var(--raio-sm);padding:var(--sp-3) var(--sp-4);margin:-2px 0 var(--sp-1)}
.adm-cats-title{font-size:.9rem;color:var(--petroleo-900);margin-bottom:var(--sp-2)}
.adm-cats-grid{display:grid;gap:var(--sp-2);grid-template-columns:repeat(auto-fill,minmax(150px,1fr));margin-bottom:var(--sp-3)}
.adm-cats-foot{display:flex;gap:var(--sp-2);justify-content:flex-end;flex-wrap:wrap}
@media(max-width:640px){.adm-row{flex-wrap:wrap}.adm-actions{width:100%;margin-top:var(--sp-1);justify-content:flex-start}}

/* ============================================================
   TIPOGRAFIA EDITÁVEL — escala + presets  (docs/10, Fases 1 e 3)
   ------------------------------------------------------------
   O docs/01 §2.1 especifica uma escala tipográfica desde fevereiro e marca
   como [alvo Fase 2] — ela nunca foi aplicada. O código real tinha 21 clamp()
   distintos e 30 font-size fixos. Esta escala NÃO foi inventada: saiu de medir
   as 40 formas tipográficas que existem nas 5 páginas e agrupá-las em 13 papéis.

   Vem por ÚLTIMO no arquivo de propósito: o editor precisa vencer a regra
   original do elemento. Pela mesma razão o seletor é DOBRADO (.tx-x.tx-x,
   especificidade 0,2,0) — sem isso `.tx-titulo-card` (0,1,0) perderia para
   `.prog h3` (0,1,1). É explícito e local; !important não seria nem uma coisa
   nem outra.

   Presets NÃO mexem na semântica: um <h2> com .tx-corpo continua sendo um h2
   para leitor de tela e para o SEO. Só a aparência muda.
   ============================================================ */
:root{
  /* 10 degraus. Fluido onde o desenho já era fluido; fixo onde já era fixo. */
  --tx-0:.7rem;                         /* só para o degrau −1 do menor papel */
  --tx-1:.78rem;                        /* selo · sobrancelha */
  --tx-2:.88rem;                        /* legenda · rótulo */
  --tx-3:1.02rem;                       /* corpo miúdo */
  --tx-4:clamp(1rem,1.6vw,1.12rem);     /* corpo */
  --tx-5:clamp(1.05rem,2.4vw,1.18rem);  /* entrada (lead) */
  --tx-6:clamp(1.1rem,2.4vw,1.3rem);    /* título de card · de notícia */
  --tx-7:clamp(1.25rem,4vw,1.8rem);     /* título de seção */
  --tx-8:clamp(1.55rem,6vw,2.6rem);     /* manchete */
  --tx-9:clamp(1.9rem,7vw,3.6rem);      /* display */
  --tx-10:clamp(2.4rem,9vw,4.6rem);     /* só para o degrau +1 do display */
  --tx-num:clamp(1.3rem,4.6vw,2rem);    /* número grande */
}

/* --- os 13 papéis --- */
.tx-display.tx-display{font-family:var(--font-titulo);font-weight:700;text-transform:uppercase;
  font-size:var(--tx-9);line-height:.95;letter-spacing:.01em;font-style:normal}
.tx-manchete.tx-manchete{font-family:var(--font-titulo);font-weight:700;text-transform:uppercase;
  font-size:var(--tx-8);line-height:.98;letter-spacing:.01em;font-style:normal}
.tx-titulo-secao.tx-titulo-secao{font-family:var(--font-titulo);font-weight:700;text-transform:uppercase;
  font-size:var(--tx-7);line-height:1.02;letter-spacing:.01em;font-style:normal}
.tx-titulo-card.tx-titulo-card{font-family:var(--font-titulo);font-weight:600;text-transform:uppercase;
  font-size:var(--tx-6);line-height:1.06;letter-spacing:.01em;font-style:normal}
.tx-titulo-noticia.tx-titulo-noticia{font-family:var(--font-titulo);font-weight:700;text-transform:none;
  font-size:var(--tx-6);line-height:1.12;letter-spacing:.01em;font-style:normal}
.tx-numero.tx-numero{font-family:var(--font-titulo);font-weight:700;text-transform:none;
  font-size:var(--tx-num);line-height:1;letter-spacing:0;font-style:normal;white-space:nowrap}
.tx-sobrancelha.tx-sobrancelha{font-family:var(--font-titulo);font-weight:500;text-transform:uppercase;
  font-size:var(--tx-1);line-height:1.3;letter-spacing:.18em;font-style:normal}
.tx-rotulo.tx-rotulo{font-family:var(--font-titulo);font-weight:600;text-transform:uppercase;
  font-size:var(--tx-2);line-height:1.2;letter-spacing:.04em;font-style:normal}
.tx-selo.tx-selo{font-family:var(--font-titulo);font-weight:600;text-transform:uppercase;
  font-size:var(--tx-1);line-height:1.2;letter-spacing:.02em;font-style:normal}
.tx-entrada.tx-entrada{font-family:var(--font-texto);font-weight:400;text-transform:none;
  font-size:var(--tx-5);line-height:1.5;letter-spacing:0;font-style:normal}
.tx-corpo.tx-corpo{font-family:var(--font-texto);font-weight:400;text-transform:none;
  font-size:var(--tx-4);line-height:1.6;letter-spacing:0;font-style:normal}
.tx-legenda.tx-legenda{font-family:var(--font-texto);font-weight:500;text-transform:none;
  font-size:var(--tx-2);line-height:1.35;letter-spacing:0;font-style:normal}
.tx-citacao.tx-citacao{font-family:var(--font-texto);font-weight:400;text-transform:none;
  font-size:var(--tx-4);line-height:1.5;letter-spacing:0;font-style:italic}

/* --- AJUSTE FINO: um degrau abaixo / acima (docs/10 Fase 5) ---
   NÃO é multiplicador. O plano (§4.2) foi explícito: "−1/+1 DEGRAU sobre o
   preset, não caixa de número" — um fator solto (×0,85) produziria tamanhos
   fora da escala, que é exatamente o que a auditoria de julho gastou uma sessão
   eliminando. Cada papel aponta para o degrau vizinho, e só.

   Só funciona SOBRE um preset: sem ele não há degrau de onde sair. O painel
   desabilita os botões quando nenhum papel está aplicado.

   Especificidade (0,2,0) igual à dos papéis; vence por vir depois. */
.tx-display.tx-menor{font-size:var(--tx-8)}         .tx-display.tx-maior{font-size:var(--tx-10)}
.tx-manchete.tx-menor{font-size:var(--tx-7)}        .tx-manchete.tx-maior{font-size:var(--tx-9)}
.tx-titulo-secao.tx-menor{font-size:var(--tx-6)}    .tx-titulo-secao.tx-maior{font-size:var(--tx-8)}
.tx-titulo-card.tx-menor{font-size:var(--tx-5)}     .tx-titulo-card.tx-maior{font-size:var(--tx-7)}
.tx-titulo-noticia.tx-menor{font-size:var(--tx-5)}  .tx-titulo-noticia.tx-maior{font-size:var(--tx-7)}
.tx-numero.tx-menor{font-size:var(--tx-7)}          .tx-numero.tx-maior{font-size:var(--tx-9)}
.tx-sobrancelha.tx-menor{font-size:var(--tx-0)}     .tx-sobrancelha.tx-maior{font-size:var(--tx-2)}
.tx-rotulo.tx-menor{font-size:var(--tx-1)}          .tx-rotulo.tx-maior{font-size:var(--tx-3)}
.tx-selo.tx-menor{font-size:var(--tx-0)}            .tx-selo.tx-maior{font-size:var(--tx-2)}
.tx-entrada.tx-menor{font-size:var(--tx-4)}         .tx-entrada.tx-maior{font-size:var(--tx-6)}
.tx-corpo.tx-menor{font-size:var(--tx-3)}           .tx-corpo.tx-maior{font-size:var(--tx-5)}
.tx-legenda.tx-menor{font-size:var(--tx-1)}         .tx-legenda.tx-maior{font-size:var(--tx-3)}
.tx-citacao.tx-menor{font-size:var(--tx-3)}         .tx-citacao.tx-maior{font-size:var(--tx-5)}

/* --- COR do texto (docs/10 Fase 3) ---
   Tokens da marca, não hex livre: cor de texto é onde a acessibilidade quebra
   primeiro, e o docs/01 §1.4 já registra que laranja e amarelo não passam AA
   em corpo pequeno. `tema` segue a cor do eixo vigente — o mesmo --e-ink que
   pinta os cards, então o texto acompanha a seção sozinho. */
.tx-cor-tema.tx-cor-tema{color:var(--e-ink,var(--petroleo-800))}
.tx-cor-petroleo.tx-cor-petroleo{color:var(--petroleo-800)}
.tx-cor-petroleo-escuro.tx-cor-petroleo-escuro{color:var(--petroleo-900)}
.tx-cor-tinta.tx-cor-tinta{color:var(--tinta)}
.tx-cor-suave.tx-cor-suave{color:var(--tinta-60)}
.tx-cor-magenta.tx-cor-magenta{color:var(--magenta-500)}
.tx-cor-turquesa.tx-cor-turquesa{color:var(--th-saude-ink)}
.tx-cor-ambar.tx-cor-ambar{color:var(--ambar-600)}
.tx-cor-amarelo.tx-cor-amarelo{color:var(--amarelo-500)}
.tx-cor-branco.tx-cor-branco{color:var(--branco)}

/* --- MARCAS DE TRECHO (docs/30) — tamanho e fonte de CARACTERES soltos ---
   Irmãs das .tx-cor-* acima: valem para um <span> dentro de um bloco, e não
   para o bloco. Três dimensões independentes (cor · tamanho · fonte) que se
   somam num mesmo span.

   O TAMANHO É RELATIVO, em `em`, e essa é a decisão que faz tudo funcionar.
   As classes de bloco (.tx-maior) são absolutas e só existem COMBINADAS com um
   papel — `.tx-display.tx-maior`, `.tx-manchete.tx-maior`… — então `.tx-maior`
   sozinho num trecho não faz nada (medido). Um degrau relativo, ao contrário,
   serve o display do hero e um rótulo de 14px com uma regra só, e continua
   certo se o bloco trocar de papel depois.

   Medido nos três contextos reais, em px:
     título do hero  51,5 · 61,8 · [73,6] · 88,3 · 106,7
     entrada (lead)  13,2 · 15,9 · [18,9] · 22,7 ·  27,4
     rótulo de stat   9,9 · 11,8 · [14,1] · 16,9 ·  20,4
   O 9,9 é a razão do piso de 12px que o editor aplica antes de deixar descer.

   Os nomes são minúsculos de propósito: o filtro do Publicar só deixa passar
   `tx-[a-z0-9-]+` (T_CLASS_OK no main.js). Uma classe com maiúscula morreria
   calada na primeira gravação. */
.tx-t-menor2{font-size:.70em}
.tx-t-menor {font-size:.84em}
.tx-t-maior {font-size:1.20em}
.tx-t-maior2{font-size:1.45em}
/* FONTE: as duas da casa, nomeadas pelo PAPEL e não pelo nome da fonte — mesma
   disciplina do AZ_CORES ("Principal/Destaque"). Não há seletor livre aqui, e
   é de propósito: fonte livre por trecho é como o site desanda. */
.tx-t-titulo{font-family:var(--font-titulo);font-weight:700;letter-spacing:.01em}
.tx-t-texto {font-family:var(--font-texto);font-weight:400;letter-spacing:0}

/* --- painel de tipografia do editor (docs/10 Fases 2-3) ---
   A altura é teto DUPLO (72vh e 480px) porque o painel é posicionado ao lado da
   caixa de texto: 72vh sozinho, num monitor alto, dá um painel grande demais
   para ficar "perto" de qualquer coisa. Ver docs/11 §13. */
.dayse-tx-panel{width:min(300px,calc(100vw - 28px));max-height:min(72vh,480px)}
.bt-tipo{font:700 .82rem/1 var(--font-titulo);letter-spacing:.02em}
.tx-ops{display:grid;gap:4px;margin-bottom:var(--sp-2);max-height:210px;overflow-y:auto}
.tx-op{text-align:left;padding:var(--sp-2) var(--sp-3);border-radius:8px;cursor:pointer;
  border:1.5px solid var(--petroleo-100);background:var(--branco);
  font:600 .78rem var(--font-texto);color:var(--petroleo-900)}
.tx-op:hover{border-color:var(--turquesa-400)}
.tx-op.is-active{background:var(--petroleo-700);color:#fff;border-color:var(--petroleo-700)}
.tx-sws{display:flex;flex-wrap:wrap;gap:5px}
.tx-sw{width:24px;height:24px;padding:0;border-radius:50%;cursor:pointer;
  border:1.5px solid rgba(var(--tinta-rgb),.22);transition:transform .12s}
.tx-sw:hover{transform:scale(1.15)}
.tx-sw.is-active{outline:2px solid var(--petroleo-700);outline-offset:2px}

/* --- seletor de ícone do editor (docs/11 Fases 2-3) ---
   Mesma razão da altura dupla acima: este painel abre AO LADO de um ícone de
   23px. Aberto por inteiro ele ia a 667px e não cabia — daí a gaveta
   (.ic-ajuste) e a grade rolável. Ver docs/11 §13.

   ISTO MUDOU EM 04/08/2026 (docs/22). Encolher o painel resolvia "não cabe ao
   lado", mas ao custo de esconder os controles atrás de um clique. Como o painel
   agora se ARRASTA, o problema deixou de ser de tamanho e virou de lugar: em
   tela larga ele abre nas duas colunas, com tudo à vista; no celular continua
   estreito e com a gaveta, que lá ainda é a resposta certa. */
.dayse-ico-panel{width:min(320px,calc(100vw - 28px));max-height:min(72vh,520px)}

/* o cabeçalho é a alça: sinaliza e não deixa o toque virar rolagem */
.dayse-ico-panel .bk-head{cursor:move;touch-action:none;user-select:none;-webkit-user-select:none}
.ic-pega{flex:1 1 auto;height:10px;margin:0 var(--sp-1);border-radius:99px;
  background:repeating-linear-gradient(90deg,rgba(var(--tinta-rgb),.22) 0 2px,transparent 2px 5px);
  background-size:auto 4px;background-position:center;background-repeat:repeat-x}
.dayse-ico-panel.is-arrastando{box-shadow:var(--sombra-pop);opacity:.97}
/* enquanto arrasta, nada dentro do painel reage ao ponteiro — senão passar por
   cima de um ícone da grade dispara hover e o arrasto fica pesado e piscando */
.dayse-ico-panel.is-arrastando .ic-colunas{pointer-events:none}

.ic-colunas{display:block}
@media (min-width:900px){
  /* Duas colunas: refino à esquerda, acervo à direita. Os 680px saem da soma —
     260 (controles) + 380 (grade de 42px, ~8 por linha) + calhas — e não de um
     número escolhido no olho. */
  .dayse-ico-panel{width:min(680px,calc(100vw - 28px));max-height:min(84vh,620px)}
  .ic-colunas{display:grid;grid-template-columns:250px 1fr;gap:var(--sp-3);align-items:start}
  .ic-col-ajuste{border-right:1px solid var(--petroleo-100);padding-right:var(--sp-3)}
  /* a gaveta deixa de ser gaveta: em 680px o conteúdo cabe, e um clique para ver
     o que já caberia é atrito puro. Quem a mantém ABERTA é o JS (`icLargo()`),
     porque CSS não abre um <details> — esconder o summary deixaria o conteúdo
     colapsado e o painel sairia vazio do lado esquerdo. */
  .ic-ajuste{border-top:0;padding-top:0;margin-bottom:0}
  .ic-ajuste summary{display:none}
  /* a GRADE rola, não o painel: se o painel inteiro rolasse, os controles da
     esquerda sairiam de vista justamente enquanto se mexe neles */
  .ic-grade{max-height:352px}
}
.ic-busca{width:100%;padding:var(--sp-2);margin-bottom:var(--sp-2);border-radius:10px;
  border:1.5px solid var(--petroleo-100);background:var(--branco);
  font:600 .8rem var(--font-texto);color:var(--petroleo-900)}
.ic-busca:focus{outline:none;border-color:var(--turquesa-400)}
.ic-grade{display:grid;grid-template-columns:repeat(auto-fill,minmax(42px,1fr));gap:4px;
  max-height:186px;overflow-y:auto}
.ic-op{display:grid;place-items:center;padding:6px;border-radius:8px;cursor:pointer;
  border:1.5px solid transparent;background:var(--papel);color:var(--petroleo-900)}
.ic-op svg{width:22px;height:22px;display:block}
.ic-op:hover{border-color:var(--turquesa-400);background:var(--branco)}
.ic-op.is-active{border-color:var(--petroleo-700);background:var(--petroleo-100)}
/* no modo edição, ícone é clicável */
body.dayse-editing svg[data-slot]{cursor:pointer}
body.dayse-editing svg[data-slot]:hover{outline:2px solid var(--turquesa-400);outline-offset:3px;border-radius:4px}
/* camadas do ícone (docs/11 Fase 4) */
.ic-cams{display:flex;gap:4px;margin-bottom:var(--sp-2)}
.ic-cam{width:28px;height:28px;flex:none;border-radius:8px;cursor:pointer;
  border:1.5px solid var(--petroleo-100);background:var(--branco);
  font:700 .78rem var(--font-titulo);color:var(--petroleo-800)}
.ic-cam:hover{border-color:var(--turquesa-400)}
.ic-cam.is-active{background:var(--petroleo-700);color:#fff;border-color:var(--petroleo-700)}
.ic-cam-mais{color:var(--turquesa-500)}
.ic-cam-del{color:var(--magenta-500)}
.dayse-ico-panel .az-row{margin-bottom:var(--sp-2)}
.dayse-ico-panel .az-row label{font-size:.7rem}
/* chips de tema do seletor de ícone (docs/11 §13) */
.ic-temas{justify-content:flex-start;gap:4px;margin:0 0 var(--sp-2)}
.ic-temas .filter-chip{font-size:.68rem;padding:3px var(--sp-2)}
/* --- CRIAR BLOCOS (docs/31): o "+" no fim do contêiner ---
   Sempre visível no modo edição, e tracejado de propósito: ele é um LUGAR onde
   algo pode nascer, não um bloco. Ocupa a mesma pista dos irmãos para a grade
   não mudar de ritmo quando ele aparece. */
.dayse-novo{display:none}
body.dayse-editing .dayse-novo{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  min-height:64px;padding:var(--sp-3);cursor:pointer;
  border:2px dashed var(--turquesa-400);border-radius:var(--raio-sm);
  background:color-mix(in srgb,var(--petroleo-700) 5%,#fff);
  color:var(--petroleo-800);font:700 .74rem var(--font-titulo);
  letter-spacing:.04em;text-transform:uppercase;transition:background .15s,border-color .15s}
body.dayse-editing .dayse-novo:hover{background:var(--petroleo-100);border-color:var(--petroleo-700)}
body.dayse-editing .dayse-novo span{font-size:1.5rem;line-height:1;font-weight:400}
/* O "+" de fileira: mesma altura de um chip. O botão padrão tem 64px e foi
   desenhado para grade de cartão; numa fileira ele viraria o assunto da linha. */
body.dayse-editing .dayse-novo--curto{
  flex-direction:row;gap:6px;min-height:0;
  padding:var(--sp-2) var(--sp-3);font-size:.72rem}
body.dayse-editing .dayse-novo--curto span{font-size:1rem}
/* A DICA DO BLOCO VAZIO mora no CSS, e não no DOM: assim ela nunca é gravada
   como conteúdo. O bloco nasce de fato vazio (docs/31 §5). */
body.dayse-editing [data-edit-key]:empty::before{
  content:"escreva aqui";opacity:.4;font-style:italic;font-weight:400}

/* barrinha sobre a seleção (docs/10 Fase 4 · docs/30)
   Nasceu só com cores; hoje tem TRÊS grupos — tamanho · fonte · cor — na ordem
   em que a mão costuma pedir. As divisórias importam: sem elas os 11 botões de
   cor engolem visualmente os 4 controles novos, que são os que mudam mais. */
.dayse-selbar{position:fixed;z-index:var(--z-edicao-alta);display:flex;align-items:center;gap:var(--sp-2);
  padding:var(--sp-2);border-radius:var(--raio-pill);background:var(--branco);
  box-shadow:var(--sombra-pop);border:1px solid rgba(var(--tinta-rgb),.08);max-width:calc(100vw - 16px)}
.dayse-selbar[hidden]{display:none}
.sb-grupo{display:flex;align-items:center;gap:4px;padding-right:var(--sp-2);
  border-right:1px solid rgba(var(--tinta-rgb),.12)}
.sb-grupo:last-of-type{padding-right:0;border-right:0}
.sb-cores{flex-wrap:wrap;max-width:270px;gap:5px}
.sb-btn{display:inline-flex;align-items:center;gap:1px;padding:3px var(--sp-2);border-radius:var(--raio-pill);
  border:1.5px solid var(--petroleo-100);background:var(--branco);cursor:pointer;
  font:700 .74rem var(--font-titulo);letter-spacing:.02em;color:var(--petroleo-900);white-space:nowrap}
.sb-btn span{font-size:.9em}
.sb-btn:hover:not([disabled]){border-color:var(--turquesa-400);background:var(--petroleo-100)}
.sb-btn.is-active{background:var(--petroleo-700);border-color:var(--petroleo-700);color:#fff}
.sb-btn[disabled]{opacity:.38;cursor:default}
.sb-fonte{font-size:.7rem;font-weight:600}
.sb-limpar{background:linear-gradient(135deg,#fff 44%,var(--magenta-500) 44%,var(--magenta-500) 56%,#fff 56%)}
/* a nota da largura casada do hero: recado de contexto, não de erro — por isso
   é neutra, e não âmbar como o aviso de contraste */
.sb-nota{align-self:center;flex:none;padding:2px var(--sp-2);border-radius:var(--raio-pill);
  font:600 .66rem var(--font-texto);color:var(--tinta-60);cursor:default;
  background:var(--petroleo-100)}
/* aviso de contraste da seleção — mesmo par de cores do .az-aviso e do painel de
   tipografia, porque é o mesmo recado (docs/10 Fase 3) */
.sb-aviso{align-self:center;flex:none;padding:2px var(--sp-2);border-radius:var(--raio-pill);
  font:700 .68rem var(--font-texto);color:var(--th-laranja-ink);cursor:default;
  background:color-mix(in srgb,var(--ambar-500) 18%,#fff)}
.tx-graus label{display:block;font:600 .74rem var(--font-texto);color:var(--tinta-60);margin:0 var(--sp-1) var(--sp-1)}
.tx-graus .filter-chip[disabled]{opacity:.45;cursor:default}
.tx-graus .filter-chip[disabled]:hover{border-color:var(--petroleo-100)}
/* gaveta dos controles de camada: a ação principal é ESCOLHER o desenho;
   ajustar é refino (docs/11 §13). Os tetos de altura que acompanham esta gaveta
   estão nas declarações de .dayse-ico-panel e .ic-grade, lá em cima — e não
   aqui embaixo em regras separadas, que era como estavam: quem fosse mexer na
   altura achava a primeira declaração, mudava, e não via efeito. */
.ic-ajuste{margin-bottom:var(--sp-2);border-top:1px dashed rgba(var(--tinta-rgb),.14);padding-top:var(--sp-2)}
.ic-ajuste summary{cursor:pointer;list-style:none;font:600 .74rem var(--font-texto);color:var(--petroleo-800);padding:var(--sp-1) 0}
.ic-ajuste summary::-webkit-details-marker{display:none}
.ic-ajuste summary::before{content:"▸ ";color:var(--turquesa-400)}
.ic-ajuste[open] summary::before{content:"▾ "}


/* ============================================================
   ALVO DE TOQUE NO CELULAR — o que precisa vencer a cascata
   ------------------------------------------------------------
   Mora no fim de propósito. `.btn`, `.filter-chip` e `.post-share` têm
   regras espalhadas pelo arquivo (base, tons, páginas), e uma correção de
   igual especificidade colocada antes delas simplesmente não pega — foi o
   que aconteceu duas vezes nesta série de revisões (docs/08 §5).

   Os ajustes de UMA página só continuam junto do componente dela; aqui
   ficam os que valem para o site inteiro.

   Medido a 390px, antes: .btn 136x41 ("Carregar mais") · .filter-chip 60x30
   · .post-share 38x38.
   ============================================================ */
@media(max-width:640px){
  .btn{min-height:44px}
  .filter-chip{padding-block:var(--sp-3);min-height:44px}
  .post-share{width:44px;height:44px}
  /* barra de compartilhar do post e o "voltar" — medidos em 40x40 e 114x21 */
  .post-share-bar .psb-wa,.post-share-bar .psb-fb,
  .post-share-bar .psb-x,.post-share-bar .psb-copy{width:44px;height:44px}
  .post-back{min-height:44px;display:inline-flex;align-items:center}
  /* subeixos do menu mobile (Melhor Idade, Esporte, Mulheres, Educação): 42 -> 44 */
  .mm-sublink{min-height:44px;display:flex;align-items:center}

  /* --- PAINÉIS (gerenciar · novo-post · crm · capas) ---
     Medido a 390px: .adm-tab 73x30 · .adm-btn 74x21 · botão do editor 35x24.
     São ferramentas de trabalho, mas quem usa também usa no celular. */
  .adm-tab{min-height:44px}
  .adm-btn{min-height:44px;padding-inline:var(--sp-3)}
  /* os do editor são de uma letra ("B", "I"): sem min-width ficam 30px de largura.
     A barra tem flex-wrap, então quebra em vez de transbordar. */
  .editor-toolbar button{min-height:44px;min-width:44px;padding-inline:var(--sp-3)}

  /* O título do post na lista do "Gerenciar" tinha 17px de altura. Em vez de
     engordar o link — e com ele as 107 linhas, +2.000px de rolagem —, o alvo
     se estende sobre o bloco de informação inteiro (.adm-main, 49px de altura
     e a largura toda) por um ::after. Mesmo truque dos pontinhos do carrossel:
     área de toque sem mudar uma linha do desenho.
     Seguro porque dentro do .adm-main só há texto — o título e a meta —, e os
     botões de ação ficam em outra linha da flex. */
  .adm-main{position:relative}
  .adm-title a::after{content:"";position:absolute;inset:0}

  /* Título em TRÊS linhas no celular. Com uma linha só, 99 dos 107 títulos eram
     cortados e aparecia 46% do texto — "Edital Saúde nas Escolas 2026 – Edição: …"
     não distingue um post do outro numa lista cheia de editais.

     Medido a 390px, as quatro opções:
        linhas  cortados     texto visível   página
          1     99 (93%)     46%             15.007px
          2     82 (77%)     67%             17.492px
          3     38 (36%)     89%             19.549px   <- escolhida
          4     15 (14%)     97%             20.503px
     O salto de 2 para 3 é o maior ganho por pixel gasto (+22 pontos por 2.057px);
     de 3 para 4 são só +8 pontos por quase mil. E quem procura um post específico
     tem a busca ali em cima — o título na lista precisa distinguir, não caber.

     Sem suporte ao clamp o texto só quebra inteiro — degrada, não quebra. */
  .adm-title{white-space:normal;display:-webkit-box;-webkit-box-orient:vertical;
    -webkit-line-clamp:3;line-clamp:3;overflow:hidden}
}

/* ============================================================
   GERADOR DE MOLDURA (/moldura) — 18/08/2026
   ------------------------------------------------------------
   A interface inteira é montada pelo `js/moldura.js`; aqui só a aparência.

   O alvo de soltar é GRANDE de propósito: ele é a primeira coisa da página e
   precisa dizer sozinho o que fazer, sem ninguém ler instrução. No celular
   ninguém arrasta arquivo — lá o mesmo bloco é um botão de toque, e é por isso
   que a segunda linha ("ou toque para escolher") não é opcional.
   ============================================================ */
.mold{max-width:920px;margin-inline:auto}
/* `[hidden]` PRECISA VENCER O `display` DE AUTOR — e esta linha é a segunda vez
   que o projeto paga por isso em dois dias: o `display:none` do atributo vem da
   folha do NAVEGADOR, e qualquer `display` declarado aqui o atropela. Sem ela a
   área de soltar continuava na tela depois da foto entrar, empurrando o editor
   para baixo. O primeiro caso foi o `.kpi-modal{display:grid}` (17/08). */
.mold-solta[hidden],.mold-edita[hidden]{display:none}
.mold-aviso{text-align:center;color:var(--tinta-60)}

.mold-solta{
  display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);
  padding:var(--sp-9) var(--sp-5);text-align:center;cursor:pointer;
  background:var(--branco);border-radius:var(--raio-md);
  border:2px dashed rgba(var(--petroleo-700-rgb),.34);
  transition:border-color var(--t-media),background var(--t-media),transform var(--t-media)}
.mold-solta:hover,.mold-solta:focus-visible,.mold-solta.sobre{
  border-color:var(--petroleo-700);background:rgba(var(--petroleo-700-rgb),.05)}
.mold-solta.sobre{transform:scale(1.01)}
.mold-ico{width:44px;height:44px;fill:none;stroke:var(--petroleo-700);stroke-width:1.8;
  stroke-linecap:round;stroke-linejoin:round;margin-bottom:var(--sp-1)}
.mold-solta-t{font-family:var(--font-titulo);font-size:clamp(1.15rem,3.6vw,1.5rem);
  font-weight:700;color:var(--petroleo-800);letter-spacing:-.01em}
.mold-solta-s{color:var(--tinta-60);font-size:1rem}
/* os dois caminhos, lado a lado: importar uma foto ou tirar uma na hora */
.mold-solta-b{display:flex;flex-wrap:wrap;gap:var(--sp-2);justify-content:center;
  margin-top:var(--sp-3)}
.mold-solta-b .btn{min-height:44px}
.mold-solta-b .btn-ico{width:18px;height:18px}
/* a promessa de privacidade fica JUNTO do gesto, não no rodapé da página:
   é no instante de escolher a foto que a dúvida aparece */
/* --- PAINEL DE ENVIO DE MOLDURA — só no site de edição (19/08/2026) ---
   Ele nasce por JavaScript e mora ACIMA do gerador, não dentro: o que está
   dentro do `#mold` some junto com a área de soltar assim que alguém escolhe
   uma foto, e quem administra precisa da lista o tempo todo. */
.mold-admin{max-width:var(--container);margin:0 auto var(--sp-5);padding:var(--sp-4);
  border:1.5px dashed var(--petroleo-200,rgba(4,69,90,.28));border-radius:var(--raio-md);
  background:color-mix(in srgb,var(--turquesa-500) 6%,#fff)}
.mold-admin-t{margin:0 0 var(--sp-1);font:700 1rem var(--font-titulo);color:var(--petroleo-900)}
.mold-admin-p{margin:0 0 var(--sp-3);font-size:.82rem;line-height:1.45;color:var(--tinta-60)}
.mold-admin-linha{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}
/* 44px de alvo, medido: o botão herdava 41 do .btn e o portão reprovou */
.mold-admin-linha .btn{min-height:44px;display:inline-flex;align-items:center}
.mold-admin-rot{font:600 .78rem var(--font-texto);color:var(--tinta-60)}
.mold-admin-rot i{font-style:normal;font-weight:400;opacity:.85}
.mold-admin-linha input[type=text]{flex:1 1 220px;min-width:0;min-height:44px;
  padding:var(--sp-2) var(--sp-3);border-radius:10px;border:1px solid rgba(var(--tinta-rgb),.18);
  background:var(--branco);font:600 .86rem var(--font-texto);color:var(--petroleo-900)}
.mold-admin-status{margin-top:var(--sp-2);font-size:.82rem;color:var(--petroleo-800)}
.mold-admin-status.ruim{color:var(--magenta-500)}
.mold-admin-status[hidden]{display:none}
.mold-admin-lista{display:flex;flex-direction:column;gap:var(--sp-1);margin-top:var(--sp-3)}
.mold-adm-item{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-1) var(--sp-2);
  border-radius:10px;background:var(--branco)}
.mold-adm-item img{width:44px;height:44px;border-radius:8px;object-fit:cover;flex:none;
  background:var(--papel)}
.mold-adm-nome{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;
  font:600 .84rem var(--font-texto);color:var(--petroleo-900);
  overflow:hidden;text-overflow:ellipsis}
/* a etiqueta que diz de qual família a moldura é — e o que ela virou */
.mold-adm-nome i{font:600 .7rem var(--font-texto);font-style:normal;color:var(--tinta-60);
  text-transform:uppercase;letter-spacing:.04em}
.mold-adm-item button{flex:none;min-height:44px;padding:var(--sp-1) var(--sp-3)}
/* escondida continua na lista de quem administra, e diz que está escondida */
.mold-adm-item.oculta{opacity:.72;background:repeating-linear-gradient(135deg,
  var(--branco),var(--branco) 8px,var(--papel) 8px,var(--papel) 16px)}
.mold-adm-item.oculta img{filter:grayscale(1)}

/* --- EDITOR DA FRASE DO COMPARTILHAR (19/08/2026) ---
   Fica abaixo da lista, com um traço separando: é outro assunto (o texto que
   viaja com a imagem), no mesmo painel de quem administra a página. */
.mold-frase{margin-top:var(--sp-4);padding-top:var(--sp-4);
  border-top:1px dashed rgba(var(--tinta-rgb),.18)}
.mold-frase-t{margin:0 0 var(--sp-1);font:700 .92rem var(--font-titulo);color:var(--petroleo-900)}
.mold-frase textarea{width:100%;min-height:88px;padding:var(--sp-2) var(--sp-3);
  border-radius:10px;border:1px solid rgba(var(--tinta-rgb),.18);background:var(--branco);
  font:400 .88rem/1.5 var(--font-texto);color:var(--petroleo-900);resize:vertical}
.mold-frase-pe{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center;margin-top:var(--sp-2)}
.mold-frase-pe .btn{min-height:44px;display:inline-flex;align-items:center}
/* o contador empurra os botões para a direita e some no celular, onde a linha
   já quebra e o espaço vale mais que a contagem */
.mold-frase-conta{flex:1;min-width:0;font:600 .76rem var(--font-texto);color:var(--tinta-60);
  font-variant-numeric:tabular-nums}
@media(max-width:600px){.mold-frase-conta{flex-basis:100%}}
.mold-frase-aviso{margin-top:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-radius:8px;
  background:color-mix(in srgb,var(--ambar-500) 14%,#fff);color:var(--th-laranja-ink);
  font-size:.78rem;line-height:1.4}
.mold-frase-aviso[hidden]{display:none}

/* --- A ARTE PRONTA (19/08/2026) ---
   Uma das opções é uma PEÇA, não uma moldura: vem com a Dayse e o Israel
   dentro e não recebe a foto de quem usa. O link da tela inicial é a porta
   dela (a lista de opções só existe depois que há foto) e o aviso ocupa o
   lugar dos controles de enquadramento, que somem — controle que não faz
   nada é pior que controle ausente. */
/* 44px de alvo, medido: com o padding da folha ele dava 38 e ficava abaixo da
   régua de toque do projeto. É link no visual e botão no alvo. */
.mold-pronta-link{display:flex;align-items:center;justify-content:center;min-height:44px;
  margin:var(--sp-2) auto 0;padding:var(--sp-1) var(--sp-2);
  border:0;background:none;cursor:pointer;font:600 .82rem var(--font-texto);
  color:var(--petroleo-700);text-decoration:underline;text-underline-offset:3px}
.mold-pronta-link:hover,.mold-pronta-link:focus-visible{color:var(--petroleo-900)}
.mold-pronta{margin:0 0 var(--sp-3);padding:var(--sp-2) var(--sp-3);border-radius:10px;
  background:color-mix(in srgb,var(--turquesa-500) 12%,#fff);
  font-size:.78rem;line-height:1.4;color:var(--petroleo-900)}
.mold-pronta[hidden]{display:none}
.mold-solta-p{margin-top:var(--sp-3);font-size:.86rem;color:var(--tinta-60);max-width:44ch}

.mold-edita{display:grid;grid-template-columns:1fr;gap:var(--sp-6);align-items:start}
@media(min-width:860px){.mold-edita{grid-template-columns:minmax(0,1fr) minmax(260px,340px)}}

.mold-palco{position:relative;width:100%;max-width:540px;margin-inline:auto}
#moldTela{display:block;width:100%;aspect-ratio:1/1;height:auto;border-radius:var(--raio-md);
  box-shadow:var(--sombra-card);touch-action:none;cursor:grab;background:var(--papel)}
#moldTela:active{cursor:grabbing}
/* A DICA FICA FORA DA IMAGEM. Sobreposta, ela disputava espaço com duas coisas
   que não podem ser tapadas: o "TÔ COM A DAYSE" no alto da moldura e o botão de
   salvar no canto de baixo. Embaixo do quadro ela orienta igual, e a foto da
   pessoa aparece inteira — que é o ponto da ferramenta. */
.mold-dica{margin-top:var(--sp-2);text-align:center;font-size:.86rem;
  color:var(--tinta-60);transition:opacity var(--t-media)}
.mold-dica.some{opacity:0}

.mold-controles{display:flex;flex-direction:column;gap:var(--sp-5)}
.mold-grupo{display:flex;flex-direction:column;gap:var(--sp-2)}
.mold-rot{font-family:var(--font-titulo);font-size:.9rem;font-weight:700;
  letter-spacing:.04em;text-transform:uppercase;color:var(--petroleo-800)}

/* GRADE 2x2, e não fileira que quebra. Com quatro molduras (18/08/2026) o
   `flex-wrap` deixava três em cima e uma sozinha embaixo — arranjo que parece
   defeito, não escolha. Duas colunas fecham certo com 2 ou com 4 opções, que
   são os únicos números que este seletor já teve. */
.mold-opcoes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-2)}
.mold-opcao{display:flex;flex-direction:column;align-items:center;gap:var(--sp-1);
  padding:var(--sp-2);cursor:pointer;background:var(--branco);
  border:2px solid transparent;border-radius:var(--raio-sm);
  font:inherit;font-size:.82rem;color:var(--tinta-60);transition:var(--t-rapida)}
.mold-opcao img{width:64px;height:64px;display:block;border-radius:var(--raio-sm)}
.mold-opcao:hover{border-color:rgba(var(--petroleo-700-rgb),.4)}
.mold-opcao.ativa{border-color:var(--petroleo-700);color:var(--petroleo-800);font-weight:700}

#moldZoom{width:100%;accent-color:var(--petroleo-700);min-height:32px}

.mold-acoes{display:flex;flex-direction:column;gap:var(--sp-2)}
.mold-acoes .btn{width:100%;justify-content:center}
.mold-status{font-size:.88rem;color:var(--tinta-60);min-height:1.4em}
/* erro não pode se parecer com aviso: quem errou precisa VER que errou */
.mold-status.ruim{color:var(--tinta);font-weight:600}

/* ---- SALVAR E COMPARTILHAR (gerador de moldura) ---------------------------
   O botão FLUTUA sobre a imagem porque é ali que a pessoa está olhando quando
   termina de enquadrar — descer os olhos até uma coluna de botões é um passo a
   mais entre "ficou bom" e "mandei para o grupo".

   Fundo SÓLIDO e sombra, nunca transparência: o que está por baixo é a foto de
   alguém, e pode ser clara, escura ou listrada. Contraste que depende do fundo
   é contraste que falha na foto de alguém. */
.mold-flutua{
  position:absolute;right:var(--sp-3);bottom:var(--sp-3);
  display:inline-flex;align-items:center;gap:var(--sp-2);
  min-height:44px;padding:0 var(--sp-4);border:0;border-radius:999px;cursor:pointer;
  background:var(--realce);color:var(--tinta);
  font-family:var(--font-titulo);font-weight:700;font-size:.92rem;letter-spacing:.02em;
  box-shadow:0 6px 20px rgba(0,0,0,.28);
  transition:transform var(--t-rapida),box-shadow var(--t-rapida)}
.mold-flutua svg{width:19px;height:19px;flex:0 0 auto;
  fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.mold-flutua:hover,.mold-flutua:focus-visible{transform:translateY(-2px);box-shadow:0 10px 26px rgba(0,0,0,.34)}
/* no celular a legenda inteira empurraria o botão até a metade da foto */
@media(max-width:460px){
  .mold-flutua{font-size:.84rem;padding:0 var(--sp-3);gap:var(--sp-1)}
}

.mold-share{display:flex;flex-direction:column;gap:var(--sp-2);
  padding:var(--sp-4);border-radius:var(--raio-md);
  background:rgba(var(--petroleo-700-rgb),.07);
  border:1px solid rgba(var(--petroleo-700-rgb),.18)}
.mold-share[hidden]{display:none}
.mold-share-t{font-family:var(--font-titulo);font-weight:700;font-size:1.06rem;
  color:var(--petroleo-800);line-height:1.25}
/* a mensagem aparece INTEIRA: é ela que vai ser enviada, e ninguém manda um
   texto que não leu */
.mold-share-m{font-size:.9rem;line-height:1.5;color:var(--tinta);
  background:var(--branco);border-radius:var(--raio-sm);padding:var(--sp-3)}
.mold-share .btn{width:100%;justify-content:center}
.mold-share-p{font-size:.84rem;color:var(--tinta-60);line-height:1.45}

/* ---- TUTORIAL do gerador de moldura ---------------------------------------
   Quatro peças de arte, lado a lado. A fileira é IRMÃ do `.mold`, não filha —
   então ela usa os 1200px do contêiner enquanto a ferramenta abaixo fica nos
   920px dela. Isso é de propósito: cada peça ganha ~277px em vez de ~215px, e a
   diferença decide se o texto DENTRO da arte é legível.

   Duas colunas no celular, e não quatro: quatro lado a lado num aparelho de
   390px dariam ~85px cada, com a chamada da arte em 3px. "Lado a lado" que não
   se lê não é lado a lado, é enfeite — e a ordem, que é a informação, o `<ol>`
   preserva em qualquer arranjo. */
.tut{list-style:none;margin:0 0 var(--sp-7);padding:0;
  display:grid;grid-template-columns:repeat(2,1fr);gap:var(--sp-3)}
@media(min-width:900px){.tut{grid-template-columns:repeat(4,1fr);gap:var(--sp-4)}}
.tut li{margin:0;position:relative}
/* A PÍLULA DA PEÇA — a mesma do carrossel do hero (.hero-pill), reduzida.
   Ela não repete a arte: a arte diz o que a tela mostra, a pílula diz o que
   FAZER. Fica sobre o rodapé da imagem, onde a arte é vazia, e vem da mesma
   família visual do resto do site (branco, cantos redondos, leve inclinação) —
   é isso que faz o tambor parecer um carrossel de fotos, e não um formulário. */
.tut-dica{position:absolute;z-index:3;left:50%;bottom:6%;
  transform:translateX(-50%) rotate(-2deg);
  max-width:86%;width:max-content;text-align:center;
  background:#fff;color:var(--petroleo-900);
  font-family:var(--font-titulo);font-weight:700;text-transform:uppercase;
  font-size:clamp(.6rem,2.5vw,.8rem);letter-spacing:.02em;line-height:1.15;
  padding:.42em .9em;border-radius:22px;
  box-shadow:0 8px 20px rgba(var(--tinta-rgb),.28)}
/* SEM fundo aqui. A arte é transparente de propósito, e pintar um fundo atrás
   dela anularia isso — foi assim que a primeira versão saiu com tarja preta: o
   PNG era RGBA, a conversão para WebP achatou o alfa contra preto, e o CSS
   ainda punha uma cor por baixo. As duas coisas foram desfeitas. */
.tut img{display:block;width:100%;height:auto;aspect-ratio:810/1012}
.tut[hidden]{display:none}

/* ---- VISOR DA CÂMERA (gerador de moldura) ---------------------------------
   O visor é QUADRADO porque a moldura é quadrada. Mostrar o 4:3 que a câmera
   entrega e recortar depois faria a pessoa enquadrar o rosto numa proporção e
   receber outra — o queixo que ela via cortaria fora. */
.mold-cam{display:flex;flex-direction:column;gap:var(--sp-3);align-items:center}
.mold-cam-palco{position:relative;width:100%;max-width:480px;aspect-ratio:1/1;
  overflow:hidden;border-radius:var(--raio-md);background:var(--tinta);
  box-shadow:var(--sombra-card)}
/* ESPELHADO: é assim que a pessoa se vê num espelho, e é o único jeito de ela
   conseguir se posicionar. A foto é salva espelhada também, senão o resultado
   não seria o que ela enquadrou. */
.mold-cam-palco video{width:100%;height:100%;object-fit:cover;display:block;
  transform:scaleX(-1)}
.mold-cam-acoes{display:flex;flex-wrap:wrap;gap:var(--sp-2);justify-content:center;width:100%;
  max-width:480px}
.mold-cam-acoes .btn{flex:1 1 160px;justify-content:center;min-height:48px}

/* ---- TUTORIAL EM TAMBOR (celular) -----------------------------------------
   No celular as quatro peças viram um carrossel: a do meio grande, as das
   bordas menores e giradas, como as faces de um tambor.

   QUEM ROLA É O NAVEGADOR. A tentação era animar `translateX` e reimplementar
   o arrasto; o `scroll-snap` já entrega inércia, atrito e aderência do
   sistema — de graça, iguais aos do aparelho, e acessíveis pelo teclado. O JS
   só LÊ a posição e distribui a perspectiva.

   `perspective` no trilho e `rotateY` em cada peça é o que faz o tambor: sem a
   perspectiva no pai, o giro sai achatado e vira só um encolhimento. */
@media(max-width:899px){
  .tut{display:flex;grid-template-columns:none;
    gap:0;overflow-x:auto;scroll-snap-type:x mandatory;
    perspective:900px;perspective-origin:50% 50%;
    /* A FOLGA DE CIMA E DE BAIXO NÃO É ESTÉTICA — É O QUE IMPEDE O CORTE.
       `overflow-x:auto` obriga o `overflow-y` a deixar de ser `visible` (a
       especificação não permite um eixo recortando e o outro não), então o
       navegador recorta em cima e embaixo também. Com a peça do centro
       ampliada, ela batia na borda: medido a 390px, 9,2px cortados de cada
       lado com escala 1,15. A folga tem de caber metade do crescimento —
       com 1,265 sobre uma peça de 282px de altura, são 37px a 390px e 92px a
       899px, ou ~11vw nos dois. */
    padding:11vw 0;margin-inline:calc(var(--sp-6) * -1);
    scrollbar-width:none;-webkit-overflow-scrolling:touch}
  .tut::-webkit-scrollbar{display:none}
  .tut li{position:relative;flex:0 0 62%;scroll-snap-align:center;
    padding-inline:var(--sp-2);
    transform-style:preserve-3d;
    /* o JS escreve --p (0 no centro, 1 na borda); tudo aqui é derivado dele,
       então uma variável só governa escala, giro e desbotamento */
    /* A peça do centro é 26,5% maior do que a fatia que ela ocupa: 1,15 no
       primeiro ajuste e mais 10% depois (1,15 x 1,10 = 1,265). Ela cresce por
       `scale`, que não mexe no layout, então AVANÇA por cima das vizinhas — que
       é o que um tambor faz. As bordas seguem em 0,78 (1,265 - 0,485), as
       mesmas de sempre: o contraste entre centro e borda aumenta sem a fileira
       inchar. O `z-index` derivado do mesmo --p garante que quem avança fique
       na frente; sem ele a ordem do DOM decide, e a peça 4 cobriria a 3. */
    z-index:calc(10 - var(--p, 0) * 10);
    transform:rotateY(calc(var(--p, 0) * -34deg)) scale(calc(1.265 - var(--p, 0) * .485));
    opacity:calc(1 - var(--p, 0) * .45);
    transition:transform .18s linear, opacity .18s linear}
  /* o primeiro e o último precisam alcançar o centro do trilho */
  .tut::before,.tut::after{content:"";flex:0 0 19%}

  .tut-n{position:absolute;top:var(--sp-2);left:calc(var(--sp-2) + var(--sp-2));
    z-index:2;width:30px;height:30px;display:grid;place-items:center;
    border-radius:50%;background:var(--petroleo-700);color:#fff;
    font-family:var(--font-titulo);font-weight:700;font-size:1rem;line-height:1;
    box-shadow:0 3px 10px rgba(0,0,0,.28)}
}
/* No desktop a fileira mostra as quatro de uma vez — carrossel ali seria
   esconder o que já cabe. O número some junto: a ordem da esquerda para a
   direita já a diz. */
@media(min-width:900px){ .tut-n{display:none} }

@media(prefers-reduced-motion:reduce){
  .tut li{transition:none}
}

/* ---- FOLHA DE ESCOLHA E AVISO DE TOPO (gerador de moldura) ----------------
   O aviso de topo existe porque o de baixo estava no lugar errado: ele mora
   dentro do editor, que só aparece DEPOIS que há foto — então todo erro de
   câmera era escrito num elemento escondido, e quem clicou via o nada. */
.mold-aviso-topo{margin-top:var(--sp-3);font-size:.9rem;line-height:1.45;
  color:var(--tinta-60);max-width:46ch}
.mold-aviso-topo.ruim{color:var(--tinta);font-weight:600;
  background:rgba(var(--petroleo-700-rgb),.08);border-radius:var(--raio-sm);
  padding:var(--sp-2) var(--sp-3)}

/* A folha sobe de baixo no celular e fica centrada no computador — é onde o
   polegar alcança num, e onde o olho está no outro. */
.mold-folha{position:fixed;inset:0;z-index:var(--z-toast);display:flex;
  align-items:flex-end;justify-content:center}
@media(min-width:700px){.mold-folha{align-items:center}}
.mold-folha-veu{position:absolute;inset:0;background:rgba(var(--petroleo-700-rgb),.5)}
.mold-folha-caixa{position:relative;width:min(460px,100%);
  display:flex;flex-direction:column;gap:var(--sp-4);
  background:var(--branco);padding:var(--sp-6) var(--sp-5) var(--sp-5);
  border-radius:var(--raio-md) var(--raio-md) 0 0;box-shadow:0 -10px 40px rgba(0,0,0,.3)}
@media(min-width:700px){.mold-folha-caixa{border-radius:var(--raio-md)}}
.mold-folha-t{font-family:var(--font-titulo);font-weight:700;font-size:1.14rem;
  color:var(--petroleo-800);text-align:center}
.mold-folha-ops{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--sp-3)}
.mold-op{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);
  padding:var(--sp-4) var(--sp-2);cursor:pointer;font:inherit;
  background:rgba(var(--petroleo-700-rgb),.06);color:var(--petroleo-800);
  border:1px solid rgba(var(--petroleo-700-rgb),.18);border-radius:var(--raio-sm);
  font-weight:650;font-size:.92rem;min-height:96px;transition:var(--t-rapida)}
.mold-op:hover,.mold-op:focus-visible{background:rgba(var(--petroleo-700-rgb),.13)}
.mold-op svg{width:28px;height:28px;fill:none;stroke:currentColor;stroke-width:1.8;
  stroke-linecap:round;stroke-linejoin:round}
/* com a opção de câmera fora, as duas restantes dividem a largura */

/* ============================================================
   CURTIDAS — o coração do site público (docs/40)
   ============================================================
   Este bloco é INERTE sem o `js/curtidas.js`: nenhuma classe daqui existe no
   HTML-fonte, todas nascem do módulo. E o módulo não é servido no site de
   edição (ver `curtirTag` no _middleware.js), então aqui o gabinete nunca vê
   coração nenhum — o que importa porque o Publicar fotografa a DOM.

   POR QUE PÍLULA BRANCA SOBRE A FOTO, e não um véu escuro: a `.hero-pill` já é
   o "chip sobre foto" desta base, e ela é branca. Repetir o mesmo tratamento
   resolve o contraste sem inventar um cinza translúcido — sobre branco, o
   traço do coração tem o contraste do texto do site, medido, e não um valor
   que depende da foto que estiver embaixo.

   A COR DE CURTIDO é `--realce-forte` e não `--realce`: o realce puro é âmbar
   para fundo escuro; sobre a pílula branca ele fica claro demais para um ícone
   preenchido, que a WCAG 1.4.11 cobra em 3:1 como qualquer objeto gráfico. */

/* ---- A ESCALADA DO FARDO ---------------------------------------------------
   `--curtir-n` (0 a 1) é escrito pelo js/curtidas.js a cada batida seguida no
   MESMO coração, e apagado quando o dedo para. Tudo o que cresce lê essa
   variável — tamanho, calor do fundo, pico do pulo e o rodapé.

   `--curtir-exagero` no `:root` é o botão de intensidade: 0 desliga a escalada
   inteira sem tirar nada do lugar, 1 é o padrão, 1.6 é festa. Um número.

   O CALOR VAI NO FUNDO, NUNCA NO ÍCONE, e isso é medido: o traço a 68% já dá
   4,13:1 na pior seção (âmbar, sobre a pílula branca); a 88% cai para 2,56:1,
   abaixo dos 3:1 de objeto gráfico. Já tingir o fundo em 20% deixa o ícone em
   3,59:1 no pior caso — e a mancha de cor cresce muito mais do que um traço de
   21px conseguiria crescer.

   POR QUE O FUNDO PASSA POR `--curtir-fundo`: cada variante tem a sua cor de
   repouso, e o `:hover` troca essa cor. Se o calor fosse um `background` numa
   regra própria, o `:hover` (mais específico) o apagaria — justamente enquanto
   o dedo está em cima, que é quando ele precisa aparecer. Assim o hover só
   muda a BASE, e uma regra só pinta o calor por cima. */
:root{--curtir-exagero:1}

.curtir{
  --curtir-n:0;
  --curtir-fundo:transparent;
  --curtir-cresce:.25;          /* quanto ESTA variante cresce no topo do fardo */
  --pico:calc(1.26 + .19 * var(--curtir-n) * var(--curtir-exagero));
  /* A COR DE CURTIDO É MEDIDA, não escolhida. O `--realce` puro dá 1,99:1 sobre
     branco e o `--realce-forte` dá 2,68:1 — os dois abaixo dos 3:1 que a WCAG
     1.4.11 cobra de objeto gráfico, e um coração cheio é exatamente isso. A
     68% do âmbar sobre preto dá 4,13:1 (rgb(168,114,14)), com folga.

     Fica AQUI e não no `:root` de propósito: é cor de um componente, não da
     rampa da marca — e assim o kit-visual não precisa acompanhar. Derivada do
     `--realce`, então uma troca de marca a carrega junto. */
  --curtido:color-mix(in srgb,var(--realce) 68%,#000);
  position:relative;display:inline-flex;align-items:center;gap:6px;
  padding:5px 9px;border:0;border-radius:var(--raio-pill);
  color:inherit;font:inherit;line-height:1;cursor:pointer;
  -webkit-tap-highlight-color:transparent;
  background:color-mix(in srgb,var(--realce) calc(20% * var(--curtir-n) * var(--curtir-exagero)),var(--curtir-fundo));
  /* o tamanho SUSTENTADO mora no botão e o PULO mora no ícone: dois transforms
     na mesma propriedade brigariam, e o fim da animação daria um salto */
  transform:scale(calc(1 + var(--curtir-cresce) * var(--curtir-n) * var(--curtir-exagero)));
  transition:background var(--t-media),color var(--t-media),opacity var(--t-media),
             transform .38s cubic-bezier(.34,1.3,.64,1);
}
/* alvo de toque de 44px sem engordar a pílula — a mesma solução do .stat-abrir */
.curtir::after{content:"";position:absolute;inset:-7px;border-radius:inherit}
.curtir-palco{position:relative;display:grid;place-items:center;width:22px;height:22px;flex:0 0 auto}
.curtir-ico{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;transition:fill var(--t-media)}
.curtir-n{font-family:var(--font-texto);font-weight:700;font-size:.8rem;font-variant-numeric:tabular-nums}
/* ---- O REPOUSO É UM CÍRCULO -----------------------------------------------
   Sem número e sem ponteiro em cima, o botão é só o coração num círculo: é a
   forma mais quieta possível, e a que não disputa atenção com o conteúdo do
   cartão. Ele CRESCE em três casos, e cada um é uma informação diferente:

     · tem número      -> vira pílula, porque o número é o assunto
     · ponteiro/foco   -> vira pílula e revela a palavra "Curtir"
     · já curtido      -> mantém o número, que agora conta você também

   A palavra some do repouso porque um coração já diz "curtir" — e reaparece no
   hover para quem precisa da confirmação antes de clicar. */
.curtir-rotulo{display:none;font-family:var(--font-texto);font-weight:650;font-size:.82rem;white-space:nowrap}
.curtir.sem-numero{width:34px;height:34px;padding:0;border-radius:50%;justify-content:center}
.curtir.sem-numero:hover,.curtir.sem-numero:focus-visible{
  width:auto;height:auto;padding:5px 11px;border-radius:var(--raio-pill)}
:is(.curtir--kpi,.curtir--post,.curtir--revista,.curtir--passo,.curtir--secao):is(:hover,:focus-visible) .curtir-rotulo{display:inline}
.curtir.sem-numero .curtir-n{display:none}
.curtir.curtiu{color:var(--curtido)}
.curtir.curtiu .curtir-ico{fill:currentColor}

/* ---- A FAGULHA ------------------------------------------------------------
   Três coisas ao mesmo tempo: o coração dá um pulo com mola, um anel se abre e
   some, e um "+1" sobe. O anel e o "+1" são elementos criados a cada batida e
   removidos no `animationend` — reaproveitar um só faria a segunda batida não
   animar, porque a animação já estaria correndo.

   Movimento reduzido: o bloco de `prefers-reduced-motion` lá em cima já mata
   toda `animation` do site, e o módulo nem cria o anel e o "+1". Sobra o
   preenchimento, que é a informação. */
/* Um keyframe só para os dez degraus: `var()` dentro de keyframe resolve POR
   ELEMENTO e reage à troca da variável — conferido no navegador (com
   `--pico:1.9` o transform chegou a 1,850; trocando para 1.15, a 1,142). */
@keyframes curtir-pulo{
  0%{transform:scale(1)} 22%{transform:scale(.8)} 52%{transform:scale(var(--pico,1.26))}
  78%{transform:scale(.95)} 100%{transform:scale(1)}
}
.curtir.pulou .curtir-ico,.curtir-total.pulou .curtir-ico{animation:curtir-pulo .46s cubic-bezier(.34,1.56,.64,1)}
/* o número entra por baixo a cada batida: sem isto ele TROCA de texto, e uma
   troca instantânea não se percebe no meio de uma sequência rápida */
@keyframes curtir-sobe{from{transform:translateY(7px);opacity:.2}to{transform:none;opacity:1}}
.curtir.pulou .curtir-n{animation:curtir-sobe .3s ease-out}
@keyframes curtir-anel{from{transform:scale(.35);opacity:.7} to{transform:scale(2.4);opacity:0}}
.curtir-anel{position:absolute;inset:0;border-radius:50%;border:2px solid var(--curtido);
  pointer-events:none;animation:curtir-anel .55s ease-out forwards}
/* O LEQUE. `rotate` ANTES do `translateY` é o que joga o "+1" em ângulo: gira o
   eixo e só então anda por ele. Com `--ang:0deg` sai reto, que é o comportamento
   dos três primeiros toques. */
@keyframes curtir-mais{
  0%{transform:translate(-50%,0) rotate(var(--ang,0deg)) translateY(4px) scale(.7);opacity:0}
  25%{opacity:1}
  100%{transform:translate(-50%,0) rotate(var(--ang,0deg)) translateY(-28px) scale(1.05);opacity:0}
}
.curtir-mais{position:absolute;left:50%;top:0;
  font-family:var(--font-texto);font-weight:800;font-size:.78rem;white-space:nowrap;
  color:var(--curtido);pointer-events:none;
  animation:curtir-mais .75s ease-out forwards}

/* ---- SOBRE FOTO: a pílula branca, no canto oposto ao da .hero-pill ---------
   A pílula do carrossel mora embaixo à direita; o coração vai em cima à
   direita, então nunca disputam o mesmo canto. */
.curtir--foto{position:absolute;z-index:4;top:10px;right:10px;
  --curtir-fundo:#fff;color:var(--petroleo-900);box-shadow:0 6px 18px rgba(var(--tinta-rgb),.28)}
/* o realce do hover é SOMBRA e não `transform`: o transform aqui é do tamanho
   sustentado, e um `translateY` o apagaria no meio da escalada */
.curtir--foto:hover,.curtir--foto:focus-visible{box-shadow:0 9px 24px rgba(var(--tinta-rgb),.4)}
@media(max-width:560px){.curtir--foto{top:8px;right:8px}}

/* ---- A DAYSE RECORTADA DO RODAPÉ ------------------------------------------
   O botão NÃO entra na <img>: ela é `pointer-events:none` e o modo edição a
   arrasta pelo `--dayse-x`. Ele entra na seção e lê o MESMO `--dayse-x`, então
   acompanha a foto de graça, sem uma linha de JavaScript de posicionamento. */
.curtir--recorte{position:absolute;z-index:3;bottom:14px;right:calc(var(--dayse-x,0px) + 14px);
  --curtir-fundo:#fff;color:var(--petroleo-900);box-shadow:0 6px 18px rgba(var(--tinta-rgb),.28)}
@media(max-width:720px){.curtir--recorte{right:var(--sp-4);bottom:10px}}

/* ---- KPI: no fluxo, embaixo à esquerda ------------------------------------
   EM FLUXO e não flutuando: o `.stat-abrir` já ocupa o canto de baixo à
   direita em posição absoluta, e um segundo botão absoluto no mesmo cartão
   cairia por cima do rótulo nos cartões de rótulo longo. No fluxo o cartão
   cresce ~30px e nada se sobrepõe — em troca de altura, previsibilidade.

   Apagado até alguém curtir: são 37 cartões numa tela só, e 37 corações em cor
   cheia competiriam com os números, que são o assunto da seção. */
/* ---- KPI: UM POR BLOCO, na linha de baixo da grade -------------------------
   Um coração por CARTÃO foi medido e recusado: no fluxo a grade da Saúde ia de
   461px para 653px a 1440 (+41,6%) e de 1051px para 1484px a 390 (+433px); em
   posição absoluta a altura ficava, mas o coração cobria até 51px de texto do
   rótulo em 9 dos 44 cartões a 390px.

   Aqui o botão é uma CÉLULA da própria grade ocupando a linha inteira, à
   direita. Custa uma linha por bloco (7 no site) e nenhuma sobreposição.

   OPACIDADE 0,7, e o número é medido contra o `--papel` (#faf7f2), que é o fundo
   REAL do cartão — não o branco que se supõe. A 0,45 o traço dava 2,39:1, abaixo
   dos 3:1 que a WCAG 1.4.11 cobra de objeto gráfico; a 0,7 dá 4,40:1. */
/* CRESCE PARA DENTRO, e isto é medido: ancorado à direita da grade, o botão a
   1,25× vazava 11px por fora dela nos 7 blocos, e a 390px encostava no chevron
   de um cartão. Com a origem no canto de cima à direita ele cresce para a
   ESQUERDA (linha vazia da grade) e para BAIXO (o vão que vem depois),
   e a borda direita não anda. */
/* CRESCE MENOS QUE OS OUTROS: 12% no lugar de 25%. Não é timidez, é medida — a
   grade é apertada e a 390px o botão a 1,25× cobria o rótulo de um cartão
   ("documentos enviados so…"). Cobrir texto para comemorar um clique é trocar
   conteúdo por confete. A 1,12× não cobre nada, nas duas larguras. */
.curtir--kpi{grid-column:1/-1;justify-self:end;transform-origin:right top;--curtir-cresce:.12;
  margin-top:var(--sp-3);padding:6px 10px;color:var(--petroleo-800);opacity:.7}
.curtir--kpi:hover,.curtir--kpi:focus-visible,.curtir--kpi.curtiu{opacity:1}
.curtir--kpi:hover{--curtir-fundo:rgba(var(--petroleo-700-rgb),.08)}

/* ---- POST: mais um chip na barra de compartilhar --------------------------- */
/* A ESPECIFICIDADE PRECISA SER DE DOIS, e isto custou uma medição: a barra de
   compartilhar pinta os próprios chips de branco com
   `.post-share-bar a,.post-share-bar button{color:#fff}` — (0,1,1). Um
   `.curtir--post` sozinho é (0,1,0) e PERDE: o botão saía branco sobre um fundo
   de 8% de tinta, ou seja, invisível. Medido: `color` computado `#ffffff` sobre
   `rgba(4,90,114,.08)`. Com o ancestral no seletor vira (0,2,0) e ganha. */
/* mesma razão do KPI: ele é o último da fileira (`margin-left:auto`), então
   crescer do centro o jogava 14px para fora da barra */
.post-share-bar .curtir--post{--curtir-fundo:rgba(var(--petroleo-700-rgb),.08);color:var(--petroleo-800);
  transform-origin:right center;padding:8px 14px;margin-left:auto}
.curtir--post{padding:8px 14px}
.curtir--post .curtir-ico{width:18px;height:18px}
.post-share-bar .curtir--post:hover,.post-share-bar .curtir--post:focus-visible{--curtir-fundo:rgba(var(--petroleo-700-rgb),.16)}
.post-share-bar .curtir--post.curtiu{--curtir-fundo:color-mix(in srgb,var(--realce) 16%,#fff);color:var(--curtido)}
@media(max-width:560px){.curtir--post{margin-left:0}}

/* ---- O TOTAL DO SITE, no rodapé -------------------------------------------
   Não é botão: é o placar. Some da soma do que o contador já devolveu — a
   resposta do `/api/curtidas` traz o site inteiro, então o total não custa
   consulta nenhuma.

   `[hidden]` PRECISA VENCER O `display`, e esta linha não é zelo: o
   `display:none` do atributo vem da folha do NAVEGADOR e qualquer `display` de
   autor o atropela. É o mesmo defeito que o `.kpi-modal` já pagou em 17/08 —
   ali o modal fechado seguia por cima da página, interceptando todo clique.

   O RÓTULO herda a família do rodapé: o mesmo `rgba(255,255,255,.7)` da
   `.footer-meta` — 7,17:1 sobre o fundo do rodapé em produção.

   O NÚMERO **não** usa o `--realce-claro`, e a razão é medida. O `--realce`
   muda por seção (a marca veste a seção, docs/37) e no rodapé ele assume a cor
   da última — que na paleta PUBLICADA hoje é o roxo `#4B2D70`. Ali o
   `--realce-claro` (69% + branco) rende `#836e9c`, que dá **2,90:1** sobre o
   `#023643` do rodapé: abaixo dos 4,5:1 de texto. (É a mesma cor do 40222 logo
   acima; este bloco não mexe nele, só não repete o problema.)

   Uma mistura de **45%** com branco resolve para qualquer cor de seção, e isso
   foi medido nas três que existem: roxo 5,33:1 · turquesa 6,81:1 · âmbar
   9,54:1. O pior caso manda. */
.curtir-total[hidden]{display:none}
.curtir-total{--curtir-n:0;--pico:calc(1.26 + .34 * var(--curtir-n) * var(--curtir-exagero));
  --curtir-total-cor:color-mix(in srgb,var(--realce) 45%,#fff);
  display:inline-flex;align-items:center;gap:7px;margin:0;
  font-family:var(--font-texto);font-size:.85rem;color:rgba(255,255,255,.7)}
.curtir-total-palco{width:17px;height:17px}
.curtir-total-ico{width:17px;height:17px;fill:var(--curtir-total-cor);stroke:none}
.curtir-total-n{font-weight:700;color:var(--curtir-total-cor);font-variant-numeric:tabular-nums}

/* ---- CAPA DE SEÇÃO: ao lado do nome da frente ------------------------------
   Pílula branca, como sobre as fotos — e pela mesma razão: a capa é uma foto
   escura com texto claro por cima, e a pílula branca resolve o contraste sem
   depender de qual foto está atrás.

   `vertical-align` porque ele entra como irmão INLINE do chip do eixo, que é
   `inline-flex`: sem isso os dois sentam em linhas de base diferentes e o
   coração desce alguns pixels. A margem de baixo copia a do chip para os dois
   ocuparem a mesma faixa. */
/* OS DOIS PRECISAM DO MESMO `vertical-align`, e isso foi medido: com o chip no
   `baseline` padrão e o botão em `middle`, o coração sentava 6,4px ACIMA do
   centro do chip — igual nas cinco capas e nas duas larguras, porque é
   geometria de linha, não acaso. Alinhando os dois pelo meio o desvio zera.
   Achado por tentativa MEDIDA, e o resultado é exato:
     chip baseline + botão middle, margem 16       ->  -6,4px
     ambos middle, sem margem                      ->  +8,0px
     ambos middle, margem 8                        ->  +4,0px
     ambos middle, margem 16 (= o --sp-4 do chip)  ->   0,0px  ✓
   A margem tem de bater com a do chip: é ela que define onde a caixa do vizinho
   se apoia na linha. */
.divisor[data-curtir] .divisor-eixo{vertical-align:middle}
.curtir--secao{--curtir-fundo:#fff;color:var(--petroleo-900);
  box-shadow:0 6px 18px rgba(var(--tinta-rgb),.3)}
/* o alinhamento de linha só vale na CAPA DE SEÇÃO, onde ele é irmão inline do
   chip; na fileira de ações da /apoiar ele é um botão entre botões */
.divisor .curtir--secao{vertical-align:middle;margin-left:var(--sp-2);margin-bottom:var(--sp-4)}
.cta-actions .curtir--secao:not(.sem-numero){padding:8px 15px}
.curtir--secao:hover,.curtir--secao:focus-visible{box-shadow:0 9px 24px rgba(var(--tinta-rgb),.42)}

/* ---- CHIP DO "COMO APOIAR?": fecha o corpo do passo ------------------------ */
/* NO CANTO INFERIOR DIREITO do chip. O `.step` já é `position:relative`, e o
   ancestral posicionado é ele — então o botão se prende ao CARTÃO, e não ao
   corpo do texto, que é o que faz o canto ser o canto do chip mesmo quando o
   cartão estica para acompanhar o vizinho de linha. */
.step-body .curtir--passo{--curtir-fundo:color-mix(in srgb,var(--e,var(--petroleo-700)) 10%,var(--branco));
  color:var(--e-ink,var(--petroleo-800));padding:7px 12px;
  position:absolute;right:var(--sp-5);bottom:var(--sp-5);transform-origin:right bottom}
.step-body .curtir--passo:hover,.step-body .curtir--passo:focus-visible{
  --curtir-fundo:color-mix(in srgb,var(--e,var(--petroleo-700)) 20%,var(--branco))}
.curtir--passo .curtir-ico{width:18px;height:18px}

/* ---- REVISTA: o coração na fileira de ações --------------------------------
   O cartão da revista NÃO é um link inteiro como o do blog, então aqui cabe um
   <button> de verdade, ao lado de Folhear, Baixar e Compartilhar. */
.rev-card-acoes .curtir--revista{--curtir-fundo:rgba(var(--petroleo-700-rgb),.08);
  color:var(--petroleo-800);padding:8px 13px}
.rev-card-acoes .curtir--revista:hover,.rev-card-acoes .curtir--revista:focus-visible{
  --curtir-fundo:rgba(var(--petroleo-700-rgb),.16)}
.rev-card-acoes .curtir--revista.curtiu{--curtir-fundo:color-mix(in srgb,var(--realce) 16%,#fff);color:var(--curtido)}
.curtir--revista .curtir-ico{width:18px;height:18px}

/* ---- SELO DO CARTÃO DO BLOG: número, sem botão ----------------------------
   O cartão inteiro é um <a>: um <button> dentro dele seria HTML inválido e um
   convite a curtir em série sem ler. Aqui o número é prova social e nada mais —
   quem curte é a página do post. */
.curtir-selo{display:inline-flex;align-items:center;gap:4px;
  color:var(--tinta-60);font-size:.78rem;font-weight:700;font-variant-numeric:tabular-nums}
.curtir-selo svg{width:14px;height:14px;fill:currentColor;stroke:none}
