/* ============================================================
   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;
  /* O VERDE DAS AÇÕES não é o `--c-whatsapp` puro: aquele é claro demais para
     ícone branco em cima (medido no Chrome — ver docs/54 §7.16). Escurecido com
     o petróleo da casa, ele passa a régua e continua sendo verde de verdade.
     Nome honesto: é o verde DE AÇÃO, não "o verde do zap" (CLAUDE.md §3). */
  --verde-acao:color-mix(in srgb,var(--c-whatsapp) 62%,var(--petroleo-900)); --c-facebook:#1877F2; --c-x:#111;
  /* A URNA ELETRÔNICA do simulador da /colinha (docs/98). Também não é paleta
     nossa: é a cor do objeto que o simulador imita, e quem treinou nele tem de
     reconhecer as teclas na cabine. Hex de propósito: o canvas da arte lê
     `--urna-branco*` e `--urna-tinta`, e o canvas não entende color-mix(). */
  --urna-corpo:#2A2A28; --urna-teclado:#1B1B1A; --urna-tecla:#0E0E0E; --urna-tecla-tx:#F5F5F5;
  --urna-visor:#EFEFEA; --urna-tinta:#111111; --urna-foto:#D9D9D3; --urna-selo:#8F8F8A;
  --urna-branco:#F7F7F2; --urna-branco-borda:#C9C9C3; --urna-corrige:#E8712A; --urna-confirma:#23A04E;

  /* ============ 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,.lk-wrap::before,.faixa-par--escura::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)}
/* a faixa partida escura da /legado segue o CTA, e não os divisores: ela é um
   bloco de fecho de assunto, com o mesmo degradê radial do `.cta` por fundo. */
.faixa-par--escura{--az-img:var(--az-src-bg);--az-blend:var(--az-cta-blend);--az-op:var(--az-cta-op);--az-rows:var(--az-cta-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,.nav-drop,.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-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,.nav-drop{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)}
/* O GATILHO GENÉRICO da barra do post (11/09/2026) — um degrau mais escuro que
   o "copiar", que é o vizinho mais parecido: os outros três vestem a cor da
   rede de destino, e este não tem destino, tem MENU. O petróleo-800 dá 10,48:1
   com o branco do texto. */
.post-share-bar .psb-share{background:var(--petroleo-800)}
.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{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,
.dayse-mview-btn,.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.

   PROPOSTAS, 28/09/2026 (docs/96): o sétimo item do primeiro nível. Medido
   pela borda direita do último item contra a borda do nav (o `scrollWidth`
   aqui MENTE: o submenu escondido de Mídias entra na conta e dá ~116px de
   transbordo em qualquer gap). Transbordo com o item novo, sem → com:
     gap 12/10 (o de antes) → 1440:22  1366:22  1180:13  1100:41
     gap  8/10              → 1440: 8  1366: 8  1180: 0  1100:33
     gap  4/2 + .86rem<1180 → zero nas seis larguras (1920 → 1100)
   O gap parece pouco, mas o espaço VISÍVEL entre os itens é ele MAIS os 24px
   do ladrilho, que ficam reservados mesmo invisíveis (ver .nav-ico). */
.nav-desktop{display:none;margin-left:auto;gap:var(--sp-1)}
/* `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,.nav-drop{font-weight:500;letter-spacing:.04em;font-size:.98rem;color:var(--tinta);padding:var(--sp-1);position:relative;white-space:nowrap;
  /* inline-flex desde 04/09/2026: o item passou a ter DUAS coisas dentro, o
     ladrilho do tema e o rótulo. Sem isto o <svg> vira caixa em linha e senta
     na linha de base do texto, ~3px abaixo do centro óptico. */
  display:inline-flex;align-items:center;gap:6px}
/* EDITORIAL — o parente do submenu. É <button> porque não navega: abre uma
   lista, e um <a> sem href não recebe foco (sem foco, o :focus-within que abre
   o submenu nunca dispara no teclado).

   ISTO É A ÚNICA DECLARAÇÃO QUE ELE CUSTOU: o cinza que o navegador põe em
   <button>. Tipografia, tamanho, cor e o traço do hover vêm das MESMAS regras
   do item de menu (acima e abaixo), e `border:0;cursor:pointer` vem da regra
   "o clicável sem borda" lá em cima, onde já moram .btn e .menu-toggle. */
.nav-drop{background:none}
/* O LADRILHO DO COBOGÓ NO MENU (04/09/2026) --------------------------------
   Cada item do primeiro nível carrega o azulejo do seu tema — o mesmo desenho
   da faixa do topo, e não um ícone de traço: são a MESMA peça da marca, e as
   cores saem dos --az-cor-c* que o gabinete publica (ver navIco no middleware).

   ELE APARECE NO HOVER E NO ITEM SELECIONADO, e o espaço fica RESERVADO desde
   sempre — é `opacity`, nunca `display` nem `width`. Um ladrilho que entrasse
   no layout ao passar o mouse empurraria os cinco vizinhos para o lado, e o
   menu inteiro tremeria a cada movimento do cursor.

   CABE, e isso foi MEDIDO antes de escrever, porque o comentário do
   `.nav-desktop` aqui em cima registra que o menu já quebrou com sete itens:
   a 1100px (a largura mais apertada em que o menu ainda existe — abaixo disso
   é hambúrguer) sobravam 326px de folga, e os seis ladrilhos custam ~150px. */
.nav-ico{flex:none;opacity:0;transition:opacity .16s ease;
  /* A TINTA DO LADRILHO É A COR DE DESTAQUE DA SEÇÃO (04/09/2026), a mesma que
     veste a assinatura: `--sec-acento`, que o azPintarSecao escreve no <html>
     enquanto uma seção domina a tela e REMOVE quando nenhuma domina — daí o
     fallback ser o turquesa da marca, e não uma cor de emergência.

     É o token certo e não um atalho: o comentário dele no main.js registra que
     o acento NÃO é a cor cheia da seção, e sim ela puxada 40% na direção da
     própria tinta, porque a cor cheia somia sobre branco (o amarelo do Guará
     dava 1,61:1; o acento sobe o pior caso a 2,51:1). Desenho fino sobre papel
     branco é exatamente o caso destes ícones.

     AQUI a tinta é o c1: é assim que nascem o lobinho (figura c1 sobre fundo
     c3) e o az-3 do Mídias. Os quatro que nascem com o quadrado cheio invertem
     isso logo abaixo, no --figura. */
  --az-cor-c1:var(--sec-acento,var(--turquesa-500));
  --az-cor-c3:var(--branco)}
/* FIGURA AZUL CLARA SOBRE BRANCO — o mesmo desenho do logo (04/09/2026).
   Quatro ladrilhos nascem com o quadrado cheio de cor, porque foram feitos para
   a FAIXA, onde eles se encostam. Soltos no menu branco isso vira o contrário do
   que se quer. A troca é só de token: quem era fundo fica branco, quem era
   figura fica azul claro. O DESENHO não se toca — é o mesmo <symbol> da faixa,
   e continua sendo, o que importa no dia em que alguém trocar um ladrilho.
   Quais entram aqui é decisão do NAV_FIGURA, no _middleware.js. */
.nav-ico--figura{--az-cor-c1:var(--branco);--az-cor-c2:var(--branco);
  --az-cor-c3:var(--sec-acento,var(--turquesa-500))}
.nav-desktop a:hover .nav-ico,.nav-desktop a.active .nav-ico,
.nav-desktop a:focus-visible .nav-ico,
.nav-drop:hover .nav-ico,.nav-drop.active .nav-ico,
.nav-drop:focus-visible .nav-ico,
.nav-item:hover .nav-drop .nav-ico,.nav-item:focus-within .nav-drop .nav-ico{opacity:1}
@media (prefers-reduced-motion:reduce){ .nav-ico{transition:none} }

/* 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:2px} .nav-desktop a,.nav-drop{font-size:.86rem} }
/* A LINHA DO ITEM ATIVO TAMBÉM SEGUE A SEÇÃO (04/09/2026) — mas pela TINTA, e
   não pelo acento dos ladrilhos, e a diferença é medida.

   A linha não é enfeite: é ela que responde "em que parte do site eu estou".
   Medido contra o branco do menu, com os quatro presets de seção:

                     acento   tinta
       topo (marca)    2,43    7,75
       Saúde           3,19    4,98
       Guará           2,50    5,57
       Concurso        2,67    4,37
       Frentes         9,30    9,30

   O acento casaria exatamente com a cor do ladrilho ao lado, e foi por isso que
   ele foi tentado primeiro — mas derruba o indicador para 2,43 numa barra de
   3px, e um indicador que só se vê procurando deixou de indicar. A `--sec-tinta`
   é a MESMA lógica (é o token que veste a camada principal da assinatura, ao
   lado do acento que veste o realce dela), acompanha a seção igual, e não desce
   de 4,37. E o fallback dela é o petróleo que a linha já tinha: fora de seção
   nada muda de aparência.

   O RÓTULO ATIVO fica no `--petroleo-800` de propósito. Ele é texto de 15,7px em
   peso 500, então precisa de 4,5:1 — e a tinta do Concurso dá 4,37, logo abaixo.
   Cor de texto e cor de barra têm réguas diferentes; misturar as duas aqui
   trocaria um item legível por um item bonito. */
.nav-desktop a::after,.nav-drop::after{
  content:"";position:absolute;left:0;right:100%;bottom:-2px;height:3px;border-radius:3px;
  background:var(--sec-tinta,var(--petroleo-700));transition:right .25s,background-color var(--t-media);
}
.nav-desktop a:hover::after,.nav-desktop a.active::after,
.nav-drop:hover::after,.nav-drop.active::after,.nav-item:focus-within .nav-drop::after{right:0}
.nav-desktop a.active,.nav-drop.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)}

/* O MENU DO CELULAR PRECISA ROLAR SOZINHO (04/09/2026).
   Quando o docs/16 o auditou ele ocupava 730px de 844 e cabia inteiro — por isso
   nasceu sem rolagem. Depois entraram Projetos, Fotos e agora Links, e ele foi a
   886px. O que passa da dobra fica INALCANÇÁVEL, e não é falta de rolagem da
   página: o `.site-header` é `sticky`, então o menu gruda no topo e rolar não o
   move. Medido no ar em 04/09/2026, 390x844, com o menu aberto: scrollY 0, 150 e
   300 e o "Apoie" parado em 923px, fora da janela de 844 nas três — ou seja, o
   botão já estava perdido ANTES do item novo.
   `dvh` e não `vh` porque no celular a barra de endereço tira altura visível e o
   `vh` continua contando a tela cheia; a linha de `vh` acima é o degrau para quem
   não tem `dvh`. `overscroll-behavior:contain` impede que o fim da lista puxe a
   página atrás junto. */
.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;
  max-height:calc(100vh - var(--header-h) - var(--azulejo-h));
  max-height:calc(100dvh - var(--header-h) - var(--azulejo-h));
  overflow-y:auto;overscroll-behavior:contain;
}
.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)}
/* NO CELULAR O LADRILHO APARECE SEMPRE. Em tela de toque não existe hover, e
   esconder o desenho atrás dele seria escondê-lo para sempre de quem entra pelo
   telefone — que aqui é a maioria. O item vira flex pelo mesmo motivo do
   desktop: são duas coisas dentro de um link só. */
.mm-link,.mobile-menu .mm-rotulo{display:flex;align-items:center;gap:10px}
.mm-link .nav-ico,.mobile-menu .mm-rotulo .nav-ico{opacity:1;width:22px;height:22px}

/* ============================================================
   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);
  /* a POOL de ladrilhos troca por seção (docs/49 F2): o redesenho pisca sem um
     respiro — 160ms de opacidade, aplicados pelo .az-trocando do main.js */
  transition:opacity .16s ease;
}
.azulejos.az-trocando{opacity:0}
@media (prefers-reduced-motion: reduce){
  .azulejos{transition:none}
}
/* +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));
  /* flex desde 11/09/2026: o item passou a ter duas coisas dentro, o ícone e o
     rótulo. Sem isto o <svg> vira caixa em linha e senta na linha de base do
     texto, alguns pixels abaixo do centro óptico. */
  display:flex;align-items:center;gap:8px;
}
.subnav a::after{display:none}
.subnav a:hover{background:var(--petroleo-100)}
/* O ÍCONE DO ITEM DO SUBMENU (11/09/2026) -----------------------------------
   ELE FICA VISÍVEL SEMPRE, e o que o hover muda é o TAMANHO. Nasceu ao
   contrário — invisível, acendendo no hover — e o dono reprovou no mesmo dia:
   com a lista já aberta, o item que não estava sob o cursor não mostrava nada,
   e um vão de 41px antes do rótulo não é um ícone, é um buraco. O desenho passa
   a ser parte do item; o hover passa a ser ênfase, não revelação.

   E CRESCE POR `transform`, NUNCA por `width`. A caixa mede 20px em todos os
   estados e o desenho ocupa 80% dela em repouso — `scale` é pintura, não
   layout, então o rótulo não anda um pixel quando o ícone engorda. Trocar o
   `width` faria as quatro linhas dançarem sob o cursor a cada movimento, que é
   a mesma razão medida do `.nav-ico` um andar acima.

   A TINTA É O `--e-ink`, e não o `--e` da barrinha: a barra é área chapada de
   5px, o ícone é traço de 2px sobre branco, e nessa espessura o tom cheio some.
   Medido contra o branco do submenu, em 11/09/2026: lavanda do Melhor Idade
   4,44:1 contra 7,67:1 do -ink; magenta do Mulheres 4,38:1 contra 6,80:1;
   violeta do Esporte 5,50:1 contra 8,36:1. O índigo do Educação já nasce escuro
   (9,92:1) e o -ink dele é o próprio valor — a linha existe para que ele não
   seja a exceção que alguém precisa lembrar. Mesma família da barra, legível
   no fino.

   O ESTADO ATIVO SAI DO `aria-current`, não de `.active`: são a mesma verdade e
   o atributo é o que sobrevive: até hoje os quatro filhos do Mídias nasciam com
   DOIS atributos `class` e o parser descartava o segundo (ver o comentário do
   `atv` no _middleware.js). Amarrar o ícone ao atributo tira a chance de o
   defeito voltar pela mesma porta. */
.sn-ico{flex:none;width:20px;height:20px;color:var(--e-ink,var(--petroleo-800));
  transform:scale(.8);transition:transform .16s ease}
.subnav a:hover .sn-ico,.subnav a:focus-visible .sn-ico,
.subnav a[aria-current] .sn-ico{transform:scale(1)}
@media (prefers-reduced-motion:reduce){ .sn-ico{transition:none} }
.sn-idade{--e:var(--th-idade);--e-ink:var(--th-idade-ink)}
.sn-esporte{--e:var(--th-esporte);--e-ink:var(--th-esporte-ink)}
.sn-mulheres{--e:var(--th-mulheres);--e-ink:var(--th-mulheres-ink)}
.sn-educacao{--e:var(--th-educacao);--e-ink:var(--th-educacao-ink)}
/* Os filhos do Mídias NÃO ganham cor de eixo, de propósito: Blog, Projetos,
   Revistas e Fotos não são frentes de atuação, e pintá-los com a cor de uma
   diria algo que não é verdade. Ficam no traço neutro.
   (Chamava-se `.sn-editorial` até 04/09/2026, quando o rótulo virou "Mídias".
   Classe que não acompanha o rótulo é a próxima pessoa procurando e não achando.) */
.sn-midias{--e:var(--petroleo-700);--e-ink:var(--petroleo-800)}

/* 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);
  /* flex AQUI, e não só na régua de 44px lá embaixo (11/09/2026): aquela regra
     mora num `@media(max-width:640px)`, e o menu do celular vive até 1023px.
     Entre 640 e 1024 o <a> não era flex, e o ícone sentava na linha de base do
     texto — a faixa do tablet é justamente onde ninguém olha. */
  display:flex;align-items:center;gap:10px}
/* O ÍCONE DO SUBMENU NO CELULAR APARECE SEMPRE (11/09/2026) — é a mesma razão
   do ladrilho do `.mm-link` logo acima: em tela de toque não existe hover, e
   pendurar o desenho nele seria escondê-lo para sempre de quem entra pelo
   telefone, que aqui é a maioria. Por isso nada de `opacity:0` neste lado.

   18px, e o número sai de proporção, não de gosto: o primeiro nível é rótulo de
   1,25rem com ladrilho de 22px, e aqui o rótulo é 1rem — 16/20 × 22 = 17,6. */
.mm-sub .sn-ico{width:18px;height:18px;transform:none}

/* ============================================================
   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: classe .has-foto no .divisor e um <img class="divisor-img">
   dentro do .divisor-media — ver o passo-a-passo no comentário do index.html. */
.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)}
/* A FOTO DO DIVISOR É UM <img>, e não `background-image` (docs/57, Achado 1).
   Medido em 26/08/2026: como background, os cinco divisores da home pesavam
   ~876 KB e chegavam SEMPRE — `loading=lazy` não alcança background-image —, e
   sem `srcset` o celular recebia o arquivo pensado para desktop (até 4,9x maior
   que o exibido). Com `<img>`: 209 KB no celular, e a maioria nem chega antes
   de a seção ser rolada.
   O `object-position:center top` reproduz o `center top` que o background usava:
   as fotos têm gente na parte de cima, e cortar por baixo é o corte certo. */
.divisor.has-foto .divisor-img{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;object-position:center top;display:block}
/* 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") */
/* O legislativo tem enquadramento proprio: a foto e alta e o assunto esta a 22%
   da altura. Era `background-position`, e virou `object-position` pela mesma
   razao do bloco do desktop (docs/57).
   O `!important` NAO E PREGUICA: a regra do desktop (`.divisor.has-foto
   .divisor-img`) tem especificidade maior que esta, e sem ele o enquadramento
   volta ao centro a partir de 768px. O original ja tinha `!important` pelo
   mesmo motivo -- eu o tirei na conversao e a medicao pegou. */
.dv-legislativo .divisor-img{object-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)}
/* O `--e-ink` acompanha o `--e` desde 11/09/2026, por causa do ícone do submenu
   do celular, que é traço fino sobre branco e some no tom cheio. Não muda nada
   na home: os quatro elementos que usam estas classes são os mesmos que já
   recebem o -ink pelo #id, com valor idêntico e especificidade maior. */
.se-idade{--e:var(--th-idade);--e-ink:var(--th-idade-ink)}
.se-esporte{--e:var(--th-esporte);--e-ink:var(--th-esporte-ink)}
.se-mulheres{--e:var(--th-mulheres);--e-ink:var(--th-mulheres-ink)}
.se-educacao{--e:var(--th-educacao);--e-ink:var(--th-educacao-ink)}

/* ============================================================
   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, E A JANELA GENÉRICA QUE SAIU DELE ----------------------
   ERA SÓ DO KPI ATÉ 23/09/2026, e o comentário abaixo dizia isso com todas as
   letras. A busca por rosto precisou de uma janela (o consentimento e a escolha
   de rosto, docs/87), e havia três saídas: duplicar estas regras com outro
   nome, usar as classes `kpi-*` para uma coisa que não é KPI, ou generalizar.

   GENERALIZAR FOI O CAMINHO, e custou oito seletores ganharem um irmão
   `.janela*` — ZERO declaração nova. Usar `.kpi-caixa` num consentimento faria
   o nome mentir, que é a regra 3 do CLAUDE.md aplicada a classe em vez de cor;
   duplicar criaria dois modais que divergem no primeiro conserto.

   O QUE CONTINUA SÓ DO KPI: o `.por-hover` (janela que abre sem clique) e o
   `.kpi-num` (o número grande na cor do eixo). Esses são daquele cartão mesmo.
   ------------------------------------------------------------------------- */
   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],.janela[hidden]{display:none}
.kpi-modal,.janela{position:fixed;inset:0;z-index:var(--z-toast);display:grid;place-items:center;padding:var(--sp-4)}
.kpi-veu,.janela-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,.janela-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,.janela-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,.janela-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,.janela-x:hover,.janela-x:focus-visible{background:rgba(var(--petroleo-700-rgb),.18)}
.kpi-x svg,.janela-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)}

/* ---- AVISO DE COTA (15/09/2026, docs/78 §14) -------------------------------
   No ALTO À ESQUERDA, abaixo do cabeçalho: embaixo mora o aviso de rascunho, no
   canto de baixo o WhatsApp, e no alto à direita o dock da engrenagem. Cartão, e
   não faixa: ele lista as cotas que passaram do degrau, e uma faixa esconderia o
   topo da página que se está editando.
   A COR É DO DEGRAU (50% atenção, 70% alta, 90% quase no fim) e vai na borda, no
   selo da porcentagem e na barra; o texto fica sempre em tinta de texto. */
.dayse-cota{
  position:fixed;z-index:var(--z-edicao);
  top:calc(var(--header-h) + var(--azulejo-h) + 12px);left:14px;
  width:min(360px,calc(100vw - 28px - 58px));
  display:flex;flex-direction:column;gap:var(--sp-2);
  padding:var(--sp-3) var(--sp-4);border-radius:var(--raio-sm);
  background:var(--branco);color:var(--tinta);box-shadow:var(--sombra-pop);
  border-left:5px solid var(--ambar-500);font-size:.85rem;line-height:1.35}
.dayse-cota.is-alto{border-left-color:var(--ambar-600)}
.dayse-cota.is-critico{border-left-color:var(--th-mulher-ink)}
.dayse-cota-cab{display:flex;align-items:center;gap:var(--sp-2)}
.dayse-cota-cab svg{flex:none}
.dayse-cota-titulo{font-weight:700;font-size:.95rem}
.dayse-cota-linha{display:flex;flex-direction:column;gap:4px}
.dayse-cota-topo{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2)}
.dayse-cota-nome{font-weight:600}
.dayse-cota-pct{flex:none;padding:2px 8px;border-radius:var(--raio-pill);font-size:.78rem;background:var(--ambar-500);color:var(--tinta)}
.dayse-cota-linha.is-alto .dayse-cota-pct{background:var(--ambar-600)}
.dayse-cota-linha.is-critico .dayse-cota-pct{background:var(--th-mulher-ink);color:var(--branco)}
.dayse-cota-trilho{display:block;height:8px;border-radius:var(--raio-pill);background:var(--petroleo-100);overflow:hidden}
.dayse-cota-cheio{display:block;height:100%;border-radius:var(--raio-pill);background:var(--ambar-500)}
.dayse-cota-linha.is-alto .dayse-cota-cheio{background:var(--ambar-600)}
.dayse-cota-linha.is-critico .dayse-cota-cheio{background:var(--th-mulher-ink)}
.dayse-cota-texto,.dayse-cota-reinicio{color:var(--tinta-60);font-size:.78rem}
.dayse-cota-acoes{display:flex;align-items:center;justify-content:flex-end;gap:var(--sp-3)}
.dayse-cota-painel{color:var(--petroleo-700);font-weight:600;font-size:.82rem}
.dayse-cota-ok{min-height:36px;padding:0 var(--sp-4);border-radius:var(--raio-pill);border:1px solid var(--petroleo-700);
  background:var(--petroleo-700);color:var(--branco);font:inherit;font-weight:600;cursor:pointer}
.dayse-cota-ok:hover{background:var(--petroleo-800)}
.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)}
/* DUAS CHAMADAS NA MESMA COLUNA: a moldura e a colinha (01/10/2026, docs/98).
   Lado a lado, as duas quadradas, para os botões que cavalgam a borda de baixo
   ficarem na mesma linha. */
.chamadas{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-7) var(--sp-6);align-items:start}
.chamadas .mold-chamada{width:100%}
/* No celular cada cartão tem ~150px, e o "Montar minha colinha" numa linha só
   media 216px: a 390px ele invadia o botão da moldura e passava da tela
   (medido, 179 a 394). Aqui o botão é preso à largura do cartão e QUEBRA. */
@media(max-width:820px){
  .chamadas{gap:var(--sp-6) var(--sp-4)}
  .chamadas .mold-chamada-btn{white-space:normal;width:94%;text-align:center;line-height:1.15;
    font-size:.8rem;padding:.6em .5em}
  .chamadas .mold-chamada-btn svg{width:16px;height:16px}
  .chamadas .mold-chamada-selo{width:44px;height:44px}
  .chamadas .mold-chamada-selo svg{width:22px;height:22px}
}

@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)}
/* A LINHA LEGAL da propaganda eleitoral (23/08/2026, ver o FOOTER no
   _middleware.js). Letra miúda, mas NÃO apagada: é identificação obrigatória, e
   texto legal que ninguém consegue ler é o mesmo que texto ausente. Por isso ela
   fica bem acima dos links de painel (.34) e no mesmo patamar do resto do
   rodapé — o contraste foi medido no elemento, com as fontes carregadas.
   `max-width` em ch para a linha quebrar em duas no celular em vez de virar
   uma tira de 90 caracteres. */
.footer-legal{color:rgba(255,255,255,.72);font-size:.7rem;line-height:1.55;
  letter-spacing:.02em;max-width:60ch;text-wrap:balance}
/* O link da privacidade mora numa `.footer-legal` e o fundo ali é ESCURO — a
   cor de link em prosa (petroleo-700) sumiria. Herda o branco de 72% da própria
   linha e só ganha o sublinhado, que é o que o faz parecer clicável. */
.footer-legal a{text-decoration:underline;text-underline-offset:3px}
.footer-legal a:hover{color:#fff}
/* A LINHA LEGAL, MIÚDA (04/09/2026). O pedido era limpar o rodapé, e ela é o que
   mais pesa ali: caixa alta, larga, e logo abaixo do nome. Não pode SAIR (é a
   identificação obrigatória de propaganda eleitoral — Lei 9.504/97 art. 57-B,
   docs/51), então saiu do caminho do olho: foi para depois do link de
   privacidade, encolheu e apagou.

   O QUE NÃO SE FAZ AQUI é baixar mais a opacidade "só um pouquinho". Medido
   contra o `--tinta-fundo` do rodapé: a 0,52 ela dá 4,65:1 (medido a 9,92px), acima do mínimo de
   4,5:1 para texto pequeno. Abaixo disso vira letra que a lei manda existir e
   ninguém consegue ler — que é o mesmo que não existir, com o trabalho de
   fingir que existe. */
.footer-legal--miuda{font-size:.62rem;color:rgba(255,255,255,.52);letter-spacing:.04em;
  max-width:64ch;line-height:1.5}

/* 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ê */
  /* No desktop a foto ocupa os 60% da direita e o texto fica na esquerda.
     O `object-position` SUBSTITUI o `background-position:center` que estava
     aqui: a foto virou <img> em 26/08/2026 (docs/57), e regra de background
     numa caixa sem background nao faz nada -- some calada, levando junto o
     enquadramento. */
  .divisor.has-foto .divisor-media{left:40%}
  .divisor.has-foto .divisor-img{object-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 da CTA ("Fale com o mandato"), sem faixa branca.
   Desde 24/08/2026 são DUAS recortadas em looping (a tabela `BONECAS` e o
   `buildBonecas()` do _middleware.js). A classe `.cta-dayse` migrou da <img>
   para o CONTÊINER — é ela que o modo edição arrasta e escala, e no contêiner
   o arrasto move as duas de uma vez.

   O CONTÊINER É O SLOT, e o slot é o da PRIMEIRA recortada (daí o
   `aspect-ratio` chumbado): é dele que o editor tira a caixa para o arrasto e
   para o quadro de escala. Por isso o carrossel PARA na primeira enquanto o
   modo edição está ligado (main.js) — com a segunda à mostra o editor daria
   uma caixa de 296px para uma imagem de 373px, e o arrasto pularia 77px na mão
   de quem estivesse posicionando. */
.cta-dayse{position:absolute;right:var(--dayse-x,0px);bottom:0;z-index:1;
  height:min(90%,450px);aspect-ratio:724/1100;pointer-events:none}
/* Cada recortada ocupa o mesmo canto inferior direito; quem troca é a opacidade.
   `--boneca-k` iguala o TAMANHO DA CABEÇA das duas e `--boneca-dx` a POSIÇÃO
   dela (as duas medições estão na tabela BONECAS do _middleware.js) — sem eles
   a Dayse mudaria de tamanho e de lugar a cada volta. O 100% é a ALTURA do
   slot, que é definida.

   A LARGURA VEM DE `aspect-ratio`, E NÃO DE `width:auto`, e isso custou uma
   medição: num elemento POSICIONADO, `width:auto` é *shrink-to-fit* —
   `min(max-content, espaço disponível)`. O espaço disponível é a largura do
   SLOT (266px a 1440), então toda recortada mais larga que ele saía esmagada
   nele: a 2, que mede 373px, renderizava 266. Altura definida +
   `aspect-ratio` dá largura definida, sem consultar o contêiner. */
.cta-boneca{position:absolute;bottom:0;right:calc(100% * var(--boneca-dx,0));
  height:calc(100% * var(--boneca-k,1));aspect-ratio:var(--boneca-ar,724/1100);
  opacity:0;transition:opacity .9s ease}
.cta-boneca.is-ativa{opacity:1}
.cta-boneca img{display:block;width:100%;height:100%;filter:drop-shadow(0 12px 30px rgba(0,0,0,.32))}
/* o coração é a única coisa clicável dentro do recorte (o resto é `none` para
   não roubar o clique dos botões do CTA, que ficam por baixo) */
.cta-bonecas .curtir{pointer-events:auto}
@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)}
/* A COLUNA DA DIREITA (04/09/2026): engrenagem em cima, visor de celular
   embaixo. O dock é `row-reverse` (a barra à esquerda, o canto à direita), então
   empilhar os dois botões pede uma coluna própria — e `align-items:flex-end`
   para o visor ficar alinhado à direita quando o dock vira coluna a 560px. */
.dayse-gear-col{display:flex;flex-direction:column;align-items:flex-end;gap:var(--sp-2)}
/* mesmo corpo da engrenagem, sem o giro: aqui o hover que rodava seria ruído */
.dayse-mview-btn{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:background .2s,color .2s}
.dayse-mview-btn:hover{background:var(--petroleo-700);color:#fff}
.dayse-mview-btn[aria-expanded="true"]{background:var(--petroleo-800);color:#fff}
.dayse-mview-btn svg{display:block}

/* ---- OS NÚMEROS EM CIMA DO SITE (01/10/2026, docs/98 §12) -----------------
   O botão de barras é o corpo do botão do visor (mesma coluna, mesmo desenho);
   ligado, fica petróleo como ele. Ao contrário do visor, ele vale também no
   celular: o número de um botão é tão útil no telefone quanto no computador. */
.dayse-num-btn[aria-pressed="true"]{background:var(--petroleo-800);color:var(--branco)}
/* A camada não recebe toque: a bolinha não pode tapar o botão que ela conta.
   Fica abaixo da interface do editor e acima de todo o site (o cabeçalho
   grudado e o WhatsApp flutuante incluídos). */
.dayse-num-camada{position:fixed;inset:0;pointer-events:none;z-index:calc(var(--z-edicao) - 1);overflow:hidden}
.dayse-num{position:absolute;left:0;top:0;display:inline-flex;align-items:center;gap:4px;min-width:26px;height:26px;padding:0 8px;
  border-radius:var(--raio-pill);background:var(--petroleo-800);color:var(--branco);border:2px solid var(--branco);
  font:700 .78rem/1 var(--font-titulo);letter-spacing:.02em;box-shadow:0 4px 12px rgba(var(--tinta-rgb),.35);white-space:nowrap}
/* os mais tocados (metade do maior para cima) no âmbar: o olho acha primeiro */
.dayse-num.is-quente{background:var(--realce);color:var(--tinta)}
/* taxa com base pequena (menos de 20 visitas viram a seção): o número existe,
   mas não serve para comparar, e a bolinha diz isso pela forma */
.dayse-num.is-pouco{background:var(--branco);color:var(--petroleo-800);border-style:dashed;border-color:var(--petroleo-700)}
/* a bolinha recebe o mouse (a camada não): é por ela que vem a explicação */
.dayse-num{pointer-events:auto;cursor:help}
.dayse-num-dica{position:absolute;left:0;top:0;display:grid;gap:4px;width:max-content;max-width:min(280px,calc(100vw - 16px));
  padding:10px 12px;border-radius:var(--raio-sm);background:var(--petroleo-900);color:var(--branco);
  font:400 .82rem/1.4 var(--font-texto);box-shadow:var(--sombra-pop);pointer-events:none}
.dayse-num-dica b{font:600 .9rem/1.2 var(--font-titulo);text-transform:uppercase;letter-spacing:.02em;color:var(--turquesa-300)}
.dayse-num-dica .is-miudo{font-size:.74rem;color:rgba(255,255,255,.72);border-top:1px solid rgba(255,255,255,.18);padding-top:4px;margin-top:2px}
.dayse-num i{font-style:normal;font-weight:600;padding-left:6px;margin-left:2px;border-left:1px solid currentColor}
.dayse-num-painel{position:fixed;left:16px;bottom:16px;z-index:var(--z-edicao);width:min(340px,calc(100vw - 32px));
  background:var(--branco);color:var(--tinta);border-radius:var(--raio-md);box-shadow:var(--sombra-pop);padding:var(--sp-3) var(--sp-4);
  display:grid;gap:var(--sp-2);font:400 .85rem/1.4 var(--font-texto)}
.dnp-topo{display:flex;align-items:center;gap:var(--sp-2)}
.dnp-topo b{flex:1}
.dnp-recolher svg{transition:transform var(--t-media)}
.dayse-num-painel.is-recolhido .dnp-recolher svg{transform:rotate(180deg)}
.dayse-num-painel.is-recolhido > :not(.dnp-topo){display:none}
.dnp-topo b{font:600 .95rem var(--font-titulo);text-transform:uppercase;color:var(--petroleo-800)}
.dnp-x{width:36px;height:36px;display:grid;place-items:center;border:0;border-radius:50%;background:var(--petroleo-100);color:var(--petroleo-800);cursor:pointer}
.dnp-periodos{display:flex;gap:4px;flex-wrap:wrap}
.dnp-periodos button{flex:1 1 auto;min-height:36px;padding:0 8px;border:1px solid var(--petroleo-200);border-radius:var(--raio-pill);
  background:var(--branco);color:var(--petroleo-800);font:600 .8rem var(--font-texto);cursor:pointer}
.dnp-periodos button.is-active{background:var(--petroleo-700);border-color:var(--petroleo-700);color:var(--branco)}
.dnp-resumo{color:var(--tinta-60)}
.dnp-modos button{flex:1 1 140px}

/* ---- O VISOR DE CELULAR (mview) -------------------------------------------
   A página de verdade, num <iframe> de 360/390/430 de largura, escalada para os
   300px que aparecem. CABER POR `transform`, NUNCA POR `zoom` — a mesma regra
   da prova do livreto e da miniatura da bio: `zoom` participa do layout.

   E `transform` NÃO encolhe a caixa: o quadro continua ocupando a largura e a
   altura inteiras no fluxo. Daí as duas margens negativas, que devolvem o que o
   desenho já não usa — sem elas sobra uma faixa vazia à direita e embaixo.

   O QUADRO É `pointer-events:none` de propósito: o visor rola e NÃO navega
   (decisão do dono). Quem rola é a `.mv-tela`, e é ela que o modo "junto"
   escreve — um mecanismo só para os dois modos de rolagem. */
.dayse-mview{position:fixed;z-index:var(--z-toast);
  top:calc(var(--header-h) + var(--azulejo-h) + 12px);right:70px;
  background:var(--branco);border-radius:var(--raio-md);box-shadow:var(--sombra-hover);
  padding:var(--sp-3)}
.dayse-mview[hidden]{display:none}
.mv-topo{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2);
  cursor:grab}
.mv-grupo{display:flex;gap:2px;background:var(--petroleo-100);border-radius:var(--raio-pill);
  padding:2px}
.mv-chip{border:0;cursor:pointer;background:none;color:var(--petroleo-800);
  font:600 .7rem var(--font-texto);padding:6px 9px;border-radius:var(--raio-pill)}
.mv-chip[aria-pressed="true"]{background:var(--petroleo-800);color:#fff}
.mv-fechar{margin-left:auto;border:0;cursor:pointer;background:none;color:var(--tinta-60);
  display:grid;place-items:center;width:28px;height:28px;padding:0}
.mv-fechar:hover{color:var(--magenta-500)}
.mv-fechar svg{width:16px;height:16px;display:block}
/* A caixa tem o tamanho JÁ ESCALADO do aparelho, e corta o resto: `transform`
   não encolhe a caixa do que ele desenha, então sem o `overflow:hidden` sobraria
   a diferença como espaço vazio à direita e embaixo. */
.mv-tela{width:var(--mv-w,300px);height:var(--mv-h,650px);overflow:hidden;
  background:var(--papel);border:1px solid var(--petroleo-100);
  border-radius:var(--raio-sm)}
/* O QUADRO ROLA POR DENTRO: ele tem o viewport de um celular de verdade
   (390x844 e companhia), e não a altura da página inteira. Um quadro alto faria
   todo `min-height:100dvh` de dentro valer a altura dele — o hero viraria uma
   catedral e a página incharia (medido: 20.640px de quadro deixavam a home com
   64.192px). Por isso também NÃO tem `pointer-events:none`: a roda do mouse
   precisa chegar ao documento de dentro. Quem impede a navegação é um ouvinte
   de clique, no editor.js. */
.mv-quadro{display:block;width:var(--mv-ap,390px);height:var(--mv-alt,844px);border:0;
  transform:scale(var(--mv-k,.77));transform-origin:top left}
/* no celular o visor não faz sentido — quem edita ali JÁ está no celular, e o
   painel cobriria a tela inteira. O botão some junto, para não abrir o que não
   cabe. */
@media (max-width:700px){.dayse-mview,.dayse-mview-btn{display:none}}
@media (max-width:700px){.dayse-mview-btn.dayse-num-btn{display:grid}}

/* 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)}
/* --- LADRILHOS DA FAIXA: quais desenhos ela sorteia (docs/49 F3) ---
   Bloco largo, fora da multi-coluna, pelo mesmo motivo do de cores: são 19
   miniaturas: em 260px a grade quebrava em seis linhas e o modal pulava a cada
   clique. As miniaturas são <use> do MESMO sprite da faixa, pintadas com os
   tokens do contexto aberto — a única prévia que não mente. */
.cx-lads{width:100%}
.az-lads{display:grid;grid-template-columns:repeat(auto-fill,minmax(84px,1fr));
  gap:var(--sp-2);margin:0 0 var(--sp-2)}
.lad{display:flex;flex-direction:column;align-items:center;gap:5px;
  padding:var(--sp-2) 4px;border:1.5px solid var(--petroleo-100);border-radius:var(--raio-sm);
  background:var(--branco);cursor:pointer;font:600 .66rem var(--font-texto);
  color:var(--petroleo-800);transition:border-color .12s,opacity .12s}
.lad svg{width:100%;height:40px;display:block}
.lad span{line-height:1.2;text-align:center;overflow-wrap:anywhere}
.lad:hover{border-color:var(--turquesa-400)}
.lad[aria-pressed=true]{border-color:var(--petroleo-800)}
/* DESLIGADO recua, mas não some: é dali que se liga de volta. O estado é dito
   por traço (pontilhado) e por luz (desbotado), nunca só por cor — e o
   aria-pressed diz o mesmo a quem não vê nenhum dos dois. */
.lad[aria-pressed=false]{border-style:dashed;border-color:rgba(var(--tinta-rgb),.20);
  opacity:.42;filter:grayscale(1)}
.lad[aria-pressed=false]:hover{opacity:.8;filter:none}
.az-lad-conta{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, fundo tingido — lê-se como "mais um
   degrau", não como o 6º gesto de apoio. O TINGIMENTO é que faz esse trabalho
   agora; a faixa inteira, não: até 11/09/2026 este cartão vinha com
   `.step--largo` e ocupava a linha toda, e nessa data passou a ser um cartão de
   uma coluna, ao lado do "Gere ideias também" (ver o comentário dele na
   /apoiar). O `.step--largo` continua existindo e continua sendo usado — mora na
   seção do Guia do Mobilizador, onde resolve o passo ímpar órfão. */
.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 no cartão — 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}
/* AS QUATRO FOTOS DO FUNDO saíram do `style` inline e vieram para cá em
   26/08/2026 (docs/57). O motivo é que `background-image` inline **não aceita
   media query**, e no celular estas quatro chegavam no tamanho de desktop:
   255 KB para uma faixa de 390px de largura.

   Aqui elas escolhem o degrau. Não dá para usar `srcset` — isto é fundo, não
   `<img>` —, e `image-set()` resolve DPR, não largura de viewport; media query
   é o que responde a pergunta certa.

   E CONTINUA SEM JS: o slideshow é animação de CSS (`animation-delay` por
   nth-child), e trocar a foto por JS teria feito um enfeite depender de script.

   A ORDEM É A DO nth-child, que é o que a animação usa — a classe existe para
   dizer QUAL foto, não para reordenar. */
.ctas-guaraense{background-image:url('/assets/img/bio-guaraense-640.webp')}
.ctas-familia{background-image:url('/assets/img/bio-familia-640.webp')}
.ctas-enfermagem{background-image:url('/assets/img/bio-enfermagem-640.webp')}
/* A formatura NÃO tem degrau de 640: o original tem 576px de largura, e a
   ferramenta não inventa tamanho acima do que existe — ampliar não cria
   informação, só peso. Aqui ela usa o original nas duas faixas, e é por isso
   que ela não aparece no bloco de 768 abaixo. */
.ctas-formatura{background-image:url('/assets/img/bio-formatura.webp')}
@media (min-width:768px){
  .ctas-guaraense{background-image:url('/assets/img/bio-guaraense.webp')}
  .ctas-familia{background-image:url('/assets/img/bio-familia.webp')}
  .ctas-enfermagem{background-image:url('/assets/img/bio-enfermagem.webp')}
}
.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}
}

/* ============================================================
   /LEGADO — A PÁGINA DE HISTÓRIA EM FAIXAS (11/09/2026, docs/69)
   ------------------------------------------------------------
   O que havia era uma seção só: 981px de prosa corrida numa coluna de 585,
   com as seis faces espremidas ao lado e cinco delas escondidas atrás de abas.
   Medido no ar a 1920x920: a página inteira tinha 2.376px e três blocos.

   A diagramação nova alterna FAIXA CHEIA / FAIXA PARTIDA / GRADE, que é o que
   quebra a parede de texto. As peças escuras reaproveitam, sem adaptação, o
   maquinário das faixas da home: `.divisor` + `.divisor-media` + `<img
   class="divisor-img">` + `.divisor-overlay` + o cobogó recortado pela mesma
   `--dv-mask`. Aqui em baixo está só o que não existia: a faixa PARTIDA, o
   recorte que vaza pra cima, os marcos e a grade das faces.

   AS REGRAS DO "QUEM SOU" ACIMA CONTINUAM VIVAS, e não por esquecimento: a
   `index.html` guarda uma cópia deliberada daquele bloco (com `.bio-grid`,
   `#facets` e as abas), e ela grava em outro documento do KV. Apagar aquelas
   regras derrubaria a home.
   ============================================================ */

/* ---------- HERO DA /LEGADO ----------
   O hero era `.cta--photos` (as quatro fotos do carrossel de fundo), depois um
   RETRATO na metade direita (11/09/2026), e desde 14/09/2026 é só texto sobre o
   cobogó: *"a imagem do hero não precisa, a Dayse boneca vai preencher o
   espaço"*. A boneca 1 da faixa seguinte sobe por cima deste fundo, no lado
   direito — ver "A FAIXA DAS FACES". O nome `--retrato` ficou: renomeá-lo não
   muda nada no ar, e os números do docs/69 §6.2 falam dele. */
.cta--retrato{padding-block:clamp(52px,8vw,104px);overflow:hidden}
.cta--retrato .cta-inner{max-width:var(--container);text-align:center}
.cta--retrato .cta-lead{margin-inline:auto}
/* A SOMBRA DO TEXTO FICA, mesmo sem foto atrás dele: o cobogó do fundo mescla
   em `lighten` e clareia ladrilho sim, ladrilho não — ela é o que impede a
   letra de piscar ao cruzar um deles. */
.cta--retrato .cta-inner{text-shadow:0 2px 16px rgba(20,8,40,.55);position:relative;z-index:2}
@media(min-width:900px){
  /* No desktop o texto fica na METADE ESQUERDA e perde a centralização: a
     metade direita é da boneca que sobe da faixa seguinte, e bloco centrado ao
     lado de uma imagem fica sem eixo (a mesma razão do `.cta--par` da /apoiar). */
  .cta--retrato .cta-inner{text-align:left}
  /* A LARGURA VAI NOS FILHOS, E NÃO EM `padding-right` NO PAI, e isso custou uma
     medição: padding em PORCENTAGEM resolve contra a largura do bloco que contém
     o elemento — aqui a SEÇÃO (1905px), não o container (1200). `padding-right:46%`
     virava 876px dentro de 1200, e o título saiu com 292px de largura: "MINHA
     HISTÓRIA." quebrado em duas linhas numa tira.
     `min(560px,50%)` é o par de réguas: os 560px seguram a linha de leitura no
     monitor grande, e os 50% garantem que o texto nunca alcance a boneca, que
     sobe centrada na coluna da DIREITA da faixa seguinte. */
  .cta--retrato .cta-kicker,
  .cta--retrato .cta-title,
  .cta--retrato .cta-lead{max-width:min(560px,50%)}
  .cta--retrato .cta-lead{margin-inline:0}
}

/* ---------- FAIXA PARTIDA ----------
   MÍDIA SANGRANDO DE UM LADO, TEXTO DO OUTRO. A mídia é uma célula da grade e
   não um `position:absolute`: célula encosta na borda sozinha, empilha sozinha
   no celular e não precisa de altura chumbada. */
.faixa-par{position:relative;display:grid;grid-template-columns:minmax(0,1fr);
  background:var(--branco);isolation:isolate}
.faixa-media{position:relative;min-width:0;z-index:1}
.faixa-corpo{position:relative;z-index:2;display:flex;align-items:center;min-width:0;
  padding-block:clamp(36px,7vw,78px);padding-inline:var(--sp-6)}
/* 620px E NÃO `62ch`: o `ch` resolve contra a fonte do PRÓPRIO elemento, e o
   `.faixa-texto` herda o corpo de 1rem enquanto a prosa dentro dele roda a
   1,1rem. Os "62ch" mediram 712px reais — 83 caracteres por linha, quando a
   régua da prosa justificada deste projeto é a mesma coluna de ~585px que o
   comentário da `.quem-prose` justifica. */
.faixa-texto{width:100%;max-width:620px}
.faixa-rotulo{display:inline-block;letter-spacing:.16em;font-size:.78rem;font-weight:600;
  text-transform:uppercase;color:var(--petroleo-700);
  padding:var(--sp-1) var(--sp-3);background:rgba(var(--petroleo-700-rgb),.10);
  margin-bottom:var(--sp-3)}
.faixa-titulo{font-size:clamp(1.6rem,5.2vw,2.7rem);text-transform:uppercase;line-height:1.04;
  color:var(--petroleo-800);margin-bottom:var(--sp-4)}
.faixa-titulo .hl{color:var(--th-saude-ink)}
@media(min-width:900px){
  .faixa-par{grid-template-columns:minmax(0,46fr) minmax(0,54fr);align-items:center}
  .faixa-corpo{padding-inline:clamp(34px,4.6vw,76px)}
  /* `--dir` = mídia à DIREITA. A ordem do HTML continua "mídia primeiro" nas
     duas, para o celular empilhar sempre foto-e-depois-texto; quem troca os
     lados no desktop é o `order`, não a marcação — mexer na marcação custaria
     `pathId` (regra 4 do CLAUDE.md).

     `--dir` NÃO TEM CLIENTE HOJE. A faixa das faces o usou numa tarde (14/09/2026)
     e em seguida virou componente próprio, `.faixa-faces`. Ele fica pela simetria,
     e o `flex-end` abaixo foi medido naquela tarde. */
  .faixa-par--dir{grid-template-columns:minmax(0,54fr) minmax(0,46fr)}
  .faixa-par--dir .faixa-media{order:2}
  /* O TEXTO ENCOSTA NA MÍDIA, espelhando o `--esq`. Lá o `.faixa-texto` (620px
     no teto) começa colado à célula da mídia, e a sobra da coluna vai para a
     borda da tela. Sem o `flex-end`, o `--dir` jogaria a sobra para o MEIO,
     entre o texto e a boneca: a 1920 a coluna mede 885px úteis, e seriam 265px
     de vão separando os cartões da foto que eles descrevem. */
  .faixa-par--dir .faixa-corpo{order:1;justify-content:flex-end}
}

/* a pele escura: o degradê radial do `.cta`, o mesmo do fecho da página */
.faixa-par--escura{color:#fff;
  background:radial-gradient(120% 100% at 50% -20%, var(--fundo-1), var(--fundo-2) 55%, var(--fundo-3))}
.faixa-par--escura::before{z-index:0}
.faixa-par--escura .faixa-rotulo{color:var(--realce-claro);background:rgba(255,255,255,.16)}
.faixa-par--escura .faixa-titulo{color:#fff}
.faixa-par--escura .faixa-titulo .hl{color:var(--realce)}
/* A PROSA CLARA PRECISA DE REGRA PRÓPRIA porque a `.quem-prose p` crava
   `color:var(--tinta)` — tinta escura sobre fundo escuro é texto invisível, e
   herdar não resolve: a declaração existe e ganha de `inherit`. */
.quem-prose--claro p{color:rgba(255,255,255,.92)}
.quem-prose--claro strong{color:#fff}
/* JUSTIFICAR SO PAGA ENQUANTO A COLUNA É LARGA. A `.quem-prose p` justifica com
   `hyphens:auto`, e o comentário dela explica por quê: numa coluna de ~585px a
   borda direita reta ajuda o olho a achar a linha seguinte. A 390px a coluna
   mede 342 e o português não acha pontos de hifenização suficientes: as linhas
   abrem rios de espaço entre as palavras, e o que era ajuda vira obstáculo.
   Vale só para as faixas novas; a cópia do bloco na home segue como estava, e
   isso é escolha: lá o texto é outro, mais curto, e mexer nele custaria a
   comparação entre as duas páginas por nada. */
@media(max-width:639px){
  .faixa-texto .quem-prose p{text-align:left}
}

/* ---------- O CARROSSEL DENTRO DA FAIXA ----------
   As quatro fotos da bio vinham num frame de 480px de largura máxima e 440 de
   altura. Aqui a célula sangra: elas ganham a metade da tela. */
.faixa-media .carousel--bio .slide{height:clamp(320px,62vh,560px)}
/* CANTO QUADRADO NA BORDA QUE SANGRA. O carrossel nasce cartão — raio e sombra
   —, e cartão encostado na borda da tela lê como erro de corte: o raio abre uma
   meia-lua da cor da seção exatamente onde a foto deveria morrer na borda.
   Arredondados ficam só os dois cantos de DENTRO.

   QUEM TEM O RAIO É O `.carousel-track`, NÃO O `.carousel`, e isso custou uma
   medição: as regras foram escritas no `.carousel` e o `borderRadius` computado
   dele já era `0px` — ou seja, nada mudou e a leitura parecia certa. O raio de
   32px e a sombra moram na pista, que é quem tem `overflow` para recortar as
   fotos. */
@media(min-width:900px){
  .faixa-media .carousel--bio .slide{height:clamp(420px,74vh,640px)}
  /* E A MOLDURA DE 4px SAI DO LADO QUE SANGRA. Ela é `border:4px solid
     var(--realce)` e existe para emoldurar um cartão; encostada na borda da
     tela ela não emoldura nada — vira uma risca de 4px colada no canto do
     monitor, que é exatamente o tipo de sobra que este projeto caça. */
  .faixa-par--esq .faixa-media .carousel-track{border-start-start-radius:0;border-end-start-radius:0;border-left:0}
  .faixa-par--dir .faixa-media .carousel-track{border-start-end-radius:0;border-end-end-radius:0;border-right:0}
}
@media(max-width:899px){
  /* empilhado, a mídia sangra nas DUAS bordas laterais */
  .faixa-media .carousel-track{border-radius:0;border-left:0;border-right:0}
}

/* ---------- A BONECA DA FAIXA ESCURA, APOIADA NO PÉ ----------
   A boneca 3 (punhos erguidos, 1221x806) é um BUSTO: o arquivo acaba num corte
   reto no peito. Até 15/09/2026 ela ficava centrada na vertical da célula, e o
   corte flutuava no meio do escuro. O dono: *"a boneca está desencaixada na
   div"*. Medido no ar, a sobra entre o corte e o fim da faixa era de 123px a
   1920, 150 a 1280, 287 a 900, e no celular o corte pairava 59px acima do título.

   APOIADA, o corte coincide com a emenda da faixa com a seção seguinte e deixa
   de ser corte: ela emerge da borda. É o mesmo truque da boneca 1 (que esconde o
   quadril atrás de um cartão, em "A FAIXA DAS FACES") e da recortada do CTA.
   Por isso a célula tem `padding-top` e NÃO `padding-bottom`.

   ABAIXO DE 1200 A FAIXA EMPILHA COM O TEXTO PRIMEIRO. Em duas colunas, entre
   900 e 1199, a coluna de texto mede ~460px, a faixa passa de 750px de altura e
   a boneca, limitada pela LARGURA da célula (proporção 1,51), fica com 290px ou
   menos: apoiada no pé, sobrariam 470px de escuro sobre a cabeça. Empilhada, ela
   vai para DEPOIS do texto (`order`, sem mexer na marcação: regra 4 do CLAUDE.md),
   porque só no fim da faixa o pé dela encontra uma borda. Com a boneca antes,
   como era, o corte encostaria no começo do texto. Os números estão no docs/69 §15. */
.faixa-media--recorte{display:flex;align-items:flex-end;justify-content:center;
  align-self:stretch;padding-top:var(--sp-6)}
.recorte-img{display:block;width:min(86%,520px);height:auto;
  filter:drop-shadow(0 18px 38px rgba(0,0,0,.42))}
@media(max-width:1199px){
  .faixa-par--escura{grid-template-columns:minmax(0,1fr)}
  .faixa-par--escura .faixa-media{order:2}
  .faixa-par--escura .faixa-corpo{justify-content:center;padding-bottom:0}
}
@media(min-width:1200px){
  .recorte-img{width:min(92%,720px)}
}

/* ---------- A FAIXA DAS FACES: TÍTULO, BONECA E DUAS COLUNAS DE TRÊS ----------
   14/09/2026, a pedido do dono: *"duas colunas de 3 no 'Prazer, eu sou a
   Dayse', pra boneca sair de cima de um dos blocos da direita e o título acima
   de um bloco da esquerda. Assim a Dayse segue vazando pra cima."*

   NO DESKTOP A GRADE TEM DUAS LINHAS: título | boneca, e embaixo os seis
   cartões nas duas colunas. Quem decide a altura da primeira linha é o TÍTULO.
   A boneca não pesa nela: é `position:absolute` presa ao PÉ da própria célula,
   e tudo o que ela tem de altura sobe, por cima do branco da faixa e do escuro
   do hero, onde o retrato morava até esta data.

   O CORTE DO QUADRIL SOME ATRÁS DO CARTÃO. O arquivo da boneca 1 acaba no
   quadril (724x1100), e corte reto à vista lê como erro. A imagem desce
   `--ff-sob` para dentro do primeiro cartão da coluna da direita, que é branco
   opaco e está num `z-index` acima: o corte fica atrás dele, e ela passa a SAIR
   do bloco. 9% da altura esconde a faixa da saia e para antes das mãos, que
   ficam a ~80% da altura do arquivo.

   O TETO DA ALTURA É O HERO, e não a coluna. O cabeçalho é `sticky` com 128px,
   e o hero mede 322 a 386px conforme a largura; o que a boneca sobe tem de caber
   nele sem encostar no cabeçalho. Os números da `--ff-alt` estão medidos no
   docs/69 §14.

   `max-width:none` NÃO É ENFEITE: o reset global dá `img{max-width:100%}`, e com
   a altura definida um teto de largura esmaga a proporção — o defeito medido em
   12/09 na boneca desta mesma faixa (460x576, proporção 0,80 contra 0,66). */
.faixa-faces{position:relative;background:var(--branco);isolation:isolate;
  padding-block:clamp(36px,7vw,78px)}
.faixa-faces-grade{--ff-alt:clamp(340px,110vw,440px);--ff-sob:calc(var(--ff-alt) * .09);
  display:grid;grid-template-columns:minmax(0,1fr);max-width:calc(620px + 2 * var(--sp-7))}
/* NO CELULAR a ordem é a do HTML — título, boneca, cartões —, e o truque é o
   mesmo: a boneca centrada desce `--ff-sob` para trás do primeiro cartão. */
.faixa-faces-boneca{position:relative;z-index:1;display:flex;justify-content:center;
  margin-bottom:calc(var(--ff-sob) * -1)}
.faixa-faces-img{display:block;width:auto;max-width:none;height:var(--ff-alt);
  filter:drop-shadow(0 16px 34px rgba(var(--tinta-rgb),.28))}
.faixa-faces .faces-grid{position:relative;z-index:2}
@media(min-width:900px){
  .faixa-faces{padding-top:clamp(32px,4vw,56px)}
  .faixa-faces-grade{--ff-alt:clamp(420px,36vw,510px);max-width:var(--container);
    grid-template-columns:repeat(2,minmax(0,1fr));column-gap:var(--sp-4);
    grid-template-areas:"titulo boneca" "cartoes cartoes"}
  .faixa-faces .faixa-titulo{grid-area:titulo;align-self:end}
  .faixa-faces-boneca{grid-area:boneca;margin-bottom:0}
  .faixa-faces-img{position:absolute;left:50%;bottom:calc(var(--ff-sob) * -1);
    transform:translateX(-50%)}
  /* o MESMO vão das duas grades, senão a coluna de cartões da direita desalinha
     do eixo da boneca, que se centra na coluna de fora */
  .faixa-faces .faces-grid{grid-area:cartoes;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-4)}
}

/* ---------- MARCOS (a linha do tempo) ---------- */
.marcos-sec{--pad-topo:clamp(40px,7vw,68px);--vaza-topo:clamp(46px,6vw,112px);
  padding-block:var(--pad-topo)}
.marcos-grid{display:grid;gap:var(--sp-6);grid-template-columns:minmax(0,1fr);align-items:start}
.marcos-head{text-align:left;margin-bottom:var(--sp-6)}
.marcos{list-style:none;padding:0;margin:0;position:relative}
/* O TRILHO É UM ::before DA LISTA, e não borda em cada item: com borda, o
   último marco deixava o trilho descer até embaixo do texto dele. Aqui o
   trilho para onde a lista para. */
.marcos::before{content:"";position:absolute;left:19px;top:16px;bottom:16px;width:3px;
  background:linear-gradient(180deg,
    var(--th-saude) 0%, var(--th-roxo) 52%, var(--th-guara) 100%);
  /* 3px a 70%, e não os 2px a 42% da primeira tentativa: na captura o trilho
     simplesmente NÃO APARECIA entre os ladrilhos dos ícones. Linha de ligação
     que não se vê não liga nada — vira sete cartões soltos. */
  opacity:.7}
.marco{position:relative;display:flex;gap:var(--sp-4);align-items:flex-start;
  padding-block:var(--sp-3)}
.marco-ico{flex:none;width:40px;height:40px;border-radius:12px;display:grid;place-items:center;
  background:var(--branco);color:var(--e,var(--petroleo-700));
  border:2px solid var(--e,var(--petroleo-700));position:relative;z-index:1}
.marco-ico svg{width:20px;height:20px}
.marco-corpo{min-width:0;padding-top:2px}
.marco-ano{font-family:var(--font-titulo);font-weight:700;font-size:.86rem;letter-spacing:.10em;
  text-transform:uppercase;color:var(--e,var(--petroleo-700))}
.marco-titulo{font-weight:700;font-size:1.1rem;line-height:1.12;color:var(--petroleo-900);
  margin-top:2px}
.marco-desc{margin-top:var(--sp-1);color:var(--tinta-60);font-size:.97rem;line-height:1.46}
/* as duas cores se revezam ao longo do trilho, para ele não virar uma coluna
   monocromática de sete itens iguais */
.fx-0{--e:var(--th-saude-ink)}
.fx-1{--e:var(--th-roxo)}

/* O RECORTE QUE VAZA PRA CIMA — a boneca rompe a borda de cima da seção e
   invade a faixa turquesa anterior. Duas coisas sustentam isso:

   1. QUEM PINTA POR CIMA É QUEM VEM DEPOIS. `section{position:relative}` vale
      para todas, e com `z-index:auto` a ordem de pintura é a do documento —
      então os marcos passam por cima do `.divisor` anterior sem precisar de
      z-index nenhum disputando com o resto do site. O `overflow:hidden` do
      divisor não alcança: ele recorta o conteúdo DELE, não o do vizinho.
   2. A SUBIDA É UMA SOMA, não um número solto. O recorte começa no topo da
      GRADE, que já está um `--pad-topo` abaixo da borda da seção; ele tem de
      vencer esse padding antes de romper a borda. Escrito como soma, mudar o
      respiro da seção não deixa a cabeça encostando na borda em vez de
      atravessá-la. */
/* A SEGUNDA COLUNA DOS MARCOS É O CARROSSEL desde 12/09/2026 — *"o carrossel
   deve estar ao lado da timeline"*. O recorte que morava aqui foi para a faixa 1
   (`.recorte-img--alta`), e com ele foi embora o vazamento: as regras
   `.marcos-recorte` logo abaixo ficaram sem elemento, e ficam de pé porque a
   conta que elas guardam (a subida como SOMA do padding com o vazamento) é a
   medição que justificou o truque — apagá-la perderia o porquê.

   DUAS DIFERENÇAS QUE NÃO SÃO ESTILO:
   · o carrossel NÃO some no celular, e o recorte sumia. Recorte é pontuação e
     pode faltar; carrossel é CONTEÚDO — são quatro fotos, cada uma com curtida
     própria (`foto:<arquivo>`). Abaixo de 900px ele empilha sob a linha;
   · ele NÃO vaza para cima. O vazamento é um truque de silhueta recortada: uma
     caixa retangular subindo por cima do divisor anterior é colisão, não
     pontuação. */
.marcos-media{min-width:0}
.marcos-media .carousel--bio .slide{height:clamp(240px,38vh,340px)}
@media(min-width:900px){
  /* CENTRADO NA COLUNA, e maior — não `sticky`. A troca criou um buraco: o
     carrossel media 426px contra 765 da lista, sobrando 339px de coluna vazia
     (o recorte que morava aqui era alto e preenchia).

     `position:sticky` seria a resposta óbvia e NÃO FUNCIONA NESTA PÁGINA: o
     ancestral `.past-hero` tem `overflow-y:auto`, e um ancestral com overflow
     vira o contêiner de rolagem do sticky — ele passa a grudar num contêiner que
     não rola, ou seja, não gruda em nada. Medido: com `top:144px` declarado, a
     coluna parou em 86px, por baixo do cabeçalho. Mexer no `.past-hero` para
     destravar isso é mexer numa peça que carrega o resto da página; não vale o
     preço de um alinhamento.

     Então o buraco some do jeito barato: a foto cresce (520 no teto, contra 420)
     e o que sobra é dividido em cima e embaixo, em vez de ficar todo embaixo. */
  .marcos-media{align-self:center}
  .marcos-media .carousel--bio .slide{height:clamp(300px,52vh,520px)}
}
.marcos-recorte{display:none}
@media(min-width:900px){
  .marcos-grid{grid-template-columns:minmax(0,1fr) minmax(0,400px);gap:var(--sp-8)}
  .marcos-recorte{display:block;position:relative;z-index:2;align-self:start;
    margin-top:calc((var(--pad-topo) + var(--vaza-topo)) * -1)}
  .marcos-recorte img{display:block;width:100%;height:auto;
    filter:drop-shadow(0 16px 34px rgba(var(--tinta-rgb),.28))}
}

/* ---------- AS SEIS FACES ----------
   Eram abas: seis rótulos, um painel à mostra. Viraram grade de três colunas
   numa seção própria (11/09/2026) e, em 14/09/2026, a pedido do dono, entraram
   na faixa "Prazer, eu sou a Dayse" NO LUGAR DA PROSA, um cartão sob o outro:
   *"as duas seções viram uma só"*. Aqui a grade é de UMA coluna; as duas
   colunas de três, no desktop, são da `.faixa-faces`, que é quem sabe onde a
   boneca está. O `.step` continua o dos passos do manual — inclusive o
   `.step-badge svg`, que já está na receita do `.ico-traco` lá em cima. */
.faces-grid{display:grid;gap:var(--sp-3);grid-template-columns:minmax(0,1fr)}
.face{align-items:flex-start}
.fc-enfermeira{--e:var(--th-saude);--e-ink:var(--th-saude-ink)}
.fc-deputada{--e:var(--th-roxo);--e-ink:var(--th-roxo-ink)}
.fc-mulher{--e:var(--th-mulher);--e-ink:var(--th-mulher-ink)}
.fc-mae{--e:var(--th-laranja);--e-ink:var(--th-laranja-ink)}
.fc-servidora{--e:var(--th-roxo2);--e-ink:var(--th-roxo2-ink)}
.fc-guaraense{--e:var(--th-guara);--e-ink:var(--th-guara-ink)}


/* 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)}
/* Propostas no menu mobile: o turquesa da marca, porque a página fala pelo
   mandato inteiro e não por um eixo (docs/96) */
.mm-propostas{border-left-color:var(--turquesa-500)}
/* 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;
  /* `clip` DEPOIS de `hidden`, e não no lugar dele (25/09/2026). Os dois
     recortam o halftone igual; a diferença é que `hidden` faz da seção um
     contêiner de rolagem, e aí qualquer `position:sticky` lá dentro gruda NELA,
     que não rola — ou seja, não gruda. Medido na /fotos a 1920px, rolando
     1400px: com `hidden` a barra do álbum foi a y=-816; com `clip`, parou em
     y=128, colada no cabeçalho. Navegador sem `clip` (Safari < 16) fica no
     `hidden` e perde só o grudar. */
  overflow:clip;
  --ht-passo:9px;
  /* A OPACIDADE SAIU PARA UM TOKEN PRÓPRIO (27/08/2026) para virar controle no
     menu de engrenagem — "Cores do site" → Textura do fundo.

     38% É O QUE JÁ ESTAVA NO AR, e não um número novo: token que nasce herda o
     valor publicado, senão a mudança de mecanismo vira mudança de aparência sem
     ninguém ter pedido.

     O PADRÃO É FALLBACK DO `var()`, NÃO UMA DEFINIÇÃO AQUI. Escrito como
     `--ht-op:38%` nesta regra, ele venceria o valor que o `applyAzulejo` põe no
     `<html>` — definição local bate herança, e o deslizador mexia no estado sem
     mexer na tela. Foi medido assim antes de virar isto. */
  --ht-cor:color-mix(in srgb,var(--petroleo-700) var(--ht-op,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}
/* 4 CAPAS POR FILEIRA, de 1200px para cima (pedido do dono, 14/09/2026 — a
   conta das colunas está no GRADES_EQ do main.js). Com 4 o cartão cai de 330
   para 266–279px, e a linha "Compartilhar + coração" deixa de caber: a 266px
   ela quebrava com UM dígito no contador, e a 276px com dois. Os três ajustes
   abaixo devolvem a folga, medida com o contador forçado: a 1200–1366px
   (cartão de 269) o de 2 dígitos sobra 8px e o de 3 cabe no limite, 0px; de
   1440 para cima (279) o de 3 sobra 10px. Abaixo de 1200 volta a trilha de 3
   e o cartão de 330 inteiro. */
@media(min-width:960px) and (max-width:1199.98px){
  .rev-grade.grid-balanced{grid-template-columns:repeat(var(--cols-md,3),minmax(0,1fr))}}
@media(min-width:1200px){
  .rev-grade.grid-balanced{gap:var(--sp-5)}
  .rev-grade.grid-balanced .rev-card-corpo{padding:var(--sp-4)}
  .rev-grade.grid-balanced .rev-card-acoes .btn{padding-inline:.9em}}
.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 */
/* ---- AS AÇÕES SOBRE A FOTO (docs/54 §7.16) --------------------------------
   Baixar e compartilhar ficam EM CIMA da imagem, no canto, e não numa faixa
   branca embaixo do cartão: a faixa custava altura em todos os cartões da grade
   para dois botões que quase nunca são usados.

   FICAM NO TOPO, e o motivo é colisão: a `.rev-lupa` ("Ver") sobe da BASE da
   capa no hover. Dois controles disputando a mesma borda seria um cobrindo o
   outro exatamente quando os dois aparecem.

   A COR SÓ NO HOVER/FOCO. Em repouso são discos escuros translúcidos — legíveis
   sobre qualquer foto, que é o que uma grade de acervo exige (há foto clara e
   foto escura, e o botão não escolhe qual). A cor entra quando a pessoa mira.

   POR QUE ISTO É CSS E NÃO ESTILO INLINE, que é o padrão do resto desta grade:
   `:hover` e `:focus-visible` não existem inline. Não há atalho.
   ========================================================================= */
.fot-card{position:relative}
.fot-acoes{position:absolute;bottom:8px;right:8px;display:flex;gap:6px;z-index:2}
/* O "VER" SAI DO CENTRO NO CARTÃO DE FOTO, e vai para a esquerda. Ele e as ações
   dividem a MESMA faixa de baixo, e centralizado ele ficava POR BAIXO dos botões
   — o rótulo virava "VE" com um disco em cima (visto na captura). Uma faixa,
   duas pontas: a chamada num lado, os controles no outro.
   Só no `.fot-card`: a grade de ÁLBUNS e a de revistas não têm ações e continuam
   com a chamada centrada, que é onde ela fica melhor quando está sozinha. */
.fot-card .rev-lupa{justify-content:flex-start;padding-right:152px}
.fot-acao{width:44px;height:44px;padding:0;display:grid;place-items:center;border:0;
  border-radius:50%;cursor:pointer;color:#fff;
  background:color-mix(in srgb,var(--petroleo-900) 62%,transparent);
  transition:background var(--t-media),transform var(--t-media)}
.fot-acao svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round}
.fot-acao:hover,.fot-acao:focus-visible{transform:scale(1.08)}
/* O "NÃO SOU EU" do resultado da busca (26/09/2026): no canto de CIMA, sozinho,
   longe do baixar e do enviar que moram embaixo. Tirar da lista e baixar são
   gestos opostos, e vizinhos um tocaria no outro. */
.fot-naosou{position:absolute;top:8px;right:8px;z-index:2}
/* CARIMBANDO A MARCA D'ÁGUA (26/09/2026, js/marca-dagua.js): o botão fica meio
   apagado enquanto o aparelho prepara a foto (1,1 a 1,7 s medidos no Chrome de mesa, mais num
   celular fraco), senão o toque parece não ter pegado e a pessoa toca de novo. */
a[aria-busy="true"][href*="o=baixar"]{opacity:.55;cursor:progress}
/* O erro do carimbo é feedback: `--z-toast`, acima do visor de onde se baixa. */
.marca-aviso{position:fixed;left:50%;bottom:var(--sp-6);transform:translateX(-50%);
  z-index:var(--z-toast);max-width:min(92vw,480px);padding:var(--sp-3) var(--sp-4);
  background:var(--petroleo-900);color:var(--branco);border-radius:var(--raio-sm);box-shadow:var(--sombra-pop)}
.marca-aviso[hidden]{display:none}
.fot-baixar:hover,.fot-baixar:focus-visible{background:var(--petroleo-600)}
.fot-share:hover,.fot-share:focus-visible{background:var(--verde-acao)}
.fot-ocultar:hover,.fot-ocultar:focus-visible{background:var(--ambar-600);color:var(--tinta)}

/* ---- A ADMINISTRAÇÃO DAS FOTOS, só no modo edição (28/09/2026, docs/97) -----
   A barra do álbum (filtro, seleção, evento inteiro) e a da lista (eventos
   ocultos e o painel "Ver as ocultas"). Nasce do js/fotos.js e só no host de
   edição — o visitante nunca recebe um nó destes, então nada aqui pesa no
   público além dos bytes da folha.

   A SELEÇÃO É UM ANEL ÂMBAR, e não um contorno: a foto oculta já usa o
   `outline` tracejado (`.dayse-hidden`, com !important), e uma foto pode estar
   oculta E selecionada ao mesmo tempo. Âmbar sobre qualquer foto se lê, e é a
   mesma cor da miniatura atual na faixa do visor. */
.fot-adm{display:flex;flex-direction:column;gap:var(--sp-3);text-align:left;
  margin:var(--sp-5) 0;padding:var(--sp-4);border-radius:var(--raio-sm);
  background:var(--petroleo-100);color:var(--tinta)}
.fot-adm[hidden]{display:none}
.fot-adm--lista{margin-bottom:0}
.fot-adm-linha{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.fot-adm-titulo{font:600 1rem var(--font-texto);color:var(--petroleo-800)}
.fot-adm-conta{flex:1 1 auto;font-size:.9rem;font-variant-numeric:tabular-nums}
.fot-adm-sep{flex:1 1 auto}
.fot-adm-n{min-width:10ch;font-variant-numeric:tabular-nums}
.fot-adm-sel{padding-top:var(--sp-3);border-top:1px solid var(--petroleo-200)}
.fot-adm-dica{font-size:.82rem;color:var(--tinta-60)}
.fot-adm-recado{font-size:.88rem;font-weight:600;color:var(--petroleo-800)}
.fot-adm-recado:empty{display:none}
.fot-adm-alerta{display:flex;gap:var(--sp-2);align-items:flex-start;padding:var(--sp-3);
  border-radius:var(--raio-sm);background:var(--branco);border-left:4px solid var(--ambar-500)}
.fot-adm-alerta svg{flex:none}
.fot-adm .btn[disabled]{opacity:.5;cursor:not-allowed}
.fot-adm .btn[aria-pressed="true"],.fot-adm .btn[aria-expanded="true"]{background:var(--petroleo-700);color:var(--branco)}
/* o `.fot-barra` gruda com z-index 3; a de administração rola junto com a
   grade — grudar as duas cobriria meia tela no celular */

.fot-marca{position:absolute;top:8px;left:8px;z-index:2;width:28px;height:28px;border-radius:50%;
  display:grid;place-items:center;border:2px solid var(--branco);
  background:color-mix(in srgb,var(--petroleo-900) 45%,transparent);color:transparent}
.fot-card--sel .fot-marca{background:var(--ambar-500);border-color:var(--ambar-500);color:var(--tinta)}
.fot-card--sel{box-shadow:0 0 0 4px var(--ambar-500)}
.rev-capa-btn[aria-pressed] .rev-lupa{display:none}

.fot-ocultas{display:flex;flex-direction:column;gap:var(--sp-3);max-height:min(70vh,640px);
  overflow:auto;overscroll-behavior:contain;padding:var(--sp-3);border-radius:var(--raio-sm);background:var(--branco)}
.fot-oc-grupo{font:600 .9rem var(--font-texto);color:var(--petroleo-800)}
.fot-oc-linhas{display:flex;flex-direction:column;gap:var(--sp-2)}
.fot-oc-linha{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.fot-oc-linha > span,.fot-oc-cab > .fot-oc-grupo{flex:1 1 12rem}
.fot-oc-cab{margin-top:var(--sp-2)}
.fot-oc-grade{display:grid;grid-template-columns:repeat(auto-fill,minmax(88px,1fr));gap:var(--sp-2)}
.fot-oc-item{position:relative;aspect-ratio:1/1;padding:0;border:0;cursor:pointer;overflow:hidden;
  border-radius:var(--raio-sm);background:var(--petroleo-100);color:var(--tinta);font-size:.7rem}
.fot-oc-item img{display:block;width:100%;height:100%;object-fit:cover;opacity:.55;transition:opacity var(--t-media)}
.fot-oc-item:hover img,.fot-oc-item:focus-visible img{opacity:1}
.fot-oc-item:focus-visible{outline:3px solid var(--petroleo-700);outline-offset:2px}
.fot-oc-olho{position:absolute;right:4px;bottom:4px;width:30px;height:30px;border-radius:50%;
  display:grid;place-items:center;color:var(--branco);
  background:color-mix(in srgb,var(--petroleo-900) 62%,transparent)}
.fot-oc-item:hover .fot-oc-olho,.fot-oc-item:focus-visible .fot-oc-olho{background:var(--turquesa-500);color:var(--tinta)}

/* ---- O ÁLBUM ABERTO: cabeçalho, barra que gruda e o botão que busca ---------
   (25/09/2026, pedido do dono.)

   O CABEÇALHO é o `.section-head` de toda seção, montado com `b` e `span` para
   ficar fora do SEL do modo edição (regra 9). `b` e `span` nascem em linha, e
   o título e o subtítulo de seção são blocos — daí o `display:block`. */
.fot-cab{margin-bottom:var(--sp-5)}
.fot-cab .section-title,.fot-cab .section-sub{display:block}
.fot-cab .section-sub[hidden]{display:none}
/* ABRIR O ÁLBUM ROLA ATÉ O CABEÇALHO DELE, e o `scrollIntoView` não desconta o
   cabeçalho grudento do site: sem isto, o nome do evento abria atrás dele. */
.fot-album{scroll-margin-top:calc(var(--header-h) + var(--azulejo-h) + 12px)}

/* A BARRA GRUDA logo abaixo do cabeçalho do site. O fundo é o da seção
   (`.apoio-sec.alt` é branco): sem ele as miniaturas passariam por trás dos
   botões. A borda só aparece quando a barra está por cima de alguma coisa, e
   isso CSS não sabe — então ela é sutil o bastante para não pesar em repouso. */
.fot-barra{position:sticky;top:calc(var(--header-h) + var(--azulejo-h));z-index:3;
  background:var(--branco);padding-block:var(--sp-2);
  border-bottom:1px solid var(--petroleo-100)}
/* NO CELULAR A BARRA CABE NUMA LINHA SÓ. Medido a 390px: com os dois rótulos
   inteiros, os botões quebravam em duas linhas e a barra tinha 121px — somada
   ao cabeçalho do site (106), um quarto da tela grudado em cima de fotos que a
   pessoa quer ver. O "voltar" fica só com a seta (o nome continua no
   `aria-label` do HTML) e a busca ganha o resto da largura. `font-size:0` e não
   um <span> novo: o botão é um nó que o modo edição numera, e mexer nos filhos
   dele é a regra 4. */
@media (max-width:640px){
  .fot-barra{flex-wrap:nowrap}
  .fot-barra #fotVoltar{font-size:0;gap:0;flex:none;padding-inline:var(--sp-3)}
  .fot-barra #rostosSelfie{flex:1;min-width:0}
  /* O "Atualizar do Flickr" (só no site de edição, docs/94) também fica só com
     o ícone: com rótulo, três botões numa linha que não quebra empurrariam a
     busca para fora da tela. O rótulo VOLTA enquanto há o que dizer
     ("Atualizando…", "Atualizado: 284 fotos"), pela classe `.fala`. */
  .fot-barra #fotRenova{flex:none;padding-inline:var(--sp-3)}
  .fot-barra #fotRenova:not(.fala) span{display:none}
  /* e enquanto ele fala a barra pode quebrar: numa linha só, o recado esmagava
     a busca em 42px de largura (medido). São 5 segundos em duas linhas. */
  .fot-barra:has(#fotRenova.fala){flex-wrap:wrap}
  /* só `wrap` não basta: a busca tem `flex:1` com base 0, então ela "cabe"
     encolhendo e a linha nunca quebra. Pedindo a largura toda, ela desce. */
  .fot-barra:has(#fotRenova.fala) #rostosSelfie{flex-basis:100%}
}

/* ---- A GRADE DE FOTOS (26/09/2026, docs/89 §2 A1) ----------------------------
   O `--min` era 200px inline no HTML, e no celular 200 não cabe duas vezes em
   342: UMA foto por linha, de 330×330. Medido a 390px: 30 fotos faziam a página
   ter 12.292px, e os botões de página moravam em y=10.997. Achar-se num evento
   de 155 fotos era rolar ~60.000px. Galeria de celular mostra 3 por linha, e é
   o que a pessoa já sabe usar.

   A 390px, `--min:96px` com 8px de vão dá 3 colunas de ~109px (4 pediriam 408).

   BAIXAR E ENVIAR SAEM DA MINIATURA no celular: dois discos de 44px cobririam
   uma foto de 109, e o visor que abre no toque já tem os dois (e o link do
   Flickr). O OCULTAR FICA — é a única porta do modo edição para tirar uma foto
   do ar, e um disco só cabe.

   O RESULTADO DA BUSCA (`.fot-achados`) FICA EM DUAS COLUNAS, com as ações: lá o
   cartão leva ao Flickr, e baixar e enviar só existem nele. 167px comportam os
   dois discos (94px) sem cobrir o rosto que a pessoa quer conferir. */
.rev-grade.fot-grade{--min:200px}
@media (max-width:640px){
  .rev-grade.fot-grade{--min:96px;gap:var(--sp-2)}
  .rev-grade.fot-achados{--min:140px}
  .fot-grade .rev-card{border-radius:var(--raio-sm)}
  .fot-grade .rev-lupa{display:none}      /* hover não existe no toque */
  #fotGrade .fot-baixar,#fotGrade .fot-share{display:none}
  .fot-grade .fot-acoes{bottom:4px;right:4px}
  .fot-grade .fot-naosou{top:4px;right:4px}
}

/* O PÉ DA JANELA DO CONSENTIMENTO GRUDA (26/09/2026, docs/89 §2 C1). Medido a
   390px: a caixa tem 675px de altura e o conteúdo 922, e o "Escolher a foto"
   morava em y=935 numa tela de 844. Quem marcava a caixa não via o passo
   seguinte. O texto continua INTEIRO (as decisões sobre ele são do dono,
   docs/63); o que muda é que a caixa e o botão ficam sempre à vista e o texto
   rola por cima deles. A margem negativa leva o fundo branco até a borda da
   caixa, senão o texto apareceria pela fresta do padding. */
/* O `bottom` NEGATIVO É O PADDING DA CAIXA (26/09/2026, visto na captura a
   390px): o `sticky` gruda na borda de DENTRO do padding do rolador, e não na
   borda de verdade. Com `bottom:0` o pé parava 40px acima do fim da caixa, e o
   texto rolava visível por baixo dos botões, na fresta. */
.janela-pe{position:sticky;bottom:calc(-1 * var(--sp-7));z-index:1;background:var(--branco);
  margin:var(--sp-4) calc(-1 * var(--sp-6)) calc(-1 * var(--sp-7));
  padding:var(--sp-3) var(--sp-6) var(--sp-5);border-top:1px solid var(--petroleo-100)}
.janela-pe .rev-card-acoes{margin-top:var(--sp-3)}
/* AS DUAS PORTAS DA BUSCA POR ROSTO são os `.mold-op` da folha da /moldura
   (26/09/2026, docs/90): mesmo desenho, mesmos ícones. Na edição há uma porta
   só (a galeria), e ela ocupa a largura em vez de meia coluna vazia ao lado. */
.janela-pe .mold-folha-ops{margin-top:var(--sp-3)}
.mold-folha-ops.mold-folha-ops--uma{grid-template-columns:1fr}
/* TRAVADO, E NÃO DESLIGADO: o botão ainda recebe o toque (é o toque que faz a
   caixa piscar), mas mostra que falta um passo. */
.mold-op[aria-disabled="true"]{opacity:.55}
/* A CAIXA PISCA EM ÂMBAR quando alguém tenta seguir sem marcar: três pulsos, e
   para. Sem movimento para quem pediu, a caixa fica âmbar parada, que diz a
   mesma coisa sem piscar. */
.check.pisca{animation:check-pisca .5s ease-in-out 3}
@keyframes check-pisca{50%{border-color:var(--ambar-500);
  background:color-mix(in srgb,var(--ambar-500) 24%,var(--branco));
  box-shadow:0 0 0 3px color-mix(in srgb,var(--ambar-500) 45%,transparent)}}
@media (prefers-reduced-motion:reduce){
  .check.pisca{animation:none;border-color:var(--ambar-500);
    background:color-mix(in srgb,var(--ambar-500) 24%,var(--branco))}
}
/* O ÂMBAR DE TEXTO PURO (`--th-laranja-ink`) dá 4,37:1 no branco, medido no
   Chrome: abaixo dos 4,5 que 14px pedem. Um quinto de tinta o leva acima sem
   deixar de ser âmbar. */
.rostos-ciente{margin-top:var(--sp-2);font-size:.9rem;font-weight:650;line-height:1.4;
  color:color-mix(in srgb,var(--th-laranja-ink) 80%,var(--tinta))}
.rostos-ciente[hidden]{display:none}
/* ARRASTAR E COLAR NA JANELA DA BUSCA (docs/93). A dica só existe onde há
   mouse; no celular não há o que arrastar. O contorno âmbar diz "pode soltar
   aqui" enquanto o arquivo passa por cima. */
.rostos-solta-dica{display:none;margin-top:var(--sp-2);font-size:.85rem;color:var(--tinta-60)}
@media (hover:hover) and (pointer:fine){.rostos-solta-dica{display:block}}
/* POR FORA da caixa, e não por dentro: o pé que gruda (`.janela-pe`) tem fundo
   branco e pinta por cima de um contorno interno, que sumia embaixo (visto
   na captura a 1440px). */
.janela-caixa.sobre{outline:3px dashed var(--ambar-500);outline-offset:6px}

/* BUSCANDO: uma faixa verde atravessa o botão, da direita para a esquerda,
   enquanto a varredura corre. O número já estava no rótulo ("Olhando foto 12 de
   263"), mas número parado parece travado quando uma foto demora; o movimento
   diz "está vivo" sem ninguém precisar ler.

   A FAIXA É O `::before`, por baixo do texto: `isolation` faz do botão um
   contexto de empilhamento, e o `z-index:-1` a põe entre o fundo dele e o
   rótulo. Anda por `transform`, que não recalcula layout a cada quadro.

   A COR é o `--verde-acao`, o mesmo verde do "compartilhar" dos cartões, a 38%:
   forte o bastante para se ver sobre o `--petroleo-100` e fraco o bastante
   para o rótulo continuar legível por cima (contraste medido no commit). */
.fot-buscando{position:relative;overflow:hidden;isolation:isolate}
.fot-buscando::before{content:"";position:absolute;top:0;bottom:0;left:0;width:55%;z-index:-1;
  pointer-events:none;
  background:linear-gradient(90deg,transparent,
    color-mix(in srgb,var(--verde-acao) 38%,transparent) 50%,transparent);
  animation:fot-varre 1.8s linear infinite}
@keyframes fot-varre{from{transform:translateX(190%)}to{transform:translateX(-100%)}}
/* SEM MOVIMENTO, a faixa vira um fundo verde parado: o "estou buscando"
   continua dito, só não se mexe. */
@media (prefers-reduced-motion:reduce){
  .fot-buscando::before{animation:none;width:100%;transform:none;
    background:color-mix(in srgb,var(--verde-acao) 22%,transparent)}
}

.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}

/* ---- O CARTÃO FANTASMA e a barra de administração (docs/59) ----------------
   SÓ EXISTEM NO SITE DE EDIÇÃO, mas o CSS carrega nos dois — como o das
   curtidas, ele é inerte sem o script que cria o markup. A trava é a borda não
   servir o js/revistas-admin.js, nunca uma regra de estilo. */
.rev-fantasma{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:var(--sp-2);width:100%;max-width:330px;min-height:220px;cursor:pointer;
  /* tracejado porque ele é um LUGAR onde algo pode nascer, e não um item: a
     borda cheia dos irmãos diria que já existe alguma coisa aqui */
  border:2px dashed var(--petroleo-200);border-radius:var(--raio-lg);
  background:none;color:var(--petroleo-700);font:600 .95rem var(--font-texto)}
.rev-fantasma:hover,.rev-fantasma:focus-visible{border-color:var(--petroleo-600);
  background:rgba(var(--petroleo-700-rgb),.05);color:var(--petroleo-900)}
.rev-fantasma .ico-traco{opacity:.75}

.rev-adm{display:flex;flex-wrap:wrap;gap:var(--sp-1);align-items:center;
  margin-top:var(--sp-2);padding-top:var(--sp-2);border-top:1px dashed var(--petroleo-200)}
.rev-adm-est{flex:1 1 100%;font-size:.72rem;color:var(--tinta-60);letter-spacing:.02em}
.rev-adm .adm-btn{font-size:.78rem;padding:var(--sp-1) var(--sp-3);min-height:32px}
/* 32px e não os 22 que saíam antes: a bateria (vistoria.mjs) mediu os quatro
   botões em 87×22 e 75×22 — abaixo do piso de 24px que ela cobra. É engrenagem
   do site de edição, mas dedo é dedo: quem publica pelo celular clica aqui. */
.rev-adm-perigo{color:var(--magenta-500)}
/* escondida continua na grade DO SITE DE EDIÇÃO, apagada — senão não haveria
   por onde trazê-la de volta. No público ela nem chega a ser desenhada. */
.rev-card--oculta{opacity:.55}

.rev-env{position:fixed;inset:0;z-index:70;display:flex;align-items:center;justify-content:center;
  padding:var(--sp-4);background:rgba(var(--petroleo-900-rgb),.55)}
.rev-env[hidden]{display:none}
.rev-env-cx{width:min(520px,100%);max-height:90vh;overflow:auto;padding:var(--sp-5);
  background:var(--branco);border-radius:var(--raio-lg);box-shadow:var(--sombra-pop);
  display:flex;flex-direction:column;gap:var(--sp-2)}
.rev-env-topo{display:flex;align-items:center;gap:var(--sp-3)}
.rev-env-t{flex:1;font-size:1.05rem;color:var(--petroleo-900)}
.rev-env-x{min-height:44px;padding:var(--sp-2)}
.rev-env-p{margin:0 0 var(--sp-2);font-size:.82rem;line-height:1.45;color:var(--tinta-60)}
.rev-env-rot{font:600 .78rem var(--font-texto);color:var(--tinta-60)}
.rev-env-rot i{font-style:normal;font-weight:400;opacity:.85}
.rev-env-cx input,.rev-env-cx textarea{min-height:44px;padding:var(--sp-2) var(--sp-3);
  border:1px solid var(--petroleo-200);border-radius:var(--raio-sm);
  font:400 .95rem var(--font-texto);color:var(--petroleo-900);background:var(--branco)}
.rev-env-cx textarea{min-height:64px;resize:vertical}
.rev-env-status{margin-top:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-radius:var(--raio-sm);
  font-size:.82rem;line-height:1.4;background:var(--petroleo-100);color:var(--petroleo-800)}
.rev-env-status.ruim{background:color-mix(in srgb,var(--magenta-500) 12%,#fff);color:var(--magenta-500)}
.rev-env-status[hidden]{display:none}
.rev-env-pe{display:flex;flex-wrap:wrap;gap:var(--sp-2);justify-content:flex-end;margin-top:var(--sp-3)}
/* 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%}
}
/* ---- O VISOR DE FOTOS (26/09/2026, docs/91) -------------------------------
   AS SETAS PARADAS: a foto ocupa o vão todo entre elas, centralizada lá
   dentro, e as setas ficam nas bordas do palco. Antes a fileira era
   "seta, foto, seta" centralizada, e as setas colavam na foto: 126px de pulo
   de cada lado entre uma foto em pé e uma deitada, medido a 1440px. No celular
   elas já flutuavam nas bordas (bloco acima). */
.rev-viewer--foto .rev-folhas{flex:1}
/* A FAIXA DE MINIATURAS. `flex:none` para ela nunca ceder altura à foto nem
   tomar mais do que a sua; a rolagem é só lateral. */
.fot-tira{flex:none;display:flex;gap:6px;overflow-x:auto;overscroll-behavior-x:contain;
  padding:0 var(--sp-3) var(--sp-3);scrollbar-width:thin;
  scrollbar-color:rgba(255,255,255,.3) transparent}
.fot-tira:empty{display:none}
.fot-tira-item,.fot-tira-pag{flex:none;width:72px;height:72px;padding:0;cursor:pointer;
  border-radius:var(--raio-sm);transition:opacity var(--t-rapida),border-color var(--t-rapida)}
.fot-tira-item{border:2px solid transparent;overflow:hidden;background:rgba(255,255,255,.08);opacity:.55}
.fot-tira-item img{display:block;width:100%;height:100%;object-fit:cover}
.fot-tira-item:hover,.fot-tira-item:focus-visible{opacity:1}
.fot-tira-item[aria-current="true"]{border-color:var(--ambar-500);opacity:1}
.fot-tira-pag{display:grid;place-items:center;border:1px solid rgba(255,255,255,.28);
  background:rgba(255,255,255,.10);color:var(--branco)}
.fot-tira-pag:hover,.fot-tira-pag:focus-visible{background:var(--ambar-500);color:var(--tinta)}
/* o contador sobe para perto da faixa: os dois dizem onde a pessoa está */
.rev-viewer--foto .rev-conta{padding-bottom:var(--sp-2)}
@media(max-width:640px){
  .fot-tira-item,.fot-tira-pag{width:56px;height:56px}
  .fot-tira{padding:0 var(--sp-2) var(--sp-2)}
}

/* 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 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)}
/* LINK EM PROSA. O reset global é `a{color:inherit;text-decoration:none}`, então
   link só aparece onde uma regra de contexto o pinta — e esta é ela. Entraram
   em 24/08/2026 o acordeão da /privacidade e a caixa de consentimento da
   /apoiar: num texto que a LGPD exige que seja compreensível, um link que não
   parece link é um link que ninguém abre. */
/* `.section-sub a` entrou em 04/09/2026 pelo MESMO motivo medido que trouxe
   `.faq-a a` e `.check a` para cá (docs/55 §5): o reset global é
   `a{color:inherit;text-decoration:none}`, então link em prosa NÃO PARECE
   LINK até uma regra de contexto o pintar. O painel de consentimento da
   busca por rosto tem o link da política de privacidade — e um link para a
   informação que a lei manda dar não pode ser invisível (docs/61). */
.post-article a,.faq-a a,.check a,.section-sub 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. (O `.footer-mail` saiu do site
   em 23/08/2026 junto com o e-mail da Câmara — docs/51 §4. A medida fica no
   registro porque é dela que sai a régua dos outros.)

   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-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,
  .post-share-bar .psb-share{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}}

/* ---- AS DAYSES RECORTADAS DO RODAPÉ ---------------------------------------
   Um coração por recortada, DENTRO da recortada — cada foto tem a sua curtida,
   como toda foto de carrossel do site (docs/40 §2.2). Some junto com ela na
   troca, porque some com o slide inteiro.

   ATÉ 24/08/2026 O BOTÃO MORAVA NA SEÇÃO, e o comentário que estava aqui dizia
   que ele acompanhava a foto "de graça", lendo o mesmo `--dayse-x`. NÃO LIA: o
   botão era filho do `.cta` e o `--dayse-x` é escrito na `.cta-dayse`, que é
   IRMÃ dele — variável de irmão não se herda, então o `calc()` sempre caiu no
   `0px` do padrão. Medido no ar antes de mexer, a 1440px: recortada em
   672..1033, coração em 1354..1426. 321px de distância entre a foto e a
   curtida dela. Dentro do slide, `right`/`bottom` são da própria foto e a
   promessa passa a ser verdade. */
.curtir--recorte{position:absolute;z-index:3;bottom:14px;right:14px;
  --curtir-fundo:#fff;color:var(--petroleo-900);box-shadow:0 6px 18px rgba(var(--tinta-rgb),.28)}
/* NO CELULAR O CORAÇÃO VAI PARA A ESQUERDA DA RECORTADA, e não é gosto: no
   mobile o slot sangra 12% para fora da tela (`right:-12%`) e a `.cta` é
   `overflow:hidden`. Com o coração à direita da foto ele caía FORA — medido a
   390px: 393..427 na 1 e 417..451 na 2, com a tela terminando em 390. Os dois
   recortados, invisíveis, sem erro nenhum no console. À esquerda da foto ele
   volta para dentro (243..277 e 214..248) e continua em cima dela. */
@media(max-width:720px){.curtir--recorte{left:10px;right:auto;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}

/* ============================================================
   /links — A PÁGINA DA BIO (27/08/2026)
   ============================================================
   Substituta do Linktree. O porquê da página está no `buildLinks()` do
   functions/_middleware.js; aqui fica só a forma.

   POR QUE BOTÃO BRANCO SOBRE O FUNDO ESCURO, e não a pílula translúcida que
   todo link-in-bio usa: o contraste do texto do site sobre o papel é medido e
   conhecido (--tinta no --papel, 14,64:1), enquanto o translúcido faria o
   contraste depender do AZULEJO que estiver por baixo — e a opacidade do
   azulejo é editável pelo gabinete no menu da engrenagem. Contraste de página
   pública não pode ser refém de um controle que alguém arrasta.

   O fundo e o azulejo são os MESMOS do CTA (mesma receita, mesmas variáveis):
   a página segue a cor do site sem saber que cor é essa. */
.lk-wrap{position:relative;isolation:isolate;overflow:hidden;min-height:100dvh;
  display:flex;flex-direction:column;align-items:center;gap:var(--sp-7);
  padding:var(--sp-9) var(--sp-5) var(--sp-7);color:#fff;
  /* O DEGRADÊ PASSOU A SER EDITÁVEL em 11/09/2026 — as variáveis e o porquê
     estão no bloco `.lk-bg`, logo abaixo. SEM NENHUMA DELAS ESCRITA ele é o
     degradê de sempre, e não por sorte: `color-mix(in srgb, X 0%, Y)` devolve
     Y, e o fallback de cada `var()` é o próprio degrau que ali já estava. */
  background:radial-gradient(120% 100% at 50% -20%, var(--fundo-1),
    color-mix(in srgb, var(--lk-bg-2,var(--fundo-2)) var(--lk-bg-p1,0%), var(--fundo-2)) var(--lk-bg-ponto,55%),
    color-mix(in srgb, var(--lk-bg-2,var(--fundo-3)) var(--lk-bg-p2,0%), var(--fundo-3)));
  --az-img:var(--az-src-bg);--az-blend:var(--az-cta-blend);--az-op:var(--az-cta-op);
  /* O `--az-rows` é o ÚNICO do azulejo que esta página não herda do CTA, e o
     motivo é medido: a camada é `100% / rows` repetida, então um `rows`
     FRACIONÁRIO (1.5, o do CTA) deixa uma fileira pela metade — e a emenda dela
     virou uma risca horizontal atravessando a página a 410px, visível na
     captura de 1440x900 em 27/08/2026. Inteiro divide certo e a emenda some.
     Blend e opacidade continuam vindo do painel da engrenagem. */
  --az-rows:3}
.lk-wrap::before{z-index:0}
/* a coluna: tudo o que é filho direto nasce estreito e centrado */
.lk-wrap > *{position:relative;z-index:2;width:100%;max-width:520px}

/* ------------------------------------------------------------------
   O FUNDO EDITÁVEL DA BIO (11/09/2026)
   ------------------------------------------------------------------
   *"vamos ter a opção de escolher o bg, controlar cores, degradê e o cobogó"*.
   Quem escolhe é o painel /gerenciar-links; quem sanea e escreve é o
   public/js/bio-html.js (`classeFundo` e `estiloFundo`). Aqui está só o
   desenho — e o que NÃO está escrito no HTML continua valendo o de sempre,
   pelos padrões dentro de cada `var()`.

   POR QUE A COR DA BASE É CLASSE e o resto é variável: cor sai de token (regra 2
   do CLAUDE.md), e nome de token dentro do HTML seria a cor escapando do
   sistema. Os números — mistura, ponto da virada, opacidade, fileiras — não são
   cor: são régua, e régua não tem lista fechada para virar classe.

   A RECEITA DOS TRÊS DEGRAUS (78% e 44% com preto) É A MESMA DO `:root`, e esta
   é a ÚNICA segunda cópia dela no projeto. Ela existe porque `--fundo-2` e
   `--fundo-3` são substituídos no `:root`, onde foram declarados: trocar
   `--fundo-1` aqui embaixo não os recalcularia, e a página sairia com o topo de
   uma cor e a base de outra. Os dois pares são cobrados juntos pelo
   tools/teste-links.mjs — mudar um e esquecer o outro quebra o portão, não a
   página no ar. */
.lk-wrap.lk-bg{--fundo-1:var(--lk-bg-base);
  --fundo-2:color-mix(in srgb,var(--lk-bg-base) 78%,#000);
  --fundo-3:color-mix(in srgb,var(--lk-bg-base) 44%,#000)}
/* A BASE. Só entram degraus em que o texto BRANCO da bio (nome, apresentação e
   a linha legal do pé) passa com folga: 7,75:1 no petróleo e 15,50:1 na noite.
   Sem classe, a página segue a cor do site — que é o desenho de 27/08 e continua
   sendo o padrão. */
.lk-bg--petroleo{--lk-bg-base:var(--petroleo-700)}
.lk-bg--noite{--lk-bg-base:var(--petroleo-900)}
/* O CALOR que sobe pela base. Não é a cor do fundo: é o quanto dela se mistura
   ao degrau, e quem diz o quanto são o `--lk-bg-p1` (meio) e o `--lk-bg-p2`
   (base) que o módulo escreve. O âmbar vem do `--realce`, e não do
   `--ambar-500`, para o calor da bio seguir o destaque do site (⚙️ → Cores) em
   vez de fixar uma segunda cor de destaque. */
.lk-bg2--ambar{--lk-bg-2:var(--realce)}
.lk-bg2--turquesa{--lk-bg-2:var(--turquesa-500)}
.lk-bg2--magenta{--lk-bg-2:var(--magenta-500)}

.lk-topo{display:flex;flex-direction:column;align-items:center;gap:var(--sp-3);text-align:center}
.lk-foto{width:132px;height:132px;border-radius:50%;object-fit:cover;
  border:3px solid var(--realce);box-shadow:0 10px 30px rgba(0,0,0,.30)}
.lk-nome{font-size:clamp(1.7rem,7vw,2.3rem);text-transform:uppercase;font-weight:700}
/* mesmo tratamento do .cta-kicker: Oswald, caixa-alta, realce claro (4,79:1) */
.lk-papel{font-family:var(--font-titulo);text-transform:uppercase;letter-spacing:.16em;
  font-size:.78rem;color:var(--realce-claro)}
.lk-bio{font-size:.95rem;line-height:1.55;color:rgba(255,255,255,.9);text-wrap:pretty}
.lk-social{margin-top:var(--sp-1)}
/* COMPARTILHAR A BIO (11/09/2026) — pílula de contorno, e não mais um bloco da
   lista. A lista É a página; este é um gesto SOBRE a página, então ele mora no
   `.lk-topo`, junto da identidade, e veste contorno em vez de fundo cheio para
   não disputar com os links que existem para ser clicados.

   `width:auto` porque o `.lk-wrap > *` põe 100% em todo filho direto — este não
   é filho direto, mas o `.lk-topo` é flex-column com `align-items:center`, e
   deixar explícito poupa a próxima pessoa de descobrir isso no navegador.

   44px de altura mínima é a régua de alvo do docs/16.

   O VÉU É PRETO, E ISSO FOI MEDIDO — nasceu branco a 8%, que é o reflexo de
   quem desenha sobre fundo escuro, e reprovou. O chão aqui não é uma cor: é o
   cobogó, que vai de rgb(49,91,104) a rgb(79,125,137) debaixo do botão (lido
   pixel a pixel na captura, 176 mil amostras, 11/09/2026). Clarear o ponto
   MAIS CLARO derrubava o rótulo branco a 3,93:1 — abaixo do 4,5 de texto
   normal, e este rótulo é 12,5px, então é texto normal mesmo em caixa-alta.
   Escurecendo 24%, o pior caso sobe a 6,93:1 e o melhor a 10,28:1.

   A BORDA é componente gráfico (limiar 3): branco a 38% dava 2,96:1 contra o
   próprio fundo do botão — passava raspando por baixo. A 50% dá 3,57:1. */
.lk-share{display:inline-flex;align-items:center;gap:var(--sp-2);
  width:auto;margin-top:var(--sp-1);padding:10px var(--sp-4);min-height:44px;
  border:1.5px solid rgba(255,255,255,.5);border-radius:var(--raio-pill);
  background:rgba(0,0,0,.24);color:#fff;cursor:pointer;
  font-family:var(--font-titulo);text-transform:uppercase;letter-spacing:.1em;
  font-size:.78rem;font-weight:600;
  transition:background .16s ease,border-color .16s ease}
/* o hover ESCURECE mais e acende a borda: muda de estado sem nunca piorar o
   contraste, que é o que clarear faria neste chão */
.lk-share:hover{background:rgba(0,0,0,.34);border-color:rgba(255,255,255,.78)}
@media (prefers-reduced-motion:reduce){ .lk-share{transition:none} }

/* ------------------------------------------------------------------
   A BANDEJA DE COMPARTILHAR DA BIO (12/09/2026)
   ------------------------------------------------------------------
   *"deve abrir a opção de compartilhar diretamente pelo wpp e o de copiar o
   link e compartilhar pelo DM"*.

   ELA MORA NO `<body>`, e isso é mecânica, não gosto: o `.lk-wrap` é
   `overflow:hidden` e o `.lk-bloco` ganha `transform` no hover — um dos dois
   cortaria a bandeja, e o `transform` ainda prenderia um `position:fixed` dentro
   do card. No corpo, ela não depende de nenhum dos dois.

   UMA BANDEJA SÓ, reposicionada a cada abertura. Uma por bloco seria uma dúzia
   de menus escondidos numa página que é uma lista de links — é o desenho que o
   main.js já usa no resto do site. */
.lk-bandeja{position:fixed;z-index:60;min-width:212px;padding:var(--sp-2);
  background:var(--branco);border-radius:var(--raio-md);
  box-shadow:0 18px 44px rgba(0,0,0,.34),0 0 0 1px rgba(0,0,0,.08);
  display:flex;flex-direction:column;gap:2px}
.lk-bandeja-item{display:flex;align-items:center;gap:var(--sp-3);width:100%;
  min-height:44px;padding:var(--sp-2) var(--sp-3);border:0;border-radius:var(--raio-sm);
  background:none;color:var(--tinta);cursor:pointer;text-align:left;
  font:400 .92rem var(--font-texto);text-decoration:none}
.lk-bandeja-item:hover{background:var(--petroleo-100)}
.lk-bandeja-item:focus-visible{outline:2px solid var(--turquesa-400);outline-offset:-2px}
.lk-bandeja-item svg{width:20px;height:20px;flex:none}
/* o glifo do WhatsApp é de marca: vem preenchido, nunca em traço (regra 1 do
   CLAUDE.md e o defeito de 02/09 — `.ico-traco` nele vira mancha vazia) */
.lk-bandeja-item .lk-ico--cheio{fill:currentColor;stroke:none;color:var(--petroleo-700)}
.lk-bandeja-item .ico-traco{color:var(--petroleo-700)}

/* ------------------------------------------------------------------
   A BOLHA DE COMPARTILHAR NO BLOCO (12/09/2026)
   ------------------------------------------------------------------
   *"deve aparecer um botãozinho redondo de compartilhar metade fora metade
   dentro do card"*.

   POR QUE O EMBRULHO EXISTE, e não é preferência: o bloco é um `<a>` e a bolha é
   um `<button>` — botão dentro de link é HTML inválido (o portão cobra) —, e
   bloco com cobogó ou arte tem `overflow:hidden`, que CORTARIA a metade de fora.
   O `.lk-bloco` é só uma caixa posicionada: não pinta nada.

   O HOVER MUDA DE DONO. O card sobe 2px no hover; com a bolha irmã, ele subiria
   e ela ficaria para trás. Aqui quem sobe é o embrulho inteiro, e o `transform`
   do filho é desligado para os dois não somarem.

   ONDE ELA FICA É MEDIDO (390px, no ar): sobram 20px entre o bloco e a borda da
   página, e a bolha de 36px sai 18 — cabe com 2px de folga. Mas o vão entre os
   DOIS LADRILHOS da fileira é de 12px: uma bolha no canto interno invadiria o
   vizinho em 6px e roubaria o clique dele. Por isso, na fileira, ela vai no
   canto EXTERNO de cada ladrilho — nunca entra no vão. */
.lk-bloco{position:relative;display:block}
.lk-bloco:has(> a:hover),.lk-bloco:has(> a:focus-visible){transform:translateY(-2px)}
.lk-bloco:has(> a:hover) > a,.lk-bloco:has(> a:focus-visible) > a{transform:none}
.lk-bolha{position:absolute;top:0;right:0;transform:translate(50%,-50%);
  width:36px;height:36px;display:flex;align-items:center;justify-content:center;
  border:0;border-radius:50%;cursor:pointer;padding:0;
  background:var(--branco);color:var(--petroleo-700);
  box-shadow:0 2px 10px rgba(0,0,0,.28),0 0 0 1px rgba(0,0,0,.10);
  transition:background .16s ease}
/* O ALVO DE TOQUE É 44, O DESENHO É 36 (docs/16): a bolha não pode engordar sem
   comer o canto do card, então quem cresce é a área invisível em volta. */
.lk-bolha::before{content:"";position:absolute;inset:-4px;border-radius:50%}
.lk-bolha:hover{background:var(--petroleo-100)}
.lk-bolha:focus-visible{outline:2px solid var(--turquesa-300);outline-offset:2px}
/* NA FILEIRA DE DOIS, cada bolha foge para o lado de fora — o vão do meio tem
   12px e não cabe nenhuma das duas. O `:not(:last-child)` é o ladrilho
   SOLITÁRIO: sozinho ele fica centrado na fileira, não tem vizinho para invadir,
   e a bolha dele volta ao canto direito como em todo o resto da página. */
.lk-duo .lk-bloco:first-child:not(:last-child) .lk-bolha{right:auto;left:0;transform:translate(-50%,-50%)}
@media (prefers-reduced-motion:reduce){
  .lk-bloco:has(> a:hover),.lk-bolha{transition:none;transform:none}
  .lk-bolha{transform:translate(50%,-50%)}
  .lk-duo .lk-bloco:first-child:not(:last-child) .lk-bolha{transform:translate(-50%,-50%)}
}
/* o ladrilho embrulhado tem de continuar ocupando a célula inteira da grade */
.lk-duo .lk-bloco{height:100%}
.lk-duo .lk-bloco > a{height:100%}

.lk-lista{display:flex;flex-direction:column;gap:var(--sp-2)}
/* 64px de altura mínima: a régua de alvo do docs/16 pede 44, e aqui o dedo vem
   de um aplicativo de rede social, com a mão em movimento. */
.lk-item{display:flex;align-items:center;gap:var(--sp-4);min-height:56px;
  padding:var(--sp-3) var(--sp-5);background:var(--branco);color:var(--tinta);
  border-radius:var(--raio-md);box-shadow:var(--sombra-card);text-decoration:none;
  transition:transform .18s,box-shadow .18s}
.lk-item:hover,.lk-item:focus-visible{transform:translateY(-2px);box-shadow:0 12px 30px rgba(0,0,0,.28)}
.lk-ico{flex:none;color:var(--petroleo-700)}
/* O GLIFO CHEIO da bio (WhatsApp, Instagram…): a lista do KV pode apontar para
   qualquer ícone do sprite, e os de rede são desenhos PREENCHIDOS, não de traço.
   Vestir `.ico-traco` neles dava contorno duplo (medido em 02/09/2026, docs/60
   §4) — o inverso da mancha sólida da regra 1. Quem escolhe a classe é o
   `buildLinks()` do _middleware.js, pela lista ICONES_CHEIOS. */
.lk-ico--cheio{fill:currentColor;stroke:none}
.lk-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.lk-rot{font-family:var(--font-titulo);font-size:1.02rem;line-height:1.18;letter-spacing:.01em}
.lk-sub{font-size:.8rem;line-height:1.35;color:var(--tinta-60)}
.lk-seta{flex:none;color:var(--tinta-60)}

/* A MOLDURA E O ZAP DA BIO (09/09/2026) — as duas ações que a /links existe para
   provocar deixaram de ser linha de lista. Não há desenho novo aqui: as peças
   são as MESMAS do site (`.mold-chamada` da /apoiar e o `.btn.btn-cta` do CTA),
   e estas duas regras só as encaixam na coluna da bio.
   O `margin-bottom` do cartão existe porque o `.mold-chamada-btn` é absoluto e
   vaza 45% da própria altura ABAIXO da foto: sem folga, ele cobriria o botão
   seguinte da lista.
   E o `align-self` porque a peça traz do site uma largura própria — no celular
   ela vale `min(280px,84%)` —, e numa coluna flex isso a encostava na ESQUERDA:
   medido, o cartão terminava em 300px e todo o resto da lista em 370. O
   `justify-self:center` que ela já tem não vale aqui: em contêiner flex quem
   manda no eixo transversal é o `align-self`. */
.lk-moldura{align-self:center;margin-bottom:var(--sp-6)}
/* NO TOPO ela é o retrato da página, e o que vem embaixo é o NOME em caixa-alta
   grande: 16px entre o pill e o <h1> ficava apertado (medido). Aqui a peça pede
   mais ar que na lista. */
.lk-topo .lk-moldura{margin-bottom:var(--sp-7)}
/* O rótulo do pill vem do KV: quem escreve é o painel, e ninguém lá sabe quantos
   pixels cabem. Medido em 09/09/2026 com "Personalize sua foto de perfil": o
   pill dá 272px e, num aparelho de 320, sobravam 4px até a borda da lista. O
   teto amarra o pill ao cartão (o `.mold-chamada` é o pai posicionado), então
   rótulo comprido quebra linha DENTRO da peça em vez de vazar a tela. */
.lk-moldura .mold-chamada-btn{max-width:100%}

/* O CARTÃO DA BUSCA POR ROSTO (09/09/2026) — o retrato em círculo sobre
   turquesa, que é o desenho do que a /fotos faz: você se acha pelo rosto.
   Cor tirada da referência com conta-gotas (#146F86) e trazida para o token
   mais próximo da rampa, como manda a regra 2. O anel é CSS, não bitmap:
   nítido em qualquer densidade de tela, e a foto é a MESMA que o topo da
   página já carregou. */
.lk-fotos{display:flex;flex-direction:column;align-items:center;text-align:center;
  gap:var(--sp-2);padding:var(--sp-4) var(--sp-4) var(--sp-3);
  background:var(--petroleo-600);color:var(--branco);border-radius:var(--raio-md);
  box-shadow:var(--sombra-card);text-decoration:none;
  transition:transform .18s,box-shadow .18s}
.lk-fotos:hover,.lk-fotos:focus-visible{transform:translateY(-2px);box-shadow:0 12px 30px rgba(0,0,0,.28)}
.lk-fotos-foto{width:84px;height:84px;border-radius:50%;object-fit:cover;
  border:3px solid var(--turquesa-300);box-shadow:0 8px 22px rgba(0,0,0,.28)}
.lk-fotos-rot{font-family:var(--font-titulo);font-size:1.08rem;line-height:1.18;letter-spacing:.01em}
/* BRANCO CHEIO, e não branco a 90%. A primeira versão usava .9 para dar
   hierarquia — e a medição derrubou: branco a 90% sobre o `--petroleo-600` dá
   **4,28:1** a 13,44px, abaixo do mínimo de 4,5 da AA. Em branco cheio são
   4,89:1, os mesmos do rótulo. A hierarquia fica por tamanho e família (17,28px
   em Oswald contra 13,44px no texto), que não custa contraste. */
.lk-fotos-sub{font-size:.84rem;line-height:1.4;color:var(--branco)}
/* O `.lk-zap` (pill amarelo de largura inteira) viveu algumas horas em
   09/09/2026 e saiu: o zap virou ladrilho quadrado, ao lado do grupo de
   concurso. Ficou o registro para quem procurar a classe no histórico. */

/* OS LADRILHOS DE WHATSAPP, LADO A LADO (09/09/2026). A fileira é grid de duas
   colunas iguais — não flex — porque o que se quer aqui é que os dois tenham a
   MESMA largura mesmo com rótulos de tamanhos diferentes ("Me chama no zap" e
   "Grupo de estudos — concurso"): em flex, o texto maior puxaria a caixa. */
.lk-duo{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-3)}
/* LADRILHO SOZINHO fica do MESMO tamanho, mas centralizado: encostado à
   esquerda com metade da linha vazia parecia defeito (medido na captura). É o
   caso do registro padrão, em que os dois zaps não são vizinhos. */
.lk-duo > :only-child{grid-column:1/-1;justify-self:center;width:calc(50% - var(--sp-3) / 2)}
.lk-quad{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:var(--sp-2);aspect-ratio:4/3;padding:var(--sp-3);text-align:center;
  background:var(--branco);color:var(--tinta);border-radius:var(--raio-md);
  box-shadow:var(--sombra-card);text-decoration:none;
  transition:transform .18s,box-shadow .18s}
.lk-quad:hover,.lk-quad:focus-visible{transform:translateY(-2px);box-shadow:0 12px 30px rgba(0,0,0,.28)}
/* O DIRETO é o botão de ação da página; o grupo é ladrilho claro. Um CTA por
   tela — dois amarelos lado a lado disputariam entre si. */
.lk-quad--cta{background:var(--realce);color:var(--realce-ink,var(--tinta))}
.lk-quad-ico{flex:none;color:var(--petroleo-700)}
.lk-quad--cta .lk-quad-ico{color:inherit}
.lk-quad-rot{font-family:var(--font-titulo);font-size:.98rem;line-height:1.16;text-wrap:balance}
.lk-quad-sub{font-size:.78rem;line-height:1.35;color:var(--tinta-60)}
.lk-quad--cta .lk-quad-sub{color:inherit;opacity:.85}

/* A COR DE CADA BLOCO (09/09/2026) — três da rampa, e só três. Quem escolhe é o
   painel, e cor livre na mão de quem não mede contraste é texto branco sobre
   amarelo na bio da campanha. Cada par abaixo tem contraste MEDIDO no navegador
   (docs/58); nome de token, nunca hex (regra 2).

   `color:inherit` nos filhos é o que faz a peça inteira virar: sem isso, a
   linha de apoio ficaria no cinza `--tinta-60` — 2,1:1 sobre o petróleo, um
   texto que existe e não se lê. */
.lk-cor--turquesa{--lk-fundo:var(--petroleo-600);background:var(--petroleo-600);color:var(--branco)}
.lk-cor--petroleo{--lk-fundo:var(--petroleo-800);background:var(--petroleo-800);color:var(--branco)}
.lk-cor--ambar{--lk-fundo:var(--realce);background:var(--realce);color:var(--realce-ink,var(--tinta))}
.lk-cor--turquesa .lk-sub,.lk-cor--petroleo .lk-sub,.lk-cor--ambar .lk-sub,
.lk-cor--turquesa .lk-quad-sub,.lk-cor--petroleo .lk-quad-sub,.lk-cor--ambar .lk-quad-sub,
.lk-cor--turquesa .lk-fotos-sub,.lk-cor--petroleo .lk-fotos-sub,.lk-cor--ambar .lk-fotos-sub,
.lk-cor--turquesa .lk-ico,.lk-cor--petroleo .lk-ico,.lk-cor--ambar .lk-ico,
.lk-cor--turquesa .lk-quad-ico,.lk-cor--petroleo .lk-quad-ico,.lk-cor--ambar .lk-quad-ico,
.lk-cor--turquesa .lk-seta,.lk-cor--petroleo .lk-seta,.lk-cor--ambar .lk-seta{color:inherit}

/* O SELO "NOVO" (09/09/2026) — âmbar com tinta escura, o par de 7,87:1 já medido
   para a cor de bloco. Ele fica sobre QUALQUER dos quatro fundos, então precisa
   de contraste próprio, e não herdado: por isso a cor é declarada aqui e o
   `color:inherit` das cores de bloco não o alcança (a regra dele é mais
   específica). Caixa-alta e Oswald, como todo rótulo curto desta casa. */
.lk-novo{display:inline-block;margin-left:.5em;vertical-align:middle;
  background:var(--realce);color:var(--realce-ink,var(--tinta));
  font-family:var(--font-titulo);font-size:.62rem;letter-spacing:.08em;
  text-transform:uppercase;line-height:1;padding:.32em .55em;border-radius:var(--raio-pill)}
/* No ladrilho o rótulo já é centralizado e curto: o selo entra embaixo, não ao
   lado, senão empurra a quebra de linha para o meio da palavra. */
.lk-quad-rot .lk-novo{display:block;margin:.4em auto 0;width:fit-content}

/* O CARROSSEL DO ÁLBUM (11/09/2026) — as fotos preenchem o cartão de cima a
   baixo e ANDAM para a esquerda, com o texto por cima de um degradê que sobe da
   base. Nasceu mosaico parado de manhã e virou carrossel na mesma tarde; o que
   move está logo abaixo, em `.lk-fotos-trilho`.
   Substituiu a tira que rolava no dedo (09/09/2026), e a troca pagou duas
   dívidas de uma vez: a tira obrigava o texto a morar FORA dela, num terceiro
   link, porque arrastar dentro de um <a> dispara o link no toque. Sem rolagem,
   o cartão é um alvo só.

   ALTURA POR PROPORÇÃO, e não em px: cada foto ocupa um terço da largura, então
   amarrar a altura em pixel daria recorte diferente em cada largura de tela. A
   2/1 o telefone de 390px dá 119x179 por foto — retrato, que é como se enquadra
   gente. Os degraus da página esticam isso, e aqui a altura muda o DESENHO (o
   quanto de foto sobra acima do texto), como nos ladrilhos.

   O VÉU É `::after` e não um elemento: um <span> vazio só para escurecer seria
   markup sem conteúdo, e o `pathId` do modo edição conta filhos (regra 4). */
.lk-fotos--album{position:relative;isolation:isolate;display:flex;
  flex-direction:column;justify-content:flex-end;align-items:stretch;
  gap:0;padding:0;overflow:hidden;aspect-ratio:2/1;
  /* é o que dá sentido ao `cqw` das fotos: elas medem ESTE cartão */
  container-type:inline-size}
/* O TRILHO ANDA SOZINHO (11/09/2026, a pedido: "isso é um carrossel, ele deve
   se mover"). Sem JavaScript nenhum — a bio não carrega main.js (docs/58) —,
   então quem move é `@keyframes` sobre `transform`, que roda no compositor e
   não força recálculo de layout a cada quadro.

   POR QUE A LISTA VAI DUAS VEZES no HTML: o trilho anda até -50% da própria
   largura, e nesse ponto a foto N+1 está exatamente onde a foto 1 começou — a
   volta reinicia sem emenda visível. Com uma cópia só, o fim da fila chegaria à
   tela e o salto apareceria.

   NADA ENTRE AS FOTOS — elas se encostam, e a conta da volta fica exata:
   largura 2N*foto, metade N*foto, que é onde a foto N+1 começa. Conferido em
   11/09 no pixel: vão fracionado 0,0000px entre todas, e na captura a cor passa
   de uma foto para a outra sem nenhuma linha clara no meio.

   SE UM DIA ALGUÉM QUISER VÃO DE VOLTA, o aviso fica: com `gap` a largura é
   2N*foto + (2N-1)*vão, e metade disso cai MEIO VÃO adiante da foto N+1 — a
   volta ganha um tranco que ninguém sabe explicar. O jeito certo é `margin-right`
   em TODAS as fotos (2N*(foto+vão), metade N*(foto+vão)), nunca `gap`.

   A LARGURA DA FOTO SAI DO CARTÃO, EM `cqw`, e a primeira tentativa errou: pôr
   `aspect-ratio:3/4` sobre `height:100%` PARECE resolver e não resolve — num
   item de flex a base é `width:auto`, que num <img> cai na largura INTRÍNSECA.
   Medido em 11/09: a foto saiu com 320px (o `width` do atributo) em vez dos 131
   esperados, e o cartão de 350px mostrava pouco mais de UMA foto. Porcentagem
   comum também não serve: o trilho é `max-content`, então % ali mede o trilho e
   não o cartão. `cqw` mede o CARTÃO, que é o que se quer — daí o
   `container-type` nele. 37,5cqw dá 131px num telefone de 390px, ~2,6 à vista.
   Os degraus mais altos pedem foto mais larga, senão o recorte vira uma fresta.

   A DURAÇÃO ACOMPANHA A CONTAGEM (`--lk-n`, que o módulo escreve no `style`):
   4,5s por foto. Com duração fixa, um álbum de três andaria na metade da
   velocidade de um de oito, e a mesma página teria dois ritmos sem motivo. */
.lk-fotos-trilho{position:absolute;top:0;left:0;bottom:0;z-index:0;
  display:flex;width:max-content;
  animation:lk-desliza calc(var(--lk-n,6) * 4.5s) linear infinite}
/* `min-width:0` NÃO É ENFEITE, e custou duas medições. Num item de flex o
   mínimo automático é o tamanho do CONTEÚDO, e num <img> isso vira a largura
   transferida da altura pela proporção natural do arquivo — ela VENCE o
   `flex-basis`. Medido: basis 131,25px, largura real 200,7px, e o cartão de
   350px mostrava uma foto e meia em vez de 2,6. Com `min-width:0` a base manda.

   SEM VÃO NENHUM entre as fotos (11/09/2026, a pedido: "queremos elas
   grudadas"). Havia 2px de `margin-right`, e tirá-los ainda simplificou a conta
   da volta: a largura do trilho vira 2N*foto e a metade, N*foto — exatamente
   onde a foto N+1 começa, sem o meio vão que o `gap` deixava sobrando. */
.lk-fotos-quadro{flex:0 0 37.5cqw;min-width:0;height:100%;object-fit:cover;
  display:block}
.lk-wrap--media .lk-fotos-quadro{flex-basis:44cqw}
.lk-wrap--folgada .lk-fotos-quadro{flex-basis:50cqw}
@keyframes lk-desliza{from{transform:translate3d(0,0,0)}
  to{transform:translate3d(-50%,0,0)}}
/* NÃO PAUSA NO HOVER (retirado em 11/09/2026, a pedido). Tinha-se posto por
   cortesia — "deixa quem quer olhar, olhar" —, e a decisão é do gabinete: o
   cartão é vitrine, e vitrine que congela quando o ponteiro passa por cima
   parece travada. O único freio que fica é o de acessibilidade, logo abaixo,
   que é preferência declarada por quem lê e não acidente de mouse. */
/* E PARA DE VEZ PARA QUEM PEDIU MENOS MOVIMENTO. Animação infinita é o caso de
   manual do `prefers-reduced-motion`: para quem tem enxaqueca vestibular ou
   transtorno de atenção, uma faixa que nunca para não é enfeite, é obstáculo.
   As fotos continuam todas lá — o que sai é o movimento. */
@media (prefers-reduced-motion:reduce){.lk-fotos-trilho{animation:none}}
/* O DEGRADÊ SOBE DA BASE. As paradas não são gosto — saíram de medição, e a
   primeira tentativa reprovou. O texto vive nos ~40% de baixo, e é lá que o véu
   precisa estar quase opaco para o branco ter contraste sobre QUALQUER foto,
   inclusive uma BRANCA, que é o pior caso possível e foi com ela que se mediu.

   Medido em 11/09/2026 na /links renderizada, com o texto escondido para o pixel
   ser fundo e não glifo (com o texto na tela mede-se o branco da letra):

                       coluna 390px      coluna 520px
     paradas .86/24%   rótulo  5,40:1    rótulo 10,60:1   ← reprovado no telefone
     paradas .88/40%   rótulo 10,79:1    rótulo 11,98:1   ← o que está aqui
                       subtít 12,16:1    subtít 12,71:1

   Os 5,40:1 passavam na AA (4,5) e mesmo assim saíram: era o elo mais fraco da
   página justamente no telefone, que é onde a bio vive. Acima de 64% o véu abre
   depressa — senão o mosaico vira um retângulo escuro e não há por que ter
   foto. */
.lk-fotos--album::after{content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(to top,
    rgba(var(--petroleo-900-rgb),.95) 0%,
    rgba(var(--petroleo-900-rgb),.88) 40%,
    rgba(var(--petroleo-900-rgb),.45) 64%,
    rgba(var(--petroleo-900-rgb),0) 100%)}
.lk-fotos-texto{position:relative;z-index:2;display:flex;align-items:center;
  justify-content:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4) var(--sp-4);
  text-align:center}
.lk-fotos-dizeres{display:flex;flex-direction:column;gap:2px;min-width:0}
/* O ÍCONE DO CARTÃO DE FOTOS (11/09/2026) — ele era a única forma sem ícone, e o
   motivo era histórico: nasceu com o retrato redondo no lugar. Branco cheio, que
   é a cor do texto que o acompanha (o véu embaixo foi medido para isso). */
.lk-fotos-ico{flex:none;color:var(--branco)}

/* O ALINHAMENTO DO CONTEÚDO (11/09/2026) — *"devemos poder escolher se a
   informação é alinhada à esquerda ou centralizada"*. O padrão é por FORMA (ver
   `alinhaPadrao` no bio-html.js) e só o desvio escreve classe.
   No cartão de fotos, alinhar à esquerda muda também o EIXO: o ícone sai de
   cima do texto e vai para o lado dele, que é o desenho das linhas. */
.lk-fotos.lk-al--esq .lk-fotos-texto{justify-content:flex-start;text-align:left}
.lk-fotos.lk-al--centro .lk-fotos-texto{justify-content:center;text-align:center}
.lk-quad.lk-al--esq{align-items:flex-start;text-align:left}
.lk-quad.lk-al--esq .lk-quad-rot{text-wrap:pretty}
.lk-item.lk-al--centro .lk-txt{text-align:center}
/* centralizar a LINHA é centralizar o texto entre o ícone e a seta — os dois
   continuam nas pontas, porque são pistas de leitura e não conteúdo */
/* OS DEGRAUS PRECISAM DE TRÊS CLASSES, e não de duas — e a primeira versão desta
   regra parou no meio do caminho. Ela subiu de `.lk-fotos--album` (0,1,0) para
   `.lk-wrap--media .lk-fotos--album` (0,2,0) achando que empate resolvido era
   briga ganha: o degrau genérico `.lk-wrap--media .lk-fotos` também vale 0,2,0 e
   mora ABAIXO no arquivo, então era ELE que vencia.

   MEDIDO em 11/09/2026, no cartão renderizado a 390px:

     compacta  350x175  padding 0
     média     350x197  padding 20px 20px 16px 20px   ← a moldura branca que
     folgada   350x233  padding 24px 20px 20px 20px      esta regra existe para impedir

   Ou seja: nos dois degraus de cima o mosaico ganhava 20px de borda branca e as
   fotos encolhiam de 350 para 310 de trilho. Ninguém tinha visto porque o
   registro publicado está em `compacta`, o padrão — o defeito só apareceria no
   dia em que o gabinete subisse um degrau. Com a terceira classe a ordem do
   arquivo deixa de decidir, que é a única correção que não volta a quebrar
   quando alguém mover um bloco de lugar. */
.lk-wrap--media .lk-fotos.lk-fotos--album{aspect-ratio:16/9;padding:0}
.lk-wrap--folgada .lk-fotos.lk-fotos--album{aspect-ratio:3/2;padding:0}

/* A ALTURA DA PÁGINA, EM TRÊS DEGRAUS (09/09/2026) — quem escolhe é o painel,
   pelo campo `altura` do perfil. O pedido foi "está muito alto sem necessidade",
   então o PADRÃO é o compacto e ele não ganha classe: os números acima já são
   os dele, e as duas classes abaixo só afrouxam.

   Os ladrilhos merecem uma nota. Eles nasceram QUADRADOS a pedido, e quadrado
   perfeito é alto: a meia-largura de 169px vira 169px de altura. No compacto
   eles ficam 4/3 (~127px); quem quiser o quadrado exato de volta escolhe
   **média**. É a única escolha da página em que a altura muda o desenho, e não
   só o respiro — por isso está escrito aqui e no docs/58.

   A régua de 44px do alvo de toque (docs/16) continua respeitada no degrau mais
   apertado: 56px de altura mínima na linha comum. */
.lk-wrap--media .lk-lista{gap:var(--sp-3)}
.lk-wrap--media .lk-item{min-height:64px;padding:var(--sp-4) var(--sp-5)}
.lk-wrap--media .lk-quad{aspect-ratio:1/1;padding:var(--sp-4)}
.lk-wrap--media .lk-fotos{padding:var(--sp-5) var(--sp-5) var(--sp-4)}
.lk-wrap--media .lk-fotos-foto{width:96px;height:96px}

.lk-wrap--folgada .lk-lista{gap:var(--sp-4)}
.lk-wrap--folgada .lk-item{min-height:72px;padding:var(--sp-5)}
.lk-wrap--folgada .lk-quad{aspect-ratio:1/1;padding:var(--sp-5)}
.lk-wrap--folgada .lk-fotos{padding:var(--sp-6) var(--sp-5) var(--sp-5)}
.lk-wrap--folgada .lk-fotos-foto{width:104px;height:104px}

/* A ALTURA DE UM BLOCO SÓ (11/09/2026) — o degrau de cima veste a lista
   inteira; aqui cada bloco escolhe a sua, no SLIDER da gaveta (a pedido do
   dono, no mesmo dia em que isto nasceu como lista de três degraus: "quero que
   apareça um slider").

   A MEDIDA VEM NO `--lk-alt`, e a classe `.lk-alt` é só o interruptor. O número
   é saneado no módulo compartilhado e limitado entre 44px (alvo de toque do
   docs/16) e 280px (o que ainda cabe num telefone de 390x844 sem empurrar o
   vizinho para fora da primeira dobra) — a régua limitada é o que substitui a
   lista fechada.

   ELE VENCE O DEGRAU DA PÁGINA, e é por isso que cada seletor traz DUAS
   classes: o da página é `.lk-wrap--media .lk-item` (0,2,0), e uma classe só
   perderia — o bloco escolhido não mudaria de altura, calado. Com o empate, a
   ORDEM decide, e este bloco está abaixo daquele de propósito. É a mesma
   armadilha que o `.lk-fotos--album` já tinha documentado aqui em cima.

   `min-height` NA LINHA E NO RETRATO, `height` NO LADRILHO E NO CARROSSEL. Não
   é gosto: linha e retrato têm texto que pode quebrar em duas — com `height` o
   rótulo vazaria a caixa no dia em que alguém escrevesse um apoio comprido. O
   preço é honesto e está no doc: numa linha cheia de texto a régua só encolhe
   até onde o texto deixa. Já o ladrilho e o carrossel são caixas de recorte,
   onde a altura escolhida é a altura, ponto.

   `padding-block` MÍNIMO em vez do padding do degrau da página: quem manda na
   altura agora é a régua, e o conteúdo já se centra sozinho (`align-items` nas
   três formas). Padding grande aqui só brigaria com o número escolhido.

   `aspect-ratio:auto` APAGA A PROPORÇÃO do ladrilho e do carrossel: sem isso a
   proporção continua valendo como altura mínima e a régua não consegue baixar.

   LADRILHO VIZINHO: com altura DEFINIDA cada um vale a sua (o `stretch` do grid
   só age em altura automática), então a fileira passa a ter dois ladrilhos de
   alturas diferentes, alinhados pelo topo. Antes, com proporção, o par andava
   junto. */
.lk-item.lk-alt{min-height:var(--lk-alt);padding-block:var(--sp-1)}
.lk-quad.lk-alt{aspect-ratio:auto;height:var(--lk-alt);padding-block:var(--sp-2)}
/* O `:not(.lk-fotos--album)` separa as DUAS caras do cartão de fotos: o retrato
   em círculo tem padding e foto redonda; o carrossel é sangrado, com padding
   ZERO — sem esta exceção a régua daria 8px de moldura branca em volta do
   mosaico, que é justamente o que o cartão do álbum não pode ter.
   E o retrato PRECISA se centrar: numa caixa mais alta que o conteúdo, uma
   coluna flex encosta tudo no topo e sobra um vão branco embaixo. */
.lk-fotos:not(.lk-fotos--album).lk-alt{min-height:var(--lk-alt);padding-block:var(--sp-2);
  justify-content:center}
/* O RETRATO EM CÍRCULO ACOMPANHA A RÉGUA, ou o slider não faz nada neste cartão:
   medido antes desta linha, ele travava em 155px (foto de 84 + duas linhas de
   texto) e ignorava tudo abaixo disso. O `.48` não é arbitrário — a 175px, que
   é a altura do cartão no padrão, ele devolve exatamente os 84px de hoje. O
   `clamp` guarda os dois extremos: 40px ainda é um retrato reconhecível, e 132
   é o tamanho da foto do TOPO da página, que este cartão não deve ultrapassar.
   O chão do cartão continua existindo (~100px: foto de 40 mais as duas linhas),
   porque texto não encolhe — está no docs/58. */
.lk-fotos:not(.lk-fotos--album).lk-alt .lk-fotos-foto{
  width:clamp(40px, calc(var(--lk-alt) * .48), 132px);
  height:clamp(40px, calc(var(--lk-alt) * .48), 132px)}
/* NO CARROSSEL A ALTURA MUDA O DESENHO: ela decide quanto de foto sobra acima
   do texto. E A LARGURA DA FOTO ACOMPANHA A ALTURA ESCOLHIDA, ou o recorte
   deixa de ser retrato — 3/4 é o enquadramento de gente, e o `calc` o mantém em
   QUALQUER ponto da régua (a 175px dá 131 de largura, que é exatamente o que os
   37,5cqw davam no padrão). */
.lk-fotos.lk-fotos--album.lk-alt{aspect-ratio:auto;height:var(--lk-alt)}
.lk-fotos.lk-fotos--album.lk-alt .lk-fotos-quadro{flex-basis:calc(var(--lk-alt) * .75)}

/* ---- O ENFEITE DO BLOCO (11/09/2026) --------------------------------------
   Dois pedidos do gabinete, no mesmo minuto: *"o bloco do site deve ter uma
   linha de cobogó com fade da esquerda para direita"* e *"o bloco da HQ Sinais
   deve ter essa imagem em fade da direita para esquerda"*. Quem escolhe é o
   campo "Enfeite do bloco" da gaveta — o CSS é que diz o que cada nome pinta.

   O FADE É MÁSCARA, e não opacidade nem degradê por cima. Degradê por cima
   pintaria a cor do cartão em cima do enfeite e obrigaria a saber qual é ela (e
   o bloco pode ser branco, turquesa, petróleo ou âmbar, pelo campo Cor).
   Máscara apaga o ENFEITE, e o fundo do cartão continua sendo o que for.

   `overflow:hidden` no cartão porque os dois enfeites sangram até a borda e o
   cartão tem canto arredondado; `isolation:isolate` para o z-index deles não
   subir e passar por cima do que vier depois na lista. E o conteúdo do botão
   ganha `position:relative`, ou ele fica DEBAIXO do enfeite: elemento
   posicionado pinta depois do que está em fluxo normal. */
.lk-item.lk-enf,.lk-item.lk-arte{position:relative;overflow:hidden;isolation:isolate}
/* `:not(.lk-cobogo)` NÃO É ENFEITE DE SELETOR, e custou uma medição: sem ele
   esta regra (0,2,0) vence o `position:absolute` do `.lk-cobogo` (0,1,0), a
   faixa volta para o fluxo e o bloco sai com 836px de altura em vez de 63 —
   doze ladrilhos empilhados dentro do botão. */
.lk-item.lk-enf > :not(.lk-cobogo),.lk-item.lk-arte > :not(.lk-cobogo){position:relative;z-index:1}

/* A LINHA DE COBOGÓ, sumindo para a DIREITA. São os ladrilhos do SPRITE — a
   mesma peça da faixa e do menu —, então eles vestem as cores que o gabinete
   publica (`--az-cor-c*`) sem uma segunda cópia da marca em arquivo.

   A OPACIDADE É MEDIDA, não escolhida: o rótulo do botão passa POR CIMA do
   trecho mais forte da faixa, e a régua do docs/01 é 4,5:1 para texto normal.
   Ver o número na medição de 11/09/2026 no docs/58.

   `align-items:center` e ladrilho quadrado de no máximo 56px: em bloco baixo o
   ladrilho encolhe até a altura disponível; em bloco alto ele para de crescer e
   vira uma LINHA no meio do cartão, que foi o que se pediu — e não um papel de
   parede cobrindo tudo. */
/* O COBOGÓ OBEDECE ÀS MESMAS RÉGUAS DA ARTE (11/09/2026, a pedido: *"mas eu
   quero poder editar a imagem dos cobogós"*). Enfeite é enfeite: opacidade,
   tamanho, fade e lado saem dos mesmos campos do painel e das mesmas variáveis.
   O que muda são os PADRÕES DE FÁBRICA, que estão nos `var(…, x)` daqui: 26% de
   opacidade (a 34% a linha de apoio reprovava — 3,87:1, medido) e fade em 70%.
   O meio da rampa acompanha por `calc`, em 49% do caminho, que é a proporção da
   curva original (34 de 70).

   O TAMANHO CHEGA SEM UNIDADE e multiplica o lado do ladrilho: 1 = os 56px de
   fábrica, 2,6 = 145px. Na arte a mesma variável multiplica uma porcentagem —
   por isso ela viaja como número puro, que serve aos dois.

   POSIÇÃO NÃO VALE AQUI: um padrão que se repete e preenche o bloco não tem
   "onde". O painel desliga as duas réguas no cobogó, em vez de fingir. */
.lk-cobogo{position:absolute;inset:0;z-index:0;display:flex;align-items:center;
  pointer-events:none;opacity:var(--lk-arte-op,.26);
  -webkit-mask-image:linear-gradient(var(--lk-arte-fim,to right),#000 0%,
    rgba(0,0,0,.55) calc(var(--lk-arte-fade,70%) * .49),transparent var(--lk-arte-fade,70%));
  mask-image:linear-gradient(var(--lk-arte-fim,to right),#000 0%,
    rgba(0,0,0,.55) calc(var(--lk-arte-fade,70%) * .49),transparent var(--lk-arte-fade,70%))}
/* a âncora acompanha o lado do fade: o padrão encosta no lado de onde ele sai */
.lk-item.lk-arte--esq .lk-cobogo{justify-content:flex-start}
.lk-item.lk-arte--dir .lk-cobogo{justify-content:flex-end}
.lk-cobogo-az{flex:none;aspect-ratio:1;
  height:min(100%,calc(56px * var(--lk-arte-zoom,1)));
  width:min(100%,calc(56px * var(--lk-arte-zoom,1)))}

/* A IMAGEM EM FADE — QUALQUER ARTE, EM QUALQUER BLOCO (11/09/2026)
   *"coloque essa mecânica de colocar uma imagem em fade nos blocos como mais um
   recurso do editar"*. Nasceu chumbada numa classe (`.lk-enf--hq`, a arte da
   revista) e durou uma hora: quem escolhe a arte é o painel, pelo caminho dela
   no site, e o CSS só sabe DESENHAR — a imagem chega na variável `--lk-arte`.

   `auto 100%` E NÃO `cover`, e a captura é que decidiu: com `cover` um bloco de
   63px mostra uma FATIA de 63px de um quadro de 268 — na arte da HQ apareceu o
   ombro do rapaz e mais nada, sem os dois rostos que são o quadro. Com
   `auto 100%` o quadro INTEIRO cabe na altura do bloco (a 63px ele mede 132 de
   largura; a 120px, 250), e quem corta é a largura, que aqui é decoração. Quem
   quiser ver a arte maior sobe a régua da altura — os dois controles se
   somam de propósito.

   A MÁSCARA APAGA OS DOIS EXTREMOS, e a captura é que pediu o segundo. A
   primeira versão empurrava a arte 40px para dentro (`right 40px`) para livrar
   a seta — e o resultado foi um CORTE VERTICAL nítido no meio do cartão, porque
   ali a máscara ainda está opaca e o que aparece é a borda do arquivo. Agora a
   arte sangra até a borda e quem a apaga é a máscara: transparente nos
   primeiros 13% (a seta, ~45px num cartão de 350), opaca no miolo e sumindo
   até 62%. Do lado esquerdo o vizinho é o ícone e a conta dá 15%. Duas pontas
   suaves, nenhuma linha reta, e os dois desenhos de traço sobre cartão limpo.

   A MÁSCARA VAI FUNDO (58%) porque arte é escura e colorida com frequência: ela
   tem de sumir ANTES de chegar ao texto, ou o rótulo cai em cima da imagem. Os
   números saíram da medição de contraste do docs/58, não do olho. */
/* AS QUATRO RÉGUAS DA ARTE (11/09/2026) — *"quero ter mais controle da posição e
   opacidade da imagem"*. Cada `var()` aqui tem o padrão de FÁBRICA no fallback,
   que é o desenho de antes delas existirem: opacidade .6, tamanho encaixado na
   altura do bloco (100%), vertical no meio e horizontal encostada no lado do
   fade. Quem não mexer em nada não ganha variável nenhuma no HTML.

   O PADRÃO DO ⇄ MORA NAS DUAS REGRAS DE LADO, e não no módulo: é a única das
   quatro cujo valor de fábrica depende de outra escolha (o lado), e resolver
   isso no CSS evita o módulo ter de escrever a variável sempre só para dizer
   "encostada". */
/* `inset:0 -1px` — UM PIXEL PARA FORA DE CADA LADO, e o `overflow:hidden` do
   cartão corta. É seguro contra a fresta de arredondamento: a arte é escalada
   por porcentagem (`auto <zoom>%`), então a largura dela cai em pixel FRACIONÁRIO
   com frequência, e a última coluna vira uma mistura da arte com o fundo do
   cartão — uma risca clara de meio pixel, que é exatamente o tipo de coisa que
   só aparece na captura ampliada (docs/32). Não muda o enquadramento: 1px num
   cartão de 350 é 0,3%. */
.lk-item.lk-arte::after{content:"";position:absolute;inset:0 -1px;z-index:0;
  pointer-events:none;background-image:var(--lk-arte);opacity:var(--lk-arte-op,.6);
  background-repeat:no-repeat;background-size:auto calc(var(--lk-arte-zoom,1) * 100%);
  background-position-y:var(--lk-arte-y,50%);
  /* A ARTE ENCOSTA NA BORDA (11/09/2026, a pedido: *"veja como não consigo
     preencher o canto direito e inferior com a imagem"*). Duas causas, e as
     duas foram consertadas juntas:
       · o CANTO era a máscara: ela começava TRANSPARENTE e só ficava opaca aos
         13%, para livrar a seta. Livrava a seta e deixava o canto vazio. Agora
         começa opaca, e quem livra a seta é o halo dela, logo abaixo;
       · o RODAPÉ era o ARQUIVO: o recorte da página 15 levava junto a margem de
         PAPEL da revista — 9 linhas embaixo e 17 colunas à direita, medidas com
         brilho médio 253 de 255. Nenhum CSS preencheria aquilo, porque o branco
         fazia parte da imagem. O recorte novo (539x254) para na tinta.
     O PONTO EM QUE ELA SOME é régua do painel (`--lk-arte-fade`, padrão 62%, que
     é o número que estava chumbado aqui). O meio da rampa acompanha por `calc`,
     em 42% do caminho — a proporção da curva original. */
  -webkit-mask-image:linear-gradient(var(--lk-arte-fim,to left),#000 0%,
    rgba(0,0,0,.72) calc(var(--lk-arte-fade,62%) * .42),transparent var(--lk-arte-fade,62%));
  mask-image:linear-gradient(var(--lk-arte-fim,to left),#000 0%,
    rgba(0,0,0,.72) calc(var(--lk-arte-fade,62%) * .42),transparent var(--lk-arte-fade,62%))}
/* O HALO DOS DESENHOS DE TRAÇO sobre a arte. Com a arte encostando na borda, a
   seta (e o ícone, no fade à esquerda) passou a viver sobre imagem — e traço
   cinza sobre foto é o par que some. O halo é a COR DO PRÓPRIO CARTÃO, não
   branco fixo: em bloco turquesa ou petróleo um halo branco seria um borrão.
   Dois `drop-shadow` empilhados porque um só, no raio que não borra o desenho,
   não fecha o contorno inteiro. */
.lk-item.lk-arte .lk-seta,.lk-item.lk-arte .lk-ico{
  filter:drop-shadow(0 0 3px var(--lk-fundo,var(--branco)))
         drop-shadow(0 0 6px var(--lk-fundo,var(--branco)))}
.lk-item.lk-arte--dir{--lk-arte-fim:to left}
.lk-item.lk-arte--esq{--lk-arte-fim:to right}
.lk-item.lk-arte--dir::after{background-position-x:var(--lk-arte-x,100%)}
.lk-item.lk-arte--esq::after{background-position-x:var(--lk-arte-x,0%)}

/* NO BLOCO ENFEITADO A LINHA DE APOIO USA A TINTA CHEIA, e isto veio da
   medição: o `--tinta-60` existe para dar HIERARQUIA e já nasce em 5,60:1 sobre
   branco — a folga inteira dele até o mínimo de 4,5 é de 1,1. Qualquer enfeite
   por baixo come essa folga e o texto reprova: medido em 11/09/2026, o apoio
   caiu a 3,87:1 sobre o cobogó e a 1,00:1 sobre a arte da HQ.
   Trocar a cor devolve 15,64:1 no cartão branco, e o preço — meia hierarquia —
   é o certo a pagar: a hierarquia já está no tamanho e na família da letra.
   O rótulo não entra aqui porque já usa a tinta cheia. */
/* … MAS NÃO NO BLOCO COLORIDO, e isto foi regressão medida no ar (11/09/2026):
   o gabinete pôs a HQ em turquesa, e esta regra (0,3,0) venceu o `color:inherit`
   das cores (0,2,0) — a linha de apoio saiu no `--tinta` ESCURO sobre
   `--petroleo-600`, que é o par que não se lê. Num bloco colorido quem já
   escolheu a cor do texto é a cor do bloco: lá o apoio herda, como sempre. */
.lk-item.lk-arte:not(.lk-cor--turquesa):not(.lk-cor--petroleo):not(.lk-cor--ambar) .lk-sub,
.lk-item.lk-enf:not(.lk-cor--turquesa):not(.lk-cor--petroleo):not(.lk-cor--ambar) .lk-sub{color:var(--tinta)}

/* o pé empurrado para baixo: em tela alta a lista não fica boiando no meio */
.lk-pe{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);
  text-align:center;margin-top:auto;padding-top:var(--sp-7)}

/* ---- PAINEL DOS LINKS DA BIO (/gerenciar-links) ----------------------------
   Veste o vocabulário que o painel de posts já tinha (.adm-row, .adm-btn,
   .field): tela de gerência não inventa componente. O que é próprio daqui é a
   linha de três campos, que é o formato do dado — rótulo, destino e apoio. */
.lkadm-perfil{display:grid;gap:var(--sp-3);grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
  margin-bottom:var(--sp-5)}
.lkadm-larga{grid-column:1/-1}
.lkadm-add{margin-left:auto}
.lkadm-in{width:100%;font:400 .9rem var(--font-texto);color:var(--tinta);
  background:var(--papel);border:1px solid var(--petroleo-100);border-radius:var(--raio-sm);
  padding:var(--sp-2) var(--sp-3)}
.lkadm-in:focus-visible{outline:2px solid var(--turquesa-400);outline-offset:1px}
.lkadm-min{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:center}
.lkadm-min .lkadm-in{width:auto;min-width:150px}
.lkadm-acoes{flex:none;display:flex;flex-wrap:wrap;gap:var(--sp-1);align-items:flex-start}
.lkadm-rodape{display:flex;align-items:center;gap:var(--sp-4);margin-top:var(--sp-5)}
/* A SAÍDA DA TRAVA DO CONTRASTE (12/09/2026) — ela é SUTIL de propósito, ao
   lado do Salvar que é o botão cheio: a ação normal continua sendo medir e
   corrigir; esta é a exceção que alguém escolhe. Magenta, que é a cor de aviso
   deste painel, e alvo de 44px como todo botão que o dedo acerta aqui. */
.lkadm-forcar{min-height:44px;color:var(--magenta-500);
  text-decoration:underline;text-underline-offset:3px}
/* o aviso de pendência é ÂMBAR, não vermelho: não é erro, é trabalho não salvo */
.lkadm-sujo{color:var(--realce-forte);font-weight:700}
.lkadm-seta{display:inline-flex;align-items:center;justify-content:center;padding:var(--sp-1) var(--sp-2)}
.lkadm-cima{transform:rotate(180deg)}
/* ---- O PALCO DA LISTA: editar com a cara do resultado (04/09/2026) ---------
   A pedido do dono, "a edição deve ser visualmente igual ao final". Cada item
   deixou de ser três caixas de texto e passou a ser O BOTÃO — montado pelo
   mesmo `DBio.itemHTML` que serve a /links, dentro do mesmo `.lk-wrap` da
   página. Não há CSS de imitação aqui: o que veste o botão é o CSS do ar.

   SÓ SAIU DE GRAÇA PORQUE O BOTÃO NÃO MEDE A JANELA — as duas regras de
   viewport da bio (`min-height:100dvh` no .lk-wrap e `clamp(...,7vw,...)` no
   .lk-nome) são do cartão de PERFIL. Por isso o perfil continua em campos e é a
   miniatura que o mostra fiel. O único desvio do palco está na linha abaixo. */
/* o vão entre itens é MAIOR que o vão entre o botão e as ações dele: sem essa
   diferença a fileira de ações parece pertencer ao botão de baixo */
.lkadm-palco{min-height:0;gap:var(--sp-6);padding:var(--sp-6) var(--sp-5);
  border-radius:var(--raio-md)}
/* `stretch` dito por extenso: a vitrine TEM de ocupar a largura da coluna, como
   o botão ocupa na página. Com o `flex-start` que a linha antiga usava (ícone à
   esquerda, campos ao lado), cada botão encolhia até o próprio texto e a lista
   virava uma escada — medido a 1440 em 04/09/2026: 445, 354, 243, 232… */
.lkadm-row{display:flex;flex-direction:column;align-items:stretch;gap:var(--sp-2)}
/* o que não vai ao ar continua NA TELA de quem administra, e apagado — some só
   da página (e da miniatura), que é o que o visitante recebe */
.lkadm-row.is-hidden{opacity:.66}
.lkadm-acoes{display:flex;flex-wrap:wrap;gap:var(--sp-1);align-items:center;
  justify-content:flex-end}
.lkadm-aviso{margin-right:auto;font-size:.74rem;color:rgba(255,255,255,.88)}
.lkadm-acoes .adm-btn{min-height:36px;background:var(--branco)}
/* régua de 44px do docs/16 onde o alvo é dedo (a bio se edita no celular) */
@media (max-width:700px){.lkadm-acoes .adm-btn{min-height:44px}}
.lkadm-gaveta{display:grid;gap:var(--sp-3);background:var(--branco);
  border-radius:var(--raio-sm);padding:var(--sp-4)}
.lkadm-campo{display:flex;flex-direction:column;gap:4px;
  font:600 .72rem var(--font-texto);letter-spacing:.04em;text-transform:uppercase;
  color:var(--tinta-60)}
.lkadm-campo .lkadm-in{text-transform:none;letter-spacing:normal;font-weight:400}
/* A CAIXA DE SELEÇÃO (12/09/2026) — o `.lkadm-campo` é uma COLUNA (etiqueta em
   cima, controle embaixo), e caixa com o rótulo embaixo fica órfã. Aqui a
   direção vira linha, e o alvo de toque é a etiqueta inteira, que é o que o
   `<label>` já dá de graça. */
.lkadm-caixa{flex-direction:row;align-items:center;gap:var(--sp-2);
  min-height:44px;cursor:pointer}
.lkadm-check{width:18px;height:18px;flex:none;accent-color:var(--petroleo-600);margin:0}
/* A RÉGUA DA ALTURA DO BLOCO (11/09/2026) — o controle que substituiu o
   <select> de três degraus, a pedido do dono. Três coisas aqui não são enfeite:

   · `flex:1 1 220px` na etiqueta: na fileira de campos da gaveta (que é flex com
     wrap) um slider estreito é um slider que não se arrasta. 220px é o mínimo em
     que os 60 passos da régua ainda dão ~3,7px de dedo cada;
   · `height:44px` no <input>: é a régua de alvo de toque do docs/16 — a bio se
     edita no celular. O trilho continua fino; o que cresce é a área que o dedo
     acerta, e ela não desenha nada;
   · `accent-color` em vez de desenhar trilho e polegar à mão: o controle nativo
     já é acessível por teclado (setas, Home/End) e o navegador o pinta com o
     token da casa. Reimplementar isso em CSS é a forma mais barata de perder o
     teclado sem perceber. */
/* O NÚMERO FICA AO LADO DA RÉGUA, e não embaixo: medido na captura, embaixo ele
   empurrava o "Some em" para uma linha nova e a gaveta crescia por causa de
   quatro caracteres. Grid de duas colunas, com o rótulo atravessando as duas. */
.lkadm-regua{flex:1 1 260px;display:grid;grid-template-columns:1fr auto;
  align-items:center;column-gap:var(--sp-3);row-gap:2px}
.lkadm-regua-rot{grid-column:1/-1}
.lkadm-slider{width:100%;height:44px;margin:0;accent-color:var(--petroleo-600);
  background:none;border:0}
.lkadm-slider:focus-visible{outline:2px solid var(--turquesa-400);outline-offset:1px}
/* o número ao lado: leitura da régua, em caixa normal (a etiqueta é caixa-alta) */
.lkadm-regua-val{font:400 .78rem var(--font-texto);color:var(--tinta);
  text-transform:none;letter-spacing:normal}
/* a nota que substitui cor e altura na gaveta da moldura — ver o porquê no
   gerenciar-links.js: controle que não move nada é painel mentindo */
.lkadm-nota{flex:1 1 220px;margin:0;font-size:.78rem;color:var(--tinta-60)}
/* a mesma nota DENTRO de um campo (a dica do caminho da imagem): ali ela é
   explicação de campo, não item da fileira — sem esticar e em caixa normal,
   porque a etiqueta em volta é caixa-alta */
.lkadm-campo .lkadm-nota{flex:none;font-size:.72rem;line-height:1.35;
  text-transform:none;letter-spacing:normal;font-weight:400}
/* o campo de caminho ocupa a fileira inteira: endereço cortado pela metade é
   endereço que ninguém confere */
.lkadm-min .lkadm-larga{flex:1 1 100%}
/* OS AJUSTES DA ARTE (11/09/2026) — o lado do fade e as cinco réguas. Eles ficam
   SEMPRE À VISTA e apenas DESLIGAM sem imagem válida, e isso foi correção do
   dono no mesmo dia: *"o menu de edição do bloco do site não está igual ao da
   HQ… o do site está incompleto"*.
   A primeira versão escondia o grupo (com `:has()` + `:placeholder-shown`) e
   estava errada de um jeito que só se vê com dois blocos lado a lado: a gaveta
   de um bloco com arte e a de um sem arte viravam menus DIFERENTES, e o segundo
   parecia quebrado. Quem desliga agora é o JS, pelo mesmo saneamento da
   gravação — e `disabled` de verdade, não só cinza: some do teclado também. */
.lkadm-ajustes{flex:1 1 100%;display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-3);
  padding:var(--sp-3);border:1px dashed var(--petroleo-100);border-radius:var(--raio-sm)}
.lkadm-ajustes.is-off{opacity:.5}
/* o aviso do caminho recusado: âmbar, como todo aviso deste painel — não é erro
   de sistema, é trabalho pela metade */
.lkadm-aviso-arte{display:block;margin-top:4px;color:var(--realce-forte);font-weight:700}
/* ---- O ENVIO E A BIBLIOTECA DE ARTE (11/09/2026) --------------------------
   *"O upload de foto para colocar no card deve ser facilitado."* O botão é um
   `<label>` com o `<input type=file>` ESCONDIDO dentro: o clique no rótulo abre
   o seletor do sistema e o teclado chega nele pelo próprio input — nada de
   reimplementar um seletor de arquivo, que é onde se perdem o arrastar, o
   teclado e o leitor de tela de uma vez. */
.lkadm-envio{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap}
.lkadm-envia{cursor:pointer;min-height:44px;display:inline-flex;align-items:center;
  background:var(--branco)}
.lkadm-envia input[type=file]{position:absolute;width:1px;height:1px;opacity:0;
  overflow:hidden;clip-path:inset(50%)}
/* o foco do input escondido tem de aparecer no rótulo, ou o teclado anda às
   cegas — é a mesma razão do `:focus-visible` das réguas */
.lkadm-envia:has(input:focus-visible){outline:2px solid var(--turquesa-400);outline-offset:1px}
.lkadm-envio-nota{font:400 .78rem var(--font-texto);color:var(--tinta-60);
  text-transform:none;letter-spacing:normal}
/* A TIRA: miniatura quadrada, a mais nova primeiro. Quadrado porque a arte é
   recortada de qualquer jeito no bloco — a miniatura serve para RECONHECER, não
   para enquadrar. */
.lkadm-biblio{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}
.lkadm-biblio-rot{flex:1 1 100%;font:600 .68rem var(--font-texto);letter-spacing:.04em;
  text-transform:uppercase;color:var(--tinta-60)}
.lkadm-biblio-item{position:relative;display:inline-flex}
.lkadm-biblio-usa{width:56px;height:56px;padding:0;border:2px solid transparent;
  border-radius:var(--raio-sm);overflow:hidden;background:var(--papel);cursor:pointer}
.lkadm-biblio-usa img{width:100%;height:100%;object-fit:cover;display:block}
.lkadm-biblio-item.is-atual .lkadm-biblio-usa{border-color:var(--turquesa-400)}
.lkadm-biblio-usa:focus-visible{outline:2px solid var(--turquesa-400);outline-offset:1px}
/* o apagar é pequeno e canto, mas tem alvo de 24px — é destrutivo, e alvo
   grande demais num canto de miniatura vira clique errado */
.lkadm-biblio-apaga{position:absolute;top:-6px;right:-6px;width:24px;height:24px;
  border-radius:50%;border:1px solid var(--petroleo-100);background:var(--branco);
  color:var(--tinta-60);font-size:1rem;line-height:1;cursor:pointer;padding:0}
.lkadm-biblio-apaga:hover{color:var(--magenta-500)}
/* as réguas da arte são curtas e cabem duas por fileira a partir de 560px de
   gaveta; abaixo disso cada uma ocupa a linha, que é o celular */
.lkadm-ajustes .lkadm-regua{flex:1 1 200px}
/* A CAIXA DO FUNDO DA PÁGINA (11/09/2026) — as mesmas peças da gaveta do bloco.
   Só os `<select>` precisam de regra própria: ali eles dividem a fileira com as
   réguas, e sem base nenhuma um "Petróleo — 7,75:1 com o branco" espremia a
   régua vizinha até ela não se arrastar mais. A do bloco continua como estava
   (lá o único select da fileira é o "Lado do fade", e ele cabe no conteúdo). */
.lkadm-ajustes--fundo .lkadm-campo{flex:1 1 210px}
/* A RÉGUA DO FUNDO PEDE MAIS BASE QUE A DO BLOCO, e o número veio da captura:
   com os 200px de lá o slider da força ficava com 83px de trilho — a leitura ao
   lado ("30% na base, 18% no meio") come a coluna `auto` do grid, e o que sobra
   é o que se arrasta. Com 320 o trilho fica em ~300px e duas réguas ainda cabem
   lado a lado numa gaveta de 850. */
.lkadm-ajustes--fundo .lkadm-regua{flex:1 1 320px}
/* OS DOIS BOTÕES DA BIBLIOTECA seguem a régua de 44px do "Enviar imagem…" (e do
   docs/16): o `.adm-btn` cru mede 21px de altura, que é alvo de mouse, não de
   dedo — e a bio se edita no celular. */
.lkadm-bg-acao{min-height:44px;background:var(--branco)}
/* A LEITURA DO CONTRASTE. Tabular porque os três números mudam a cada passo da
   régua e dançariam de largura; magenta quando reprova, que é a cor de aviso
   deste painel — e o texto ao lado diz o que está reprovando, para a mensagem
   não depender só da cor. */
/* `flex:none` porque a `.lkadm-nota` nasce com `flex:1 1 220px` para viver numa
   fileira, e aqui o pai é uma COLUNA: ali os 220px viram ALTURA e o `grow`
   estica a linha de leitura até o fim da caixa. Medido: 586px de corpo com
   ~190px de vazio embaixo, na captura de 1440. */
.lkadm-medida{flex:none;font-variant-numeric:tabular-nums}
.lkadm-reprova{color:var(--magenta-500);font-weight:600}
/* A CAIXA DOBRÁVEL DA IMAGEM (11/09/2026) — ela abre o topo da gaveta, logo
   abaixo da vitrine do bloco, que é o ponto do pedido: arrastar a régua e ver o
   resultado na mesma tela. `<details>` nativo — o triângulo, o teclado e o
   anúncio ao leitor de tela vêm do navegador; o que o CSS faz aqui é só vestir.
   `list-style:none` + `::-webkit-details-marker` porque o triângulo padrão do
   WebKit ignora o primeiro. */
.lkadm-img{border:1px solid var(--petroleo-100);border-radius:var(--raio-sm);
  background:var(--papel)}
.lkadm-img-tit{cursor:pointer;padding:var(--sp-2) var(--sp-3);
  font:600 .72rem var(--font-texto);letter-spacing:.04em;text-transform:uppercase;
  color:var(--tinta-60);display:flex;align-items:center;gap:var(--sp-2);min-height:44px}
.lkadm-img-tit::before{content:"";width:0;height:0;flex:none;
  border-left:6px solid currentColor;border-top:4px solid transparent;
  border-bottom:4px solid transparent;transition:transform .15s}
.lkadm-img[open] .lkadm-img-tit::before{transform:rotate(90deg)}
.lkadm-img-tit::marker{content:""}
.lkadm-img-tit::-webkit-details-marker{display:none}
.lkadm-img-tit:focus-visible{outline:2px solid var(--turquesa-400);outline-offset:-2px}
.lkadm-img-corpo{display:flex;flex-direction:column;gap:var(--sp-3);
  padding:0 var(--sp-3) var(--sp-3)}
@media (prefers-reduced-motion:reduce){.lkadm-img-tit::before{transition:none}}

/* ---- A MINIATURA AO VIVO DA BIO (/gerenciar-links, 04/09/2026) -------------
   Quem edita a bio editava às cegas: o único jeito de ver o resultado era o
   "Ver a página" do topo, que abre o PUBLICADO — não o rascunho da tela.

   A MINIATURA É A PÁGINA DE VERDADE, num <iframe> da mesma origem, e não uma
   maquete. O motivo é medido: o `.lk-wrap` tem `min-height:100dvh` e o
   `.lk-nome` tem `clamp(1.7rem,7vw,2.3rem)` — as duas medidas são do VIEWPORT.
   Numa div escalada por transform a bio sairia com a altura da janela inteira e
   o nome do tamanho da página real; o iframe cria um viewport próprio de 390 e
   resolve os dois SEM tocar no CSS que serve o visitante.

   CABER POR `transform`, NUNCA POR `zoom` — a mesma regra da prova do livreto
   (ver o comentário do `.guia-prova` neste arquivo): `zoom` participa do layout.
   E `transform` NÃO encolhe a caixa: o iframe continua ocupando 390 × altura no
   fluxo. Daí as duas margens negativas, que devolvem o espaço que o desenho já
   não usa — sem elas sobra uma faixa vazia embaixo (e é o erro clássico de
   escalar por transform sem compensar).

   O quadro é `pointer-events:none` de propósito: clicar num botão da miniatura
   navegaria DENTRO dela e trocaria a prévia pela página de destino, com o
   rascunho ainda não salvo. Quem quer abrir de verdade tem o "Ver a página" do
   cabeçalho. A rolagem continua funcionando porque quem rola é a caixa de fora. */
.lkadm-mesa{display:grid;gap:var(--sp-6)}
.lkprev{--lkprev-k:.72}
.lkprev[hidden]{display:none}
.lkprev-topo{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);
  margin-bottom:var(--sp-2)}
.lkprev-rot{font:600 .78rem var(--font-texto);letter-spacing:.06em;text-transform:uppercase;
  color:var(--tinta-60)}
.lkprev-tela{width:281px;height:clamp(360px,calc(100dvh - 280px),608px);
  overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;
  background:var(--branco);border:1px solid var(--petroleo-100);
  border-radius:var(--raio-md);box-shadow:var(--sombra-card)}
.lkprev-quadro{display:block;width:390px;border:0;pointer-events:none;
  transform:scale(var(--lkprev-k));transform-origin:top left;
  /* o que o scale já não ocupa: 390 e a altura do quadro, vezes (k − 1) */
  margin-right:calc(390px * (var(--lkprev-k) - 1));
  margin-bottom:calc(var(--lkprev-alt,844px) * (var(--lkprev-k) - 1))}
.lkprev-nota{margin:var(--sp-2) 0 0;max-width:281px}
.lkprev-abre{display:inline-flex;align-items:center;gap:var(--sp-2);margin-left:auto}
/* RÉGUA DE 44px (docs/16): esta barra é de quem edita a bio PELO CELULAR — a
   "Prévia" e o "Acrescentar link" são os dois alvos de toque dela, e o
   `.btn--sutil` nasce com a altura da linha de texto (20px medidos em
   04/09/2026), que é confortável no mouse e apertado no dedo. Cresce o espaço,
   não a letra — a mesma decisão dos links do rodapé. */
.lkprev-abre,.lkadm-add{min-height:44px;padding:var(--sp-2) var(--sp-4)}
.lkprev-fecha{margin-left:auto}

/* A COLUNA SÓ EXISTE ONDE CABE. 920 (o .adm-wrap) + 300 + o vão dá 1244; a
   partir de 1180 o editor encolhe um pouco e os dois convivem. Abaixo disso a
   prévia vira sobreposição, aberta pelo botão — no celular ela continua
   existindo, que é onde a bio mais é editada. */
@media (min-width:1180px){
  .lkadm-mesa{grid-template-columns:minmax(0,920px) 300px;align-items:start;justify-content:center}
  .lkprev{position:sticky;top:calc(var(--header-h) + var(--sp-4))}
  .lkprev-abre,.lkprev-fecha{display:none}
}

/* A sobreposição das telas estreitas. `position:fixed` e não um modal do zero:
   é a mesma família do .kpi-modal, e o z-index sai do token. */
.lkprev--flutua{position:fixed;inset:auto var(--sp-4) var(--sp-4) auto;z-index:var(--z-toast);
  background:var(--papel);padding:var(--sp-4);border-radius:var(--raio-md);
  box-shadow:var(--sombra-hover);max-width:calc(100vw - var(--sp-6))}

/* O link da privacidade é o único alvo de toque do pé desta página, e ela é
   página de celular: sem isto ele fica com 12px de altura, abaixo do piso de
   24px que a vistoria cobra (WCAG 2.5.8). Cresce o ESPAÇO, não a letra —
   mesma decisão dos links do rodapé do site. */
.lk-pe .footer-legal a{display:inline-block;padding-block:var(--sp-3)}

/* ============================================================================
   O IDLESHOT — o palco do carrossel com trilha (25/09/2026, docs/88)
   ----------------------------------------------------------------------------
   Um palco 16:9 escuro, duas <img> empilhadas que trocam de lugar (é o que faz
   o fade sem quadro preto no meio), a mesma foto desfocada por trás para a
   vertical não virar tarja, e uma barra de controle por baixo.
   Toda cor sai de token (regra 2). O fundo do palco é o --petroleo-900 porque
   é onde o texto branco da capa e da barra mede 15,50:1 — o mais alto da rampa.
   ========================================================================== */
.idl-palco{position:relative;overflow:hidden;aspect-ratio:16/9;max-height:78vh;width:100%;
  margin-inline:auto;border-radius:var(--raio-md);background:var(--petroleo-900);color:var(--branco);
  box-shadow:var(--sombra-hover);isolation:isolate;outline:none;touch-action:pan-y}
.idl-palco:focus-visible{box-shadow:0 0 0 3px var(--turquesa-300),var(--sombra-hover)}
/* no celular em pé, 16:9 deixa a foto do tamanho de um selo */
@media (max-width:640px){ .idl-palco{aspect-ratio:4/5;border-radius:var(--raio-sm)} }

.idl-fundo{position:absolute;inset:-40px;background:center/cover no-repeat;filter:blur(28px) brightness(.55);
  transform:scale(1.1);transition:background-image 1s;z-index:0}
.idl-camadas{position:absolute;inset:0;z-index:1}
.idl-foto{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;opacity:0;
  transition:opacity 1.2s ease;will-change:opacity,transform}
.idl-foto.is-ativa{opacity:1}
.idl-foto:not([src]){visibility:hidden}

/* DESLIZA: a que entra vem da direita; a que sai não se mexe e só apaga. */
.idl-palco[data-transicao="desliza"] .idl-foto{transition:opacity .9s ease,transform .9s cubic-bezier(.2,.7,.2,1);transform:translateX(8%)}
.idl-palco[data-transicao="desliza"] .idl-foto.is-ativa{transform:none}

/* KEN BURNS: um zoom lento durante o tempo da foto, com a origem trocando
   entre quatro cantos. A duração vem do JS (--idl-dur = tempo por foto + a
   transição), para o movimento não parar antes da troca. Desligado quando a
   pessoa pede menos movimento — quem decide isso é o JS, que nem põe a classe. */
.idl--kb .idl-foto.is-ativa{animation:idl-kb var(--idl-dur,7500ms) linear both}
.idl--kb .idl-foto[data-kb="1"]{transform-origin:20% 30%}
.idl--kb .idl-foto[data-kb="2"]{transform-origin:80% 30%}
.idl--kb .idl-foto[data-kb="3"]{transform-origin:70% 75%}
.idl--kb .idl-foto[data-kb="4"]{transform-origin:30% 70%}
@keyframes idl-kb{from{transform:scale(1)}to{transform:scale(1.08)}}

/* A ASSINATURA NO CANTO SUPERIOR ESQUERDO. Acima da capa (z 5) para aparecer
   desde o primeiro quadro. A sombra é o que a segura numa foto clara: o
   branco dela sobre céu ou parede branca some, e com o halo petróleo o
   contorno continua lido. `pointer-events:none` para não roubar o toque de
   quem desliza a foto. A altura cresce com a tela: 18px no celular (a
   assinatura tem 9,5 de largura para 1 de altura, ~170px) e 34px numa TV. */
.idl-marca{position:absolute;top:var(--sp-4);left:var(--sp-4);z-index:5;height:clamp(18px,2.4vw,34px);width:auto;
  pointer-events:none;filter:drop-shadow(0 1px 3px rgba(var(--petroleo-900-rgb),.85)) drop-shadow(0 0 10px rgba(var(--petroleo-900-rgb),.55))}
.idl-telao .idl-marca,.idl-palco:fullscreen .idl-marca,.idl-palco.idl--cheio .idl-marca{top:var(--sp-6);left:var(--sp-6)}

/* O QR NO CANTO SUPERIOR DIREITO, espelhando a assinatura no esquerdo; a
   barra de controles fica embaixo, longe dos dois. O fundo branco com folga é a zona de silêncio que o
   leitor do celular precisa; sem ela, numa foto escura, o QR não lê. O lado
   cresce com a tela: 76px no celular (não cobre o rosto de ninguém num palco
   4:5) e 200px no telão, que é onde ele trabalha. */
.idl-qr{position:absolute;right:var(--sp-4);top:var(--sp-4);z-index:5;
  display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);width:clamp(76px,14vw,200px);pointer-events:none}
.idl-qr img{display:block;width:100%;height:auto;background:var(--branco);padding:6%;border-radius:var(--raio-sm);
  box-shadow:0 2px 12px rgba(var(--petroleo-900-rgb),.55)}
.idl-qr span{font:600 clamp(.62rem,1.3vw,1.05rem)/1.15 var(--font-titulo);text-transform:uppercase;letter-spacing:.03em;
  color:var(--branco);text-align:center;text-shadow:0 1px 3px rgba(var(--petroleo-900-rgb),.9),0 0 10px rgba(var(--petroleo-900-rgb),.6)}
.idl-telao .idl-qr,.idl-palco:fullscreen .idl-qr,.idl-palco.idl--cheio .idl-qr{top:var(--sp-6);right:var(--sp-6)}

/* ---- a capa: o clique que destrava o som ---- */
.idl-capa{position:absolute;inset:0;z-index:3;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:var(--sp-3);padding:var(--sp-6);text-align:center;
  /* O VÉU É QUASE UNIFORME, e a conta é do pior caso — foto toda branca por
     baixo (25/09/2026): com .55 no topo o título branco media 3,68:1 e o
     subtítulo turquesa 2,14:1. A .72 o branco mede 6,30:1; a .88, 11,6:1. */
  background:linear-gradient(180deg,rgba(var(--petroleo-900-rgb),.72),rgba(var(--petroleo-900-rgb),.88));
  transition:opacity var(--t-lenta),visibility var(--t-lenta)}
.idl--comecou .idl-capa{opacity:0;visibility:hidden}
.idl-capa-titulo{font:600 clamp(1.3rem,3.2vw,2.2rem)/1.15 var(--font-titulo);text-transform:uppercase;max-width:28ch}
.idl-capa-sub{font:500 .95rem var(--font-texto);color:var(--branco);min-height:1.2em}
.idl-capa-acoes{display:flex;flex-wrap:wrap;gap:var(--sp-3);justify-content:center;margin-top:var(--sp-3)}
.idl-capa-acoes .btn{min-height:48px;display:inline-flex;align-items:center;gap:var(--sp-2)}
.idl-palco[data-estado="carregando"] .idl-capa-acoes,
.idl-palco[data-estado="vazio"] .idl-capa-acoes,
.idl-palco[data-estado="erro"] .idl-capa-acoes{display:none}

/* ---- a barra de controle ---- */
.idl-barra{position:absolute;left:0;right:0;bottom:0;z-index:2;
  /* o degradê só começa a sumir ACIMA do texto (70%): até ali o véu fica em
     .85 ou mais, onde o branco mede 9,6:1 sobre a foto mais clara possível */
  background:linear-gradient(0deg,rgba(var(--petroleo-900-rgb),.92) 0,rgba(var(--petroleo-900-rgb),.85) 70%,rgba(var(--petroleo-900-rgb),0) 100%);
  padding:var(--sp-7) var(--sp-3) var(--sp-2);transition:opacity var(--t-lenta)}
.idl-palco:not(.idl--comecou) .idl-barra{opacity:0;pointer-events:none}
.idl-progresso{height:3px;background:rgba(255,255,255,.22);border-radius:var(--raio-pill);overflow:hidden;margin:0 var(--sp-2) var(--sp-2)}
.idl-progresso span{display:block;height:100%;background:var(--realce);transform-origin:left;transform:scaleX(0)}
.idl-ctrl{display:flex;align-items:center;gap:var(--sp-1)}
/* RÉGUA DE 44px (docs/16): o palco é de celular também, e é tocado no dedo */
.idl-bt{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;
  background:transparent;border:0;border-radius:var(--raio-pill);color:var(--branco);cursor:pointer}
.idl-bt:hover{background:rgba(255,255,255,.14)}
.idl-bt:focus-visible{outline:2px solid var(--turquesa-300);outline-offset:1px}
.idl-bt[hidden]{display:none}
.idl-info{flex:1;min-width:0;display:flex;flex-direction:column;padding-inline:var(--sp-2);line-height:1.25}
.idl-conta{font:600 .8rem var(--font-texto)}
.idl-faixa{font:400 .78rem var(--font-texto);color:var(--branco);opacity:.85;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.idl-volume{width:90px;accent-color:var(--realce)}
/* NO CELULAR A LEGENDA GANHA LINHA PRÓPRIA. Com seis botões de 44px numa
   barra de 350px sobravam ~40px para ela, e "Foto 1 de 155" quebrava letra por
   letra (medido na captura de 390px em 25/09/2026). O volume sai: no iPhone
   ele é só leitura (quem manda é o botão do aparelho), e no Android o botão
   físico faz o mesmo. */
@media (max-width:640px){
  .idl-volume{display:none}
  .idl-ctrl{flex-wrap:wrap;justify-content:space-between}
  .idl-info{order:-1;flex-basis:100%;padding:0 var(--sp-2) var(--sp-1)}
}

/* ---- sem ninguém mexendo, na tela cheia: a barra e o cursor saem ---- */
.idl--quieto{cursor:none}
.idl--quieto .idl-barra{opacity:0}

.idl-aviso{position:absolute;top:var(--sp-3);left:50%;transform:translateX(-50%);z-index:4;
  background:rgba(var(--petroleo-900-rgb),.9);padding:var(--sp-2) var(--sp-4);border-radius:var(--raio-pill);font-size:.85rem}

/* ---- tela cheia: a da API e o plano B do iPhone (palco fixo) ---- */
.idl-palco:fullscreen{max-height:none;aspect-ratio:auto;border-radius:0;width:100vw;height:100vh}
.idl-palco.idl--cheio{position:fixed;inset:0;z-index:var(--z-toast);max-height:none;aspect-ratio:auto;border-radius:0;width:auto;height:100dvh}

/* ---- o modo telão (?telao): só o palco, a tela inteira ---- */
.idl-telao body > :not(main):not(script),
.idl-telao main > :not(.idl-sec),
.idl-telao .idl-sec .section-head,
.idl-telao .idl-sec .rev-card-meta{display:none}
.idl-telao body,.idl-telao .idl-sec{background:var(--petroleo-900);padding:0;margin:0}
.idl-telao .idl-sec .container{max-width:none;padding:0}
.idl-telao .idl-palco{max-height:none;aspect-ratio:auto;height:100dvh;border-radius:0;box-shadow:none}

/* ---- o painel do Idleshot (só no site de edição, docs/88) ----
   Reaproveita o que o painel da bio já tem (.adm-wrap, .field, .check,
   .btn--sutil, .blog-search); daqui para baixo é só o que não existia: a
   grade de eventos com capa, a linha de música e as notas. */
.idl-painel .section-sub{text-align:center}
.idlp-bloco{margin-top:var(--sp-7);padding-top:var(--sp-6);border-top:1.5px solid var(--petroleo-100)}
.idlp-h{font:600 1.15rem var(--font-titulo);text-transform:uppercase;color:var(--petroleo-800);margin-bottom:var(--sp-4)}
.idlp-sub{display:block;margin:var(--sp-6) 0 var(--sp-3)}
.idlp-nota{font-size:.88rem;color:var(--tinta);background:var(--petroleo-100);border-radius:var(--raio-sm);
  padding:var(--sp-3) var(--sp-4);margin-bottom:var(--sp-4)}
.idlp-aviso{font-weight:600;color:var(--th-laranja-ink);background:color-mix(in srgb,var(--ambar-500) 16%,var(--papel));
  border-radius:var(--raio-sm);padding:var(--sp-3) var(--sp-4);margin-top:var(--sp-5)}
.idlp-escolhido{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-4);color:var(--petroleo-800)}
.idl-painel .blog-search{max-width:520px;margin:0 0 var(--sp-4)}

.idlp-albuns{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:var(--sp-3)}
.idlp-alb{display:flex;flex-direction:column;gap:var(--sp-1);text-align:left;padding:var(--sp-2);cursor:pointer;
  background:var(--branco);border:2px solid var(--petroleo-100);border-radius:var(--raio-sm);font:inherit;color:var(--tinta)}
.idlp-alb:hover{border-color:var(--turquesa-400)}
.idlp-alb.is-escolhido{border-color:var(--petroleo-700);box-shadow:0 0 0 2px var(--petroleo-700)}
.idlp-alb img{width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:8px;background:var(--petroleo-100)}
.idlp-alb-tit{font-size:.8rem;font-weight:600;line-height:1.25}
.idlp-alb-n{font-size:.72rem;color:var(--tinta-60)}
.idlp-linha{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-3);margin-top:var(--sp-3)}

.idlp-envio,.idlp-ajustes{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:var(--sp-4)}
.idlp-larga{grid-column:1/-1}
.idlp-envio .btn,.idlp-acoes .btn{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:44px}
.idlp-ajustes input[type=range]{padding:0;border:0;accent-color:var(--petroleo-700)}

.idlp-lista{display:flex;flex-direction:column;gap:var(--sp-2)}
.idlp-item{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2);padding:var(--sp-3);
  background:var(--branco);border:1.5px solid var(--petroleo-100);border-radius:var(--raio-sm)}
.idlp-num{font:600 1rem var(--font-titulo);color:var(--petroleo-700);min-width:1.5em}
.idlp-txt{flex:1;min-width:180px;display:flex;flex-direction:column;font-size:.85rem;line-height:1.35}
.idlp-txt span{color:var(--tinta-60)}
.idlp-lic{font-size:.78rem}
.idlp-mini{display:inline-flex;align-items:center;gap:var(--sp-1);min-height:40px;min-width:40px;justify-content:center}
.idlp-mini.is-ativo{background:var(--petroleo-700);color:var(--branco)}
/* as setas do sprite são horizontais; na lista, subir e descer */
.idlp-gira svg{transform:rotate(90deg)}
.idlp-vazio{font-size:.88rem;color:var(--tinta-60);padding:var(--sp-3) 0}

.idlp-acoes{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:var(--sp-3);
  margin:var(--sp-7) 0 var(--sp-4);padding-top:var(--sp-5);border-top:1.5px solid var(--petroleo-100)}
.idlp-status{font-size:.85rem;color:var(--petroleo-800);margin-right:auto}
.idlp-status.is-erro{color:var(--th-mulher-ink);font-weight:600}

/* ============================================================
   PÁGINA DAS PROPOSTAS (propostas.html, 28/09/2026, docs/96)
   Tudo sobre tokens que já existem. A cor de cada frente desce da
   própria <section> por `--e`/`--e-ink`, o mesmo par que pinta o
   `.prog` da home: trocar `--th-idade` no :root troca a frente inteira.
   ============================================================ */

/* O RESUMO É O ÍNDICE. Sete ladrilhos, um por frente, com a proposta que
   abre cada uma: quem lê só esta faixa já sabe o que o mandato promete, e
   quem quer o detalhe clica e desce. */
.prop-resumo{display:grid;gap:var(--sp-4);
  grid-template-columns:repeat(auto-fit,minmax(min(100%,230px),1fr))}
.prop-tile{display:grid;align-content:start;gap:var(--sp-2);padding:var(--sp-5);color:inherit;
  background:var(--branco);border-radius:var(--raio-md);box-shadow:var(--sombra-card);
  border-top:4px solid var(--e);
  transition:transform var(--t-media),box-shadow var(--t-media)}
.prop-tile:hover{transform:translateY(-4px);box-shadow:var(--sombra-hover)}
.prop-tile-ico{width:48px;height:48px;border-radius:14px;display:grid;place-items:center;
  background:color-mix(in srgb,var(--e) 15%,white);color:var(--e-ink)}
.prop-tile-nome{font-family:var(--font-titulo);font-weight:700;font-size:1.35rem;
  text-transform:uppercase;letter-spacing:.02em;color:var(--e-ink);line-height:1.05}
.prop-tile-n{font-size:.82rem;font-weight:600;letter-spacing:.04em;color:var(--tinta-60)}
.prop-tile-frase{font-size:.98rem;line-height:1.4;color:var(--petroleo-900)}

/* A BARRA QUE GRUDA. São 47 cartões: sem ela, quem está no meio de Melhor
   Idade e quer Educação rola quatro telas. Gruda logo abaixo do cabeçalho,
   com a mesma conta da `.fot-barra` da /fotos. No celular ela ROLA para o
   lado em vez de quebrar em duas linhas: duas linhas grudadas comeriam um
   pedaço da tela que é dos cartões. */
.prop-barra{position:sticky;top:calc(var(--header-h) + var(--azulejo-h));z-index:3;
  background:var(--branco);border-bottom:1px solid var(--petroleo-100)}
.prop-barra-in{display:flex;gap:var(--sp-2);overflow-x:auto;padding-block:var(--sp-2);
  scrollbar-width:none}
.prop-barra-in::-webkit-scrollbar{display:none}
@media (min-width:1024px){ .prop-barra-in{justify-content:center} }
/* 44px de altura: é a régua de toque do site (docs/08, revisão no celular) */
.prop-barra a{flex:none;display:inline-flex;align-items:center;gap:6px;min-height:44px;
  padding:0 var(--sp-4);border-radius:var(--raio-pill);white-space:nowrap;
  font-weight:600;font-size:.9rem;color:var(--e-ink);
  background:color-mix(in srgb,var(--e) 12%,white);transition:background var(--t-media),color var(--t-media)}
.prop-barra a:hover,.prop-barra a:focus-visible{background:color-mix(in srgb,var(--e-ink) 75%,var(--petroleo-900));color:var(--branco)}
/* A TINTA DO TEXTO PEQUENO ESCURECE UM POUCO. Sobre o fundo tingido, a tinta
   pura do eixo dava 4,48:1 na Saúde e 4,03:1 no Concurso (medido a 1440, no
   pixel renderizado) — abaixo dos 4,5 de texto normal. Puxar 25% para o
   petróleo sobe as duas sem trocar de cor aos olhos. Vale para a barra e
   para o selo do cartão; os títulos são texto grande e já passam. */
.prop-barra a:not(:hover):not(:focus-visible),.prop .tag{color:color-mix(in srgb,var(--e-ink) 75%,var(--petroleo-900))}

/* O pulo da barra para a frente tem de descontar a própria barra, senão o
   título abre escondido atrás dela. `section.` e não só `.prop-eixo`: a regra
   geral `section[id]` tem especificidade (0,1,1) e venceria. */
section.prop-eixo{scroll-margin-top:calc(var(--header-h) + var(--azulejo-h) + 72px)}

/* O CABEÇALHO DE CADA FRENTE: ladrilho cheio na tinta do eixo, título,
   frase e a contagem. A tinta (`--e-ink`) e não a cor cheia porque o
   amarelo do Guará e a lavanda da Melhor Idade não seguram ícone branco. */
.prop-cab{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-4);
  margin-bottom:var(--sp-6);padding-bottom:var(--sp-4);border-bottom:3px solid var(--e)}
.prop-cab-ico{flex:none;width:60px;height:60px;border-radius:16px;display:grid;place-items:center;
  background:var(--e-ink);color:var(--branco)}
.prop-cab-txt{flex:1 1 240px;min-width:0}
.prop-cab-t{font-size:clamp(1.8rem,5vw,2.6rem);text-transform:uppercase;color:var(--e-ink);line-height:1}
.prop-cab-frase{margin-top:var(--sp-1);color:var(--tinta-60);font-size:1.05rem}
.prop-cab-n{flex:none;font-size:.85rem;color:var(--tinta-60);text-align:right}
/* No celular a contagem caía sozinha numa linha abaixo do título (medido a
   390px). O número já está no ladrilho do resumo, lá em cima. */
@media (max-width:599.98px){ .prop-cab-n{display:none} }
.prop-cab-n b{display:block;font-family:var(--font-titulo);font-size:2.4rem;line-height:1;color:var(--e-ink)}

/* Os grupos dentro de uma frente (Saúde e Melhor Idade têm). À esquerda, e
   não ao centro como o `.sub-label` da home: aqui ele é o título de uma
   grade que começa na margem esquerda. */
.prop-grupo{text-align:left;margin:var(--sp-7) 0 var(--sp-3);color:var(--e-ink)}
.prop-cab + .prop-grupo{margin-top:0}
.prop-grid{--min:290px}

/* "COMO VAI FUNCIONAR" — o detalhe fica recolhido. O cartão diz a promessa
   em duas linhas; quem quer saber como ela se cumpre abre. É <details>, que
   funciona sem JavaScript e o leitor de tela já anuncia como expansível.
   Sem `grid-row`: o cartão sem selo deixaria uma linha vazia no meio, e a
   colocação automática já põe o detalhe na primeira linha livre. */
.prop .prop-mais{grid-column:1 / -1;border-top:1px solid color-mix(in srgb,var(--e) 22%,white)}
.prop-mais summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:6px;
  min-height:44px;font-weight:600;font-size:.88rem;color:var(--e-ink)}
.prop-mais summary::-webkit-details-marker{display:none}
.prop-mais-seta{transition:transform var(--t-media)}
.prop-mais[open] .prop-mais-seta{transform:rotate(180deg)}
.prop-mais ul{margin:0 0 var(--sp-2);padding-left:1.1em;display:grid;gap:var(--sp-1)}
.prop-mais li,.prop-mais p{font-size:.92rem;line-height:1.5;color:var(--tinta-60)}
.prop-mais p{margin:0 0 var(--sp-2)}
.prop-mais li::marker{color:var(--e)}
@media (prefers-reduced-motion:reduce){ .prop-tile,.prop-mais-seta{transition:none} }

/* ============================================================
   A COLINHA (colinha.html + js/colinha.js) — 01/10/2026, docs/98
   ------------------------------------------------------------
   Veio de fora com tema próprio (amarelo e ciano sobre preto, Atkinson do
   Google Fonts). Aqui veste a casa: papel, petróleo, o âmbar do realce para o
   40222, Oswald nos números e Campton no texto. Prefixo `col-` em tudo: o site
   já tem `.chip`, `.seg-*`, `.tile`-alguma-coisa, e um nome genérico daqui
   herdaria regra de lá (ou pior, ganharia o "+" do modo edição).

   A coluna é estreita de propósito (600px): é uma ferramenta de celular, e no
   computador uma lista de cargos esticada a 1200px vira linha de planilha.
   ============================================================ */
.col-kicker{font:600 var(--tx-1)/1 var(--font-titulo);letter-spacing:.18em;text-transform:uppercase;
  color:var(--petroleo-700);margin-bottom:var(--sp-2)}
.col-app{max-width:600px;margin-inline:auto;scroll-margin-top:calc(var(--header-h) + var(--azulejo-h) + 12px)}
.col-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.col-app .ico-traco{flex:none}

@keyframes colCela{0%{transform:scale(.6) translateY(4px)}55%{transform:scale(1.1)}to{transform:none}}
@keyframes colCursor{50%{border-color:var(--petroleo-200)}}
@keyframes colDobra{0%{opacity:0;transform:perspective(1200px) rotateX(-80deg) scaleY(.35)}46%{opacity:1;transform:perspective(1200px) rotateX(12deg) scaleY(1.04)}74%{transform:perspective(1200px) rotateX(-4deg)}to{transform:none}}
@keyframes colSobe{0%{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes colTreme{0%,to{transform:none}20%{transform:translateX(-6px)}40%{transform:translateX(5px)}60%{transform:translateX(-3px)}80%{transform:translateX(2px)}}
@keyframes colPisca{to{visibility:hidden}}
@keyframes colSelo{0%{transform:scale(.4) rotate(-12deg);opacity:0}60%{transform:scale(1.08) rotate(3deg);opacity:1}to{transform:none}}

/* ---- progresso e seções ---- */
.col-progresso{display:grid;grid-template-columns:repeat(6,1fr);gap:5px;margin-bottom:var(--sp-2)}
.col-progresso span{height:6px;border-radius:9px;background:var(--petroleo-100);overflow:hidden;position:relative}
.col-progresso span::after{content:"";position:absolute;inset:0;background:var(--petroleo-700);transform:scaleX(0);
  transform-origin:left;transition:transform .38s var(--ease-mola)}
.col-progresso span.ok::after{transform:scaleX(1)}
.col-progresso span.fixo::after{background:var(--realce);transform:scaleX(1)}
.col-secao{display:flex;align-items:center;gap:var(--sp-3);margin:var(--sp-6) 0 var(--sp-3);
  font:600 var(--tx-1)/1 var(--font-titulo);letter-spacing:.16em;text-transform:uppercase;color:var(--tinta-60)}
.col-secao::after{content:"";flex:1;height:1px;background:rgba(var(--tinta-rgb),.12)}

/* ---- o cartão de cada cargo ---- */
.col-cargos{list-style:none;margin:0;padding:0;display:grid;gap:var(--sp-3)}
.col-cargo{background:var(--branco);border:1px solid rgba(var(--tinta-rgb),.12);border-radius:var(--raio-md);
  padding:var(--sp-4);position:relative;box-shadow:var(--sombra-card);animation:colSobe .45s var(--ease-mola) both}
.col-cargo.entrou{animation:colDobra .62s ease-out both}
.col-cargo.erro .col-celas{animation:colTreme .38s ease-out}
.col-cargo-linha{display:flex;align-items:center;gap:10px}
.col-cargo-tit{flex:1;min-width:0;text-align:left;background:none;border:0;padding:0;cursor:pointer;color:inherit;font:inherit}
.col-cargo-tit b{display:block;font:600 1.05rem/1.2 var(--font-titulo);text-transform:uppercase;letter-spacing:.02em;color:var(--petroleo-800)}
.col-cargo-tit small{display:block;margin-top:4px;font-size:var(--tx-2);color:var(--tinta-60)}
.col-celas{position:relative;display:flex;gap:5px;flex:none;cursor:text;border-radius:10px}
.col-celas-vis{display:contents}
.col-cela{width:30px;height:42px;border:1.5px dashed var(--turquesa-400);border-radius:9px;display:grid;place-items:center;
  font:700 1.4rem/1 var(--font-titulo);color:var(--tinta);transition:border-color var(--t-rapida),background var(--t-rapida)}
.col-cela.cheia{border-style:solid;border-color:var(--petroleo-200);background:var(--papel)}
.col-cela.pop{animation:colCela .32s ease-out}
.col-celas:focus-within .col-cela.atual{border-style:solid;border-color:var(--petroleo-700);animation:colCursor 1s steps(1) infinite}
.col-celas:focus-within{outline:2px solid var(--turquesa-400);outline-offset:3px}
.col-celas-in{position:absolute;inset:0;width:100%;height:100%;opacity:0;border:0;padding:0;margin:0;font-size:16px;caret-color:transparent;cursor:text}
.col-lupa{flex:none;width:44px;height:44px;border-radius:13px;border:1px solid rgba(var(--tinta-rgb),.12);
  background:var(--papel);color:var(--petroleo-700);display:grid;place-items:center;cursor:pointer;transition:transform var(--t-rapida)}
.col-lupa:active{transform:scale(.92)}
.col-cargo-msg{margin-top:10px;font-size:var(--tx-2);color:var(--th-mulher-ink);font-weight:600}

/* cargo preenchido, e o mesmo desenho na lista da busca */
.col-escolha,.col-cand{width:100%;display:grid;grid-template-columns:58px minmax(0,1fr) 52px;gap:12px;align-items:center;
  text-align:center;color:inherit;font:inherit;cursor:pointer}
.col-escolha{background:none;border:0;padding:0}
.col-meio{min-width:0}
.col-foto{position:relative;width:58px;height:76px;border-radius:11px;overflow:hidden;background:var(--petroleo-100);
  display:grid;place-items:center;font:700 1.05rem var(--font-titulo);color:var(--petroleo-700)}
.col-foto::before{content:attr(data-ini)}
.col-foto img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:var(--petroleo-100)}
.col-rot{display:block;font-size:var(--tx-0);font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--tinta-60);
  margin-bottom:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.col-tiles{display:inline-flex;gap:5px;justify-content:center}
.col-tile{width:30px;height:40px;border:1.5px solid var(--petroleo-200);border-radius:9px;background:var(--papel);
  display:grid;place-items:center;font:700 1.4rem/1 var(--font-titulo);color:var(--tinta)}
.entrou .col-tile{animation:colCela .34s ease-out both}
.col-tile.vazio{border-style:dashed;border-color:var(--turquesa-400);background:none}
.col-tile.apagado{color:var(--tinta-60)}
.col-tecla-branco{display:inline-grid;place-items:center;height:40px;padding:0 16px;border-radius:8px;
  background:var(--urna-branco);color:var(--urna-tinta);font:700 .95rem var(--font-titulo);letter-spacing:.08em;
  box-shadow:0 3px 0 var(--urna-branco-borda),inset 0 0 0 1px var(--urna-branco-borda)}
.col-fio{display:block;height:1px;margin:8px auto 0;width:80%;background:linear-gradient(90deg,transparent,rgba(var(--tinta-rgb),.16),transparent)}
.col-nome{display:block;margin-top:7px;font:600 .98rem/1.2 var(--font-titulo);letter-spacing:.02em;color:var(--tinta);overflow-wrap:anywhere}
/* A SIGLA EM OSWALD, numa linha: em Campton, "DEMOCRATA" quebrava em
   "DEMOCRAT / A" (vistoria de 01/10/2026). A condensada cabe; a mais longa
   (SOLIDARIEDADE) desce um degrau. */
.col-partido small{display:block;margin-top:6px;font:600 .72rem/1.1 var(--font-titulo);color:var(--tinta-60);letter-spacing:.02em;white-space:nowrap}
.col-partido small.longa{font-size:.6rem;letter-spacing:0}
.col-selo-p{width:48px;height:48px;margin:0 auto;border-radius:13px;background:var(--petroleo-100);color:var(--petroleo-800);
  display:grid;place-items:center;font:700 1.15rem var(--font-titulo)}
/* a linha de cima do cartão preenchido: o cargo, e o que dá para fazer com ele */
.col-cargo-cab{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);margin:-6px -6px 8px 0}
.col-cargo-rot{min-width:0;font:600 var(--tx-1)/1.2 var(--font-titulo);letter-spacing:.06em;text-transform:uppercase;color:var(--petroleo-700)}
.col-cargo-bts{display:flex;gap:4px;flex:none}
.col-mini-bt{display:inline-flex;align-items:center;gap:4px;min-height:44px;padding:0 7px;border:0;border-radius:var(--raio-pill);
  background:none;color:var(--tinta-60);font:600 .82rem var(--font-texto);cursor:pointer}
.col-mini-bt:hover,.col-mini-bt:focus-visible{background:var(--petroleo-100);color:var(--petroleo-800)}
.col-mini-bt[data-limpar]:hover,.col-mini-bt[data-limpar]:focus-visible{background:color-mix(in srgb,var(--magenta-500) 10%,var(--branco));color:var(--th-mulher-ink)}

/* DEPUTADA DISTRITAL: fixa e em destaque. É o único cartão no petróleo da casa,
   com o 40222 no âmbar — a mesma dupla do hero e do botão "Apoie". */
.col-cargo.fixo{background:var(--petroleo-800);border:0;color:var(--branco);padding:18px 18px 16px 24px;overflow:hidden}
.col-cargo.fixo::before{content:"";position:absolute;left:0;top:0;bottom:0;width:7px;background:var(--realce)}
.col-fixo-topo{display:flex;align-items:center;justify-content:space-between;gap:8px}
.col-fixo-rot{font:600 var(--tx-1)/1.2 var(--font-titulo);letter-spacing:.1em;text-transform:uppercase;color:var(--turquesa-300)}
.col-cadeado{display:inline-flex;align-items:center;gap:5px;background:var(--realce);color:var(--tinta);
  font:600 var(--tx-0)/1 var(--font-titulo);letter-spacing:.12em;text-transform:uppercase;padding:6px 9px;border-radius:var(--raio-pill);
  animation:colSelo .6s .5s var(--ease-mola) both}
.col-fixo-corpo{display:flex;align-items:center;gap:14px;margin-top:14px}
.col-fixo-foto{width:68px;height:90px;border-radius:12px;object-fit:cover;flex:none;border:2px solid var(--realce)}
.col-fixo-nome{display:block;font:700 1.5rem/1.05 var(--font-titulo);letter-spacing:.02em}
.col-fixo-part{display:block;margin-top:5px;font-size:var(--tx-2);color:rgba(255,255,255,.86)}
.fixo .col-tiles{margin-top:16px;gap:8px;display:flex;justify-content:flex-start}
.fixo .col-tile{width:52px;height:66px;border-radius:13px;background:var(--realce);border-color:var(--realce);color:var(--tinta);font-size:2.3rem}
.fixo .col-tile:nth-child(1){animation:colCela .4s .15s ease-out both}
.fixo .col-tile:nth-child(2){animation:colCela .4s .22s ease-out both}
.fixo .col-tile:nth-child(3){animation:colCela .4s .29s ease-out both}
.fixo .col-tile:nth-child(4){animation:colCela .4s .36s ease-out both}
.fixo .col-tile:nth-child(5){animation:colCela .4s .43s ease-out both}
.col-fixo-nota{margin-top:14px;font-size:var(--tx-2);color:rgba(255,255,255,.9)}

/* ---- ações ---- */
.col-acoes{display:grid;gap:var(--sp-3);margin-top:var(--sp-6)}
.col-duas{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-3)}
.col-bt-largo{width:100%}
/* o botão secundário da ferramenta: o mesmo .btn da casa, em contorno */
.col-bt{background:var(--branco);color:var(--petroleo-800);box-shadow:inset 0 0 0 1.5px var(--petroleo-200);min-height:48px}
.col-bt:hover{box-shadow:inset 0 0 0 1.5px var(--turquesa-400)}
.col-bt:disabled,.col-app .btn:disabled{opacity:.45;cursor:not-allowed}
.col-bt-perigo{color:var(--th-mulher-ink);box-shadow:inset 0 0 0 1.5px var(--th-mulher-ink)}
.col-app .btn span[data-ic]{display:inline-flex}
.col-linha-link{display:flex;align-items:center;gap:14px;width:100%;text-align:left;background:var(--branco);color:inherit;font:inherit;cursor:pointer;
  border:1px solid rgba(var(--tinta-rgb),.12);border-radius:var(--raio-md);padding:var(--sp-4);transition:border-color var(--t-rapida),transform var(--t-rapida)}
.col-linha-link:hover{border-color:var(--turquesa-400)}
.col-linha-link:active{transform:scale(.985)}
.col-linha-link b{display:block;font:600 1.02rem var(--font-titulo);text-transform:uppercase;letter-spacing:.02em;color:var(--petroleo-800)}
.col-linha-link small{display:block;color:var(--tinta-60);font-size:var(--tx-2);margin-top:3px;line-height:1.35}
.col-seta{margin-left:auto;color:var(--tinta-60);display:flex}
.col-ic{width:44px;height:44px;border-radius:12px;background:var(--petroleo-100);color:var(--petroleo-700);display:grid;place-items:center;flex:none}

.col-rodape{margin-top:var(--sp-8);padding-top:var(--sp-4);border-top:1px solid rgba(var(--tinta-rgb),.12);
  font-size:.8rem;line-height:1.5;color:var(--tinta-60);display:grid;gap:var(--sp-2)}
.col-selo-oficial{justify-self:start;display:inline-flex;align-items:center;gap:6px;font-weight:600;color:var(--petroleo-800);
  border:1px solid var(--petroleo-200);border-radius:var(--raio-pill);padding:4px 11px}
.col-selo-oficial i{width:6px;height:6px;border-radius:50%;background:var(--turquesa-500)}

/* ---- as vistas internas (Passar cola, Minhas colinhas, Simulador) ---- */
.col-vista{animation:colSobe .35s var(--ease-mola) both}
.col-vista-topo{display:grid;grid-template-columns:44px 1fr 44px;align-items:center;margin-bottom:var(--sp-4)}
.col-vista-topo h2{grid-column:2;text-align:center;font-size:var(--tx-7);text-transform:uppercase;color:var(--petroleo-800);outline:none}
.col-fechar{width:44px;height:44px;border-radius:50%;border:0;background:var(--petroleo-100);color:var(--petroleo-800);display:grid;place-items:center;cursor:pointer}
.col-previa{background:var(--branco);border:1px solid rgba(var(--tinta-rgb),.12);border-radius:var(--raio-md);padding:var(--sp-4);display:flex;justify-content:center}
.col-previa canvas{display:block;width:100%;max-width:330px;height:auto;border-radius:10px}
.col-previa.stories canvas{max-width:240px}
.col-previa + .col-bt-zap{margin-top:var(--sp-4)}
.col-grupo{margin-top:var(--sp-4)}
.col-grupo > span{display:block;font:600 var(--tx-1)/1 var(--font-titulo);letter-spacing:.16em;text-transform:uppercase;color:var(--tinta-60);margin-bottom:var(--sp-2)}
.col-seg{display:grid;grid-template-columns:1fr 1fr;background:var(--branco);border:1px solid rgba(var(--tinta-rgb),.12);border-radius:14px;padding:4px;gap:4px}
.col-seg label{position:relative}
.col-seg input{position:absolute;inset:0;opacity:0;margin:0;cursor:pointer}
.col-seg span{display:flex;align-items:center;justify-content:center;min-height:44px;border-radius:10px;font-weight:600;color:var(--tinta-60);
  transition:background var(--t-media),color var(--t-media)}
.col-seg input:checked + span{background:var(--petroleo-700);color:var(--branco)}
.col-seg input:focus-visible + span{outline:2px solid var(--turquesa-400);outline-offset:2px}
.col-alterna{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:var(--sp-3);background:var(--branco);
  border:1px solid rgba(var(--tinta-rgb),.12);border-radius:14px;padding:12px 14px;font-weight:600;cursor:pointer}
.col-alterna input{appearance:none;width:46px;height:28px;border-radius:99px;background:var(--petroleo-200);position:relative;cursor:pointer;
  transition:background var(--t-media);flex:none;margin:0}
.col-alterna input::after{content:"";position:absolute;top:3px;left:3px;width:22px;height:22px;border-radius:50%;background:var(--branco);
  transition:transform var(--t-media) var(--ease-mola)}
.col-alterna input:checked{background:var(--petroleo-700)}
.col-alterna input:checked::after{transform:translateX(18px)}
.col-saidas{display:grid;gap:var(--sp-3);margin-top:var(--sp-5)}
.col-nota{font-size:var(--tx-2);color:var(--tinta-60);line-height:1.45}
.col-nota--grande{font-size:var(--tx-4);color:var(--tinta)}
.col-centro{text-align:center;margin-top:var(--sp-3)}
#col-sim-intro > .col-nota:last-child{margin-top:var(--sp-4)}
.col-link-manual{width:100%;height:46px;border-radius:12px;border:1px solid var(--petroleo-200);background:var(--branco);padding:0 12px;font:.85rem var(--font-texto)}
.col-salvas{list-style:none;margin:0;padding:0;display:grid;gap:var(--sp-3)}
.col-salva{background:var(--branco);border:1px solid rgba(var(--tinta-rgb),.12);border-radius:var(--raio-md);padding:var(--sp-4);animation:colSobe .4s var(--ease-mola) both}
.col-salva-nome{display:block;font:600 1.1rem var(--font-titulo);color:var(--petroleo-800);overflow-wrap:anywhere}
.col-salva-data{display:block;font-size:.8rem;color:var(--tinta-60);margin-top:3px}
.col-salva-nums{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
.col-salva-nums span{font:700 .85rem/1 var(--font-titulo);letter-spacing:.04em;padding:6px 7px;border-radius:7px;border:1px solid var(--petroleo-200);background:var(--papel)}
.col-salva-nums span.fixo{background:var(--realce);color:var(--tinta);border-color:var(--realce)}
.col-salva-nums span.vazio{border-style:dashed;border-color:var(--turquesa-400);color:var(--tinta-60);background:none}
.col-salva-acoes,.col-renomear{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:14px}
.col-renomear input{flex:1 1 150px;min-width:0;height:44px;border-radius:12px;border:1.5px solid var(--petroleo-700);background:var(--branco);padding:0 12px;font-size:16px}
.col-aviso{border:1px solid var(--realce);background:color-mix(in srgb,var(--realce) 12%,var(--branco));border-radius:14px;padding:12px 14px;font-size:var(--tx-2);margin-bottom:14px}
.col-vazio-bloco{border:1.5px dashed var(--turquesa-400);border-radius:var(--raio-md);padding:30px 18px;text-align:center;color:var(--tinta-60);display:grid;gap:var(--sp-4)}

/* ---- a gaveta de busca. Acima do cabeçalho (z 50) e do WhatsApp flutuante
   (z 80): é uma folha modal, e nada do site pode ficar por cima dela. ---- */
html.col-gaveta-aberta{overflow:hidden}
.col-gaveta-fundo{position:fixed;inset:0;z-index:var(--z-menu);background:rgba(var(--petroleo-900-rgb),.6);opacity:0;transition:opacity .38s ease}
.col-gaveta-fundo.aberta{opacity:1}
.col-gaveta{position:fixed;left:0;right:0;bottom:0;z-index:calc(var(--z-menu) + 1);margin:0 auto;max-width:600px;height:94dvh;
  background:var(--papel);border-radius:24px 24px 0 0;display:flex;flex-direction:column;transform:translateY(102%);
  transition:transform .5s var(--ease-mola);overflow:hidden;box-shadow:var(--sombra-pop)}
.col-gaveta.aberta{transform:none}
.col-gaveta-alca{width:40px;height:5px;border-radius:9px;background:var(--petroleo-200);margin:8px auto 0;flex:none}
.col-gaveta-topo{display:grid;grid-template-columns:44px 1fr 44px;align-items:center;padding:8px 14px 6px;flex:none}
.col-gaveta-topo b{text-align:center;font:600 1.15rem var(--font-titulo);text-transform:uppercase;color:var(--petroleo-800)}
.col-busca{margin:8px 14px 0;position:relative;flex:none;display:block}
.col-busca > span[data-ic]{position:absolute;left:15px;top:50%;transform:translateY(-50%);color:var(--tinta-60);pointer-events:none;display:flex}
.col-busca input{width:100%;height:52px;border-radius:16px;border:1px solid rgba(var(--tinta-rgb),.16);background:var(--branco);padding:0 14px 0 44px;font-size:16px;outline:none}
.col-busca input:focus{border-color:var(--petroleo-700)}
.col-busca input::placeholder{color:var(--tinta-60)}
.col-filtros{display:flex;gap:8px;padding:10px 14px 0;flex:none;overflow-x:auto;scrollbar-width:none}
.col-chip{flex:none;height:44px;border-radius:13px;border:1px solid rgba(var(--tinta-rgb),.16);background:var(--branco);color:var(--petroleo-800);
  padding:0 14px;display:inline-flex;align-items:center;gap:7px;font:600 .9rem var(--font-texto);position:relative;cursor:pointer}
.col-chip select{position:absolute;inset:0;opacity:0;width:100%;cursor:pointer;font-size:16px}
.col-chip.ativo{border-color:var(--petroleo-700);box-shadow:inset 0 0 0 1px var(--petroleo-700)}
.col-conta{display:flex;justify-content:space-between;gap:8px;padding:12px 16px 8px;font:600 var(--tx-0)/1 var(--font-titulo);letter-spacing:.14em;
  text-transform:uppercase;color:var(--tinta-60);flex:none}
.col-lista{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:2px 14px 14px;overscroll-behavior:contain}
.col-lista ul{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.col-cand{background:var(--branco);border:1px solid rgba(var(--tinta-rgb),.12);border-radius:18px;padding:12px;transition:border-color var(--t-rapida),transform var(--t-rapida)}
.col-cand:hover{border-color:var(--turquesa-400)}
.col-cand:active{transform:scale(.985)}
.col-cand.anima{animation:colSobe .4s var(--ease-mola) both}
.col-cand:disabled{opacity:.42;cursor:not-allowed}
.col-cand.escolhido{border-color:var(--petroleo-700);box-shadow:inset 0 0 0 1px var(--petroleo-700)}
.col-etiqueta{display:inline-block;margin-top:6px;font:600 var(--tx-0)/1 var(--font-titulo);letter-spacing:.08em;text-transform:uppercase;
  padding:4px 7px;border-radius:6px;background:var(--petroleo-100);color:var(--petroleo-800)}
.col-etiqueta--sua{background:var(--realce);color:var(--tinta)}
.col-etiqueta.alerta{background:color-mix(in srgb,var(--magenta-500) 10%,var(--branco));color:var(--th-mulher-ink)}
.col-nada{padding:40px 12px;text-align:center;color:var(--tinta-60)}
/* FLEX, e não `grid repeat(auto-fit,minmax(0,1fr))`: com o "Limpar" ocupando a
   linha toda, o auto-fit criava colunas de largura zero e os três botões se
   empilhavam esmagados num canto (medido na vistoria de 01/10/2026). */
.col-gaveta-base{flex:none;border-top:1px solid rgba(var(--tinta-rgb),.12);padding:10px 14px calc(10px + env(safe-area-inset-bottom));
  display:flex;flex-wrap:wrap;gap:8px;background:var(--papel)}
.col-gaveta-base .col-base-bt{flex:1 1 0;min-width:0}
.col-base-bt{min-height:58px;border-radius:14px;border:1px solid rgba(var(--tinta-rgb),.14);background:var(--branco);color:var(--petroleo-800);cursor:pointer;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;font:600 .8rem var(--font-texto);padding:6px}
.col-mini{display:flex;gap:3px}
.col-mini i{width:13px;height:17px;border:1.3px dashed var(--turquesa-400);border-radius:4px;font:700 .7rem/15px var(--font-titulo);font-style:normal;text-align:center;color:var(--tinta-60)}
.col-mini-branco{font:700 .62rem/1 var(--font-titulo);background:var(--urna-branco);color:var(--urna-tinta);padding:4px 8px;border-radius:4px;
  letter-spacing:.06em;box-shadow:inset 0 0 0 1px var(--urna-branco-borda)}
.col-limpar-cargo{flex:1 0 100%;display:inline-flex;align-items:center;justify-content:center;gap:6px;background:none;
  border:1.5px solid var(--petroleo-200);border-radius:var(--raio-pill);color:var(--th-mulher-ink);min-height:44px;
  font:600 .92rem var(--font-texto);cursor:pointer}

/* a ficha do candidato desliza por cima da lista, dentro da gaveta */
.col-ficha{position:absolute;inset:0;background:var(--papel);z-index:3;display:flex;flex-direction:column;transform:translateX(104%);transition:transform .45s var(--ease-mola)}
.col-ficha.aberta{transform:none}
.col-ficha-topo{display:grid;grid-template-columns:44px 1fr 44px;align-items:center;padding:14px 14px 4px}
.col-ficha-topo > span{text-align:center;font:600 var(--tx-0)/1.4 var(--font-titulo);letter-spacing:.16em;text-transform:uppercase;color:var(--tinta-60)}
.col-ficha-corpo{flex:1;overflow-y:auto;padding:14px 16px 20px}
.col-ficha-cab{display:grid;grid-template-columns:104px minmax(0,1fr) 56px;gap:14px;align-items:start}
.col-ficha-cab .col-foto{width:104px;height:136px;border-radius:16px;font-size:1.6rem}
.col-ficha-nome{display:block;font:700 1.45rem/1.1 var(--font-titulo);color:var(--petroleo-800);overflow-wrap:anywhere}
.col-ficha-info{margin-top:8px;font-size:var(--tx-2);color:var(--tinta-60);display:grid;gap:3px}
.col-ficha-sit{margin-top:8px;font-size:var(--tx-2);display:flex;align-items:center;gap:6px}
.col-ficha-sit i{width:8px;height:8px;border-radius:50%;background:var(--verde-acao);flex:none}
.col-ficha-sit.alerta i{background:var(--magenta-500)}
.col-ficha .col-tiles{margin-top:22px;gap:8px}
.col-ficha .col-tile{width:48px;height:62px;border-radius:12px;font-size:2.1rem}
.col-ficha .col-bt-largo{margin-top:22px}
.col-ficha-fonte{margin-top:22px;font-size:.78rem;color:var(--tinta-60);line-height:1.6}

/* ---- o simulador: a urna de verdade, com as cores dela (tokens --urna-*) ---- */
.col-sim-cola{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;align-items:center;background:var(--realce);color:var(--tinta);
  border-radius:14px;padding:10px 14px;font-weight:600;font-size:var(--tx-2);margin-bottom:12px}
.col-sim-cola b{font:700 1.15rem var(--font-titulo)}
.col-urna{background:var(--urna-corpo);border-radius:16px;padding:12px;display:grid;gap:12px}
.col-visor{background:var(--urna-visor);color:var(--urna-tinta);font-family:Arial,Helvetica,sans-serif;border:6px solid var(--urna-tinta);border-radius:4px;
  min-height:300px;padding:10px 12px;display:flex;flex-direction:column;line-height:1.3}
.col-v-topo{font-size:12px;font-weight:700;min-height:16px}
.col-v-cargo{text-align:center;font-size:22px;font-weight:700;margin-top:6px}
.col-v-vaga{text-align:center;font-size:13px;margin-bottom:6px;min-height:16px}
.col-v-corpo{flex:1;display:flex;gap:10px}
.col-v-dados{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
.col-v-num{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:14px}
.col-v-cxs{display:inline-flex;gap:4px}
.col-v-cx{width:30px;height:40px;border:1.5px solid var(--urna-tinta);background:var(--branco);display:grid;place-items:center;font:700 26px Arial,Helvetica,sans-serif}
.col-v-cx.atual{animation:colPisca 1s steps(2,start) infinite}
.col-v-linha{font-size:14px;overflow-wrap:anywhere}
.col-v-linha b{font-size:16px}
.col-v-grande{font-size:21px;font-weight:700}
.col-v-pisca{animation:colPisca 1.1s steps(2,start) infinite}
.col-v-foto{flex:none;width:80px;text-align:center;font-size:11px}
.col-v-quadro{position:relative;width:80px;height:104px;border:1.5px solid var(--urna-tinta);background:var(--urna-foto);display:grid;place-items:center;font-size:26px;font-weight:700;overflow:hidden}
.col-v-quadro::before{content:attr(data-ini)}
.col-v-quadro img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.col-v-rodape{border-top:1.5px solid var(--urna-tinta);margin-top:10px;padding-top:6px;font-size:12px;line-height:1.35}
.col-v-fim{flex:1;display:grid;place-items:center;font-size:96px;font-weight:700;letter-spacing:.04em}
.col-v-votou{text-align:right;font-size:14px;font-weight:700;color:var(--tinta-60)}
.col-teclado-caixa{background:var(--urna-teclado);border-radius:10px;padding:12px}
.col-teclado-selo{font:600 .62rem/1 var(--font-titulo);letter-spacing:.16em;color:var(--urna-selo);text-align:center;margin-bottom:10px}
.col-teclado{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.col-tecla{border:0;border-radius:5px;background:var(--urna-tecla);color:var(--urna-tecla-tx);font:700 26px Arial,Helvetica,sans-serif;min-height:54px;cursor:pointer;
  box-shadow:0 3px 0 var(--urna-tinta);touch-action:manipulation;transition:transform .08s,box-shadow .08s}
.col-tecla:active,.col-tecla.apertada{transform:translateY(3px);box-shadow:none;filter:brightness(1.3)}
.col-tecla.zero{grid-column:2}
.col-teclas-acao{display:grid;grid-template-columns:1fr 1fr 1.25fr;gap:8px;margin-top:12px;align-items:end}
.col-teclas-acao .col-tecla{font-size:13px;color:var(--urna-tinta);letter-spacing:.02em}
.col-tecla.t-branco{background:var(--urna-branco)}
.col-tecla.t-corrige{background:var(--urna-corrige)}
.col-tecla.t-confirma{background:var(--urna-confirma);min-height:68px}
.col-sim-msg{min-height:22px;margin-top:10px;font-size:var(--tx-2);font-weight:600;color:var(--th-guara-ink)}
.col-resumo{list-style:none;margin:14px 0 0;padding:0;display:grid;gap:6px}
.col-resumo li{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;background:var(--branco);border:1px solid rgba(var(--tinta-rgb),.12);
  border-radius:12px;padding:10px 12px;font-size:var(--tx-2)}
.col-resumo b{font-family:var(--font-titulo)}
@media (min-width:760px){.col-urna{grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);padding:16px}}
@media (max-width:370px){
  .col-escolha,.col-cand{grid-template-columns:50px minmax(0,1fr) 44px;gap:8px}
  .col-foto{width:50px;height:66px;border-radius:9px}
  .col-selo-p{width:42px;height:42px;font-size:1rem;border-radius:11px}
  .col-tile{width:26px;height:36px;font-size:1.2rem;border-radius:8px}
  .col-tiles{gap:4px}
  .col-cela{width:27px;height:38px;font-size:1.2rem}
  .fixo .col-tile{width:46px;height:60px;font-size:2rem}
  .col-ficha-cab{grid-template-columns:86px minmax(0,1fr) 48px}
  .col-ficha-cab .col-foto{width:86px;height:114px}
}

/* o aviso que aparece e some. Acima de tudo, como o toast da casa. */
.col-toast{position:fixed;left:50%;bottom:calc(20px + env(safe-area-inset-bottom));z-index:var(--z-toast);transform:translate(-50%,24px);
  width:min(92vw,440px);background:var(--petroleo-900);color:var(--branco);padding:13px 16px;border-radius:14px;font-size:var(--tx-2);font-weight:600;
  opacity:0;pointer-events:none;transition:opacity var(--t-media),transform .38s var(--ease-mola);box-shadow:var(--sombra-pop)}
.col-toast.ver{opacity:1;transform:translate(-50%,0)}
.col-toast.erro{background:var(--th-mulher-ink)}
/* com botão (o "Desfazer"): passa a receber toque, e o texto e o botão dividem a linha */
.col-toast.com-acao{pointer-events:auto;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3)}
.col-toast-bt{flex:none;min-height:44px;padding:0 14px;border:0;border-radius:var(--raio-pill);background:var(--realce);color:var(--tinta);
  font:600 .9rem var(--font-titulo);text-transform:uppercase;letter-spacing:.04em;cursor:pointer}
@media (prefers-reduced-motion:reduce){
  .col-app *,.col-app *::before,.col-app *::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}
}

/* ---- a cola de bolso impressa. Só na /colinha: a regra é presa ao
   data-page, senão imprimir qualquer outra página do site sairia em branco. */
#col-impressao{display:none}
@media print{
  body[data-page="colinha"] > *:not(#col-impressao){display:none !important}
  body[data-page="colinha"] #col-impressao{display:block}
  body[data-page="colinha"]{background:var(--branco) !important}
}
.col-imp-aviso{font:11px Arial,Helvetica,sans-serif;color:var(--tinta-60);text-align:center;margin-bottom:4mm}
.col-imp-folha{display:flex;gap:8mm;justify-content:center;flex-wrap:wrap}
.col-imp-cola{width:82mm;border:1px dashed var(--urna-tinta);border-radius:3mm;padding:3.5mm;font-family:var(--font-texto);color:var(--urna-tinta);
  -webkit-print-color-adjust:exact;print-color-adjust:exact;break-inside:avoid;line-height:1.25}
.col-imp-cab{display:flex;justify-content:space-between;align-items:baseline;gap:2mm;padding-bottom:2mm;border-bottom:.4mm solid var(--urna-tinta)}
.col-imp-cab b{font:700 12pt var(--font-titulo);text-transform:uppercase;white-space:nowrap}
.col-imp-cab span{font-size:7pt;text-align:right}
.col-imp-linha{display:flex;align-items:center;gap:2mm;padding:1.8mm 1mm;border-bottom:.25mm solid var(--urna-branco-borda)}
.col-imp-linha.fixo{background:var(--realce);border-radius:2mm;border-bottom:0;margin:1mm 0}
.col-imp-ord{font:700 9pt var(--font-titulo);width:4mm}
.col-imp-txt{flex:1;min-width:0}
.col-imp-txt b{display:block;font-size:7.5pt;text-transform:uppercase;letter-spacing:.04em}
.col-imp-txt span{display:block;font-size:7pt}
.col-imp-nums{display:flex;gap:.8mm}
.col-imp-dig{width:5.2mm;height:6.8mm;border:.3mm solid var(--urna-tinta);border-radius:1mm;background:var(--branco);display:grid;place-items:center;font:700 12pt var(--font-titulo)}
.col-imp-linha.fixo .col-imp-dig{background:var(--tinta);color:var(--realce);border-color:var(--tinta)}
.col-imp-rod{margin-top:2mm;font-size:6pt;line-height:1.35}
.col-imp-rod b{font-size:6.5pt}

/* ---- O WHATSAPP DA COLINHA (01/10/2026, docs/98 §7). O verde é o
   `--verde-acao` do compartilhar dos cartões, UM degrau abaixo: ele foi
   medido para ÍCONE branco (3:1), e com TEXTO branco dá 3,98:1. Com 18% de
   tinta, 5,03:1; o hover desce mais, 5,79:1. ---- */
.col-bt-zap{background:color-mix(in srgb,var(--verde-acao) 82%,var(--tinta));color:var(--branco);text-decoration:none}
.col-bt-zap:hover,.col-bt-zap:focus-visible{background:color-mix(in srgb,var(--verde-acao) 72%,var(--tinta));
  transform:translateY(-2px);box-shadow:var(--sombra-hover)}
.col-bt-zap .btn-ico{width:22px;height:22px}

/* SEM O WHATSAPP FLUTUANTE NA /colinha (vistoria de 01/10/2026). Ele abre
   conversa com o GABINETE, e aqui ficava colado no "Enviar no WhatsApp", que
   manda a colinha: dois ícones iguais lado a lado, com destinos diferentes, é
   convite a tocar no errado. O contato com o gabinete continua no "Falar no
   WhatsApp" do CTA, no fim da página. */
body[data-page="colinha"] .wa-float{display:none}

/* ---- OS RECOMENDADOS da colinha: Israel e Leila (docs/98 §10). O destaque
   é o mesmo da Dayse (o `.fixo`), e duas coisas dizem que não é a mesma
   coisa: o selo "Recomendado" no lugar do cadeado, e o botão Retirar. A
   faixa da esquerda é turquesa: o âmbar é do 40222. ---- */
.col-cargo.recomendado::before{background:var(--turquesa-500)}
.col-cadeado--rec{background:var(--turquesa-300);color:var(--petroleo-900)}
.col-foto--fixo{width:68px;height:90px;border-radius:12px;border:2px solid var(--turquesa-300);flex:none;
  background:rgba(255,255,255,.1);color:var(--turquesa-300);font-size:1.3rem}
.col-foto--fixo img{background:rgba(255,255,255,.1)}
.col-rec-pe{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin-top:14px;flex-wrap:wrap}
.col-rec-pe .col-fixo-nota{margin:0;flex:1 1 160px}
.col-retirar{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 16px;border:1.5px solid rgba(255,255,255,.5);
  border-radius:var(--raio-pill);background:none;color:var(--branco);font:600 .88rem var(--font-texto);cursor:pointer}
.col-retirar:hover,.col-retirar:focus-visible{background:rgba(255,255,255,.12);border-color:var(--branco)}
