/* ============================================================
   VOXTER  |  mockup home v2
   Cores amostradas do LOGO oficial (logovoxterpeq.png):
     vermelho #bc5257 (88% dos pixels)   dourado #dcab5b (11%)
   Escuro = brand-navy #0b1220 da paleta ja registrada. Sombras tingidas
   de navy, nunca preto neutro.
   Tipografia: Google Sans (display + texto) + Google Sans Code (rotulo tecnico)
   Raio: variavel, de 10px a pill. A marca tem terminais arredondados.
   ============================================================ */
:root{
  /* marca: vermelho definido pelo usuario (#a8282a, o carmim do estande) */
  --carmim:#a8282a;
  --carmim-vivo:#c33a36;
  --carmim-fundo:#7d1d24;
  --dourado:#dcab5b;
  /* acento isolado (nao faz parte da paleta da marca): so' pro valor
     principal do simulador de "Como o dinheiro entra", copiado igual da LP
     original -- contraste verde-neon proposital contra o navy, pedido
     explicito do usuario ("a cor do valor em tom verde da um contraste legal"). */
  --verde-simulador:#adff2f;
  /* escuros: navy da marca */
  --navy:#000033;
  --navy-2:#111c33;
  --navy-3:#1a2742;
  /* claros: base neutra fria (pedido explicito do usuario, ponto de partida
     rgb(248 250 252)) -- osso e' esse tom direto, osso-2 e' um passo abaixo,
     sutilmente mais escuro/firme, pro contraste entre camadas continuar
     existindo nos mesmos lugares (chips, campos desabilitados etc). */
  --osso:#f8fafc;
  --osso-2:#e7ebf1;
  /* fundo neutro atras das fotos de produto do catalogo -- 1a tentativa
     (#e2e8f0, o slate-200 do voxter.com.br/marketplace) ficou azulada
     demais pro usuario; cinza quase-branco, so' o suficiente pra diferenciar
     da foto/card branco ao redor. */
  --foto-fundo:#f0f0f0;
  --tinta:#0b1220;
  --tinta-70:rgba(11,18,32,.72);
  --tinta-45:rgba(11,18,32,.5);
  --linha:rgba(0,0,51,.13);
  --linha-clara:rgba(246,242,237,.16);
  /* sombra tingida de navy */
  --sombra-sm:0 2px 8px rgba(0,0,51,.08);
  --sombra-md:0 10px 30px rgba(0,0,51,.13);
  --sombra-lg:0 24px 60px rgba(0,0,51,.22);
  /* raio discreto: botao 6px, nada exagerado */
  --r-xs:4px; --r-sm:6px; --r-md:8px; --r-lg:12px; --r-xl:16px; --pill:999px;
  --fonte:"Google Sans","Product Sans",system-ui,sans-serif;
  --mono:"Google Sans Code",ui-monospace,monospace;
  --gut:clamp(20px,5vw,72px);
  --max:1320px;
  /* altura real do nav (+ faixa de migalhas, em pagina interna) fixo por cima
     do conteudo -- medida ao vivo por estadoDaBarra() em site.js. O valor
     aqui e' so' o chute inicial, antes do JS rodar. */
  --secao-offset:110px;
  /* altura da barra de abas fixa do rodape, so' existe <700px (ver TAB BAR) --
     variavel unica pra' quem precisa abrir espaco/desviar dela (.subir, o
     widget externo, o padding de baixo da pagina) ficar sempre em sincronia. */
  --barra-inf:60px;
}

/* ---------- PALCO FIXO (1000px -> 1920px) ----------
   O site e' desenhado para 1920 de largura e aparece nessa mesma otica em
   qualquer tela menor, so' reduzido -- como um filme gravado em 1920x1080,
   que nao remonta o enquadramento conforme a TV. Decisao do usuario, pelo
   motivo dele: sem isso ele nao controla o que o visitante ve'.

   POR QUE zoom E NAO transform:scale
   O site tem barra fixa no topo, elementos sticky e um widget de terceiro
   injetado na pagina. transform:scale nao muda o layout, so' o desenho:
   seria preciso cravar width:1920px, compensar a altura na mao e consertar
   todo position:fixed, que passa a se ancorar no elemento transformado.
   zoom refaz o LAYOUT na medida nova, entao fixed, sticky e o widget
   continuam se comportando como antes. E, ao contrario de scale, nao borra:
   a fonte continua vetorial.

   POR QUE EM CSS E NAO EM JAVASCRIPT
   Houve uma versao em script, calculando largura/1920 a cada resize. Ela
   aplicava o zoom e, em algum ponto depois da carga, ele voltava a 1 --
   visto ao vivo, com --palco-h ainda valendo e o zoom vazio. Era a
   "piscada" relatada: a pagina abria no tamanho certo e saltava pra grande.
   Em CSS nao ha' gatilho que possa desfazer, a regra vale desde o primeiro
   desenho e nao depende de JavaScript ligado.

   POR QUE EM DEGRAUS
   CSS nao divide comprimento por comprimento: calc(100vw / 1920px) e'
   invalido, nao da' pra tirar a razao direto. Com faixas de 40px, a largura
   de layout que o desenho recebe fica entre 1920 e ~1997 -- 4%, que nao se
   percebe. O zoom na raiz faz o layout preencher a janela em qualquer fator,
   entao nunca sobra faixa branca na borda.

   --palco-h: a altura da janela convertida pra medida do palco. Unidade de
   viewport NAO participa do zoom (100svh continua sendo a janela real),
   entao sem isto o hero nascia com 768 em vez de 1080 e o zoom ainda o
   encolhia: 71% da altura da tela em vez de 100%. Medido.

   PISO de 0.62: abaixo de ~1190px o fator para de cair, senao o texto do corpo
   chegaria a 9px. Dali pra baixo o enquadramento volta a abrir um pouco.

   Abaixo de 1000px nada disso vale: comeca a faixa de celular e tablet, que
   tem layout proprio e nao pode ser encolhida junto. */
@media (min-width:1000px) and (max-width:1919px){
  :root{
    zoom:var(--palco-z);
    --palco-h:calc(100svh / var(--palco-z));
    /* --palco-l: a largura da janela, ja' na medida do palco e ja' sem a
       barra de rolagem. Serve pra quem precisa sangrar de ponta a ponta da
       tela: 100vw sozinho e' a janela REAL e, dentro do layout ampliado do
       palco, cobre so' uma fracao dele. */
    --palco-l:calc((100vw - var(--barra-rolagem,0px)) / var(--palco-z));
  }
}
@media (min-width:1000px) and (max-width:1039px){:root{--palco-z:0.62}}
@media (min-width:1040px) and (max-width:1079px){:root{--palco-z:0.62}}
@media (min-width:1080px) and (max-width:1119px){:root{--palco-z:0.62}}
@media (min-width:1120px) and (max-width:1159px){:root{--palco-z:0.62}}
@media (min-width:1160px) and (max-width:1199px){:root{--palco-z:0.62}}
@media (min-width:1200px) and (max-width:1239px){:root{--palco-z:0.625}}
@media (min-width:1240px) and (max-width:1279px){:root{--palco-z:0.6458}}
@media (min-width:1280px) and (max-width:1319px){:root{--palco-z:0.6667}}
@media (min-width:1320px) and (max-width:1359px){:root{--palco-z:0.6875}}
@media (min-width:1360px) and (max-width:1399px){:root{--palco-z:0.7083}}
@media (min-width:1400px) and (max-width:1439px){:root{--palco-z:0.7292}}
@media (min-width:1440px) and (max-width:1479px){:root{--palco-z:0.75}}
@media (min-width:1480px) and (max-width:1519px){:root{--palco-z:0.7708}}
@media (min-width:1520px) and (max-width:1559px){:root{--palco-z:0.7917}}
@media (min-width:1560px) and (max-width:1599px){:root{--palco-z:0.8125}}
@media (min-width:1600px) and (max-width:1639px){:root{--palco-z:0.8333}}
@media (min-width:1640px) and (max-width:1679px){:root{--palco-z:0.8542}}
@media (min-width:1680px) and (max-width:1719px){:root{--palco-z:0.875}}
@media (min-width:1720px) and (max-width:1759px){:root{--palco-z:0.8958}}
@media (min-width:1760px) and (max-width:1799px){:root{--palco-z:0.9167}}
@media (min-width:1800px) and (max-width:1839px){:root{--palco-z:0.9375}}
@media (min-width:1840px) and (max-width:1879px){:root{--palco-z:0.9583}}
@media (min-width:1880px) and (max-width:1919px){:root{--palco-z:0.9792}}

*{box-sizing:border-box}
/* par de .so-desk (texto que so' aparece <700px, ver TAB BAR): oculta por
   padrao, .so-desk{display:none} dentro do media de 700px liga o par certo. */
.so-movel{display:none}
html{scroll-behavior:smooth}
/* respiro pro nav fixo (+ faixa de migalhas, em pagina interna): sem isso, um
   link do submenu ou do mega jogava o topo da section pra debaixo da barra,
   cortado. --secao-offset e' medido ao vivo em site.js (estadoDaBarra). */
section[id]{scroll-margin-top:var(--secao-offset)}
/* mesma folga do nav fixo, mas pros alvos do indice de leitura (h3 dentro do
   corpo do post, nao section) -- sem isso o clique no indice pulava pro topo
   exato (y=0), escondendo o comeco do trecho atras do nav fixo. */
.post-leitor-corpo h3[id]{scroll-margin-top:calc(var(--secao-offset) + 16px)}
body{
  margin:0;background:var(--osso);color:var(--tinta);
  font-family:var(--fonte);
  /* 1.0625rem e nao 17px: com a raiz em 16px da' exatamente os mesmos 17px,
     mas agora o corpo SEGUE a raiz -- e' o que faz a escada de desktop (ver
     o @media de min-width:1000px, logo depois do :root) alcancar o texto
     corrido, nao so' os titulos. */
  font-size:1.0625rem;line-height:1.6;
  cursor:default;-webkit-font-smoothing:antialiased;
  /* clip, nao hidden: overflow-x:hidden cria scrollport e quebra position:sticky */
  overflow-x:clip;
}
a{color:inherit;cursor:pointer;text-decoration:none}
img{max-width:100%;display:block}
button{font:inherit;cursor:pointer}
/* barra de rolagem escura sobre section escura, clara sobre clara -- o
   data-tema no <html> e trocado por JS conforme a section em foco (ver
   script). Comeca escuro porque a pagina abre no hero, que e escuro. */
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-track{background:var(--navy)}
::-webkit-scrollbar-thumb{background:rgba(220,171,91,.45);border:2px solid var(--navy);border-radius:var(--pill);background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:rgba(220,171,91,.7)}
:root[data-tema="claro"] ::-webkit-scrollbar-track{background:var(--osso)}
:root[data-tema="claro"] ::-webkit-scrollbar-thumb{background:rgba(0,0,51,.28);border-color:var(--osso)}
:root[data-tema="claro"] ::-webkit-scrollbar-thumb:hover{background:rgba(0,0,51,.42)}
.wrap{max-width:var(--max);margin:0 auto;padding-inline:var(--gut)}
.rot{font-family:var(--mono);font-size:11.5px;font-weight:500;letter-spacing:.16em;text-transform:uppercase}
.idx{font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;opacity:.55}

h1,h2,h3{font-family:var(--fonte);font-weight:700;margin:0;line-height:1.04;letter-spacing:-.028em}
h1{font-size:clamp(2.25rem,5.1vw,4.4rem)}
h2{font-size:clamp(1.9rem,4vw,3.2rem)}
h3{font-size:clamp(1.15rem,1.8vw,1.45rem);line-height:1.2;letter-spacing:-.02em}
p{margin:0}
.lede{font-size:clamp(1.02rem,1.4vw,1.24rem);line-height:1.55;color:var(--tinta-70)}

/* ---------- nav ---------- */
/* centralizacao de verdade: logo e nav-acoes crescem em partes IGUAIS
   (flex:1 nos dois), entao o menu (largura natural, entre eles) fica
   sempre exatamente no meio do nav -- nao importa se um lado e' mais
   largo que o outro por natureza. space-between so equilibra os VAOS
   entre os itens, nao centraliza o item do meio em relacao a tela: com
   nav-acoes mais largo que a logo (o caso real aqui, por causa do botao
   de vendas + login), o menu ficava puxado pra esquerda. */
.nav{
  position:relative;z-index:1;display:flex;align-items:center;
  border:1px solid transparent;   /* reserva a borda que so aparece no estado solido */
  gap:24px;padding:16px var(--gut);
  transition:background .3s,border-color .3s,box-shadow .3s,margin .3s,padding .3s,border-radius .3s;
}
/* rolou: a barra branca tambem descola das bordas e vira um objeto flutuante.
   O padding lateral desconta a margem, entao o logo nao pula de lugar na transicao.
   Cor chapada, sem blur: e um objeto, nao um vidro. */
.nav.solido{
  margin:10px;border-radius:var(--r-md);
  padding:12px calc(var(--gut) - 10px);
}
/* A SUPERFICIE BRANCA e' um elemento, nao um background.
   Como background ela so' podia aparecer por transicao de cor, ou seja, por
   fade -- e fade e' justamente o que nao se quer aqui. Como elemento, ela
   ENTRA por geometria: desdobra pra baixo a partir da borda de cima do nav
   (scaleY + transform-origin:top).
   E a borda de cima do nav, no estado de topo, e' exatamente onde a pilula de
   utilidades acaba (10 de padding + 48 de altura = 58; o nav comeca em 58).
   As duas brancas nascem encostadas, entao o que se ve' e' UMA massa branca
   escorrendo por cima do menu, e nao uma segunda barra acendendo.
   inset:-1px (e nao 0) pra' laje cobrir tambem o anel de 1px que o .nav
   reserva com border:transparent -- senao sobraria um fio do fundo aparecendo
   em volta da pilula. A borda e a sombra moram aqui, nao no .nav, pra' nao
   existir mais nenhuma propriedade de COR mudando na transicao.
   scaleY(0) nao pinta nada: area zero nao gera sombra. Era por isso que nem
   height:0 nem clip-path serviam -- um deixa a sombra vazar, o outro recorta
   a sombra fora no estado final. */
.nav::before{
  content:'';position:absolute;inset:-1px;z-index:-1;
  border-radius:inherit;background:var(--osso);
  border:1px solid var(--linha);box-shadow:var(--sombra-md);
  transform:scaleY(0);transform-origin:top;
  transition:transform .26s cubic-bezier(.2,.8,.2,1);
}
.nav.solido::before{transform:scaleY(1)}
/* faixa de migalhas grudada por baixo (ver .migalhas-faixa.presa): vira UMA
   pilula so, em duas cores -- entao a base do menu perde o arredondado e a
   sombra propria (quem fecha a forma embaixo e' a faixa, nao o menu; sombra
   dupla no meio ficaria estranha, como se houvesse profundidade onde nao ha). */
.nav.solido.colado{border-bottom-left-radius:0;border-bottom-right-radius:0}
.nav.solido.colado::before{border-bottom-color:transparent;box-shadow:none}
/* o espaco flexivel entre logo e menu precisa crescer pra empurrar o menu
   pro centro, mas quem cresce e' esta caixa -- nao o <a>, senao a area
   vazia toda virava clicavel (link de volta pra home so' deveria valer
   em cima do logo mesmo). */
.marca-cx{flex:1 1 0;display:flex;align-items:center}
.marca img{height:26px;width:auto}
/* Sobre o hero escuro entra a arte MONOCROMATICA de verdade (_inc/nav.php traz
   as duas no HTML), nao a colorida com filter:brightness(0) invert(1). O
   monocromatico tem um corte entre o chevron e o traco de baixo; sem ele, com
   tudo branco, os dois encostavam e o icone virava um borrao. Nada de filtro
   aqui: trocar a arte E' a correcao. */
/* As duas artes ficam SOBREPOSTAS e trocam por opacidade. Com display
   none/block (como era antes) a troca acontece num quadro so' e le-se como
   piscada; o cruzado de opacidade acompanha o resto da barra, que ja' anima
   em .3s. A colorida fica no fluxo e e' ela quem reserva o espaco; a
   monocromatica vai por cima, absoluta, pra largura do logo nao oscilar
   durante o cruzado. */
.marca{position:relative;display:inline-flex;align-items:center}
.marca .marca-cor,.marca .marca-mono{transition:opacity .34s cubic-bezier(.4,0,.2,1)}
.marca .marca-mono{position:absolute;inset:0 auto 0 0;opacity:0}
.marca .marca-cor{opacity:1}
.marca.branca .marca-cor{opacity:0}
.marca.branca .marca-mono{opacity:1}
.menu{display:flex;align-items:center;gap:6px;flex:0 0 auto}
.menu > a,.menu > .tem-sub-item > a{
  text-decoration:none;font-size:14.5px;font-weight:500;color:rgba(246,242,237,.85);
  padding:8px 14px;border-radius:var(--r-sm);transition:background .3s,color .3s,border-color .3s;
}
/* so os itens da capsula: .menu a:hover tem especificidade maior que .mega a
   e pintava de branco o titulo do item sobre fundo claro */
/* .ativo entra na mesma regra do hover: o item da secao que esta na tela
   (ver scrollspy no script) fica com a mesma cor, sem duplicar declaracao */
.menu > a:hover,.menu > .tem-sub-item > a:hover,
.menu > a.ativo,.menu > .tem-sub-item > a.ativo{background:rgba(246,242,237,.14);color:#fff}
.nav.solido .menu a{color:var(--tinta-70)}
.nav.solido .menu a:hover,.nav.solido .menu a.ativo{background:rgba(188,82,87,.1);color:var(--carmim)}
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:9px;
  padding:12px 22px;border:0;border-radius:var(--r-sm);
  background:var(--carmim);color:#fff;font-size:14.5px;font-weight:500;
  text-decoration:none;box-shadow:var(--sombra-sm);
  transition:background .2s,transform .2s,box-shadow .2s;
}
.btn:hover{background:var(--carmim-vivo);transform:translateY(-1px);box-shadow:var(--sombra-md)}
.btn.vazado{background:rgba(0,0,51,.34);backdrop-filter:blur(8px);border:1px solid rgba(246,242,237,.42);box-shadow:none}
.btn.vazado:hover{background:rgba(246,242,237,.16)}
.btn.linha{background:transparent;color:var(--carmim);border:1px solid var(--carmim);box-shadow:none}
.btn.linha:hover{background:var(--carmim);color:#fff}
/* branco em faixa escura: o .btn.linha e' carmim com borda carmim, que em
   cima de navy quase some. Mesma receita que .cta .btn ja' usava escopada
   na caixa do CTA, agora como variante nomeada e reusavel. */
.btn.branco{background:#fff;color:var(--carmim);box-shadow:var(--sombra-sm)}
.btn.branco:hover{background:var(--osso);color:var(--carmim)}
.burger{display:none;background:rgba(246,242,237,.14);border:0;padding:9px;border-radius:var(--r-sm);color:#fff;
  transition:background .3s,color .3s}
.nav.solido .burger{background:rgba(0,0,51,.07);color:var(--tinta)}

/* logins: botao de icone ao lado do CTA, nao mais um item de texto no menu */
/* justify-content:flex-end + min-width travado por JS (ver script): o botao de
   vendas recolhe/expande por dentro dessa largura reservada, sem que o bloco
   como um todo mude de tamanho -- e sem isso, o menu central balançava a cada
   recolhimento, porque o space-between do .nav recalculava com o vizinho. */
.nav-acoes{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex:1 1 0}
.tem-sub{position:relative;display:flex}
.btn-login{
  display:flex;align-items:center;justify-content:center;
  width:42px;height:42px;border:0;border-radius:var(--r-sm);
  background:#fff;color:var(--carmim);box-shadow:var(--sombra-sm);
  transition:background .3s,color .3s,border-color .3s,transform .2s;
}
.btn-login svg{width:20px;height:20px}
.btn-login:hover{transform:translateY(-1px)}
/* altura igual ao botao de login (42px): sem isso o botao de vendas herdava a
   altura do padding+linha do texto e ficava ~5px mais alto que o icone ao lado */
.nav-acoes .btn{height:42px;padding-block:0}
/* barra branca: inverte pro navy, senao branco sobre branco some */
.nav.solido .btn-login{background:var(--navy);color:#fff}

/* botao de vendas: abre com o rotulo, recolhe pra icone depois de 4s e volta
   a abrir no hover. Recolher sem poder reabrir esconderia a informacao de vez.
   Largura por max-width no rotulo: animar width de auto nao transiciona. */
.btn-vendas{overflow:hidden;white-space:nowrap;gap:0;transition:padding .55s cubic-bezier(.2,.7,.3,1),background .3s,box-shadow .3s,transform .2s}
.btn-vendas .rotulo{display:inline-block;max-width:260px;opacity:1;transition:max-width .55s cubic-bezier(.2,.7,.3,1),opacity .3s}
/* o PNG do flaticon e preto puro com alpha: o filtro pinta de branco. Aqui
   serve, porque e' um pictograma de uma forma so'; o LOGO da Voxter nao pode
   ser pintado assim (ver .marca), que a arte monocromatica dele tem um corte
   que a colorida nao tem. Sobe .5px porque a cauda do balao joga o peso
   visual pra baixo -- centro geometrico nao e centro optico. */
.btn-vendas img{width:0;height:18px;flex:none;opacity:0;position:relative;top:-.5px;
  filter:brightness(0) invert(1);transition:width .5s cubic-bezier(.2,.7,.3,1),opacity .3s}
/* um de cada vez: aberto so o texto, recolhido so o icone */
.btn-vendas.recolhido img{width:18px;opacity:1}
.btn-vendas.recolhido:hover img{width:0;opacity:0}
.btn-vendas.recolhido{padding-left:13px;padding-right:13px}
.btn-vendas.recolhido .rotulo{max-width:0;opacity:0}
.btn-vendas.recolhido:hover{padding-left:22px;padding-right:22px}
.btn-vendas.recolhido:hover .rotulo{max-width:260px;opacity:1}

/* ---------- FERRAMENTAS na home: o baralho -------------------------------
   Pedido explicito: carrossel horizontal de cartas EMPILHADAS. Entao elas se
   sobrepoem de verdade (margin-left negativa), e nao e' uma fileira de caixas
   iguais separadas por vao.
   A sobreposicao come' 38px da carta anterior -- por isso o padding direito
   da carta e' maior que o esquerdo: o que a vizinha tampa e' margem, nunca
   texto. z-index crescente (--n, escrito no HTML) pra pilha cair sempre pro
   mesmo lado; no hover a carta sobe e vai pra frente de todas.
   justify-content:safe center: mesma correcao do carrossel de depoimentos --
   em tela larga a fila para de rolar e ficaria encostada a' esquerda. */
.fer-home{padding:clamp(66px,8vw,120px) 0;background:var(--osso)}
/* --fer-junto / --fer-solto: os dois estados do baralho, num numero so' cada.
   Parado, as cartas se cobrem bastante (e' um baralho, nao uma fileira);
   com o mouse em cima da fileira, elas se afastam pra poder ler.
   A transicao e' de margin-left mesmo, nao de transform: as cartas precisam
   REALMENTE ocupar mais largura quando abrem, senao a ultima ficaria fora da
   conta da rolagem e a volta infinita erraria o periodo. */
/* TRES numeros por estado, e eles andam juntos de proposito.
   Parado o baralho e' apertado; com o mouse na fileira ele abre. O risco
   obvio dessa ideia era cortar texto: carta de 288px coberta em 96px deixa
   192px a' mostra, e a primeira versao cortava titulo e descricao no meio da
   palavra (medido na previa, feio de verdade).
   A saida nao foi afrouxar o aperto, foi manter a COLUNA DE TEXTO fixa em
   170px nos dois estados: parada, a carta e' larga (288) com folga grande a'
   direita (96) -- a vizinha cobre exatamente essa folga, nunca o texto;
   aberta, a carta estreita (230) e a folga encolhe (38), e o texto continua
   nos mesmos 170px. Como largura e folga andam na mesma curva, a conta
   288-22-96 = 230-22-38 = 170 vale tambem NO MEIO da animacao: a coluna de
   texto nao muda um pixel, entao nao ha' refluxo de palavra nenhuma.
   De quebra, o passo entre cartas sobe de 192 pra 240px: a abertura se ve'. */
.fer-deck{
  --fer-largura:288px;  --fer-recuo:-96px;  --fer-dir:96px;
  display:flex;align-items:stretch;
  overflow-x:auto;scroll-padding-inline:var(--gut);
  padding:clamp(22px,2.6vw,30px) 0 16px;scrollbar-width:none;
}
.fer-deck::-webkit-scrollbar{display:none}
/* as setas ficam FORA da fila, nas pontas, e a fila rola entre elas. Dentro
   da fila elas rolariam junto e sairiam da tela. */
.fer-deck-cx{position:relative;display:flex;align-items:center}
.fer-deck-cx > .fer-deck{flex:1;min-width:0}
.fer-seta{
  /* z-index acima das CARTAS, nao so' acima do fundo: cada carta tem
     z-index calc(--n + 1), ou seja, ate' 9 nesta fila. Com 4 a seta da
     direita ficava por baixo das ultimas cartas e o clique caia no link
     da ferramenta -- medido: o teste navegava pra outra pagina em vez de
     rolar a fileira. */
  position:absolute;z-index:20;top:50%;translate:0 -50%;
  display:flex;align-items:center;justify-content:center;
  width:44px;height:44px;border:1px solid var(--linha);border-radius:50%;
  background:#fff;color:var(--navy);box-shadow:var(--sombra-md);cursor:pointer;
  transition:opacity .25s ease,background .25s ease,color .25s ease,transform .2s ease;
}
.fer-seta svg{width:20px;height:20px}
.fer-seta:hover:not(:disabled){background:var(--carmim);border-color:var(--carmim);color:#fff}
.fer-seta:active:not(:disabled){transform:scale(.94)}
/* ponta da fila: a seta apaga e para de responder. Botao aceso que nao faz
   nada ensina a pessoa a desconfiar do controle. */
.fer-seta:disabled{opacity:.3;cursor:default;box-shadow:none}
.fer-seta-esq{left:clamp(6px,1.4vw,18px)}
.fer-seta-dir{right:clamp(6px,1.4vw,18px)}
@media (max-width:700px){
  /* no toque o gesto de arrastar ja' resolve, e a seta tampa carta */
  .fer-seta{display:none}
}
.fer-carta{
  position:relative;z-index:calc(var(--n) + 1);
  flex:0 0 var(--fer-largura);
  display:flex;flex-direction:column;gap:9px;
  margin-left:var(--fer-recuo);
  padding:22px var(--fer-dir) 20px 22px;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);
  /* sombra puxada pra esquerda: e' ela que mostra uma carta POR CIMA da
     outra. Sem isso o conjunto vira retangulos branco-sobre-branco. */
  box-shadow:-10px 0 22px -12px rgba(0,0,51,.3);
  text-decoration:none;color:inherit;
  /* 620ms nas tres medidas que mudam de verdade (largura, recuo e padding)
     contra os 420 de antes: abrir um baralho e' gesto de materia pesada, e a
     420 o conjunto estourava na cara de quem so' passou o mouse. A curva
     tambem ficou mais mansa no fim (.25,.9,.3,1), pra a fila assentar em vez
     de travar.
     O numero esta' casado com ABERTURA, em assets/js/site.js: e' durante
     esse tempo que o script prende a carta apontada debaixo do cursor.
     Mudou aqui, muda la'.
     translate, sombra e borda continuam rapidos: sao resposta ao toque de
     uma carta so', nao o movimento do conjunto. */
  /* As duas medidas do movimento. A transicao em si NAO mora aqui: um
     '.casc > *' la' embaixo tem a mesma especificidade, vem depois e
     substituiria o shorthand inteiro. Ver a regra .fer-deck.casc.vis, logo
     depois do bloco .casc. */
  --fer-atraso:calc(var(--n) * 55ms);   /* leque: cada carta sai depois da anterior */
  --fer-entra:calc(var(--n) * 90ms);    /* entrada em cascata, igual a do .casc */
}
/* mouse na fileira: o baralho abre */
.fer-deck:hover,.fer-deck:focus-within{--fer-largura:230px;--fer-recuo:10px;--fer-dir:38px}
/* respiro nas pontas. Antes a carta encostava na borda de proposito: a volta
   infinita exigia que o padrao fosse periodico, e um vao so' na primeira
   copia quebrava a emenda. Sem volta, nao ha' mais essa amarra. */
.fer-carta:first-child{margin-left:clamp(16px,3vw,54px)}
.fer-carta:last-child{margin-right:clamp(16px,3vw,54px)}
.fer-carta:hover,.fer-carta:focus-visible{
  z-index:50;translate:0 -6px;border-color:rgba(168,40,42,.24);
  box-shadow:-6px 10px 28px -12px rgba(0,0,51,.34);
}
.fer-ico{display:flex;width:26px;height:26px;color:var(--carmim)}
.fer-ico svg{width:100%;height:100%}
.fer-carta b{font-size:1rem;font-weight:700;letter-spacing:-.02em;color:var(--navy);line-height:1.2}
.fer-d{font-size:.86rem;line-height:1.5;color:var(--tinta-70);flex:1}
.fer-abrir{font-size:.82rem;font-weight:700;color:var(--carmim)}
.fer-abrir i{font-style:normal;display:inline-block;transition:translate .25s}
.fer-carta:hover .fer-abrir i{translate:3px 0}
.fer-pe{display:flex;justify-content:center;margin-top:clamp(18px,2.4vw,26px)}
/* SEM PONTEIRO (toque): nao ha' hover pra abrir o baralho nem deslize pela
   posicao do mouse, entao a fila vira uma fila comum -- vao positivo, encaixe
   no arrastar, respiro nas pontas e a copia escondida some (ela so' serve pra
   volta infinita, que aqui nao existe; deixada visivel, a pessoa percorreria
   a mesma lista duas vezes). */
@media (hover:none){
  .fer-deck{--fer-largura:230px;--fer-recuo:14px;--fer-dir:38px;scroll-snap-type:x proximity}
  .fer-carta{scroll-snap-align:center}
  .fer-carta:first-child{margin-left:var(--gut)}
  .fer-carta:last-child{margin-right:var(--gut)}
}
@media (max-width:700px){
  .fer-deck{--fer-largura:244px;--fer-dir:20px}
  .fer-carta{padding-top:20px;padding-bottom:18px;padding-left:20px}
}

/* ---------- /ofertas/ ----------------------------------------------------
   Condicao comercial com endereco proprio. O bloco tem uma ordem fixa, e ela
   e' argumento: quem e' o parceiro, o que custa, o que vem junto, ate' quando
   vale e a letra miuda. A letra miuda fica numa <details> na propria pagina,
   nao num asterisco que leva pra lugar nenhum -- e' ela que separa promessa
   de contrato.
   A superficie e' branca sobre fundo tingido, mesma receita das placas de
   /aplicacoes/: branco reservado pro que esta' vivo. */
.ofe-solucao{padding:clamp(50px,6vw,80px) 0;border-top:1px solid var(--linha);background:var(--osso-2)}
.ofe-bloco{
  /* o padding vira variavel porque a faixa da arte precisa recuar
     exatamente ele pra sangrar ate' a borda do card */
  --ofe-pad:clamp(24px,3vw,38px);
  margin-top:clamp(28px,3.4vw,40px);
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-xl);
  padding:var(--ofe-pad);box-shadow:var(--sombra-sm);
}
.ofe-bloco + .ofe-bloco{margin-top:clamp(20px,2.4vw,28px)}
.ofe-cab .rot{display:block;color:var(--carmim);margin-bottom:8px}
.ofe-cab h3{font-size:clamp(1.3rem,2.2vw,1.72rem);letter-spacing:-.025em;color:var(--navy)}
.ofe-cab p{margin:9px 0 0;color:var(--tinta-70);font-size:.97rem;line-height:1.55;max-width:62ch}
/* as linhas de preco: nome a' esquerda, valor a' direita, filete entre elas.
   Nao sao cards -- sao linhas de uma tabela de preco, e e' assim que se le. */
.ofe-precos{margin-top:clamp(22px,2.6vw,30px);border-top:1px solid var(--linha)}
.ofe-item{
  display:flex;align-items:center;gap:clamp(14px,2vw,22px);
  padding:clamp(16px,2vw,22px) 0;border-bottom:1px solid var(--linha);
}
/* foto do produto como PREFIXO da linha. A mesma do catalogo, no tamanho de
   miniatura: aqui ela identifica o item, nao decora o card -- duas versoes
   com arte grande ao lado do titulo foram reprovadas. */
.ofe-item-foto{
  flex:none;width:clamp(64px,7vw,84px);height:auto;display:block;
  border-radius:var(--r-sm);
}
/* o texto empurra o preco pra direita; sem isso os tres ficariam colados */
.ofe-item-txt{min-width:0;flex:1}

/* preco anterior, riscado, acima do que vale. Corpo menor e opacidade baixa:
   ele esta' ali pra dar a medida do corte, nao pra competir com o numero
   novo. */
.ofe-de{
  display:block;font-family:var(--mono);font-size:.82rem;font-weight:500;
  color:var(--tinta-45);text-decoration-thickness:1.5px;margin-bottom:1px;
}

/* Cresce no hover a LINHA DO PRODUTO, nao o bloco inteiro. Chegou a ser o
   bloco; o usuario corrigiu, e com razao: o que a pessoa esta' olhando e'
   um produto, e o bloco e' so' a moldura em volta de tres deles.

   transform-origin na esquerda pra a linha crescer pro lado de dentro do
   card, sem avancar sobre a borda. Mesma curva do resto do site. */
.ofe-item{
  transition:scale .3s cubic-bezier(.2,.7,.3,1);
  transform-origin:left center;will-change:scale;
}
.ofe-item:hover{scale:1.012}
@media (prefers-reduced-motion:reduce){
  .ofe-item{transition:none}
  .ofe-item:hover{scale:none}
}
.ofe-kicker{display:block;font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;
  text-transform:uppercase;color:var(--tinta-45);margin-bottom:5px}
.ofe-item-txt b{display:block;font-size:1.08rem;letter-spacing:-.02em;color:var(--navy)}
.ofe-item-txt > span{display:block;margin-top:4px;font-size:.9rem;line-height:1.5;color:var(--tinta-70)}
.ofe-preco{flex:none;text-align:right}
/* tabular-nums: dois precos um embaixo do outro precisam ter os digitos na
   mesma coluna, senao a virgula serrilha */
.ofe-valor{display:block;font-family:var(--mono);font-variant-numeric:tabular-nums;
  font-size:clamp(1.5rem,2.6vw,2rem);font-weight:600;letter-spacing:-.03em;color:var(--carmim);line-height:1}
.ofe-unidade{display:block;margin-top:5px;font-size:.78rem;color:var(--tinta-45)}
.ofe-vantagens{list-style:none;margin:clamp(20px,2.4vw,26px) 0 0;padding:0;
  display:flex;flex-wrap:wrap;gap:10px 26px}
.ofe-vantagens li{display:flex;align-items:center;gap:8px;font-size:.88rem;color:var(--tinta-70)}
.ofe-vantagens svg{width:15px;height:15px;flex:none;color:var(--carmim)}
.ofe-pe{display:flex;align-items:center;flex-wrap:wrap;gap:14px 20px;margin-top:clamp(22px,2.6vw,30px)}
.ofe-validade{font-family:var(--mono);font-size:11.5px;letter-spacing:.04em;color:var(--tinta-45)}
/* a letra miuda: fechada por padrao, mas na pagina -- nao num link pra outro
   lugar. Aberta, o texto ganha medida curta pra ser lido de verdade. */
.ofe-fina{margin-top:clamp(18px,2.2vw,24px);border-top:1px solid var(--linha);padding-top:14px}
.ofe-fina summary{
  display:flex;align-items:center;gap:7px;cursor:pointer;list-style:none;
  font-size:.84rem;font-weight:600;color:var(--tinta-45);transition:color .2s;
}
.ofe-fina summary::-webkit-details-marker{display:none}
.ofe-fina summary:hover{color:var(--carmim)}
.ofe-fina summary svg{width:14px;height:14px;transition:rotate .25s}
.ofe-fina[open] summary svg{rotate:180deg}
/* sem teto de medida: num card largo, 76ch deixava um vazio grande a'
   direita do paragrafo. Aqui o texto e' consulta, nao leitura corrida --
   preencher a largura e' melhor que uma coluna estreita com buraco ao
   lado. */
.ofe-fina p{margin:12px 0 0;font-size:.84rem;line-height:1.6;color:var(--tinta-45)}
@media (max-width:620px){
  /* no estreito a linha quebra, mas a foto continua ao lado do nome: o que
     desce e' o preco. */
  .ofe-item{flex-wrap:wrap}
  .ofe-item-txt{flex:1 1 60%}
  .ofe-preco{flex:1 0 100%;text-align:left;margin-top:4px}
  .ofe-item-foto{width:56px}
}
/* O atalho de OFERTAS na barra do topo. Os outros dois sao atalhos de
   jornada, em texto; este e' oferta com prazo, e vem primeiro justamente
   pra ser visto antes. Fundo carmim com letra branca, chama em dourado:
   o contraste entre o icone quente e o fundo escuro e' o que o faz saltar
   sem precisar piscar nem crescer.

   Os 2px negativos de margem vertical compensam o padding proprio, pra a
   pilula nao aumentar a altura da barra -- ela e' fixa e mede o topo de
   toda pagina (ver --secao-offset). */
/* .utl a.utl-oferta e nao so' .utl-oferta: existe um `.utl a, .utl button
   { background:none; color:var(--tinta-70) }` com especificidade 0-1-1, que
   vence uma classe sozinha (0-1-0) e zerava o fundo -- a pilula saia branca
   com texto cinza. Medido no computed style antes de corrigir. */
.utl a.utl-oferta{
  background:var(--carmim);color:#fff;
  /* 28px e nao os 34px dos vizinhos: aqueles 34 sao area de clique
     invisivel, e uma pilula PREENCHIDA da mesma altura fica pesada demais
     numa barra de 58. Como o .utl-esq centraliza, mais baixa ela continua
     alinhada com o texto dos outros dois. */
  height:28px;
  /* 15px de recuo contra os 12 dos vizinhos: texto dentro de fundo precisa
     de mais folga que texto solto, nao de menos. Estava com 11. */
  padding:0 15px;
  /* 7px no lugar dos 11 da barra: dentro da pilula, icone e palavra tem de
     ler como uma coisa so'. Com 11 a chama ficava solta do texto. */
  gap:7px;
  /* nao encostar no canto arredondado da barra */
  margin-left:6px;
  border-radius:var(--pill);
  font-weight:600;letter-spacing:.004em;
  box-shadow:0 1px 3px rgba(0,0,51,.22);
  transition:background .22s,box-shadow .22s;
}
/* A caixa do icone acompanha a TINTA da chama, nao um quadrado.
   Medido: no viewBox de 24x24 o glifo ocupava x 5..19 e y 1.60..23 -- ou
   seja, 5 unidades de vazio de cada lado e, pior, 1.60 de folga em cima
   contra 1.00 embaixo. Centrar essa caixa alinhava o VAZIO, nao o desenho,
   e a chama aparecia empurrada pra baixo, com mais respiro em cima.
   O viewBox foi apertado na tinta (ver _inc/nav.php) e a caixa aqui ficou
   com a proporcao real do glifo, 14:21.4. Agora centrar a caixa e centrar
   a chama sao a mesma coisa.

   O -0.6px e' correcao OPTICA, nao geometrica: chama e' larga na base e
   fina no topo, entao a massa dela fica embaixo e o centro geometrico le'
   baixo demais ao lado de uma palavra. */
.utl a.utl-oferta .utl-ico{width:13px;height:19px;translate:0 -.6px}

/* ----- a chama queima -----
   Duas animacoes de duracoes diferentes (1,7s e 2,3s) no mesmo glifo: como
   os ciclos nao sao multiplos, a combinacao so' se repete depois de muito
   tempo e o fogo nao fica metronomico. Uma so', por mais caprichada que
   fosse, denunciaria o compasso em dois segundos.

   transform-origin no PE': chama dança a partir da base, presa ao que
   queima. Girando pelo centro ela flutuaria, que e' outro fenomeno.

   A deformacao e' trocada entre os eixos (afina ao subir, engrossa ao
   baixar) pra o volume parecer constante -- fogo muda de forma, nao de
   tamanho. */
@keyframes chamaDanca{
  0%,100%{scale:1 1;rotate:0deg}
  18%{scale:.94 1.09;rotate:-3deg}
  41%{scale:1.05 .95;rotate:2deg}
  63%{scale:.97 1.06;rotate:-1.5deg}
  82%{scale:1.03 .98;rotate:1deg}
}
@keyframes chamaBrilho{
  0%,100%{filter:drop-shadow(0 0 1px rgba(255,186,84,.45))}
  35%{filter:drop-shadow(0 0 4px rgba(255,160,50,.95))}
  70%{filter:drop-shadow(0 0 2px rgba(255,200,110,.7))}
}
.utl a.utl-oferta .utl-ico svg{
  transform-origin:50% 92%;
  animation:chamaDanca 1.7s ease-in-out infinite,chamaBrilho 2.3s ease-in-out infinite;
  will-change:scale,rotate,filter;
}
@media (prefers-reduced-motion:reduce){
  .utl a.utl-oferta .utl-ico svg{animation:none;filter:none}
}
/* o color tem de ser repetido aqui: a regra geral da barra
   (.utl a:hover) pinta o texto de carmim, e sem isto a pilula ficava com
   letra vermelha escura sobre fundo vermelho escuro no hover. */
.utl a.utl-oferta:hover{background:#8f2224;color:#fff;box-shadow:0 2px 7px rgba(0,0,51,.3)}
.utl a.utl-oferta .utl-ico{color:var(--dourado)}

/* MARCA DE FUSO no /desenrola/ (so' fora do portugues) ---------------------
   A pagina mostra hora de Brasilia AO VIVO. Pra quem le em portugues isso e'
   o relogio de casa; pra quem le em ingles ou espanhol, nao. Entao vale a
   mesma gramatica ja' aprovada no widget: bandeira do Brasil FORA da label,
   como prefixo, sufixo GMT-3 ao lado da hora e dica ao passar o mouse.
   A dica some sozinha em 3s: so' :hover a deixaria presa na tela enquanto o
   mouse estivesse em cima. */
.desenrola-online-band{display:inline-flex;width:17px;height:17px;flex:0 0 auto;margin-right:2px}
.desenrola-online-band svg{width:100%;height:100%;border-radius:2px}
/* NADA de gap aqui. Os filhos desta caixa sao os digitos do relogio: slots de
   .62em que tem de ficar colados, e o `:` com 1px de folga. Um gap no pai
   espaca digito por digito e a hora sai desmontada. O respiro do GMT-3 vem da
   margem dele, nao do pai. Alinhamento tambem nao: display/align-items reais
   vem da regra do badge, mais abaixo neste arquivo. */
.desenrola-online-hora{position:relative;cursor:default}
.desenrola-online-tz{
  font-family:var(--mono);font-size:9.5px;font-weight:600;letter-spacing:.04em;
  opacity:.6;white-space:nowrap;position:relative;cursor:default;
}
/* so quando o GMT-3 esta dentro do relogio: no "expediente ... GMT-3" do
   resultado ja existe um espaco de texto antes dele. */
.desenrola-online-hora .desenrola-online-tz{margin-left:4px}
@keyframes desenrolaDica{0%{opacity:0;translate:-50% 4px}10%{opacity:1;translate:-50% 0}80%{opacity:1;translate:-50% 0}100%{opacity:0;translate:-50% 0}}
[data-dica]{position:relative}
.desenrola-online-hora[data-dica]::after,.desenrola-online-tz[data-dica]::after{
  content:attr(data-dica);position:absolute;bottom:calc(100% + 9px);left:50%;translate:-50% 4px;
  background:var(--navy-3);color:#fff;border:1px solid var(--linha-clara);
  padding:6px 10px;border-radius:var(--r-sm);box-shadow:var(--sombra-md);
  font-family:var(--fonte);font-size:11.5px;font-weight:500;letter-spacing:0;line-height:1.25;
  white-space:normal;width:max-content;max-width:210px;text-align:center;
  opacity:0;pointer-events:none;z-index:6;
}
.desenrola-online-hora[data-dica]:hover::after,.desenrola-online-tz[data-dica]:hover::after{animation:desenrolaDica 3s ease forwards}

/* ---------- barra de utilidades, acima da principal ----------
   Atalhos de jornada, busca, escala e idioma. Some ao rolar: quem esta lendo
   nao precisa dela ocupando altura na barra fixa. */
.topo{position:fixed;inset:0 0 auto 0;z-index:60}
/* A caixa fica, com 10px iguais nos quatro lados. O que muda e o tratamento:
   fundo osso em vez de mais uma laje escura sobre hero escuro -- inverte o valor,
   ancora o topo e antecipa a barra branca da rolagem. Tudo em mono caixa alta,
   que e a voz que o site ja usa em rotulo, e o icone em carmim, dentro de um
   quadrado com filete, no lugar do pictograma solto antes do texto. */
/* max-height EXPLICITO no estado aberto. Sem ele o valor calculado e' "none",
   e transicao de none pra 0 NAO anima: o navegador corta seco, a barra de
   utilidades some num quadro e o menu salta ~52px de uma vez. Era essa a
   "piscada abrupta" ao rolar. 70px cobre a caixa de 48px mais o padding de
   10px, e e' coerente com os 60px que a regra de .com-busca ja' assumia. */
/* --utl-alto: a altura REAL do conjunto (padding-top + pilula). max-height
   tem que valer exatamente isso, nao um numero com folga: com folga, o
   comeco da animacao consome a folga sem mexer na altura, a pilula sai
   andando na frente do recorte e abre uma tira escura entre ela e a laje
   do nav (medido: 19px de vao). No mobile a regra de 700px troca pra 52. */
.utl{--utl-alto:58px;position:relative;z-index:2;padding:10px 10px 0;max-height:var(--utl-alto);
  transition:max-height .42s cubic-bezier(.33,0,.2,1),padding .42s cubic-bezier(.33,0,.2,1)}
.utl-cx{
  position:relative;
  display:flex;align-items:center;justify-content:space-between;gap:20px;
  height:48px;padding:0 8px;border-radius:var(--r-md);
  background:#fff;box-shadow:var(--sombra-sm);
  transition:transform .42s cubic-bezier(.33,0,.2,1);
}
.utl-esq,.utl-dir{position:relative;z-index:1}
/* rolou: a pilula SOBE e sai pela borda de cima, recortada pelo overflow do
   .utl que se fecha junto. Sem opacity: quem sai, sai andando. */
.topo.solido .utl{max-height:0;padding-top:0;overflow:hidden;pointer-events:none}
/* -100% e' a altura da propria pilula: sobe exatamente o que o nav desce,
   entao a borda de baixo dela acompanha a linha do recorte em vez de
   disparar na frente. */
.topo.solido .utl-cx{transform:translateY(-100%)}
.utl-esq{display:flex;align-items:center;gap:0}
.utl-dir{display:flex;align-items:center;gap:0}
.utl a,.utl button{
  display:flex;align-items:center;gap:11px;height:34px;padding:0 12px;
  border:0;background:none;cursor:pointer;line-height:1;
  font-family:var(--fonte);font-size:13px;font-weight:500;letter-spacing:-.005em;
  color:var(--tinta-70);text-decoration:none;border-radius:var(--r-sm);
  transition:color .2s,background .2s;
}
.utl a:hover,.utl button:hover:not(:disabled){background:var(--osso-2);color:var(--carmim)}
.utl svg{width:14px;height:14px;flex:0 0 auto}
/* sem contorno: o glifo carmim sozinho */
.utl-ico{
  display:flex;align-items:center;justify-content:center;flex:0 0 auto;
  width:18px;height:18px;color:var(--carmim);
}
.utl-ico svg{width:100%;height:100%}
/* padding igual dos dois lados, senao o fundo do hover fica torto. Quem recua
   o primeiro rotulo pro lugar certo e o padding menor da propria barra, e o
   filete vive na margem entre os dois -- dentro do padding ele era engolido
   pelo fundo do hover e encostava no separador. */
/* 14px (era 24): com o atalho de Ofertas preenchido abrindo a fila, os 24
   deixavam os tres itens espalhados demais e a barra parecia vazia no meio.
   O filete acompanha, em -7px, pra continuar no meio da folga. */
.utl-esq a + a{position:relative;margin-left:14px}
.utl-esq a + a::before{
  content:"";position:absolute;left:-7px;top:50%;transform:translateY(-50%);
  width:1px;height:20px;background:var(--linha);
}
/* NAO ha' filete depois da pilula de Ofertas: ela e' preenchida, e um fundo
   cheio ja' separa por conta propria. O filete ali virava um segundo
   separador em cima do primeiro. */
.utl-esq a.utl-oferta + a::before{content:none}
.utl-dir > * + *{margin-left:4px}
.utl-sep{width:1px;height:20px;background:var(--linha);margin:0 8px}
/* escala: so os dois botoes na barra. A porcentagem e resposta a um toque,
   nao informacao permanente -- aparece embaixo do controle e some sozinha. */
.escala{position:relative;display:flex;align-items:center}
.escala button{position:relative;padding:0 10px;justify-content:center;font-size:16px;color:var(--carmim)}
.escala button:disabled{opacity:.26;cursor:default}
/* dica no hover. O texto vem do proprio aria-label: um rotulo so, sem copia
   que possa divergir do que o leitor de tela anuncia. */
.escala button::after{
  content:attr(aria-label);
  position:absolute;top:calc(100% + 9px);left:50%;transform:translate(-50%,-4px);
  padding:5px 9px;border-radius:var(--r-xs);background:var(--navy);color:#fff;
  font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;text-transform:none;
  white-space:nowrap;opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .2s,transform .2s,visibility .2s;
}
.escala button:hover:not(:disabled)::after{opacity:1;visibility:visible;transform:translate(-50%,0)}
/* o aviso de porcentagem mora no mesmo lugar: enquanto ele aparece, a dica cala */
.escala:has(.pct.vis) button::after{opacity:0;visibility:hidden}
.escala .pct{
  position:absolute;top:calc(100% + 9px);left:50%;
  transform:translate(-50%,-5px);white-space:nowrap;
  padding:5px 10px;border-radius:var(--r-xs);background:var(--navy);color:#fff;
  font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .22s,transform .22s,visibility .22s;
}
.escala .pct.vis{opacity:1;visibility:visible;transform:translate(-50%,0)}
/* idioma: bandeira do idioma corrente, nao um globo generico. As tres ficam no
   DOM e o data-lang decide qual aparece -- clonar SVG duplicaria o id do clipPath. */
.idioma{position:relative}
.idioma > button{gap:9px}
.idioma > button .sigla{font-family:var(--mono);font-size:11px;letter-spacing:.12em}
.idioma .band{display:none}
.idioma[data-lang="PT"] .band-PT,
.idioma[data-lang="EN"] .band-EN,
.idioma[data-lang="ES"] .band-ES{display:flex}
.op-nome{display:flex;align-items:center;gap:11px}
.idioma-lista{
  position:absolute;top:calc(100% + 10px);right:0;min-width:214px;padding:7px;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-md);
  box-shadow:var(--sombra-lg);opacity:0;visibility:hidden;transform:translateY(-6px);
  transition:opacity .2s,transform .2s,visibility .2s;
}
.idioma.aberto .idioma-lista{opacity:1;visibility:visible;transform:none}
/* a lista nao herda a voz da barra: nome de idioma se le em caixa mista.
   Sem redeclarar, .utl button impunha mono/maiuscula e o "PT-BR" quebrava em duas linhas. */
/* as opcoes viraram <a> (links reais pro mesmo endereco no outro idioma);
   os seletores cobrem os dois pra nao depender de qual elemento esta' ali */
.idioma-lista button,.idioma-lista a{width:100%;justify-content:space-between;gap:18px;height:40px;padding:0 12px;
  font-family:var(--fonte);font-size:14px;font-weight:500;letter-spacing:0;text-transform:none;
  color:var(--tinta)}
.idioma-lista button + button,.idioma-lista a + a{margin-top:2px}
.idioma-lista button:hover,.idioma-lista a:hover{background:var(--osso-2);color:var(--tinta)}
.idioma-lista button[aria-current="true"],.idioma-lista a[aria-current="true"]{color:var(--carmim);font-weight:600}
.idioma-lista i{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;font-style:normal;opacity:.5;white-space:nowrap}
/* busca ali mesmo, sem camada: o campo abre dentro da barra. Modal pra uma
   busca simples era peso a mais -- escurece a pagina inteira pra um input. */
.busca{display:flex;align-items:center}
.busca input{
  width:0;padding:0;border:0;outline:0;background:none;opacity:0;
  font-family:var(--fonte);font-size:13px;color:var(--tinta);
  border-bottom:1px solid transparent;
  transition:width .35s cubic-bezier(.2,.7,.3,1),opacity .22s,padding .35s,border-color .3s;
}
.busca input::placeholder{color:var(--tinta-45)}
.busca.aberta input{
  width:clamp(130px,20vw,230px);padding:0 12px 4px 2px;opacity:1;
  border-bottom-color:var(--linha);
}
.busca.aberta #abrir-busca .utl-ico{color:var(--carmim)}
.busca input::-webkit-search-cancel-button{display:none}
/* ---- Resultados da busca -------------------------------------------------
   Painel ANCORADO embaixo do campo, nao modal: a decisao de nao escurecer a
   pagina inteira pra um input (comentario acima) continua valendo. O que
   faltava nao era camada, era resultado.
   A barra .utl recolhe quando a pagina rola (.topo.solido); com a busca
   aberta ela precisa voltar, senao o atalho "/" e Ctrl+K focaria um campo
   invisivel. */
.topo.solido.com-busca .utl{max-height:60px;padding-top:10px;pointer-events:auto;overflow:visible}
.topo.solido.com-busca .utl-cx{transform:none}
.busca{position:relative}
.busca-painel{
  position:absolute;top:calc(100% + 10px);right:0;z-index:60;
  width:min(470px,calc(100vw - 24px));
  max-height:min(70vh,560px);overflow:auto;overscroll-behavior:contain;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);
  box-shadow:var(--sombra-lg);
  opacity:0;visibility:hidden;transform:translateY(-6px);
  transition:opacity .18s,transform .18s,visibility .18s;
}
.busca-painel.aberto{opacity:1;visibility:visible;transform:none}
/* ATENCAO: estes elementos vivem DENTRO de .utl, e a regra `.utl a,.utl button`
   la' em cima impoe display:flex, height:34px, padding e line-height:1 a
   qualquer link da barra. Sem reescrever isso aqui, o resultado virava tres
   colunas sobrepostas (titulo, contexto e resumo lado a lado) -- foi
   exatamente o que aconteceu na primeira versao. Por isso tudo abaixo e'
   prefixado por .busca-painel (especificidade 0,2,0 contra 0,1,1) e devolve
   display/altura/entrelinha ao normal. */
.busca-painel .busca-grupo{padding:4px 0}
.busca-painel .busca-grupo + .busca-grupo{border-top:1px solid var(--linha)}
.busca-painel .busca-grupo-rot{
  display:block;height:auto;padding:11px 16px 5px;
  font-family:var(--mono);font-size:10px;font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:var(--carmim);line-height:1.2;
}
.busca-painel .busca-item{
  display:block;width:100%;height:auto;gap:0;text-align:left;padding:9px 16px;
  border:0;border-left:2px solid transparent;border-radius:0;background:none;
  cursor:pointer;text-decoration:none;line-height:normal;
  font-size:14.5px;letter-spacing:0;color:var(--tinta);
}
.busca-painel .busca-item:hover,.busca-painel .busca-item.destacado{
  background:var(--osso);border-left-color:var(--carmim);color:var(--tinta);
}
.busca-painel .busca-item-t{
  display:block;font-family:var(--fonte);font-size:14.5px;font-weight:600;
  line-height:1.3;color:var(--tinta);letter-spacing:0;text-transform:none;
}
.busca-painel .busca-item-ctx{
  display:block;margin-top:2px;font-size:11.5px;line-height:1.35;color:var(--tinta-45);
  letter-spacing:0;text-transform:none;
}
.busca-painel .busca-item-d{
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  margin-top:3px;font-size:12.5px;line-height:1.45;color:var(--tinta-70);
  letter-spacing:0;text-transform:none;
}
/* o termo encontrado entra por LAVAGEM dourada, nao por fundo chapado --
   mesma logica da faixa de marca-texto dos titulos */
.busca-painel .busca-item mark{background:rgba(220,171,91,.34);color:inherit;border-radius:2px;padding:0 1px}
.busca-painel .busca-vazio{display:block;padding:22px 16px;font-size:13px;line-height:1.5;
  color:var(--tinta-70);letter-spacing:0;text-transform:none}
.busca-painel .busca-vazio b{color:var(--tinta)}
.busca-painel .busca-rodape{
  position:sticky;bottom:0;display:flex;justify-content:space-between;align-items:center;gap:12px;
  padding:9px 16px;background:var(--osso);border-top:1px solid var(--linha);
  font-size:11.5px;line-height:1.3;color:var(--tinta-45);letter-spacing:0;text-transform:none;
}
.busca-painel .busca-rodape a{display:inline;height:auto;padding:0;gap:0;
  color:var(--carmim);font-weight:600;font-size:11.5px;background:none}
.busca-painel .busca-rodape a:hover{background:none;opacity:.75}
.busca-painel .busca-rodape kbd{
  font-family:var(--mono);font-size:10px;padding:1px 5px;margin-right:3px;
  border:1px solid var(--linha);border-radius:var(--r-xs);background:#fff;color:var(--tinta-70);
}
@media (max-width:620px){
  /* o 'top' vem do JS (posiciona()): position:fixed ignora o pai posicionado */
  .busca-painel{position:fixed;left:12px;right:12px;width:auto;margin-top:0;max-height:min(66vh,520px)}
  .busca.aberta input{width:clamp(120px,38vw,200px)}
}
/* ---- /busca/: a mesma busca servida pelo PHP ----------------------------
   Existe pro Enter ter destino, pro resultado virar link compartilhavel e pra
   busca funcionar sem JavaScript. Le o mesmo indice do painel do topo. */
.busca-pagina{padding:clamp(28px,4vw,46px) 0 clamp(60px,8vw,110px)}
.busca-form{display:flex;align-items:center;gap:10px;
  max-width:720px;padding:6px 6px 6px 16px;
  background:#fff;border:1px solid var(--linha);border-radius:var(--pill);box-shadow:var(--sombra-sm)}
.busca-form svg{width:18px;height:18px;flex:none;color:var(--tinta-45)}
.busca-form input{flex:1;min-width:0;height:44px;border:0;outline:0;background:none;
  font-family:var(--fonte);font-size:1rem;color:var(--tinta)}
.busca-form .btn{flex:none}
.busca-aviso{margin:22px 0 0;color:var(--tinta-70);font-size:.95rem}
.busca-aviso b{color:var(--tinta)}
/* lista por tipografia e filete, nao por card */
.busca-lista{list-style:none;margin:26px 0 0;padding:0;max-width:760px;counter-reset:none}
.busca-lista li + li{border-top:1px solid var(--linha)}
.busca-lista a{display:block;padding:20px 0 22px;border-left:2px solid transparent;padding-left:0;
  transition:border-color .2s,padding-left .2s}
.busca-lista a:hover{border-left-color:var(--carmim);padding-left:16px}
.busca-lista-rot{display:block;font-family:var(--mono);font-size:10.5px;font-weight:600;
  letter-spacing:.07em;text-transform:uppercase;color:var(--carmim)}
.busca-lista-rot i{font-style:normal;opacity:.45}
.busca-lista h2{margin:6px 0 0;font-size:1.12rem;line-height:1.3;color:var(--tinta)}
.busca-lista p{margin:6px 0 0;color:var(--tinta-70);font-size:.9rem;line-height:1.55;max-width:66ch}
.busca-lista-url{display:block;margin-top:8px;font-family:var(--mono);font-size:11px;color:var(--tinta-45)}
@media (max-width:620px){
  .busca-form{padding-left:12px}
  .busca-form .btn{padding-left:16px;padding-right:16px}
}
/* seta pro topo no canto ESQUERDO: o widget mora no direito (bottom/right 20px,
   16px no mobile) e os dois nao podem disputar o mesmo canto. */
.subir{position:fixed;left:20px;bottom:20px;z-index:70;
  width:46px;height:46px;display:flex;align-items:center;justify-content:center;
  border:1px solid var(--linha-clara);border-radius:var(--r-md);cursor:pointer;
  background:var(--navy);color:#fff;
  opacity:0;visibility:hidden;transform:translateY(10px);
  transition:opacity .3s,transform .3s,visibility .3s,background .25s,border-color .25s}
.subir.vis{opacity:1;visibility:visible;transform:none}
.subir:hover{background:var(--carmim);border-color:var(--carmim)}
.subir svg{width:19px;height:19px}
.sub{
  position:absolute;top:calc(100% + 10px);right:0;min-width:348px;
  background:#fff;border-radius:var(--r-lg);border:1px solid var(--linha);
  box-shadow:var(--sombra-lg);padding:8px;
  opacity:0;visibility:hidden;transform:translateY(-8px);
  transition:opacity .22s ease,transform .22s cubic-bezier(.2,.7,.3,1),visibility .22s;
}
.tem-sub:hover .sub,.tem-sub:focus-within .sub{opacity:1;visibility:visible;transform:none}
/* ponte invisivel: sem ela o mouse "cai" no vao entre o item e o submenu */
.tem-sub::after{content:"";position:absolute;top:100%;right:0;width:100%;height:12px}
/* saiu de dentro do .menu, entao precisa declarar o proprio reset:
   antes herdava text-decoration:none de la e agora sublinhava */
.sub a{
  display:flex;gap:12px;align-items:flex-start;padding:12px 14px;
  border-radius:var(--r-md);text-decoration:none;color:var(--tinta);
  background:none;transition:background .2s;
}
.sub a:hover{background:var(--osso-2)}
/* deixa explicito que ali e area de acesso, e nao mais um menu de navegacao */
.sub-rot{padding:10px 14px 12px;margin-bottom:4px;border-bottom:1px solid var(--linha);
  color:var(--carmim);font-size:10.5px;letter-spacing:.15em}
.sub b{display:block;font-size:14.5px;font-weight:500;letter-spacing:-.01em;color:var(--tinta)}
/* 11.5px num painel de 348: a descricao mais longa mede 246 e sobram 24 de folga.
   Em 12.5px num painel de 330 ela media 265 contra 252 de espaco, e quebrava. */
.sub span{display:block;font-size:11.5px;line-height:1.45;color:var(--tinta-45);margin-top:3px}
.sub .sub-ico{flex:none;width:20px;height:20px;color:var(--carmim);margin-top:2px}
.sub .sub-ico svg{width:100%;height:100%}


/* ---------- menu em capsula ----------
   Item solto sobre foto depende do veu pra ser legivel, e o veu muda com a
   imagem. A capsula carrega o proprio contraste. Translucida, mas SEM blur:
   vidro fosco e justamente o que foi vetado. */
.menu{
  display:flex;align-items:center;gap:2px;
  padding:5px;border-radius:var(--pill);
  background:rgba(0,0,51,.68);border:1px solid rgba(246,242,237,.13);
  transition:background .3s,border-color .3s;
}
.nav.solido .menu{background:rgba(0,0,51,.045);border-color:var(--linha)}
/* so os itens da capsula, nao os links dentro dos paineis: `.menu a` tambem
   alcancava o .sub e o .mega, e la o item virava pilula */
.menu > a,.menu > .tem-sub-item > a{border-radius:var(--pill)}
/* chevron so em quem tem filho: e afordancia, nao enfeite */
.menu .com-sub{display:flex;align-items:center;gap:7px}
.menu .com-sub svg{width:12px;height:12px;opacity:.6;transition:transform .25s,opacity .25s}
.menu .tem-sub-item:hover .com-sub svg,
.menu .tem-sub-item:focus-within .com-sub svg{transform:rotate(180deg);opacity:1}
.tem-sub-item{position:relative;display:flex}
/* ponte invisivel: sem ela o mouse cai no vao entre o item e o painel */
.tem-sub-item::after{content:"";position:absolute;top:100%;left:0;width:100%;height:14px}
/* BUG REAL (achado pelo usuario: "abre quando o mouse passa na direcao do
   item, mas fora dele"): .tem-sub-item-cheio vira position:static (linha
   ~417, pra o .mega ancorar no .nav inteiro) -- isso tira o proprio contexto
   de posicionamento do item, entao a ::after acima (position:absolute;
   left:0;width:100%) deixa de se ancorar no item e passa a se ancorar no
   .nav inteiro: vira uma faixa invisivel de 14px cobrindo a LARGURA TOTAL do
   nav colada na base da barra, nao so' embaixo do link. Qualquer mouse
   cruzando essa faixa (mesmo embaixo de "Catalogo" ou de um espaco vazio)
   disparava mouseenter no item. Fix: a ponte nao faz falta aqui -- o show/
   hide de .tem-sub-item-cheio e' via JS (site.js), com folga de fechamento
   propria (250ms) e o painel .mega e' filho do item no DOM, entao entrar
   nele ja cancela o fechamento pendente sem precisar de ponte de CSS. */
.tem-sub-item-cheio::after{content:none}

/* mega menu das solucoes/segmentos: base do mecanismo de show/hide, sem
   layout proprio -- quem da forma e' .mega-cheio (ver abaixo). Revelado por
   clip-path (de cima pra baixo, "deslizando"), nao so' opacidade -- pedido
   explicito do usuario ("do jeito que fez, hoje, e' so' um fade rapido").
   ACHADO REAL (testado com mouse simulado, varias rodadas): :hover puro
   (.tem-sub-item:hover .mega) NAO da conta de um painel full-width. Duas
   falhas achadas: (1) o painel comeca la embaixo, na base do .nav inteiro
   -- ha' um vao real entre o texto do link e o topo do painel onde :hover
   se perde no meio do caminho pra um item mais distante; (2) tentar FECHAR
   esse vao alargando a caixa do item (padding/margin) resolveu (1) mas
   criou (2): Solucoes e Segmentos ficam a poucos px um do outro no nav, e
   a caixa alargada de um passou a encostar na do outro -- confirmado pelo
   usuario ("descendo o mouse, em alguns pontos, muda pro menu de
   Segmentos"). CSS puro nao tem como expressar "so' feche depois de uma
   folga" -- por isso o show/hide virou JS (ver site.js), com uma classe
   .aberto e um pequeno atraso pra fechar. O gatilho de :hover sumiu daqui
   de proposito. */
.mega{
  position:absolute;top:100%;
  opacity:0;visibility:hidden;pointer-events:none;
  clip-path:inset(0 0 100% 0);
  transition:opacity .2s ease,visibility .32s,clip-path .32s cubic-bezier(.2,.7,.3,1);
}
.tem-sub-item-cheio.aberto .mega{opacity:1;visibility:visible;pointer-events:auto;clip-path:inset(0 0 0% 0)}

/* .mega-cheio: painel EDGE-TO-EDGE, flush com a base do nav -- estilo
   apple.com (pedido explicito do usuario, print de referencia). Substituiu
   o cartao flutuante antigo (canto arredondado, ancorado no item): aquele
   exigia mexer em largura/posicao toda vez que o numero de itens mudava (foi
   o caso de Segmentos, que ja tinha vazado a tela 2x so' de crescer). Full-
   bleed elimina a classe inteira de bug: nao tem "acabou a largura" quando
   o painel sempre ocupa o nav inteiro.
   TECNICA: .tem-sub-item-cheio vira position:static (perde o proprio
   contexto de posicionamento), entao o .mega absolute dentro dele ancora no
   proximo ancestral posicionado, que e' .nav (position:relative, e' a barra
   inteira) -- left:0/right:0 relativos a .nav cobrem a barra toda, nao so' o
   item. Contato/Login NAO usam essa classe, continuam com o .sub flutuante
   de sempre + :hover puro (dropdown pequeno e isolado, sem o vao nem a
   vizinhanca que quebravam Solucoes/Segmentos). */
.tem-sub-item-cheio{position:static}
/* respiro + cantos arredondados nas laterais, pedido explicito do usuario
   (mesmo tratamento da barra ".utl-cx" -- "Monte sua Central/Migre sua
   Central" -- 10px de respiro, --r-md). Em cima fica encostado no nav
   (top:100% sem soma) -- so' visual, o show/hide agora e' via JS/.aberto,
   entao um vao aqui nao quebra mais nada. */
.mega.mega-cheio{
  left:10px;right:10px;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-md);
  box-shadow:var(--sombra-lg);
}
/* ACHADO REAL (reportado pelo usuario com print, apos rolar a pagina):
   .nav.solido ja' ganha margin:10px pra' "flutuar" a barra (ver acima) --
   o left/right:10px do .mega (pensado pro estado base, onde .nav NAO tem
   margem propria) somava um SEGUNDO recuo de 10px em cima desse, deixando
   o painel 20px mais estreito que a barra solida por cima dele. .mega
   ancora no .nav (proximo ancestral position:relative -- ver comentario
   "TECNICA" acima), entao o box do nav ja' vem inset pela margem; o painel
   so' precisa ir de ponta a ponta DENTRO dele (left/right:0), sem repetir
   o respiro. */
.nav.solido .mega.mega-cheio{left:0;right:0}

/* Fundo embacado quando Solucoes/Segmentos abre -- pedido explicito do
   usuario, com excecoes explicitas: NAO embaca #topo (barra Monte/Migre +
   logo + menu + Falar com Vendas/Login moram todos ali dentro) nem o
   widget de atendimento.
   ACHADO REAL (1a tentativa, reprovada em 2 frentes): filter:blur() direto
   em cada filho de <body> (header/sections/footer) gerava uma borda clara
   visivel na quina de cada secao (cada uma borra sozinha, sem enxergar a
   vizinha -- e o blur "vaza" pra fora da propria caixa nas bordas da
   pagina) E quebrava o hover do mega em telas grandes: filter cria um novo
   contexto de empilhamento em CADA secao, e o ponteiro passava a acertar
   o conteudo da pagina (confirmado via elementFromPoint) em vez do painel,
   mesmo o painel estando visivel por cima.
   FIX correto: UM veu so' (.mega-veu), fixed cobrindo a tela inteira, com
   backdrop-filter (embaca o que esta' ATRAS dele, sem borda por secao --
   e' uma composicao so'). Vem ANTES do .nav no DOM dentro de #topo, entao
   nav/mega pintam por cima dele naturalmente (sem precisar de z-index).
   O widget e' injetado FORA de #topo, depois no body -- fica por cima do
   veu por ordem do DOM, sem precisar de excecao explicita. */
.mega-veu{
  position:fixed;inset:0;pointer-events:none;
  opacity:0;visibility:hidden;
  transition:opacity .25s ease,visibility .25s,backdrop-filter .25s ease;
}
body:has(.tem-sub-item-cheio.aberto) .mega-veu{
  opacity:1;visibility:visible;
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
}
.mega-cheio-grade{
  max-width:var(--max);margin:0 auto;padding:36px var(--gut);
  display:grid;grid-template-columns:repeat(3,1fr);gap:8px 48px;
}
.mega.mega-segmentos .mega-cheio-grade{grid-template-columns:repeat(4,1fr)}
.mega-col > .rot{
  display:block;padding:0 0 10px;margin-bottom:10px;
  border-bottom:1px solid var(--linha);color:var(--carmim);font-size:10.5px;letter-spacing:.15em;
}
/* caixa de selecao com cantos arredondados no hover -- pedido explicito do
   usuario, mesmo tratamento do dropdown de Contato/Login (.sub a). */
.mega a{
  display:flex;gap:12px;align-items:flex-start;padding:10px 12px;
  border-radius:var(--r-md);text-decoration:none;color:var(--tinta);
  background:none;transition:background .2s;
}
.mega a:hover{background:var(--osso-2)}
.mega b{display:block;font-size:15.5px;font-weight:600;letter-spacing:-.01em}
.mega span.d{display:block;font-size:12px;line-height:1.4;color:var(--tinta-45);margin-top:3px}
/* apple.com nao usa icone -- so' hierarquia tipografica. Removido aqui (nao
   no PHP): mega-solucoes.php e' compartilhado com o consolidado das
   migalhas (.migalhas-mega/.mini-ico), que continua com icone -- so' o
   .mega-cheio (nav principal) fica sem. */
.mega.mega-cheio .mega-ico{display:none}
/* EXPERIMENTO -- pedido explicito do usuario ("quero testar um efeito"):
   hover num item aumenta a escala do texto DELE e reduz a dos demais no
   MESMO painel (todas as colunas, nao so' a coluna atual). Fora de qualquer
   item -- inclusive no respiro entre eles -- fica tudo no tamanho padrao.
   Truque: :has(a:hover) no .mega inteiro detecta "algum link deste painel
   esta em hover" sem JS (mesma tecnica ja usada em .mega-veu); ai' basta
   :not(:hover) pros "demais" e :hover pro proprio item -- selecionam
   conjuntos disjuntos, sem conflito de especificidade. So' escala .mega-txt
   (o bloco titulo+desc), o .mega-cheio (nav principal) -- a versao compacta
   das migalhas (.migalhas-mega) nem tem essa classe, fica de fora sozinha. */
.mega-txt{display:block;transition:transform .3s cubic-bezier(.2,.7,.3,1);transform-origin:left center}
.mega.mega-cheio:has(a:hover) a:not(:hover) .mega-txt{transform:scale(.92)}
.mega.mega-cheio a:hover .mega-txt{transform:scale(1.08)}
@media (max-width:980px){ .mega{display:none} }


/* o .sub nasceu ancorado a direita, para o botao de acesso. No menu ele precisa
   abrir da esquerda pra direita, senao sai da tela pelo lado de fora. */
.sub-esq{left:0;right:auto}
/* a regra que abre o .sub mira .tem-sub, que e o botao de acesso. No menu o
   pai e .tem-sub-item, entao sem esta linha o painel existe e nunca aparece. */
.tem-sub-item:hover .sub,.tem-sub-item:focus-within .sub{opacity:1;visibility:visible;transform:none}
/* o item de WhatsApp e <button>, nao <a>: precisa dos mesmos estilos do link */
.sub button{
  width:100%;border:0;cursor:pointer;font-family:var(--fonte);text-align:left;
  display:flex;gap:12px;align-items:flex-start;padding:12px 14px;
  border-radius:var(--r-md);color:var(--tinta);background:none;transition:background .2s;
}
.sub button:hover{background:var(--osso-2)}

/* aviso em camada: o WhatsApp nao e canal aberto, entao o clique explica antes
   de mandar a pessoa pro lugar errado */
.aviso{
  position:fixed;inset:0;z-index:90;display:flex;align-items:center;justify-content:center;
  padding:var(--gut);background:rgba(0,0,51,.66);
  opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s;
}
.aviso.aberto{opacity:1;visibility:visible}
.aviso-cx{
  width:min(420px,100%);background:#fff;border-radius:var(--r-xl);
  box-shadow:var(--sombra-lg);padding:34px 30px 26px;text-align:center;
  transform:translateY(10px);transition:transform .28s cubic-bezier(.2,.7,.3,1);
}
.aviso.aberto .aviso-cx{transform:none}
.aviso-ico{
  display:flex;align-items:center;justify-content:center;width:52px;height:52px;
  margin:0 auto 18px;border-radius:50%;background:rgba(168,40,42,.1);color:var(--carmim);
}
.aviso-ico svg{width:24px;height:24px}
.aviso h3{margin:0 0 12px;font-size:1.3rem;letter-spacing:-.02em}
.aviso p{color:var(--tinta-70);font-size:14.5px;line-height:1.6;margin:0 0 24px}
.aviso p b{color:var(--carmim);font-weight:600}
.aviso .btn{width:100%;justify-content:center}
.aviso-fechar{
  width:100%;margin-top:10px;padding:13px;border:0;cursor:pointer;
  background:var(--osso-2);color:var(--tinta-70);border-radius:var(--r-sm);
  font-family:var(--fonte);font-size:14.5px;font-weight:500;transition:background .2s,color .2s;
}
.aviso-fechar:hover{background:var(--linha);color:var(--tinta)}

/* ---------- hero ---------- */
.hero{position:relative;min-height:var(--palco-h,100svh);overflow:hidden;background:var(--navy);display:flex;flex-direction:column;justify-content:flex-end}
.hero-img{position:absolute;inset:0}
/* fundo em video (ver index.php): a foto (1o frame do video) fica por baixo e
   o video por cima, invisivel ate' disparar 'playing' -- entao nunca aparece
   quadro preto nem salto de imagem, e se o video nao tocar a foto segura.
   object-position puxado pra direita: a torre principal fica a ~72% da
   largura no 1o frame. No desktop o corte lateral e' pequeno (62% basta);
   no celular (retrato) o corte e' estreito e vai a 70%, ver media 700px. */
.hero-img img,.hero-img video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:62% 50%}
.hero-video{opacity:0;transition:opacity .8s ease}
.hero-video.tocando{opacity:1}
/* veu mais fechado: o navy passa a mandar na imagem em vez de so encostar nela.
   As duas radiais no fim sao a base da /lp/rastreadorj16 -- azul entrando pelo
   alto direito e carmim pelo pe esquerdo -- adaptadas pro nosso #a8282a. */
.hero-veu{
  position:absolute;inset:0;
  background:
    linear-gradient(97deg,rgba(0,0,51,.92) 0%,rgba(0,0,51,.82) 30%,rgba(0,0,51,.56) 58%,rgba(0,0,51,.32) 100%),
    linear-gradient(to top,rgba(0,0,51,.86) 0%,rgba(0,0,51,.38) 38%,rgba(0,0,51,.22) 70%,rgba(0,0,51,.4) 100%),
    radial-gradient(1200px 500px at 82% -10%, rgba(30,58,138,.55), transparent),
    radial-gradient(900px 500px at 0% 110%, rgba(168,40,42,.4), transparent);
}
/* pontos de luz, mesma receita da LP: circulos grandes com blur de 80px flutuando
   devagar. Ficam ACIMA do veu -- embaixo dele virariam mancha, nao luz. */
.aurora{position:absolute;inset:0;z-index:1;pointer-events:none;overflow:hidden}
.aurora span{position:absolute;border-radius:50%;filter:blur(80px);opacity:.5}
.aurora span:nth-child(1){width:360px;height:360px;background:rgba(168,40,42,.4);left:-64px;top:64px}
.aurora span:nth-child(2){width:420px;height:420px;background:rgba(37,99,235,.3);right:-40px;top:120px}
.aurora span:nth-child(3){width:300px;height:300px;background:rgba(220,171,91,.16);left:42%;bottom:-70px}
@media (prefers-reduced-motion:no-preference){
  .aurora span{animation:flutua 15s ease-in-out infinite}
  .aurora span:nth-child(2){animation-delay:-6s}
  .aurora span:nth-child(3){animation-delay:-10s}
}
@keyframes flutua{0%,100%{transform:translate(0,0)}50%{transform:translate(24px,-26px)}}
.hero > .wrap{position:relative;z-index:2;width:100%;padding-top:150px;padding-bottom:clamp(34px,4vw,56px)}
.hero-rot{display:flex;align-items:center;gap:12px;color:var(--dourado);margin-bottom:20px}
.hero-rot i{display:block;width:32px;height:1px;background:var(--dourado);opacity:.75}
.hero h1{position:relative;color:#fff;max-width:15ch;text-shadow:0 2px 40px rgba(0,0,51,.4)}
/* glitch no hover do titulo inteiro: separa os canais em vermelho/azul e
   sacode em passos (steps, nao ease) por 0,5s -- ver JS que adiciona/remove
   a classe, porque reaplicar a mesma classe sozinha nao reinicia a animacao */
@keyframes glitchTexto{
  0%,100%{text-shadow:0 2px 40px rgba(0,0,51,.4);filter:none;clip-path:inset(0 0 0 0);opacity:1}
  5%{text-shadow:6px 0 rgba(168,40,42,.9),-6px 0 rgba(37,99,235,.85);filter:contrast(1.35) saturate(1.4)}
  10%{text-shadow:0 2px 40px rgba(0,0,51,.4);filter:none}
  15%{clip-path:inset(0 0 55% 0);opacity:.35}
  18%{clip-path:inset(0 0 0 0);opacity:1;text-shadow:-7px 0 rgba(168,40,42,.9),7px 0 rgba(37,99,235,.85)}
  24%{text-shadow:0 2px 40px rgba(0,0,51,.4)}
  30%{text-shadow:5px 0 rgba(168,40,42,.8),-5px 0 rgba(37,99,235,.75);filter:blur(1.5px)}
  34%{filter:none;text-shadow:0 2px 40px rgba(0,0,51,.4)}
  40%{clip-path:inset(60% 0 0 0);opacity:.3}
  43%{clip-path:inset(0 0 0 0);opacity:1}
  50%{text-shadow:-6px 0 rgba(168,40,42,.85),6px 0 rgba(37,99,235,.8);filter:contrast(1.4)}
  55%{text-shadow:0 2px 40px rgba(0,0,51,.4);filter:none}
  62%{text-shadow:7px 0 rgba(168,40,42,.9),-7px 0 rgba(37,99,235,.85)}
  66%{text-shadow:0 2px 40px rgba(0,0,51,.4)}
  72%{clip-path:inset(0 0 65% 0);opacity:.35}
  75%{clip-path:inset(0 0 0 0);opacity:1;text-shadow:-4px 0 rgba(168,40,42,.7),4px 0 rgba(37,99,235,.65)}
  80%{text-shadow:0 2px 40px rgba(0,0,51,.4)}
  88%{text-shadow:5px 0 rgba(168,40,42,.75),-5px 0 rgba(37,99,235,.7);filter:saturate(1.5)}
  93%{filter:none;text-shadow:0 2px 40px rgba(0,0,51,.4)}
}
/* mais forte que a versao anterior: offsets de cor maiores (ate 7px), pulsos
   de filter (contraste/saturacao/blur, tipo "pico de sinal") e dois cortes
   rapidos de clip-path (a metade do texto some por 1-2 passos, tipo linha
   de varredura falhando) -- nao mexe na posicao do texto (sem translate),
   so isso ja da conta de ler como interferencia bem mais forte */
.hero h1.glitch{animation:glitchTexto .4s steps(1,end) 1}
.hero h1 > span{position:relative;z-index:1}
/* REDE: globo de rede grande, cortado do equador pra cima, girando devagar --
   ver script no fim da pagina. Malha densa (150 pontos, 5 vizinhos cada); o
   lado de tras da esfera desenha tambem, so que escurecido pro azul do
   fundo (profundidade e' cor, nunca opacidade sumindo). Substitui as ondas
   concentricas (que um concorrente ja usa) e tentativas anteriores que nao
   acertaram; canvas da controle total sobre o pixel. */
/* pointer-events:none: o rastreio do mouse escuta no .hero (mousemove
   borbulha), entao nao precisa do canvas participar do hit-test */
.rede{position:absolute;inset:0;z-index:1;pointer-events:none}
/* prefixo variavel do slogan; em bloco proprio, senao a troca de palavra reflui a linha.
   width:fit-content encolhe a caixa de cada linha pro tamanho real do texto --
   sem isso, a linha da palavra curta ("Tecnologia") herdava a largura da linha
   mais longa ("para quem busca qualidade.") e sobrava area vazia a direita,
   onde o hover do glitch disparava sem ter texto nenhum embaixo do cursor. */
.hero h1 .giro{display:block;color:var(--dourado);width:fit-content}
.hero h1 .giro span,.slogan p em{display:inline-block;transition:opacity .26s ease,transform .26s ease}
.hero h1 .giro span.sai,.slogan p em.sai{opacity:0;transform:translateY(-14px)}
.hero h1 .l{display:block;width:fit-content}
.hero-sub{margin-top:22px;max-width:52ch;color:rgba(246,242,237,.85);font-size:clamp(1rem,1.3vw,1.16rem);line-height:1.55}
.hero-acoes{display:flex;flex-wrap:wrap;gap:12px;margin-top:30px}

/* faixa: as SOLUCOES, agrupadas. 8 colunas nao seriam legiveis; 3 grupos sim. */
.hero-pe{position:relative;z-index:2;background:linear-gradient(to top,rgba(0,0,51,.94),rgba(0,0,51,.72));backdrop-filter:blur(6px);border-top:1px solid var(--linha-clara)}
/* acima de 700px a faixa descola das bordas e vira um painel flutuante, mesma
   receita do .nav.solido: margem fixa + padding do wrap descontado dela, pra
   o conteudo continuar alinhado com o h1 e os botoes ali em cima. Fica de fora
   do mobile de proposito -- la embaixo a faixa rola na horizontal encostada
   nas bordas, e o painel flutuante atrapalharia o gesto de arrastar. */
@media (min-width:701px){
  .hero-pe{
    --pe-respiro:clamp(14px,2vw,26px);
    margin:0 var(--pe-respiro) var(--pe-respiro);
    border:1px solid var(--linha-clara);
    border-radius:var(--r-xl);
    box-shadow:var(--sombra-lg);
  }
  .hero-pe .wrap{padding-inline:calc(var(--gut) - var(--pe-respiro))}
}
/* icone outline + titulo + descricao breve, agrupado em 3. Sem caixa: a foto
   ja e cheia, e caixa sobre caixa nivela tudo no mesmo peso. */
.hero-pe .wrap{display:grid;grid-template-columns:repeat(3,1fr);gap:0;padding-top:clamp(40px,4.2vw,54px);padding-bottom:clamp(42px,4.4vw,56px)}
.hpe-grupo{padding-inline:clamp(16px,2.6vw,40px);display:flex;gap:14px;align-items:flex-start;text-decoration:none;transition:opacity .25s}
.hpe-grupo:first-child{padding-left:0}
.hpe-grupo:last-child{padding-right:0}
.hpe-grupo + .hpe-grupo{border-left:1px solid var(--linha-clara)}
.hpe-ico{flex:none;width:34px;height:34px;color:var(--dourado);transition:transform .35s cubic-bezier(.2,.7,.3,1)}
.hpe-ico svg{width:100%;height:100%;display:block}
.hpe-grupo:hover .hpe-ico{transform:translateY(-3px)}
/* o titulo cresce no hover por transform, nao por font-size: font-size refluiria
   a descricao embaixo a cada passada de mouse */
.hpe-grupo b{display:block;color:#fff;font-size:15.5px;font-weight:500;letter-spacing:-.015em;margin-bottom:3px;
  transform-origin:left center;transition:transform .3s cubic-bezier(.2,.7,.3,1)}
.hpe-grupo:hover b{transform:scale(1.075)}
.hpe-grupo p{color:rgba(246,242,237,.62);font-size:13.5px;line-height:1.45}
.hpe-grupo:hover p{color:rgba(246,242,237,.8)}

/* ---------- manifesto ---------- */
.manifesto{padding:clamp(66px,8vw,120px) 0;border-bottom:1px solid var(--linha)}
.manifesto-grid{display:grid;grid-template-columns:minmax(0,.62fr) minmax(0,1.6fr);gap:clamp(26px,5vw,76px);align-items:start}
.manifesto-grid > div:first-child{position:sticky;top:92px}
.manifesto-grid > div:first-child .idx{display:block;padding-bottom:13px;border-bottom:1px solid var(--linha)}
.manifesto-grid > div:first-child .nota{margin-top:13px;font-family:var(--mono);font-size:11.5px;line-height:1.75;color:var(--tinta-45)}
.manifesto p.grande{font-size:clamp(1.45rem,2.7vw,2.2rem);line-height:1.3;letter-spacing:-.022em;font-weight:500}
.manifesto p.grande b{font-weight:700;color:var(--carmim)}
.manifesto .apoio{margin-top:24px;max-width:56ch;color:var(--tinta-70)}
.assin{margin-top:28px;display:flex;align-items:center;gap:14px}
.assin img{width:60px;height:60px;border-radius:var(--pill);object-fit:cover;object-position:center 18%;background:var(--osso-2);filter:grayscale(1) brightness(1.15) contrast(1.1);box-shadow:var(--sombra-sm)}
.assin .rot{color:var(--tinta-45);display:block;margin-top:2px}
.assin b{font-size:14.5px}

/* ---------- solucoes ---------- */
.solucoes{padding:clamp(66px,8vw,120px) 0;position:relative}
/* marca-dagua decorativa (recorte outline do "VOX" do logotipo) cobrindo a
   section inteira, com parallax sutil. E um ::before (nao background direto
   na section) pra poder ter opacidade propria sem clarear o --osso por
   baixo, e pra nao precisar de overflow no elemento que contem o .pilha
   (sticky cards la embaixo).
   NAO e' mais background-attachment:fixed -- era a causa de um jank real de
   rolagem (usuario relatou trava, mais visivel bem aqui): fixed forca o
   navegador a repintar o fundo a cada frame em vez do compositor so' mover
   uma camada. --paralaxe-fundo e' escrito por site.js via transform (translate),
   que roda so' no compositor. */
.solucoes::before{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:url(/assets/bg-linhas-2.webp) center/cover no-repeat;
  opacity:.2;translate:0 var(--paralaxe-fundo,0px);
}
.solucoes > .wrap{position:relative;z-index:1}
.sec-topo{display:flex;justify-content:space-between;align-items:flex-end;gap:30px;margin-bottom:clamp(30px,4vw,52px)}
.sec-topo .rot{color:var(--carmim)}
.sec-topo h2{margin-top:12px;max-width:20ch}

/* Variante "alta": quando o filete vermelho do lede precisa acompanhar a
   altura do H2 sozinho (nao um rotulo .rot acima dele) e o texto do lede
   fica centralizado verticalmente nessa altura. Uso: rotulo sai de dentro
   do .sec-topo e vira uma linha propria por cima (classe .sec-rot); dentro
   do .sec-topo ficam so' o H2 e o .lede-centrada (os 2 flex-items, que o
   align-items:stretch iguala em altura). O <p> em si continua bloco normal
   -- so' quem centraliza e' o wrapper .lede-centrada, senao o texto solto +
   qualquer <span> dentro dele quebram de fluir numa mesma linha. Ver
   /desenrola/ e /cases/. */
.sec-rot{font-family:var(--mono);font-size:11.5px;font-weight:500;letter-spacing:.16em;text-transform:uppercase;color:var(--carmim);display:block;margin-bottom:12px}
.sec-topo-alto{align-items:stretch}
.sec-topo-alto > h2{margin-top:0}
.lede-centrada{display:flex;flex-direction:column;justify-content:center}
.lede-centrada > p{margin:0}
/* STACKED CARDS: position:sticky com top incremental, mesmo mecanismo do
   revitastudio.com.br. Cada frente vira um card que empilha na rolagem. */
.pilha{position:relative;padding-bottom:60px}
.grupo{
  margin-top:clamp(22px,3vw,34px);
  background:var(--osso);border:1px solid var(--linha);border-radius:var(--r-lg);
  padding:clamp(22px,2.6vw,34px);box-shadow:var(--sombra-md);
}
@media (min-width:980px){
  .grupo{position:sticky}
  .grupo:nth-of-type(1){top:96px}
  .grupo:nth-of-type(2){top:118px}
  .grupo:nth-of-type(3){top:140px}
}
.grupo-cab{display:flex;align-items:center;gap:14px;margin-bottom:18px}
.grupo-cab .rot{color:var(--carmim);white-space:nowrap}
.grupo-cab i{display:block;height:1px;flex:1;background:var(--linha)}
.grupo-cab .cont{font-family:var(--mono);font-size:11.5px;color:var(--tinta-45);white-space:nowrap}
/* dentro do card empilhado os itens ficam planos, senao vira caixa dentro de caixa */
.grupo .sol{box-shadow:none;border:1px solid var(--linha);background:#fff}
.grupo .sol:hover{box-shadow:var(--sombra-md);transform:translateY(-3px)}
/* .grupo .sol e (0,2,0) e atropelava o .sol-cta (0,1,0), deixando fundo branco
   com texto claro por cima. Terceira vez que especificidade me pega neste arquivo. */
.grupo .sol-cta{background:linear-gradient(150deg,var(--navy-2),var(--navy));border-color:rgba(246,242,237,.12)}
.grade{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(14px,1.8vw,24px)}
.grade.dois{grid-template-columns:repeat(2,1fr)}
.sol{
  display:block;text-decoration:none;background:#fff;border-radius:var(--r-lg);
  overflow:hidden;box-shadow:var(--sombra-sm);
  transition:transform .35s cubic-bezier(.2,.7,.3,1),box-shadow .35s;
}
.sol:hover{transform:translateY(-4px);box-shadow:var(--sombra-lg)}
.sol-foto{position:relative;aspect-ratio:16/10;overflow:hidden;background:var(--navy-2);margin:10px 10px 0;border-radius:var(--r-md)}
.sol-foto img{width:100%;height:100%;object-fit:cover;transition:transform .7s cubic-bezier(.2,.7,.3,1)}
.sol:hover .sol-foto img{transform:scale(1.05)}
/* VERIFICADO com sharp: só jvx.webp tem alpha; tag-* e dashcam-* são opacas com
   fundo BRANCO. Por isso o box de produto é claro, senao aparece retangulo branco. */
.sol-foto.produto{background:#fff;padding:12px;border:1px solid var(--linha)}
.sol-foto.produto img{object-fit:contain}
.sol:hover .sol-foto.produto img{transform:scale(1.06)}
.sol-corpo{padding:18px 22px 24px}
.sol-corpo h3{margin-bottom:7px}
.sol-corpo p{color:var(--tinta-70);font-size:14.5px;line-height:1.5}
.sol-link{margin-top:14px;display:inline-flex;align-items:center;gap:7px;color:var(--carmim);font-weight:500;font-size:14px}
.sol-link i{transition:transform .25s}
.sol:hover .sol-link i{transform:translateX(4px)}
/* .sol-link tambem usado solto (fora de .sol), ex.: link "ver todos" no fim
   de uma grade -- precisa do proprio hover, nao so' o do pai. */
.sol-link:hover i{transform:translateX(4px)}
/* card de conversa no 3o slot de Conectividade. Fica DEPOIS de .sol-corpo de
   proposito: mesma especificidade, so a ordem decide, e antes o texto saia escuro. */
.sol-cta{background:linear-gradient(150deg,var(--navy-2),var(--navy));display:flex;align-items:center;border:1px solid rgba(246,242,237,.1)}
.sol-cta .rot{color:var(--dourado);display:block;margin-bottom:12px}
.sol-cta h3{color:#fff}
.sol-cta p{color:rgba(246,242,237,.72)}
.sol-cta .sol-link{color:var(--dourado)}

/* ---------- por que ---------- */
.porque{background:var(--navy);color:var(--osso);padding:clamp(66px,8vw,120px) 0;position:relative;overflow:hidden}
.porque::before{content:"";position:absolute;top:-25%;right:-8%;width:58%;height:150%;background:radial-gradient(ellipse at center,rgba(188,82,87,.42),transparent 62%);pointer-events:none}
.porque .wrap{position:relative;z-index:1}
.porque .sec-topo .rot{color:var(--dourado)}
.porque h2{color:#fff;max-width:20ch}
.porque .lede{color:rgba(246,242,237,.66);max-width:42ch}
.grade-pq{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(12px,1.6vw,20px)}
.pq{background:rgba(246,242,237,.05);border:1px solid var(--linha-clara);border-radius:var(--r-lg);padding:26px 22px 30px;transition:background .3s,transform .3s}
.pq:hover{background:rgba(246,242,237,.09);transform:translateY(-3px)}
.pq .rot{color:var(--dourado);opacity:.9}
.pq b{display:block;font-size:clamp(1.2rem,1.8vw,1.5rem);font-weight:700;letter-spacing:-.022em;margin:14px 0 9px;line-height:1.15;min-height:2.3em}
.pq p{color:rgba(246,242,237,.62);font-size:14.5px;line-height:1.5}

/* ---------- jornadas ---------- */
.jornadas{padding:clamp(66px,8vw,120px) 0;background:var(--osso-2)}
.grade-jor{display:grid;grid-template-columns:1fr 1fr;gap:clamp(16px,2.2vw,28px)}
.jor{position:relative;display:block;text-decoration:none;border-radius:var(--r-lg);overflow:hidden;min-height:340px;box-shadow:var(--sombra-md);transition:transform .35s cubic-bezier(.2,.7,.3,1),box-shadow .35s}
.jor:hover{transform:translateY(-4px);box-shadow:var(--sombra-lg)}
.jor-foto{position:absolute;inset:0}
.jor-foto img{width:100%;height:100%;object-fit:cover;transition:transform .8s cubic-bezier(.2,.7,.3,1)}
.jor:hover .jor-foto img{transform:scale(1.05)}
.jor-foto::after{content:"";position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,51,.94) 8%,rgba(0,0,51,.6) 46%,rgba(0,0,51,.18) 100%)}
.jor-txt{position:relative;z-index:1;padding:clamp(26px,3vw,40px);display:flex;flex-direction:column;justify-content:flex-end;min-height:340px;color:#fff}
.jor-txt .rot{color:var(--dourado);margin-bottom:10px}
.jor-txt h3{color:#fff;font-size:clamp(1.35rem,2.1vw,1.75rem);margin-bottom:9px}
.jor-txt p{color:rgba(246,242,237,.82);font-size:15px;line-height:1.5;max-width:42ch}
.jor-txt .sol-link{color:var(--dourado);margin-top:16px}
.jor:hover .sol-link i{transform:translateX(4px)}

/* ---------- depoimentos ---------- */
.depo{padding:clamp(66px,8vw,120px) 0;background:var(--navy);color:var(--osso);overflow:hidden}
.depo h2{color:#fff}
.depo .sec-topo .rot{color:var(--dourado)}
.depo .lede{color:rgba(246,242,237,.62)}
/* padding-left/right (nao margin) nasce comida pelo proprio scroll-snap
   mandatory: medido -- scrollLeft chegava em 20px sozinho, sem input do
   usuario, empurrando o 1o card pra x:0 apesar do padding. Mesma causa e
   mesma correcao ja aplicada em .grade-posts-carrossel/.tempo-trilha:
   respiro via margin no 1o/ultimo item + scroll-padding-inline avisando o
   algoritmo de snap sobre o inset. Vale pro desktop tambem -- esta regra
   nao esta' dentro de media query, o carrossel ja existe em todas as
   larguras. */
/* MEDIDO: em 1920px o ultimo card acabava em 1672 (248px de vao morto a'
   direita); em 2560px, 888px. Os seis cards tem largura fixa, entao a partir
   de ~1750px a fileira para de rolar e fica encostada a' esquerda.
   `safe center` centraliza quando sobra espaco e volta sozinho pra esquerda
   quando o conteudo e' maior que a caixa -- `center` puro cortaria o comeco
   da fileira fora da area rolavel nesse segundo caso. */
.depo-track{
  display:flex;justify-content:safe center;gap:clamp(12px,1.6vw,20px);
  overflow-x:auto;scroll-snap-type:x mandatory;
  padding-bottom:8px;scrollbar-width:none;scroll-padding-inline:var(--gut);
}
.depo-track::-webkit-scrollbar{display:none}
.depo-card:first-child{margin-left:var(--gut)}
.depo-card:last-child{margin-right:var(--gut)}
.depo-card{
  position:relative;flex:0 0 clamp(210px,17vw,250px);aspect-ratio:9/16;
  border-radius:var(--r-lg);overflow:hidden;scroll-snap-align:start;text-decoration:none;
  border:1px solid rgba(246,242,237,.12);transition:transform .35s cubic-bezier(.2,.7,.3,1)
}
.depo-card:hover{transform:translateY(-5px)}
.depo-card > img{width:100%;height:100%;object-fit:cover;filter:saturate(.9)}
.depo-card::after{content:"";position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,51,.92) 6%,transparent 52%)}
.depo-play{
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2;
  width:52px;height:52px;border-radius:50%;background:rgba(168,40,42,.92);
  display:flex;align-items:center;justify-content:center;color:#fff;
  box-shadow:0 8px 24px rgba(0,0,51,.4);transition:transform .3s,background .3s;
}
.depo-play svg{width:22px;height:22px;margin-left:2px}
.depo-card:hover .depo-play{transform:translate(-50%,-50%) scale(1.12);background:var(--carmim-vivo)}
.depo-nome{position:absolute;left:16px;right:16px;bottom:14px;z-index:2;color:#fff}
.depo-nome b{display:block;font-size:14.5px;font-weight:500;letter-spacing:-.01em}
.depo-nome > span{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.05em;color:rgba(246,242,237,.6);margin-top:2px}

/* card final da fileira de depoimentos */
.depo-fim{
  display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;
  gap:16px;padding:22px;background:
    radial-gradient(ellipse at 70% 20%,rgba(168,40,42,.35),transparent 62%),
    linear-gradient(160deg,var(--navy-2),var(--navy));
  border:1px dashed rgba(246,242,237,.22);
}
.depo-fim::after{display:none}
.depo-fim-marca{width:40px;height:40px;color:var(--dourado);margin-bottom:auto}
.depo-fim-marca svg{width:100%;height:100%}
.depo-fim-txt b{display:block;color:#fff;font-size:16px;font-weight:500;letter-spacing:-.015em;line-height:1.25}
.depo-fim-txt > span{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.05em;color:rgba(246,242,237,.55);margin-top:6px}
.depo-fim:hover{border-color:var(--dourado)}

/* ---------- parceiros ---------- */
.parceiros{background:var(--osso);padding:clamp(72px,9vw,124px) 0}
.parc-cab{text-align:center;max-width:52ch;margin:0 auto clamp(40px,5vw,64px)}
.parc-cab .rot{color:var(--carmim);display:block;margin-bottom:14px}
.parc-cab p{font-size:clamp(1.15rem,1.9vw,1.5rem);line-height:1.4;letter-spacing:-.02em;font-weight:500}
.parc-grade{display:grid;grid-template-columns:repeat(8,1fr);gap:clamp(12px,1.8vw,26px);align-items:center}
/* circulo com contorno: sem ele os logos flutuam e desalinham entre si */
.parc{
  display:flex;align-items:center;justify-content:center;
  aspect-ratio:1;border-radius:50%;background:#fff;
  border:1px solid var(--linha);box-shadow:var(--sombra-sm);
  padding:16%;
  transition:transform .5s cubic-bezier(.2,.7,.3,1),border-color .5s,box-shadow .5s;
}
.parc img{height:auto;width:100%;max-height:100%;object-fit:contain;filter:grayscale(1) opacity(.5);transition:filter .5s}
/* revezamento: um circulo por vez cresce e revela a cor, controlado por JS
   (ver script) pra poder reagir ao hover -- pausa nele, e o looping so
   retoma, a partir dali, quando o mouse sai */
.parc.ativo{transform:scale(1.13);border-color:rgba(168,40,42,.45);box-shadow:var(--sombra-md)}
.parc.ativo img{filter:grayscale(0) opacity(1)}

@media (prefers-reduced-motion:no-preference){
  /* as pocas de luz atravessam a barra devagar */
  .utl-cx::before{animation:utlLuz 26s linear infinite}
}
@keyframes utlLuz{from{background-position:0% 50%}to{background-position:230% 50%}}

/* ---------- slogan ---------- */
.slogan{background:var(--osso-2);padding:clamp(56px,7vw,100px) 0;text-align:center}
.slogan .marca-g{height:34px;width:auto;margin:0 auto 26px}
.slogan p{font-size:clamp(1.5rem,3.2vw,2.6rem);font-weight:700;letter-spacing:-.028em;line-height:1.15}
.slogan p em{font-style:normal;color:var(--carmim)}
.slogan .apoio{margin-top:16px;color:var(--tinta-70);max-width:52ch;margin-inline:auto;font-size:1.02rem}
/* span com display:block, nunca <br> com classe responsiva */
@media (min-width:768px){.slogan .apoio .l2{display:block}}

/* ---------- gente ---------- */
/* full bleed como na v1: a caixa com margem encolhia a foto e a section perdia presenca */
.gente{background:var(--navy);color:var(--osso);padding:0;overflow:hidden}
.gente-cx{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);align-items:stretch}
.gente-txt{padding:clamp(56px,7vw,110px) clamp(28px,4vw,72px) clamp(56px,7vw,110px) var(--gut);align-self:center}
.gente-txt .rot{color:var(--dourado)}
.gente-txt h2{margin:14px 0 18px;color:#fff;max-width:16ch}
.gente-txt p{color:rgba(246,242,237,.75);max-width:46ch}
/* overflow:hidden é obrigatório: o scale(1.14) do parallax faz a imagem sangrar
   54px pra fora do box, e o degradê só cobre o box. Medido, não deduzido. */
.gente-foto{position:relative;min-height:460px;overflow:hidden}
/* a foto e retrato (860x1146) num box deitado: o corte pega so ~51% da altura,
   e 44% e onde a faixa de rostos cai inteira dentro dele. Medido no arquivo. */
.gente-foto img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center 44%}
/* legenda: a direita o degrade ja acabou, entao ela leva o proprio fundo */
.foto-cap{position:absolute;right:16px;bottom:14px;z-index:1;
  background:rgba(0,0,51,.6);backdrop-filter:blur(5px);
  padding:6px 11px;border-radius:var(--r-xs);
  font-family:var(--mono);font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;
  color:rgba(246,242,237,.82)}
.gente-foto::after{content:"";position:absolute;inset:0;background:linear-gradient(to right,var(--navy) 0%,rgba(0,0,51,.92) 8%,rgba(0,0,51,.64) 20%,rgba(0,0,51,.28) 34%,rgba(0,0,51,.06) 48%,transparent 62%)}
.gente-nums{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:32px;max-width:460px}
.gente-nums b{display:block;font-size:clamp(1.6rem,2.4vw,2.1rem);font-weight:700;letter-spacing:-.03em;line-height:1}
.gente-nums .rot{color:rgba(246,242,237,.5);margin-top:7px;display:block}

/* linha do tempo breve: pontos com salto, nao marco a marco -- so um teaser
   pra historia completa, que mora em /sobre-nos/ */
.gente-tempo{border-top:1px solid var(--linha-clara);padding:clamp(34px,4vw,52px) 0 clamp(40px,5vw,60px)}
.tempo-cab{display:flex;align-items:center;justify-content:space-between;gap:20px;margin-bottom:clamp(26px,3vw,38px)}
.tempo-cab .rot{color:var(--dourado)}
.tempo-link{display:inline-flex;align-items:center;gap:6px;color:rgba(246,242,237,.68);font-size:13.5px;font-weight:500;text-decoration:none;transition:color .2s}
.tempo-link:hover{color:#fff}
.tempo-link i{transition:transform .25s}
.tempo-link:hover i{transform:translateX(4px)}

.tempo-trilha{position:relative;display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:clamp(16px,2.2vw,28px)}
.tempo-trilha::before{content:"";position:absolute;left:0;right:0;top:6px;height:1px;background:var(--linha-clara)}
.tempo-pt{position:relative;padding-top:24px}
.tempo-pt i{position:absolute;left:0;top:0;width:13px;height:13px;border-radius:50%;background:var(--navy);border:2px solid var(--dourado);transition:border-color .3s}
.tempo-pt:hover i{border-color:#fff}
.tempo-ano{display:block;font-family:var(--mono);font-size:12px;letter-spacing:.08em;color:var(--dourado);margin-bottom:6px;transition:font-size .25s,color .25s}
.tempo-pt:hover .tempo-ano{font-size:13.5px;color:#fff}
.tempo-pt p{margin:0;color:rgba(246,242,237,.68);font-size:13.5px;line-height:1.45;max-width:22ch;transition:font-size .25s,color .25s}
.tempo-pt:hover p{font-size:14.5px;color:rgba(246,242,237,.95)}
.tempo-hoje i{background:var(--dourado);box-shadow:0 0 0 4px rgba(220,171,91,.22)}
.tempo-hoje .tempo-ano{color:#fff;font-weight:600}
.tempo-hoje p{color:rgba(246,242,237,.92);font-weight:500}
@media (max-width:980px){
  /* vira rolagem horizontal com snap, mesma receita do depo-track */
  .tempo-trilha{
    grid-auto-flow:column;grid-auto-columns:min(56vw,220px);
    overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;
    margin-inline:calc(var(--gut) * -1);padding-bottom:6px;
  }
  .tempo-trilha::-webkit-scrollbar{display:none}
  .tempo-trilha::before{left:var(--gut);right:var(--gut)}
  .tempo-pt{scroll-snap-align:start}
  /* BUG REAL, medido (nao suposto): com scroll-snap-align:start + padding no
     PROPRIO container, o navegador ja' nasce com scrollLeft = padding (aqui,
     20px) -- o snap "engole" o respiro assim que a pagina carrega, e o 1o
     item fica colado na borda mesmo com o padding certo no CSS. margin no
     :first-child/:last-child (em vez de padding no container) nao sofre
     desse efeito -- o respiro fica de verdade. */
  .tempo-pt:first-child{margin-left:var(--gut)}
  .tempo-pt:last-child{margin-right:var(--gut)}
  /* ACHADO REAL, confirmado ao vivo (desligar/religar scroll-snap-type sem
     nenhum scroll do usuario ja' pula o scrollLeft sozinho): o proprio
     mecanismo de snap, nao so' o load inicial, RECALCULA e forca o
     scrollLeft pro que ELE acha que e' o inicio -- e ele nao conta a margem
     do 1o item como "ja alinhado". scroll-padding e' a propriedade feita
     pra isso: avisa o algoritmo de snap que o inicio "de verdade" do
     scrollport tem esse respiro, sem o que margin/padding sozinhos nao
     bastam (testado e comprovado: nenhum dos dois, sozinho, resolvia). */
  .tempo-trilha{scroll-padding-inline:var(--gut)}
}

/* ---------- editorial ---------- */
/* osso-2, nao osso: sem isso ficava identico ao fundo de .parceiros, a
   section logo acima -- mesmo tom claro, sem nenhuma costura entre as duas.
   O proprio degrade de cor ja marca a fronteira, mesma receita que separa
   .jornadas de .slogan em outro ponto da pagina; sem precisar de divisor. */
.editorial{padding:clamp(66px,8vw,120px) 0;background:var(--osso-2)}
.grade-posts,.grade-cases{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(16px,2.2vw,28px)}
.post{text-decoration:none;display:flex;flex-direction:column;background:#fff;border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sombra-sm);transition:transform .3s,box-shadow .3s}
.post:hover{transform:translateY(-4px);box-shadow:var(--sombra-md)}
.post-foto{position:relative;aspect-ratio:16/9;overflow:hidden;background:var(--osso-2)}
.post-foto img{width:100%;height:100%;object-fit:cover;transition:transform .7s cubic-bezier(.2,.7,.3,1)}
/* selo de categoria sobre a foto (so' na grade de "todos os posts") -- cada
   categoria com sua propria combinacao bg+texto, pedido explicito pra
   diferenciar rapido no grid sem precisar ler o rotulo em cima do titulo. */
.post-cat{
  position:absolute;top:12px;left:12px;z-index:1;
  font-family:var(--mono);font-size:10.5px;font-weight:500;letter-spacing:.07em;text-transform:uppercase;
  padding:5px 12px;border-radius:var(--pill);box-shadow:var(--sombra-sm);
}
.post-cat.cat-avoxter{background:#fff;color:var(--carmim)}
.post-cat.cat-comunicados{background:var(--carmim);color:#fff}
.post-cat.cat-conectividade{background:#2f5fd6;color:#fff}
.post-cat.cat-software{background:var(--navy);color:#fff}
.post-cat.cat-negocios{background:var(--dourado);color:var(--navy)}
.post-cat.cat-novidades{background:#2f8f5b;color:#fff}
.post:hover .post-foto img{transform:scale(1.05)}
.post-corpo{display:flex;flex-direction:column;gap:11px;padding:22px 22px 24px;flex:1}
.post .rot{color:var(--carmim)}
.post h3{line-height:1.24}
.post p{color:var(--tinta-70);font-size:14.5px;line-height:1.5}
.post time{font-family:var(--mono);font-size:11.5px;letter-spacing:.05em;color:var(--tinta-45);margin-top:auto}

/* ---------- posts: portal (/posts/) ---------- */
/* uma linha so', baixa -- o Instagram e' coadjuvante aqui, quem carrega a
   pagina e' a section "todos os posts" logo abaixo. Cada celula usa a
   proporcao REAL da propria imagem (aspect-ratio inline, medido em
   _inc/dados-instagram.php) numa fileira de altura fixa -- sem cortar E sem
   fundo desfocado/letterbox (1a tentativa, reprovada como "gambiarra"): a
   largura de cada celula sai naturalmente da propria proporcao da foto.
   Sem cabecalho proprio: a 1a celula do grid E' o convite pra seguir
   (icone+@voxterbrasil, gradiente oficial do Instagram, mesma proporcao das
   demais pra nao destoar). */
.ig-secao{padding:clamp(40px,5vw,64px) 0;background:var(--osso)}
/* .rodape tem margin-top proprio (padrao do site) que soma com o padding-
   bottom daqui, dobrando o respiro debaixo em relacao ao de cima -- cancela
   so' nessa vizinhanca especifica, sem mexer no rodape das outras paginas. */
.ig-secao > .wrap > .rot{color:var(--carmim);display:block;margin-bottom:18px}
.ig-grade{display:flex;gap:clamp(8px,1.2vw,14px);overflow-x:auto;padding-bottom:4px}
.ig-card{
  position:relative;flex:none;height:clamp(150px,16vw,220px);border-radius:var(--r-md);overflow:hidden;
  box-shadow:var(--sombra-sm);text-decoration:none;background:var(--osso-2);
}
.ig-card img{width:100%;height:100%;object-fit:cover}
/* a celula da marca cresce pra absorver o espaco que sobra na fileira (as
   outras tem largura fixa, vinda da proporcao real de cada foto) -- assim a
   soma das celulas fecha exatamente com a largura do .wrap, sem sobra do
   lado direito. */
.ig-card-marca{
  flex:1 1 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  color:#fff;text-align:center;transition:filter .2s;
  background:radial-gradient(circle at 30% 107%,#fdf497 0%,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285AEB 90%);
}
.ig-card-marca:hover{filter:brightness(1.08)}
.ig-card-marca svg{width:30px;height:30px;transition:scale .25s}
.ig-card-marca span{font-family:var(--fonte);font-weight:600;font-size:17px;transition:scale .25s}
.ig-card-marca:hover svg,.ig-card-marca:hover span{scale:1.1}
/* play do reel no azul-marinho da marca (var(--navy), o mesmo do fundo do
   rodape -- nao o vermelho padrao de .video-play) pra nao se confundir com o
   vermelho da legenda que cobre o card inteiro no hover -- e fica ATRAS dela
   (z-index abaixo), nao por cima. */
.video-play.ig-card-play{background:var(--navy);z-index:1}
/* hover: preenche o tile inteiro de vermelho, texto ocupando o espaco com
   respiro nas bordas -- pedido explicito, mais forte que uma legenda discreta
   no rodape (1a versao, reprovada). */
.ig-card-legenda{
  position:absolute;inset:0;z-index:2;padding:20px;color:#fff;
  background:var(--carmim);
  display:flex;flex-direction:column;justify-content:center;
  opacity:0;transition:opacity .25s;
}
.ig-card-legenda span{
  text-align:left;font-size:13px;line-height:1.42;
  display:-webkit-box;-webkit-line-clamp:6;-webkit-box-orient:vertical;overflow:hidden;
}
.ig-card:hover .ig-card-legenda{opacity:1}
@media (max-width:520px){.ig-card-legenda{display:none}}

.post-destaque-secao{padding:clamp(50px,6vw,84px) 0;background:var(--osso)}
.post-destaque-cab{display:flex;justify-content:space-between;align-items:baseline;gap:20px;margin-bottom:24px}
.post-destaque-cab .rot{color:var(--carmim)}
.post-destaque-rotulo{
  font-family:var(--mono);font-size:11.5px;font-weight:500;letter-spacing:.16em;text-transform:uppercase;
  color:var(--tinta);margin:0;
}
.post-destaque{
  text-decoration:none;display:grid;grid-template-columns:1.1fr 1fr;gap:0;
  background:#fff;border-radius:var(--r-xl);overflow:hidden;box-shadow:var(--sombra-md);
  transition:transform .3s,box-shadow .3s;
}
.post-destaque:hover{transform:translateY(-4px);box-shadow:var(--sombra-lg)}
/* 16/9 (era 4/3) -- com o corpo agora curto (so' titulo+data), a proporcao
   da foto e' quem manda na altura da linha inteira do grid; encolher a foto
   e' o que de fato encurta o card, pedido explicito de "ganhar espaco". */
.post-destaque-foto{position:relative;aspect-ratio:16/9;overflow:hidden;background:var(--osso-2)}
.post-destaque-foto img{width:100%;height:100%;object-fit:cover;transition:transform .8s cubic-bezier(.2,.7,.3,1)}
.post-destaque:hover .post-destaque-foto img{transform:scale(1.05)}
/* so' titulo+data agora (categoria virou pilula sobre a foto, resumo saiu). */
.post-destaque-corpo{display:flex;flex-direction:column;justify-content:center;gap:14px;padding:clamp(30px,4vw,52px)}
.post-destaque-corpo h3{font-size:clamp(1.5rem,2.6vw,2.2rem);line-height:1.22}
.post-destaque-corpo time{font-family:var(--mono);font-size:12px;letter-spacing:.05em;color:var(--tinta-45)}

.post-todos-secao{padding:clamp(50px,6vw,100px) 0;background:var(--osso-2)}
.posts-ordenar{display:flex;gap:8px;flex:none}
.posts-ordenar button{
  font-family:var(--mono);font-size:12.5px;letter-spacing:.03em;padding:9px 16px;border-radius:var(--pill);
  border:1px solid var(--linha);background:#fff;color:var(--tinta-70);transition:background .2s,color .2s,border-color .2s;
}
.posts-ordenar button.ativo{background:var(--carmim);border-color:var(--carmim);color:#fff}
.posts-filtro-linha{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;margin-bottom:clamp(28px,3.4vw,40px)}
.posts-categorias{display:flex;flex-wrap:wrap;gap:10px}
.posts-cat{
  font-family:var(--mono);font-size:12.5px;letter-spacing:.03em;padding:10px 18px;border-radius:var(--pill);
  border:1px solid var(--linha);background:transparent;color:var(--tinta-70);transition:background .2s,color .2s,border-color .2s;
}
.posts-cat.ativo{background:var(--tinta);border-color:var(--tinta);color:#fff}
.posts-qtd{display:flex;align-items:center;gap:8px;flex:none}
.posts-qtd-rot{font-family:var(--mono);font-size:11.5px;letter-spacing:.05em;color:var(--tinta-45);text-transform:uppercase}
.posts-qtd-btn{
  font-family:var(--mono);font-size:12px;letter-spacing:.03em;padding:6px 13px;border-radius:var(--pill);
  border:1px solid var(--linha);background:#fff;color:var(--tinta-70);transition:background .2s,color .2s,border-color .2s;
}
.posts-qtd-btn.ativo{background:var(--tinta);border-color:var(--tinta);color:#fff}
.posts-vazio{text-align:center;color:var(--tinta-45);padding:40px 0 0}
.posts-carregar{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-top:clamp(30px,4vw,44px)}
.posts-contagem{margin:0;color:var(--tinta-45);font-size:14px}
.posts-contagem b{color:var(--tinta);font-weight:600}
/* selo de recencia (HOJE/ONTEM/SEMANA PASSADA), calculado no PHP contra a
   data de hoje -- ver post_recencia() em _inc/dados-posts.php. */
.post-recencia{
  display:inline-block;margin-left:8px;padding:2px 9px;border-radius:var(--pill);
  background:var(--carmim);color:#fff;font-weight:600;font-size:10px;letter-spacing:.05em;vertical-align:middle;
}
@media (max-width:760px){
  .post-destaque{grid-template-columns:1fr}
}

/* ---------- posts: leitor (/posts/ler.php) ---------- */
.post-leitor{padding:clamp(40px,5vw,64px) 0 0;background:var(--osso)}
.post-leitor-wrap{max-width:1120px}
/* topo do artigo: titulo de verdade mora AQUI, nao no header generico
   (.pagina-hero, compartilhado com toda pagina interna) -- repetir o titulo
   la' em cima ficava ruim/redundante (achado real, reportado direto). O
   header generico agora mostra so' a categoria, curto, igual toda pagina.
   Foto pequena a esquerda do bloco titulo+meta (pedido direto -- antes era
   uma faixa 21/9 full-width sozinha, achando grande demais). */
.post-leitor-topo{
  display:grid;grid-template-columns:minmax(160px,240px) 1fr;gap:clamp(24px,3vw,40px);align-items:center;
  max-width:1120px;margin:0 auto clamp(30px,4vw,44px);
}
.post-leitor-topo-texto h1{margin:0 0 14px;font-size:clamp(1.7rem,3.2vw,2.4rem);line-height:1.18}
.post-leitor-meta-linha{
  display:flex;flex-wrap:wrap;align-items:center;gap:8px;color:var(--tinta-45);
  font-family:var(--mono);font-size:12.5px;letter-spacing:.03em;
}
.post-leitor-meta-linha b{color:var(--tinta);font-weight:600}
.post-leitor-capa{position:relative;margin:0;border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sombra-md)}
.post-leitor-capa img{width:100%;aspect-ratio:4/3;object-fit:cover;transition:transform .6s cubic-bezier(.2,.7,.3,1)}
.post-leitor-capa:hover img{transform:scale(1.08)}
@media (max-width:700px){
  .post-leitor-topo{grid-template-columns:1fr}
  .post-leitor-capa img{aspect-ratio:16/9}
}
/* corpo + sidebar (compartilhar + indice) -- antes era so' uma coluna unica
   centralizada em 760px; "mais recursos" + "coluna estreita" pedido direto. */
.post-leitor-grade{display:grid;grid-template-columns:minmax(0,1fr) 260px;gap:clamp(30px,4vw,64px);align-items:start;padding-bottom:clamp(50px,6vw,80px)}
.post-leitor-corpo{max-width:720px;font-size:1.05rem;line-height:1.78;color:var(--tinta-70)}
/* tipografia de base do conteudo importado -- posts variam MUITO na origem:
   alguns vem com estilo inline completo (cor, margem, tudo), outros sao
   blocos Gutenberg puros sem NENHUM estilo (wp-block-paragraph, wp-block-
   heading) -- sem essa base, os sem-estilo saiam com titulo colado no
   paragrafo anterior e zero respiro entre blocos (achado real, reportado
   com print). Regra por TAG (nao por classe wp-block-*) pra pegar os dois
   casos; estilo inline de quem ja' tem sempre vence por especificidade, essa
   base so' preenche quem nao tem. */
.post-leitor-corpo :is(h1,h2,h3,h4){font-family:var(--fonte);color:var(--tinta);line-height:1.3}
.post-leitor-corpo h2{font-size:33px;margin:1.9em 0 .6em}
.post-leitor-corpo h3{font-size:33px;margin:1.8em 0 .6em}
.post-leitor-corpo h4{font-size:1.1rem;margin:1.6em 0 .5em}
.post-leitor-corpo > :first-child{margin-top:0}
.post-leitor-corpo p{margin:0 0 1.2em}
.post-leitor-corpo ul,.post-leitor-corpo ol{margin:0 0 1.2em;padding-left:1.3em}
.post-leitor-corpo li{margin-bottom:.5em}
.post-leitor-corpo li:last-child{margin-bottom:0}
.post-leitor-corpo li > ul,.post-leitor-corpo li > ol{margin-top:.5em}
.post-leitor-corpo a{color:var(--carmim);text-decoration:none}
.post-leitor-corpo strong,.post-leitor-corpo b{color:var(--tinta);font-weight:700}
.post-leitor-corpo blockquote{
  margin:1.6em 0;padding:.3em 0 .3em 1.2em;border-left:3px solid var(--carmim);
  font-style:italic;color:var(--tinta);
}
.post-leitor-corpo img{max-width:100%;height:auto;border-radius:var(--r-lg);margin:1.5em 0;display:block}
.post-leitor-corpo table{width:100%;border-collapse:collapse;margin:1.6em 0;font-size:.95rem}
.post-leitor-corpo td,.post-leitor-corpo th{padding:10px 14px;border:1px solid var(--linha);text-align:left}
.post-leitor-corpo hr{border:0;border-top:1px solid var(--linha);margin:2em 0}
.post-leitor-sidebar{position:sticky;top:calc(var(--secao-offset) + 16px);display:flex;flex-direction:column;gap:30px}
.post-leitor-compartilhar{display:flex;flex-direction:column;gap:12px}
.post-leitor-compartilhar .rot{color:var(--carmim)}
.post-leitor-compartilhar-btns{display:flex;gap:8px}
.post-leitor-compartilhar-btns a,.post-leitor-compartilhar-btns button{
  position:relative;width:38px;height:38px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:var(--osso-2);color:var(--tinta);border:1px solid var(--linha);transition:background .2s,color .2s,border-color .2s;
}
.post-leitor-compartilhar-btns svg{width:17px;height:17px}
.post-leitor-compartilhar-btns a:hover,.post-leitor-compartilhar-btns button:hover{background:var(--carmim);color:#fff;border-color:var(--carmim)}
.post-leitor-compartilhar-btns button.copiado{background:var(--carmim);color:#fff;border-color:var(--carmim)}
/* tooltip proprio (nao o title= nativo do navegador, feio e sem identidade --
   mesmo achado ja' reportado nos cards do Instagram) -- nome da acao aparece
   em cima do botao no hover. */
.post-leitor-compartilhar-btns [data-tooltip]::before{
  content:attr(data-tooltip);position:absolute;bottom:calc(100% + 12px);left:50%;
  padding:6px 11px;border-radius:6px;background:var(--navy);color:#fff;
  font-family:var(--mono);font-size:11px;font-weight:500;letter-spacing:.03em;white-space:nowrap;
  box-shadow:var(--sombra-sm);z-index:5;
  opacity:0;visibility:hidden;translate:-50% 4px;transition:opacity .18s,translate .18s,visibility .18s;
}
.post-leitor-compartilhar-btns [data-tooltip]::after{
  content:"";position:absolute;bottom:calc(100% + 6px);left:50%;
  border:5px solid transparent;border-top-color:var(--navy);z-index:5;
  opacity:0;visibility:hidden;translate:-50% 4px;transition:opacity .18s,translate .18s,visibility .18s;
}
.post-leitor-compartilhar-btns [data-tooltip]:hover::before,
.post-leitor-compartilhar-btns [data-tooltip]:hover::after{opacity:1;visibility:visible;translate:-50% 0}
/* devolutiva visivel do "copiar link" -- o botao sozinho mudando de cor
   passava batido (achado real, pedido explicito de algo "destacado na
   tela"). Toast fixo, centralizado embaixo, identidade da marca. */
.post-toast{
  position:fixed;left:50%;bottom:36px;z-index:200;
  display:flex;align-items:center;gap:10px;padding:14px 24px;border-radius:var(--pill);
  background:var(--navy);color:#fff;box-shadow:var(--sombra-lg);
  translate:-50% 16px;opacity:0;pointer-events:none;transition:opacity .3s,translate .3s;
}
.post-toast.mostrar{opacity:1;translate:-50% 0}
.post-toast-ico{
  width:24px;height:24px;flex:none;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:var(--carmim);color:#fff;
}
.post-toast-ico svg{width:14px;height:14px}
.post-toast span:last-child{font-weight:600;font-size:14.5px}
.post-leitor-indice summary{color:var(--carmim);cursor:pointer;margin-bottom:10px;list-style:none}
.post-leitor-indice summary::-webkit-details-marker{display:none}
.post-leitor-indice-lista{display:flex;flex-direction:column;gap:12px}
.post-leitor-indice-lista a{
  padding:7px 0 7px 14px;border-left:2px solid var(--linha);color:var(--tinta-70);font-size:13.5px;line-height:1.4;
  text-decoration:none;transition:border-color .2s,color .2s;
}
.post-leitor-indice-lista a:hover{color:var(--tinta)}
.post-leitor-indice-lista a.ativo{border-color:var(--carmim);color:var(--carmim);font-weight:600}
@media (max-width:900px){
  .post-leitor-grade{grid-template-columns:1fr}
  .post-leitor-sidebar{position:static}
}
.post-relacionados-secao{padding:clamp(50px,6vw,90px) 0;background:var(--osso-2)}

/* ---------- cta ---------- */
/* A faixa em volta do cartao e' osso-2, nao transparente. Transparente ela
   mostrava o osso do body -- exatamente o mesmo tom da secao anterior em
   varias paginas (na home, Ferramentas), e as duas corriam juntas sem
   divisa. O cartao carmim continua sendo o assunto; a faixa so' precisa
   dizer onde uma secao acaba e a outra comeca. */
.cta{padding:clamp(28px,4vw,56px) var(--gut);background:var(--osso-2)}
.cta-cx{
  max-width:var(--max);margin:0 auto;border-radius:var(--r-xl);
  background:linear-gradient(135deg,var(--carmim) 0%,var(--carmim-fundo) 62%,var(--navy) 130%);
  color:#fff;padding:clamp(44px,6vw,86px);position:relative;overflow:hidden;box-shadow:var(--sombra-lg);
  /* CENTRADAS, nao alinhadas por baixo. Com align-items:end a coluna da
     direita (texto + botao) e' mais alta e empurrava o titulo pra base:
     medido, 131px de respiro acima do titulo contra 86px abaixo. */
  display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:clamp(24px,4vw,60px);align-items:center;
}
.cta-cx::before{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at 88% 118%,rgba(220,171,91,.34),transparent 56%);pointer-events:none}
.cta-cx > *{position:relative;z-index:1}
.cta .rot{color:rgba(246,242,237,.72)}
.cta h2{color:#fff;margin:16px 0 0;max-width:15ch}
/* os 16px de cima existiam por causa do rotulo (.rot) que ficava ACIMA do
   titulo no formato antigo. Nas paginas convertidas pra Ponte o rotulo
   saiu, e a margem virou espaco orfao: o titulo ficava com mais respiro
   em cima do que embaixo dentro do card (relatado pelo usuario na
   /ofertas/). Onde o titulo e' o primeiro elemento, a margem vai a zero;
   onde o rotulo ainda existe, ela continua valendo. */
.cta-cx h2:first-child{margin-top:0}
.cta h2 .fino{font-weight:400}
.cta p{color:rgba(246,242,237,.88);margin:0 0 24px;font-size:1.04rem;max-width:44ch}
.cta .btn{background:#fff;color:var(--carmim)}
.cta .btn:hover{background:var(--osso)}

/* ---------- rodape ---------- */
/* SEM margin-top. Tinha clamp(28px,4vw,56px) aqui, e margem fica FORA do
   fundo navy: o espaco era pintado com a cor do body (--osso, quase branco),
   virando uma faixa branca entre a ultima section e o rodape. Aparecia em
   toda pagina, so' que gritava nas que terminam em section clara. A prova de
   que era remendo: existiam dois overrides pontuais zerando essa margem
   (.ig-secao + .rodape e .desenrola-vantagens + .rodape), cada um resolvendo
   uma pagina. Respiro agora e' padding, ou seja, por dentro do navy. */
.rodape{background:var(--navy);color:rgba(246,242,237,.62);padding:clamp(48px,6vw,76px) 0 0;font-size:14.5px}
.rod-grid{display:grid;grid-template-columns:1.5fr repeat(4,1fr);gap:30px;padding-bottom:38px}
/* Renegociacao vive dentro da mesma coluna de Acessos (categoria propria,
   pedido explicito -- so' nao ganha uma coluna inteira SO' pra 1 link, o que
   deixava o rodape com uma coluna vazia/desbalanceada ao lado das outras).
   Agora sao 2 .rod-acc empilhados na mesma coluna -- o espaco entre os dois
   vem do proprio irmao adjacente, nao mais de uma classe no rotulo. */
.rod-acc + .rod-acc{margin-top:20px}
/* sem filtro: o rodape ja' recebe a arte monocromatica pronta */
.rodape .marca img{height:26px;margin-bottom:16px}
.rodape h4,.rod-acc summary{font-family:var(--mono);font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--dourado);margin:0 0 15px;font-weight:500}
.rodape ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
/* .rod-acc: no desktop e' so' um rotulo estatico (a seta some, o cursor nao
   convida a clicar -- nasce com "open" e fica assim, ninguem precisa mexer).
   No mobile (JS tira o "open" no load) vira accordion de verdade: rotulo
   clicavel com seta que roda 180deg, mesmo padrao ja' usado em .mm-acc. */
.rod-acc summary{display:flex;align-items:center;justify-content:space-between;gap:10px;list-style:none;cursor:pointer}
.rod-acc summary::-webkit-details-marker{display:none}
.rod-acc-seta{width:14px;height:14px;flex:none;color:rgba(246,242,237,.5);transition:transform .25s}
.rod-acc[open] .rod-acc-seta{transform:rotate(180deg)}
@media (min-width:700px){
  .rod-acc summary{cursor:default;pointer-events:none}
  .rod-acc-seta{display:none}
}
.rodape a{text-decoration:none;transition:color .2s}
.rodape a:hover{color:#fff}
.rod-social{display:flex;gap:8px;margin-top:22px}
.rod-social a{display:flex;align-items:center;justify-content:center;width:38px;height:38px;
  border:1px solid var(--linha-clara);border-radius:var(--r-sm);color:rgba(246,242,237,.68);
  transition:background .25s,border-color .25s,color .25s,transform .25s}
.rod-social a:hover{background:var(--carmim);border-color:var(--carmim);color:#fff;transform:translateY(-2px)}
.rod-social svg{width:17px;height:17px}
/* DICA de 3 segundos nos icones de rede. Com :hover puro ela ficaria presa na
   tela enquanto o mouse estivesse em cima; a animacao segura e apaga sozinha,
   que foi o que se pediu (no maximo 3s). Mesma receita do tooltip do widget.
   position:relative mora no proprio <a> (ja' e' flex), e a seta e' um
   triangulo de borda, sem elemento novo. */
@keyframes dicaRod{0%{opacity:0;translate:-50% 4px}12%{opacity:1;translate:-50% 0}78%{opacity:1;translate:-50% 0}100%{opacity:0;translate:-50% 0}}
.rod-social a{position:relative}
.rod-social a[data-dica]::after{
  content:attr(data-dica);position:absolute;bottom:calc(100% + 10px);left:50%;translate:-50% 4px;
  background:var(--navy-3);color:#fff;border:1px solid var(--linha-clara);
  padding:6px 10px;border-radius:var(--r-sm);box-shadow:var(--sombra-md);
  font-size:11.5px;font-weight:500;letter-spacing:0;line-height:1.2;white-space:nowrap;
  opacity:0;pointer-events:none;z-index:4;
}
.rod-social a[data-dica]:hover::after,.rod-social a[data-dica]:focus-visible::after{animation:dicaRod 3s ease forwards}

/* endereco com destino: perfil da empresa no Google e rota no mapa. Discretos
   (mesma familia e peso do texto do rodape), um ao lado do outro, com filete
   so' no hover -- link sem sublinhado e' regra da casa. */
.rod-locais{display:flex;flex-wrap:wrap;gap:6px 18px;margin-top:11px}
.rod-locais a{display:inline-flex;align-items:center;gap:7px;
  font-size:13px;font-weight:500;color:var(--dourado);text-decoration:none;
  transition:opacity .2s}
.rod-locais a:hover{opacity:.72}
.rod-locais svg{width:15px;height:15px;flex:0 0 auto}
/* sede, telefone e expediente: informacao de contato nao e link de navegacao,
   entao sai da grade de listas e ganha faixa propria, com icone ancorando cada uma */
.rod-contato{display:grid;grid-template-columns:1.6fr 1fr 1fr;gap:34px;
  padding:32px 0 38px;border-top:1px solid var(--linha-clara)}
.rod-bloco{display:flex;gap:13px}
.rod-ico{flex:0 0 auto;width:32px;height:32px;display:flex;align-items:center;justify-content:center;
  border:1px solid var(--linha-clara);border-radius:var(--r-sm);color:var(--dourado)}
.rod-ico svg{width:16px;height:16px}
.rod-bloco h4{margin-bottom:9px}
.rod-bloco p{margin:0;line-height:1.6;max-width:38ch}
.rod-bloco .marcado{color:var(--dourado);display:block;margin-top:7px}
/* schedule compacto (2 linhas curtas + rotulo + selo) -- o line-height:1.6
   herdado de .rod-bloco p e' pensado pra paragrafo corrido (Sede), aqui so'
   alonga o que devia ser uma lista enxuta de horario. */
.rod-bloco p.rod-expediente{line-height:1.3}
.rod-expediente-rot{color:rgba(246,242,237,.45)}
/* o fuso e' o segundo rotulo do bloco, embaixo dos horarios. Ganha um
   respiro proprio pra nao colar na ultima linha de horario nem na nota
   dourada do suporte 24h, que vem logo abaixo. */
.rod-fuso{display:inline-block;margin-top:7px}
.rod-tel{display:flex;flex-direction:column;gap:4px}
.rod-tel a{font-size:15.5px}
/* faixa legal: largura total, fora do wrap, um pouco mais funda que o rodape */
.rod-legal{border-top:1px solid var(--linha-clara);background:rgba(0,0,0,.24);
  padding:15px var(--gut);text-align:center;
  font-family:var(--mono);font-size:11px;letter-spacing:.05em;
  color:rgba(246,242,237,.42)}
/* assinatura da equipe: linha propria embaixo do copyright, um passo mais
   apagada que ele -- e' credito, nao aviso legal. */
.rod-assinatura{display:block;margin-top:6px;font-size:10.5px;color:rgba(246,242,237,.3)}

/* ----- os dois CNPJs -----
   Linha propria embaixo do copyright: sao duas pessoas juridicas, e
   empurradas pra mesma linha do "todos os direitos reservados" elas viravam
   uma fileira comprida de numero que ninguem le'.

   O filete pontilhado e' o sinal de que ali ha' algo a ler. Sem ele o CNPJ
   parece so' mais um numero de rodape e ninguem passa o mouse.
   cursor:help e nao pointer: nao leva a lugar nenhum, so' explica. */
.rod-cnpjs{
  display:flex;flex-wrap:wrap;justify-content:center;
  gap:6px clamp(14px,2vw,26px);margin-top:5px;
}
.rod-cnpj{
  position:relative;cursor:help;
  border-bottom:1px dotted rgba(246,242,237,.3);padding-bottom:1px;
  transition:color .22s,border-color .22s;
}
.rod-cnpj:hover,.rod-cnpj:focus-visible{
  color:rgba(246,242,237,.8);border-bottom-color:var(--dourado);
}
/* Mesmo balao da sigla de cargo em /sobre-nos/, ate' a animacao
   (estrutDica): entra, fica e sai sozinho em 4s, em vez de ficar preso
   enquanto o mouse estiver em cima. Um site, um jeito de dar dica. */
.rod-cnpj::after{
  content:attr(data-dica);
  position:absolute;bottom:calc(100% + 10px);left:50%;translate:-50% 5px;
  background:var(--navy-3);color:#fff;border:1px solid rgba(220,171,91,.3);
  padding:8px 12px;border-radius:var(--r-sm);box-shadow:var(--sombra-md);
  font-family:var(--fonte);font-size:11.5px;font-weight:500;letter-spacing:0;
  line-height:1.4;white-space:normal;text-align:center;
  width:max-content;max-width:min(260px,80vw);
  opacity:0;pointer-events:none;z-index:8;
}
.rod-cnpj:hover::after,.rod-cnpj:focus-visible::after{animation:estrutDica 4s ease forwards}
@media (prefers-reduced-motion:reduce){
  .rod-cnpj:hover::after,.rod-cnpj:focus-visible::after{animation:none;opacity:1;translate:-50% 0}
}

/* rod-notas: letra miuda especifica da pagina (regra de um recurso citado
   nela), separada do copyright global -- vem ANTES do .rod-legal, dentro do
   .wrap, alinhada a esquerda como as outras colunas do rodape. */
.rod-notas{border-top:1px solid var(--linha-clara);padding:20px 0;margin-top:6px}
.rod-notas p{margin:0 0 6px;font-size:12px;line-height:1.6;color:rgba(246,242,237,.4)}
.rod-notas p:last-child{margin-bottom:0}

/* ============================================================ MOVIMENTO
   Empresa de tecnologia nao pode ter pagina parada. Tudo abaixo cai fora
   inteiro em prefers-reduced-motion, e nada bloqueia leitura ou clique.
   ============================================================ */
.rev{opacity:0;transform:translateY(22px);transition:opacity .7s ease,transform .7s cubic-bezier(.2,.7,.3,1)}
.rev.vis{opacity:1;transform:none}
/* escalonamento: filhos entram em cascata, nao em bloco */
.casc > *{opacity:0;transform:translateY(18px);transition:opacity .6s ease,transform .6s cubic-bezier(.2,.7,.3,1)}
.casc.vis > *{opacity:1;transform:none}
.casc.vis > *:nth-child(1){transition-delay:0s}
.casc.vis > *:nth-child(2){transition-delay:.09s}
.casc.vis > *:nth-child(3){transition-delay:.18s}
.casc.vis > *:nth-child(4){transition-delay:.27s}
.casc.vis > *:nth-child(5){transition-delay:.36s}
.casc.vis > *:nth-child(6){transition-delay:.45s}

/* ---------- BARALHO DE FERRAMENTAS: a transicao que de fato vale ----------
   Tem de vir DEPOIS do bloco .casc acima e com especificidade maior que
   '.casc.vis > *:nth-child()' (0-3-0), senao o atraso de entrada em cascata
   sobrescreve o atraso do leque. '.fer-deck.casc.vis > .fer-carta' da' 0-4-0.

   Por que tudo num shorthand so': 'transition' substitui, nao complementa.
   Declarar o baralho aqui e deixar a entrada la' em cima faria uma apagar a
   outra, que foi exatamente o defeito que esta regra conserta -- as tres
   medidas do baralho (flex-basis, margin-left, padding) estavam SEM
   transicao, mudando de valor de uma vez. Era o pulo.

   O 4o valor de cada item e' o atraso, e eles sao diferentes de proposito:
   a entrada usa --fer-entra (90ms por carta, o ritmo do .casc) e a abertura
   usa --fer-atraso (55ms por carta). translate, sombra e borda ficam sem
   atraso nenhum: sao resposta ao toque de UMA carta, e atrasa-las deixaria
   o hover individual lerdo.

   900ms na largura e no recuo: e' o tempo de ver a carta ANDANDO. Abaixo
   de meio segundo o olho so' registra o antes e o depois. */
.fer-deck.casc.vis > .fer-carta{
  transition:
    opacity .6s ease var(--fer-entra),
    transform .6s cubic-bezier(.2,.7,.3,1) var(--fer-entra),
    flex-basis .9s cubic-bezier(.22,.85,.28,1) var(--fer-atraso),
    margin-left .9s cubic-bezier(.22,.85,.28,1) var(--fer-atraso),
    padding .9s cubic-bezier(.22,.85,.28,1) var(--fer-atraso),
    translate .3s cubic-bezier(.2,.7,.3,1),
    box-shadow .3s ease,
    border-color .3s ease;
}
@media (prefers-reduced-motion:reduce){
  .fer-deck.casc.vis > .fer-carta{transition:none}
}

/* entrada do hero: linhas do H1 sobem escalonadas */
@keyframes sobe{from{opacity:0;transform:translateY(26px)}to{opacity:1;transform:none}}
.hero-rot,.hero h1 .giro,.hero h1 .l,.hero-sub,.hero-acoes{animation:sobe .9s cubic-bezier(.2,.7,.3,1) both}
.hero h1 .giro{animation-delay:.1s}
.hero h1 .l{animation-delay:.18s}
.hero-sub{animation-delay:.3s}
.hero-acoes{animation-delay:.4s}
.hero-pe{animation:sobe .9s cubic-bezier(.2,.7,.3,1) .5s both}

/* aurora: a mancha vermelha dos blocos escuros respira devagar */
@keyframes aurora{
  0%{transform:translate(0,0) scale(1);opacity:.85}
  50%{transform:translate(-4%,3%) scale(1.12);opacity:1}
  100%{transform:translate(0,0) scale(1);opacity:.85}
}
.porque::before{animation:aurora 18s ease-in-out infinite}

/* filete que se desenha sob o titulo da section ao entrar */
.grupo-cab i{transform:scaleX(0);transform-origin:left;transition:transform .9s cubic-bezier(.2,.7,.3,1) .15s}
.grupo.vis .grupo-cab i{transform:scaleX(1)}

/* numero que conta ao aparecer */
.gente-nums b{font-variant-numeric:tabular-nums}

/* parallax: a foto anda mais devagar que a pagina. Escala extra evita borda vazia
   nas pontas do curso. So no desktop e so com transform, nunca background-attachment. */
.px{will-change:transform}
@media (min-width:980px){
  .gente-foto img,.jor-foto img{transform:scale(1.14)}
}

/* ============================================================ MOBILE */
@media (max-width:980px){
  .grade{grid-template-columns:repeat(2,1fr)}
  .grade-jor{grid-template-columns:1fr}
  .jor,.jor-txt{min-height:280px}
  .grade-pq{grid-template-columns:repeat(2,1fr)}
  .gente-cx{grid-template-columns:1fr}
  .gente-foto{min-height:280px;order:-1}
  .grade-posts,.grade-cases{grid-template-columns:1fr}
  /* minmax(0,...): com 1fr puro a coluna nao encolhe abaixo do min-content e
     empurra a pagina uns 5px pra fora quando a escala de texto sobe. */
  .rod-grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:28px}
  .rod-contato{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:26px}
  .rodape li{overflow-wrap:anywhere}
  .cta-cx{grid-template-columns:1fr;gap:22px}
}
@media (max-width:700px){
  body{font-size:16px}
  .menu{display:none}
  /* .burger nunca teve handler de JS -- ficava so' de enfeite (achado real).
     A barra de abas do rodape (.tab-bar) assume esse papel de vez, com a aba
     "Menu" abrindo a folha que faz o que o burger prometia. Ele fica oculto
     aqui pra' nao duplicar a mesma acao com 2 icones diferentes na tela. */
  .burger{display:none}
  .nav > .btn{display:none}
  /* 92svh (era 96svh): agora tem chrome fixo dos DOIS lados da tela (nav em
     cima, barra de abas embaixo) -- um pouco mais baixo deixa a proxima
     secao espiar mais cedo, sensacao menos "tela cheia de vazio decorativo
     antes do conteudo". */
  .hero{min-height:92svh}
  .hero > .wrap{padding-top:100px;padding-bottom:24px}
  /* respiro do tamanho da barra de abas: sem isso os cartoes de Software/
     Conectividade/Equipamentos (bottom-anchored, ver .hero{justify-content:
     flex-end} na regra base) ficavam parcialmente atras da barra fixa nova. */
  .hero-pe{padding-bottom:calc(var(--barra-inf) + env(safe-area-inset-bottom,0))}
  .hero-img img,.hero-img video{object-position:70% 50%}
  .hero-veu{background:linear-gradient(to bottom,rgba(0,0,51,.62) 0%,rgba(0,0,51,.8) 32%,rgba(0,0,51,.92) 66%,rgba(0,0,51,.96) 100%)}
  .hero h1{max-width:13ch}
  .hero-sub{font-size:.98rem;margin-top:18px}
  .so-desk{display:none}
  .so-movel{display:inline}
  /* uma linha so' -- pedido explicito do usuario (empilhados antes). flex:1
     divide a largura igual entre os 2 (textos de tamanho bem diferente --
     "Falar com um especialista" x "Ver as solucoes" --, sem flex:1 um
     ficaria bem mais estreito que o outro). padding lateral menor + font
     menor pro texto mais longo nao quebrar em 3 linhas numa metade de tela. */
  .hero-acoes{gap:8px;margin-top:24px}
  .hero-acoes .btn{flex:1;padding-inline:10px;padding-block:14px;font-size:13.5px}
  /* grid de 1 linha e 3 colunas -- pedido explicito do usuario (a 1a versao
     desta faixa no mobile era carrossel horizontal com scroll-snap; achou
     que uma grade encaixando os 3 de uma vez ficava melhor aqui). A base
     desktop (mais acima no arquivo) ja' e' grid-template-columns:repeat(3,
     1fr) -- so' precisa parar de virar flex/scroll aqui, e compactar: numa
     coluna de ~110px a descricao alongava demais, entao fica oculta (o link
     inteiro continua levando pra #solucoes); icone+rotulo curto,
     centralizados, no mesmo espirito das outras celulas pequenas do
     redesenho mobile (.mm-cel). */
  .hero-pe .wrap{padding-top:18px;padding-bottom:18px}
  .hpe-grupo{flex-direction:column;align-items:center;text-align:center;gap:8px;padding-inline:6px}
  .hpe-ico{width:26px;height:26px}
  .hpe-grupo b{font-size:12px;margin-bottom:0;letter-spacing:-.005em}
  .hpe-grupo p{display:none}
  .manifesto-grid{grid-template-columns:1fr;gap:22px}
  .manifesto-grid > div:first-child{position:static}
  .sec-topo{flex-direction:column;align-items:flex-start;gap:14px}
  /* VOLTOU a ser grid (nao carrossel) -- pedido explicito do usuario ("nao
     ta legal, pode ser grid tambem, da melhor forma, sem espacos vazios
     sobrando"): a 1a tentativa (carrossel horizontal por grupo) foi
     revertida. 2 colunas, e os 3 grupos da pagina (Software/Conectividade
     com o card de CTA/Equipamentos) tem SEMPRE 3 cartoes cada -- sobraria
     uma celula vazia numa grade par. Conectividade: o ULTIMO (o card de CTA,
     "A gente dimensiona com voce") ocupa a linha inteira -- fica melhor como
     faixa de destaque no fim. Software/Equipamentos: pedido explicito do
     usuario pra' inverter -- o PRIMEIRO ocupa a linha inteira (Plataforma de
     Rastreamento / Rastreadores, os "carro-chefe" de cada grupo), os outros
     2 dividem a linha de baixo. Precisa das classes .grupo-* (adicionadas no
     PHP) pra' diferenciar -- os 3 grupos usam as MESMAS classes .sol/
     .sol-cta, nao da' pra distinguir so' por elas. */
  .grade{grid-template-columns:repeat(2,1fr);gap:10px}
  .grupo-conectividade .sol:nth-child(odd):last-child,.grupo-conectividade .sol-cta:nth-child(odd):last-child{grid-column:1/-1}
  .grupo-software .grade > :first-child,.grupo-equipamentos .grade > :first-child{grid-column:1/-1}
  .sol-corpo{padding:14px 16px 18px}
  .sol-corpo p{font-size:13px}
  .sol-link{font-size:13px}
  /* 2 colunas mesmo abaixo de 700 -- pedido explicito do usuario ("a lista
     esta' muito extensa", eram 8 cartoes empilhados 1 por linha). Reduz o
     texto mais um passo pra' caber nos ~170px de cada celula. */
  .grade-pq{grid-template-columns:repeat(2,1fr);gap:10px}
  .pq b{min-height:0}
  .rod-contato{grid-template-columns:1fr;gap:24px;padding:26px 0 30px}
  .pq{padding:16px 14px 18px}
  .pq b{min-height:0;font-size:.98rem}
  .pq p{font-size:12.5px;line-height:1.45}
  .gente-nums{grid-template-columns:repeat(3,1fr);gap:12px}
  .cta-cx{padding:34px 24px 38px}
  .cta .btn{width:100%}
  /* carrossel de Posts, com o proximo exibido parcialmente -- pedido
     explicito do usuario ("como nos catalogos de streaming"). SO' na home
     (.grade-posts-carrossel, classe propria) -- .grade-posts sozinha
     tambem e' usada em /posts/ (listagem completa) e no "relacionados" de
     /posts/ler.php, que devem continuar em lista/grid normal, nao virar
     carrossel. 84% de largura por card = uma fatia boa do proximo espiando.
     Respiro do 1o/ultimo card via margin (nao padding no container) -- ver
     comentario junto de .tempo-pt:first-child mais acima: padding num
     container com scroll-snap nasce ja' "comido" pelo proprio snap. */
  .grade-posts-carrossel{
    display:flex;gap:14px;overflow-x:auto;scroll-snap-type:x mandatory;
    margin:0 calc(var(--gut) * -1);padding-bottom:2px;
    -webkit-overflow-scrolling:touch;
  }
  .grade-posts-carrossel::-webkit-scrollbar{display:none}
  .grade-posts-carrossel .post{flex:0 0 84%;scroll-snap-align:start}
  .grade-posts-carrossel .post:first-child{margin-left:var(--gut)}
  .grade-posts-carrossel .post:last-child{margin-right:var(--gut)}
  .grade-posts-carrossel{scroll-padding-inline:var(--gut)}
  /* timeline: mesmo efeito dos posts (1 card dominante + o proximo espiando
     parcialmente) -- pedido explicito do usuario, "o mesmo efeito que ja'
     fizemos nos posts". Sobrescreve o grid-auto-columns do breakpoint de
     980px (mais~1.7 item por tela, sem card dominante). */
  .tempo-trilha{grid-auto-columns:80%}
  .grupo{padding:18px 16px 22px}
  .grupo-cab .cont{display:none}
  .depo-card{flex:0 0 62vw}
  .jor,.jor-txt{min-height:224px}
  .jor-txt{padding:20px 18px 22px}
  .parc-grade{grid-template-columns:repeat(4,1fr);gap:10px}
  /* .manifesto/.solucoes/.porque/.jornadas/.depo/.editorial/.parceiros/.slogan
     usam no desktop clamp(66px,8vw,120px) (ou variantes proximas) -- no
     mobile o 8vw nunca chega no piso de 66px, entao toda section bate
     sempre nos mesmos 66px fixos em cima e embaixo (132px por section, so'
     de padding, sem carregar conteudo). Multiplicado pelas ~6 sections da
     home isso e' >700px de tela gastos so' com respiro entre blocos --
     exatamente o tipo de espaco mal usado que o usuario apontou comparando
     com o celular de um amigo. Aqui cada uma ganha um piso mobile proprio,
     mais coerente com a tela menor. */
  .manifesto,.solucoes,.porque,.jornadas,.depo,.editorial,.fer-home{padding:44px 0}
  .parceiros{padding:44px 0}
  .slogan{padding:40px 0}
  .nav-acoes .btn{display:none}
  .btn-login{width:38px;height:38px}
  /* blur de 80px em tres camadas custa caro em celular: ficam duas, menores */
  .aurora span:nth-child(1){width:230px;height:230px}
  .aurora span:nth-child(2){width:250px;height:250px}
  .aurora span:nth-child(3){display:none}
  /* atalhos de jornada saem: o texto e longo e eles ja estao no menu da gaveta.
     Busca, escala e idioma ficam -- sao justamente os que nao tem outro lugar. */
  /* Os tres atalhos VOLTAM, na MESMA linha. Antes sumiam aqui, e com eles
     sumia a oferta com prazo.
     Houve uma tentativa com segunda linha: deu 160px de cabecalho fixo num
     telefone e, pior, o numero cravado em --utl-alto nao batia com a altura
     real do conteudo -- a linha vazava por cima do logo e do botao de
     login. Medido: .utl ia ate' 88, o conteudo ate' 108, o logo comecava em
     111.
     Cabe em uma linha porque o rotulo encolhe (Monte / Migre, ver
     so-desk/so-movel) e porque o controle de escala sai -- veja abaixo. */
  .utl{--utl-alto:52px;padding:8px 8px 0}
  .utl-cx{height:44px;padding:0 4px}
  .utl-esq{display:flex;align-items:center;min-width:0}
  .utl-dir{margin-left:auto}
  /* Recuo, vao, icone e corpo menores: no celular cada pixel da linha conta.
     MEDIDO a 360px com os valores anteriores: "Migre" ia ate' 270 e a busca
     comecava em 256 -- 14px de sobreposicao. Estes cortes devolvem ~20px, e
     e' a largura de 360 que manda, nao a de 390: telefone estreito e' o
     caso dificil, e se couber nele cabe no outro. */
  .utl-esq a{padding:0 6px;gap:5px;font-size:12.5px}
  .utl-esq a + a{margin-left:6px}
  .utl-esq a + a::before{left:-3px;height:15px}
  .utl a.utl-oferta{padding:0 9px;gap:5px;height:26px;margin-left:0;font-size:12.5px}
  .utl a.utl-oferta .utl-ico{width:15px;height:15px}
  .utl-esq .utl-ico{width:15px;height:15px}
  /* O controle de escala sai no celular. E' o unico dos tres da direita com
     substituto nativo: zoom por pinca faz o mesmo. Busca e idioma ficam,
     porque nao tem outro lugar na navegacao do telefone. */
  .escala{display:none}
  /* MEDIDO a 390px, antes destes dois cortes: "Migre" ia ate' 270 e a busca
     comecava em 232 -- 38px de sobreposicao, com o conjunto pedindo ~405px
     numa barra de 367. Faltava largura, nao alinhamento.
     Os filetes da direita separavam escala de busca e de idioma; sem a
     escala, sobrou um separador para dois itens que ja' sao icones
     distintos. E a sigla do idioma e' redundante ao lado da bandeira, que
     ja' diz qual e'. Juntos, devolvem ~70px. */
  .utl-dir .utl-sep{display:none}
  .idioma .sigla{display:none}
  .utl-dir{gap:4px}
  /* BUSCA ABERTA: os atalhos saem da linha.
     O campo cresce ate' clamp(120px,38vw,200px) dentro da mesma barra, e no
     celular nao ha' essa largura sobrando -- ele abria POR CIMA de Monte e
     Migre, com texto de um por cima do outro. Com os atalhos fora, o campo
     tem a linha inteira pra crescer, e eles voltam assim que a busca fecha.
     Quem liga a classe e' o proprio script da busca (ver 'com-busca' em
     assets/js/site.js), o mesmo que devolve a barra recolhida pelo scroll. */
  .topo.com-busca .utl-esq{display:none}
  .nav.solido{margin:8px;padding:10px calc(var(--gut) - 8px)}
  .utl-cx{justify-content:flex-end}
  /* bottom soma --barra-inf: sem isso o botao de voltar ao topo ficava
     escondido atras da barra de abas fixa nova. */
  .subir{left:16px;bottom:calc(var(--barra-inf) + 16px + env(safe-area-inset-bottom,0));width:42px;height:42px}
  /* respiro embaixo de toda pagina, do tamanho da barra de abas -- sem isso a
     ultima secao/rodape ficava parcialmente atras dela. */
  body{padding-bottom:calc(var(--barra-inf) + env(safe-area-inset-bottom,0))}
  /* widget de contato externo (#voxter-contact-widget, injetado fora deste
     repo -- ver comentario mais abaixo sobre erb-fullscreen-travado): por
     padrao flutua colado no canto inferior, o que agora cai EM CIMA da barra
     de abas. !important pelo mesmo motivo de la': nao controlamos a
     especificidade do CSS dele. Pedido explicito do usuario: subir mais um
     pouco em relacao a' barra (+16px de folga, mesmo respiro ja' usado no
     .subir contra essa mesma barra, algumas linhas acima).
     ACHADO REAL: um transform:scale(.9) aqui (pedido tambem explicito, pra
     reduzir a escala) quebrou a ABERTURA do widget -- painel de chat nascia
     fininho/estreito. O script do widget e' externo (nao temos o codigo);
     getBoundingClientRect() reflete o scale visual mas offsetWidth/
     clientWidth nao, entao se ele mede a si mesmo por getBoundingClientRect
     pra decidir a largura do painel ao abrir, o scale distorce essa conta.
     Sem controle sobre esse script, a saida segura e' NAO escalar o
     container inteiro -- revertido, so' a posicao (acima) fica. */
  body:not(.erb-fullscreen-travado) #voxter-contact-widget{
    bottom:calc(var(--barra-inf) + 16px + env(safe-area-inset-bottom,0)) !important;
  }
}
/* ============================================================ BARRA DE ABAS
   (mobile, <700px): navegacao "de app" pedida explicitamente pelo usuario,
   substituindo o .burger morto (ver comentarios acima). 4 abas fixas --
   Inicio/Solucoes/Catalogo direto, "Menu" abre a folha de baixo com o resto
   (A Voxter, Segmentos, Cases, Ferramentas, Posts, Contato, Login) -- e' a
   unica forma de chegar em Segmentos pelo celular hoje, por exemplo: nao
   estava em lugar nenhum do mobile (nem no rodape). */
.tab-bar{display:none}
@media (max-width:700px){
  /* respiro lateral de 10px + cantos superiores 12px -- pedido explicito do
     usuario, "mesma largura das barras do topo": e' o MESMO inset de 10px
     que .utl (padding) e .nav.solido (margin) ja' usam pra' flutuar a barra
     de busca/idioma e o nav rolado, so' que so' embaixo -- a base continua
     encostada (bottom:0), por isso os cantos de baixo ficam retos. */
  .tab-bar{
    display:flex;position:fixed;left:10px;right:10px;bottom:0;z-index:85;
    height:var(--barra-inf);padding-bottom:env(safe-area-inset-bottom,0);
    background:#fff;border:1px solid var(--linha);border-bottom:0;
    border-radius:12px 12px 0 0;
    box-shadow:var(--sombra-md);
  }
}
.tab-item{
  flex:1 1 0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  padding:0 4px;background:none;border:0;color:var(--tinta-45);
  font-family:inherit;font-size:10.5px;font-weight:500;
  text-decoration:none;cursor:pointer;transition:color .2s;
}
.tab-item.ativo{color:var(--carmim)}
/* "Início" e' o unico item condicional da barra (some na propria home) --
   pedido explicito do usuario: animacao deslizante no surgir/desaparecer.
   Site multi-pagina (cada navegacao e' um load novo, sem persistencia de
   layout entre paginas): nao ha' como animar de VERDADE uma transicao
   ENTRE a home e uma pagina interna (a home nem chega a carregar o DOM da
   pagina interna, e vice-versa) -- o "desaparecer" so' existe fazendo a
   home nunca ter o item, o que ja' e' o caso. O que DA' pra fazer, e o que
   fica aqui: quando o item existe (toda pagina interna), ele desliza de
   verdade ao entrar, em vez de so' aparecer estatico com o resto da barra. */
@keyframes tabInicioEntra{from{opacity:0;transform:translateX(-14px)}to{opacity:1;transform:translateX(0)}}
.tab-inicio{animation:tabInicioEntra .45s cubic-bezier(.2,.7,.3,1) .1s both}
.tab-ico{width:22px;height:22px;display:flex}
.tab-ico svg{width:100%;height:100%}
/* "Menu" alterna hamburguer <-> X (mesmos 2 svgs, so' um por vez) --
   pedido implicito de affordance clara: o icone tem que dizer "isso fecha"
   quando a folha ja' esta' aberta, nao continuar parecendo "abrir". */
.tab-ico-fechado{display:none}
.tab-menu.aberto .tab-ico-aberto{display:none}
.tab-menu.aberto .tab-ico-fechado{display:flex}
.tab-menu.aberto{color:var(--carmim)}

/* ---- folha de menu (mobile): mesmo molde de overlay do .catalogo-drawer
   (fundo + painel + [data-fechar]), so' que desliza de BAIXO pra CIMA (bottom
   sheet) em vez de lateral -- combina com a barra de abas que a abre. */
/* BUG REAL (achado pelo usuario: fecha sem animar, so' some seco): a
   visibility:hidden daqui aplicava na hora, no instante em que .aberto saia
   -- cortava a folha da tela ANTES da transicao de transform (.35s) terminar
   de descer. transition-delay so' na SAIDA (a regra .aberto zera o delay pra
   entrada ser instantanea) faz visibility:hidden esperar a animacao acabar
   pra' so' entao sumir de verdade. */
.menu-movel{position:fixed;inset:0;z-index:120;visibility:hidden;transition:visibility 0s linear .35s}
.menu-movel-fundo{
  position:absolute;inset:0;background:rgba(0,0,51,.5);
  opacity:0;transition:opacity .3s ease;
}
.menu-movel-painel{
  position:absolute;left:0;right:0;bottom:0;max-height:82svh;
  display:flex;flex-direction:column;
  background:#fff;border-radius:var(--r-xl) var(--r-xl) 0 0;
  box-shadow:var(--sombra-lg);
  transform:translateY(100%);transition:transform .35s cubic-bezier(.2,.7,.3,1);
  padding-bottom:env(safe-area-inset-bottom,0);
}
.menu-movel.aberto{visibility:visible;transition-delay:0s}
.menu-movel.aberto .menu-movel-fundo{opacity:1}
.menu-movel.aberto .menu-movel-painel{transform:translateY(0)}
.menu-movel-cab{
  flex:none;display:flex;align-items:center;justify-content:space-between;
  padding:18px 20px 14px;border-bottom:1px solid var(--linha);
  font-family:var(--mono);font-size:11.5px;font-weight:500;letter-spacing:.16em;text-transform:uppercase;color:var(--tinta-45);
}
.menu-movel-cab button{display:flex;background:none;border:0;padding:6px;margin:-6px;color:var(--tinta-45);cursor:pointer}
.menu-movel-cab svg{width:20px;height:20px}
.menu-movel-corpo{flex:1;overflow-y:auto;padding:10px 20px 28px;-webkit-overflow-scrolling:touch}

/* accordion Solucoes/Segmentos via <details> nativo -- expand/collapse de
   graca, sem JS proprio, e ja' acessivel por padrao (teclado, leitor de tela). */
.mm-acc{border-bottom:1px solid var(--linha)}
.mm-acc summary{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:15px 2px;font-size:15.5px;font-weight:600;color:var(--tinta);
  cursor:pointer;list-style:none;
}
.mm-acc summary::-webkit-details-marker{display:none}
.mm-acc summary svg{width:16px;height:16px;flex:none;color:var(--tinta-45);transition:transform .25s}
.mm-acc[open] summary svg{transform:rotate(180deg)}
.mm-acc-corpo{padding:0 2px 16px;display:flex;flex-direction:column}
.mm-rot{
  display:block;margin:14px 0 6px;font-family:var(--mono);font-size:10.5px;
  font-weight:500;letter-spacing:.13em;text-transform:uppercase;color:var(--carmim);
}
.mm-acc-corpo .mm-rot:first-child{margin-top:2px}
.mm-acc-corpo > a{padding:8px 0;font-size:14.5px;color:var(--tinta-70);text-decoration:none}
.mm-acc-corpo > a:active{color:var(--carmim)}

/* links diretos + secoes de contato/login, fora do accordion */
.mm-rot-secao{margin-top:22px;padding-top:16px;border-top:1px solid var(--linha)}
.mm-link{
  display:block;width:100%;padding:13px 2px;border:0;background:none;
  font-family:inherit;font-size:15.5px;font-weight:500;color:var(--tinta);
  text-align:left;text-decoration:none;cursor:pointer;border-bottom:1px solid var(--linha);
}
.mm-link:last-child{border-bottom:0}
.mm-link i{display:block;margin-top:2px;font-style:normal;font-size:12.5px;font-weight:400;color:var(--tinta-45)}
/* "Falar com Vendas" dentro da folha -- mesmo .btn vermelho do topo, largura
   cheia (sem disputa de espaco com outros itens de nav, como tem la' em
   cima) e com respiro proprio, separado da lista de links por cima. */
.mm-vendas{width:100%;justify-content:center;margin:16px 0 6px}
/* folha mais curta (submenu rapido de Solucoes): nao precisa do respiro
   inteiro de 82svh da folha "Mais" (bem mais conteudo) -- teto menor deixa
   ela nascer do tamanho do proprio conteudo, sem sobrar vazio embaixo. */
.menu-movel--curta .menu-movel-painel{max-height:70svh}

/* grids de celula pequena (2x2 e 1x3) -- pedido explicito do usuario, no
   lugar da lista vertical de links: "escala reduzida visualmente,
   organizado". Reaproveita os MESMOS icones que ja' existiam no dropdown de
   desktop (.sub-ico), so' que num cartao compacto e centralizado. */
.mm-grid{display:grid;gap:8px;margin:10px 0 4px}
.mm-grid-2x2{grid-template-columns:repeat(2,1fr)}
.mm-grid-1x3{grid-template-columns:repeat(3,1fr)}
.mm-cel{
  display:flex;flex-direction:column;align-items:center;text-align:center;gap:5px;
  padding:14px 6px;border:1px solid var(--linha);border-radius:var(--r-md);
  background:var(--osso);font-family:inherit;color:var(--tinta);
  text-decoration:none;cursor:pointer;transition:background .2s,border-color .2s;
}
.mm-cel:active{background:var(--osso-2);border-color:var(--carmim)}
.mm-cel-ico{width:20px;height:20px;color:var(--carmim)}
.mm-cel-ico svg{width:100%;height:100%}
.mm-cel b{font-size:12.5px;font-weight:600;line-height:1.25}
.mm-cel > span{font-size:10.5px;color:var(--tinta-45)}
/* grid de Solucoes (submenu rapido): mesma celula, mas com o rotulo real do
   produto (mais longo -- "Plataforma de Rastreamento") em vez do rotulo
   curto usado nas celulas de contato/login -- sem o subtitulo pra caber. */
#solucoes-movel .mm-cel{padding:16px 8px}
#solucoes-movel .mm-cel-ico{width:22px;height:22px}
#solucoes-movel .mm-cel b{font-size:12.5px;font-weight:500}
/* widget externo (#voxter-contact-widget, z-index:999999 -- ver comentario
   mais abaixo sobre erb-fullscreen-travado) flutua por cima de QUALQUER
   coisa nossa, inclusive a folha de menu aberta. Mesma tecnica ja' usada pro
   mapa fullscreen: escondido enquanto a folha esta' aberta. */
/* mesma tecnica tambem cobre o modal "Categorias e Marcas" do /catalogo/
   (mobile) -- o widget flutua por cima de qualquer coisa nossa, inclusive
   os ultimos itens da lista de marcas no canto inferior. */
body:has(.menu-movel.aberto, .catalogo-filtros-modal.aberto) #voxter-contact-widget{display:none !important}
@media (prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important}
  .rev{opacity:1;transform:none}
  html{scroll-behavior:auto}
}
/* .sem-scroll-reveal (ver $body_classe em /cases -- pedido explicito do
   usuario: "não quero que o conteúdo apareça conforme rolagem... deixar
   revelado direto, assim que carregar"): mesma receita do
   prefers-reduced-motion acima, so' que ligada por PAGINA em vez de
   preferencia do usuario -- o JS de site.js continua rodando por baixo
   (so' observa e tenta marcar .vis, o que aqui ja' e' irrelevante), sem
   precisar de nenhuma mudanca no JS compartilhado. */
body.sem-scroll-reveal .rev,
body.sem-scroll-reveal .casc > *,
body.sem-scroll-reveal .grupo{opacity:1!important;transform:none!important;transition:none!important}
/* zoom Ken Burns da foto de "Sobre a empresa" tambem depende de .vis
   (.case-bento.vis) -- sem isso a foto carregava mais "zoomada" (scale
   1.14) ate' o scroll chegar la'. */
body.sem-scroll-reveal .case-bento-foto img{transform:scale(1)!important}

/* .teste-tracking-reduzido (ver $body_classe em /cases -- pedido explicito
   do usuario): o teste anterior (trocar a fonte MONO pela Google Sans
   padrao via --mono) foi reprovado -- "pode voltar pra --mono" -- entao
   NAO mexe mais em font-family. O que ficou: o espacamento entre letras
   (letter-spacing) desses mesmos rotulos/pilulas/migalhas reduzido um
   pouco, ainda isolado em /cases. Sem uma variavel unica pra letter-spacing
   (cada regra ja' tinha o proprio valor hardcoded antes deste teste
   existir), entao aqui repete os MESMOS seletores com um valor menor --
   se aprovado, e' so' aplicar esses valores direto nas regras originais
   (.rot, .post-cat etc.) e tirar a classe/este bloco. */
body.teste-tracking-reduzido .rot{letter-spacing:.11em}
body.teste-tracking-reduzido .post-cat{letter-spacing:.05em}
body.teste-tracking-reduzido .posts-cat{letter-spacing:.02em}
body.teste-tracking-reduzido .posts-qtd-rot{letter-spacing:.035em}
body.teste-tracking-reduzido .migalhas{letter-spacing:.03em}
body.teste-tracking-reduzido .migalhas-secoes{letter-spacing:.02em}
body.teste-tracking-reduzido .case-nav-seta-tip-rot{letter-spacing:.04em}
body.teste-tracking-reduzido .case-bento-mapa-rot{letter-spacing:.04em}

/* ============================================================
   CABECALHO DE PAGINA INTERNA (reutilizavel nas proximas 7 paginas)
   ============================================================ */
/* o .topo/.nav e' position:fixed e foi desenhado pra flutuar sobre um hero
   ESCURO -- e' de la que vem o logo branco (.marca.branca) e a barra
   transparente. Uma pagina interna que comeca direto com secao clara fica
   sem esse fundo: logo branco some, barra flutua sem contraste, e o
   conteudo nasce colado no nav porque nada empurra ele pra baixo. Este
   header resolve isso replicando o offset vertical e o fundo escuro do
   hero da home, so que bem mais baixo -- nao e' hero de home, e' so o
   espaco necessario pra a barra ter onde pousar. */
.pagina-hero{
  position:relative;min-height:clamp(240px,calc(var(--palco-h,100svh) * .30),330px);
  background:var(--navy);color:#fff;
  display:flex;align-items:flex-end;overflow:hidden;
}
.pagina-hero::before{
  content:"";position:absolute;top:-22%;right:-8%;width:520px;height:520px;
  background:radial-gradient(circle,rgba(168,40,42,.4),transparent 70%);
  filter:blur(70px);pointer-events:none;
}
.pagina-hero::after{
  content:"";position:absolute;bottom:-30%;left:-10%;width:420px;height:420px;
  background:radial-gradient(circle,rgba(37,99,235,.3),transparent 70%);
  filter:blur(70px);pointer-events:none;
}
.pagina-hero .wrap{position:relative;z-index:1;width:100%;padding-bottom:clamp(28px,3.5vw,40px)}
.pagina-hero h1{margin:0 auto;color:#fff;text-align:center;font-size:clamp(2.1rem,4.5vw,3.4rem);letter-spacing:-.02em;max-width:20ch}
/* pulso continuo e bem sutil (1 -> 1.018 -> 1), so nas paginas internas --
   a entrada letra a letra e' rapida (ver .letra abaixo) e acaba muito antes
   do 1o ciclo do pulso, entao as duas nunca disputam visualmente. */
@media (prefers-reduced-motion:no-preference){
  .pagina-hero h1{animation:tituloPulso 3.6s ease-in-out infinite}
}
@keyframes tituloPulso{0%,100%{scale:1}50%{scale:1.018}}
.pagina-hero h1 .media{font-weight:500}
/* titulo de 2 linhas das paginas de Segmentos (ver _inc/pagina-hero.php,
   $pagina_titulo_prefixo + $pagina_titulo_nome) -- pedido explicito do
   usuario pra substituir o auto-encolhe de 1 linha nessas paginas: aqui
   quebrar em 2 linhas e' o design, nao um problema, com prefixo pequeno
   ("Soluções para") e nome do segmento grande embaixo. max-width solta
   (nao herda o 20ch/auto-encolhe do h1 generico) -- cada linha tem seu
   proprio tamanho cuidando de nao esticar demais. */
/* titulo de 2 linhas e' mais alto que o de 1 linha padrao -- sem isso o
   "prefixo" (topo do H1, que fica ancorado embaixo do header por causa
   do align-items:flex-end) colidia com o nav (achado ao vivo testando
   /centrais-de-rastreamento/). */
.pagina-hero.pagina-hero-alto{min-height:clamp(300px,calc(var(--palco-h,100svh) * .36),400px)}
@media (max-width:700px){
  .pagina-hero.pagina-hero-alto{min-height:280px}
}
.pagina-hero h1.pagina-hero-segmento{
  display:flex;flex-direction:column;align-items:center;gap:.2em;
  /* max-width:none (nao um Nch) de proposito: o h1 generico herdaria
     max-width:20ch relativo ao CLAMP PEQUENO da versao de 1 linha
     (2.1-3.4rem) -- bem menor que o espaco real do .wrap, e cortaria
     nome de segmento comprido ("Associações de Proteção Veicular") numa
     3a linha sem necessidade nenhuma (achado testando ao vivo). Como os
     filhos (.prefixo/.nome) sao itens de flex com align-items:center,
     eles nao esticam pra ocupar essa largura -- so' correm menos risco
     de quebrar cedo demais. */
  max-width:none;
}
.pagina-hero h1.pagina-hero-segmento .prefixo{
  display:block;font-size:clamp(1.05rem,2.2vw,1.5rem);font-weight:500;
  letter-spacing:-.01em;color:rgba(255,255,255,.72);line-height:1.2;
}
.pagina-hero h1.pagina-hero-segmento .nome{
  display:block;font-size:clamp(2.5rem,6vw,4.1rem);font-weight:700;
  letter-spacing:-.03em;line-height:1.05;color:#fff;
}
/* entrada letra a letra: cada <span class="letra"> (gerado em site.js) cai
   de cima com atraso crescente. inline-block e' obrigatorio -- transform
   nao pega em inline "puro". */
.pagina-hero h1 .letra{display:inline-block;opacity:0;transform:translateY(-18px)}
.pagina-hero h1.entra .letra{animation:letraEntra .34s cubic-bezier(.2,.7,.3,1) forwards}
@keyframes letraEntra{to{opacity:1;transform:translateY(0)}}
@media (max-width:700px){
  .pagina-hero{min-height:220px}
}

/* migalhas (breadcrumb): faixa propria de linha unica, entre o header/hero
   escuro e a 1a section de conteudo -- nao mora dentro de nenhum dos dois.
   Migalhas na ESQUERDA, menu de atalho pras sections da propria pagina
   (opcional, ver $secoes em _inc/migalhas.php) na DIREITA. */
/* sticky com `top` calculado por JS (ver estadoDaBarra em site.js) -- gruda
   no menu SEM vao (top = base do menu, 0 de folga) quando a rolagem alcanca
   a base dele. A separacao entre os dois nao e' espacial, e' de COR: vira
   --osso-2 (o mesmo tom "claro-2" ja usado pra alternar sections no resto
   do site) contra o --osso do menu -- as duas pilulas ficam encostadas,
   lendo como um objeto so em duas cores, nao como dois objetos flutuando
   separados. Cantos: so os de FORA ficam arredondados (topo do menu, base
   da faixa); a costura no meio fica reta dos dois lados (ver .colado no
   .nav e o border-radius zerado em cima aqui). */
.migalhas-faixa{
  background:var(--osso);border-bottom:1px solid var(--linha);
  position:sticky;top:0;z-index:59;
  transition:margin .3s cubic-bezier(.2,.7,.3,1),border-radius .3s,box-shadow .3s,border-color .3s,background .3s;
}
.migalhas-faixa.presa{
  margin-inline:10px;border-radius:0 0 var(--r-md) var(--r-md);
  background:var(--osso-2);
  border:1px solid var(--linha);border-top-color:transparent;
  box-shadow:var(--sombra-md);
}
.migalhas-faixa .wrap{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px 24px;padding-block:13px;transition:padding .3s}
.migalhas-faixa.presa .wrap{padding-block:9px}
.migalhas{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0;font-family:var(--mono);font-size:11.5px;letter-spacing:.04em;color:var(--tinta-45)}
.migalhas a{color:var(--tinta-70);text-decoration:none;transition:color .2s}
.migalhas a:hover{color:var(--carmim)}
.migalhas-sep{color:rgba(11,18,32,.2)}
.migalhas-atual{color:var(--tinta)}
.migalhas-secoes{display:flex;align-items:center;gap:2px;flex-wrap:wrap;margin:0;font-family:var(--mono);font-size:11px;letter-spacing:.03em}
.migalhas-secoes a{padding:6px 11px;border-radius:var(--pill);color:var(--tinta-45);text-decoration:none;transition:background .2s,color .2s}
.migalhas-secoes a:hover{background:var(--osso-2);color:var(--tinta)}
.migalhas-secoes a.ativo{background:rgba(168,40,42,.09);color:var(--carmim)}
/* migalhas-contagem: variante do slot direito pra pagina com 1 ponto so'
   (ex. /catalogo/) -- em vez de um pill de link sem uso real, mostra quantos
   itens tem em cada categoria. Reusa .migalhas-secoes (flex/fonte/some no
   mobile) + .migalhas-sep (mesmo tom do separador das migalhas a esquerda). */
.migalhas-contagem{gap:12px;color:var(--tinta-45)}
.migalhas-contagem span{white-space:nowrap}
.migalhas-contagem b{color:var(--carmim);font-weight:700}
@media (max-width:820px){ .migalhas-secoes{display:none} }

/* consolidado das migalhas: mesmo gatilho .tem-sub-item do mega/sub do nav
   (ver _inc/nav.php), painel PROPRIO -- so' icone+titulo, sem descricao, bem
   mais compacto. O painel cheio (.mega/.sub) e' peso demais pra uma faixa
   fina de breadcrumb. Fonte do corpo, nao a mono ambiente da faixa -- pra
   combinar com o submenu do menu principal. */
.migalhas .tem-sub-item > span:hover,
.migalhas .tem-sub-item:hover > span,
.migalhas .tem-sub-item:focus-within > span{color:var(--carmim)}
.migalhas-mega{
  position:absolute;top:calc(100% + 12px);left:0;transform:translateY(-8px);
  width:max-content;max-width:calc(100vw - 2 * var(--gut));
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);
  box-shadow:var(--sombra-lg);padding:14px;
  display:grid;grid-template-columns:repeat(3,auto);gap:2px 30px;
  opacity:0;visibility:hidden;
  transition:opacity .2s ease,transform .2s cubic-bezier(.2,.7,.3,1),visibility .2s;
}
.tem-sub-item:hover .migalhas-mega,.tem-sub-item:focus-within .migalhas-mega{opacity:1;visibility:visible;transform:none}
.migalhas-mega-col > .rot{
  display:block;padding:0 9px 8px;margin-bottom:2px;border-bottom:1px solid var(--linha);
  color:var(--carmim);font-size:10px;letter-spacing:.13em;font-family:var(--mono);
}
.migalhas-mega a,.migalhas-sub a{
  display:flex;gap:10px;align-items:center;padding:8px 9px;border-radius:var(--r-sm);
  text-decoration:none;color:var(--tinta);font-family:var(--fonte);font-size:13.5px;
  font-weight:500;letter-spacing:0;background:none;transition:background .2s,box-shadow .2s;white-space:nowrap;
}
.migalhas-mega a b,.migalhas-sub a b{font-weight:500}
.migalhas-mega a:hover,.migalhas-sub a:hover{background:var(--osso-2)}
/* pagina ativa: contorno pastel, nao preenchimento solido -- e' so' uma
   marcacao discreta de "voce esta aqui", nao um estado selecionado. */
.migalhas-mega a.ativo,.migalhas-sub a.ativo{background:rgba(168,40,42,.06);box-shadow:inset 0 0 0 1px rgba(168,40,42,.22)}
.migalhas-mega a.ativo:hover,.migalhas-sub a.ativo:hover{background:rgba(168,40,42,.1)}
.mini-ico{flex:none;width:16px;height:16px;color:var(--carmim)}
.mini-ico svg{width:100%;height:100%}
.migalhas-sub{
  position:absolute;top:calc(100% + 12px);left:0;min-width:190px;
  background:#fff;border-radius:var(--r-lg);border:1px solid var(--linha);
  box-shadow:var(--sombra-lg);padding:6px;
  opacity:0;visibility:hidden;transform:translateY(-8px);
  transition:opacity .2s ease,transform .2s cubic-bezier(.2,.7,.3,1),visibility .2s;
}
.tem-sub-item:hover .migalhas-sub,.tem-sub-item:focus-within .migalhas-sub{opacity:1;visibility:visible;transform:none}
@media (max-width:820px){ .migalhas-mega,.migalhas-sub{display:none} }

/* ============================================================
   SOBRE NOS
   ============================================================ */
.historia{padding:clamp(44px,5.5vw,72px) 0 clamp(66px,8vw,120px);position:relative;overflow:hidden}

/* grade editorial: coluna esquerda fixa (citacao + retrato), sticky
   enquanto a coluna direita (a narrativa ano a ano) rola -- mesmo mecanismo
   de .manifesto-grid. Resolve dois problemas de uma vez: o texto nao
   precisa mais abracar a foto (shape-outside saiu, o retrato agora vive
   isolado na lateral) e a secao usa a largura toda, sem sobrar vazio a
   direita como no layout anterior de coluna unica de 76ch. */
.historia-grade{display:grid;grid-template-columns:minmax(0,.62fr) minmax(0,1.6fr);gap:clamp(28px,4.5vw,64px);align-items:start}
.historia-lado{position:sticky;top:110px;display:flex;flex-direction:column;gap:28px}
.historia-citacao{
  margin:0;padding:2px 0 2px 22px;border-left:4px solid var(--carmim);
  font-family:var(--fonte);font-weight:700;letter-spacing:-.025em;
  font-size:clamp(1.6rem,2.4vw,2.15rem);line-height:1.2;color:var(--tinta);
}
.historia-foto{margin:0 0 0 22px;max-width:230px}
.historia-foto img{width:100%;display:block;border-radius:var(--r-lg);filter:drop-shadow(0 18px 32px rgba(0,0,51,.16))}
.historia-foto figcaption{margin-top:10px;font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--tinta-45)}

/* corpo: cada bloco cronologico ganha o proprio ano em tipografia gigante
   e quase invisivel atras do paragrafo (puro fundo decorativo,
   pointer-events:none). Filete a esquerda marca o "trilho" da narrativa;
   padding-left da coluna e' o respiro que faltava entre o texto e a borda.
   margin-inline negativo no bloco deixa o hover "sangrar" um pouco pros
   dois lados sem mudar onde o texto quebra linha (padding cancela a margem). */
.historia-corpo{padding-left:clamp(22px,2.6vw,34px);border-left:1px solid var(--linha)}
.historia-bloco{position:relative;padding:22px 20px;margin-inline:-20px;border-top:1px solid var(--linha);border-radius:var(--r-md);transition:background .25s}
.historia-bloco:first-of-type{border-top:0}
.historia-bloco:hover{background:rgba(168,40,42,.05)}
.historia-bloco--marco{background:linear-gradient(90deg,rgba(168,40,42,.07),transparent 80%)}
.historia-bloco--marco:hover{background:linear-gradient(90deg,rgba(168,40,42,.12),transparent 80%)}
.historia-ano-fundo{
  position:absolute;top:-.1em;left:calc(20px - .03em);z-index:0;
  font-family:var(--fonte);font-weight:700;letter-spacing:-.03em;line-height:1;
  font-size:clamp(4.2rem,10.5vw,7rem);color:var(--tinta);opacity:.045;
  pointer-events:none;user-select:none;
}
.historia-marca-ano{position:relative;z-index:1;display:block;font-family:var(--mono);font-size:12.5px;font-weight:600;letter-spacing:.06em;color:var(--carmim);margin-bottom:8px}
.historia-bloco p{position:relative;z-index:1;margin:0;color:var(--tinta-70);font-size:1.02rem;line-height:1.7}

.historia-transicao{margin:10px 0 18px;color:var(--tinta-70);font-size:1.02rem;line-height:1.7}

.historia-stack{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.historia-stack-item{
  position:relative;background:var(--osso-2);border-radius:var(--r-md);padding:18px 18px 20px;
  transition:transform .3s cubic-bezier(.2,.7,.3,1),box-shadow .3s,background .3s;
}
.historia-stack-item:hover{transform:translateY(-3px);box-shadow:var(--sombra-md);background:#fff}
.historia-stack-ico{display:flex;align-items:center;justify-content:center;width:34px;height:34px;margin-bottom:12px;border-radius:var(--r-sm);background:rgba(168,40,42,.09);color:var(--carmim)}
.historia-stack-ico svg{width:18px;height:18px}
.historia-stack-item b{display:block;color:var(--tinta);font-size:.96rem;margin-bottom:6px}
.historia-stack-item p{margin:0;color:var(--tinta-70);font-size:13px;line-height:1.55}
@media (max-width:900px){
  .historia-grade{grid-template-columns:1fr;gap:32px}
  .historia-lado{position:static;flex-direction:row;align-items:flex-start}
  .historia-foto{margin-left:0;max-width:150px;flex:none}
  .historia-corpo{padding-left:0;border-left:0}
}
@media (max-width:560px){
  .historia-lado{flex-direction:column}
  .historia-foto{max-width:220px}
  .historia-stack{grid-template-columns:1fr}
}

/* linha do tempo completa: acordeao por ano com uma espinha vertical continua
   por tras dos cabecalhos (pedido explicito do usuario -- sem ela, blocos
   colapsaveis perdem a leitura de "linha do tempo" e viram so uma lista
   com sanfona). O marcador de cada ano fica sobre essa linha; o proprio
   painel de marcos entra recuado, alinhado ao mesmo eixo, entao ele le
   como uma ramificacao da espinha, nao como conteudo solto. max-height
   anima (nao auto, que nao transiciona), medido em JS a partir do
   scrollHeight de cada painel. O padding troca junto com o atributo
   data-aberto, sem transicao propria -- fica escondido dentro do proprio
   crescimento do max-height. */
.tempo-completo{padding:clamp(66px,8vw,120px) 0;background:var(--navy);color:#fff}
.tempo-completo .rot{color:var(--dourado)}
.tempo-completo .lede{color:rgba(246,242,237,.68);margin:0}
.tempo-topo-direita{display:flex;flex-direction:column;align-items:flex-end;gap:14px}
.tc-controles{display:flex;gap:10px;flex-wrap:wrap;justify-content:flex-end}
.tc-btn{
  display:inline-flex;align-items:center;gap:7px;padding:9px 15px;
  border-radius:var(--pill);border:1px solid rgba(246,242,237,.2);
  background:rgba(246,242,237,.04);color:rgba(246,242,237,.85);
  font-family:var(--fonte);font-size:12.5px;font-weight:500;cursor:pointer;
  transition:background .2s,border-color .2s,color .2s;white-space:nowrap;
}
.tc-btn:hover{background:rgba(246,242,237,.1);border-color:rgba(246,242,237,.4)}
.tc-btn svg{width:14px;height:14px;flex-shrink:0}
.tc-btn-label{min-width:6.5ch;text-align:left}
.tc-anos{position:relative;padding-left:40px}
.tc-anos::before{
  content:"";position:absolute;left:9px;top:12px;bottom:12px;width:2px;
  background:linear-gradient(to bottom,rgba(220,171,91,.55),rgba(246,242,237,.14) 92%);
}
.tc-ano{
  position:relative;width:100%;display:flex;align-items:center;gap:18px;padding:22px 4px 22px 0;
  background:none;border:0;border-bottom:1px solid rgba(246,242,237,.14);
  cursor:pointer;text-align:left;font-family:var(--fonte);color:#fff;
  transition:background .2s;
}
.tc-ano::before{
  content:"";position:absolute;left:-40px;top:50%;translate:0 -50%;
  width:12px;height:12px;border-radius:50%;background:var(--navy);
  border:2px solid rgba(246,242,237,.4);transition:border-color .25s,background .25s;
  z-index:1;
}
.tc-ano[aria-expanded="true"]::before{background:var(--dourado);border-color:var(--dourado)}
.tc-ano:hover{background:rgba(246,242,237,.03)}
.tc-ano:hover::before{border-color:var(--dourado)}
.tc-ano-num{font-size:clamp(1.5rem,2.4vw,2.1rem);font-weight:700;letter-spacing:-.02em;min-width:5ch;transition:color .2s}
.tc-ano:hover .tc-ano-num{color:var(--dourado)}
.tc-ano-cont{font-family:var(--mono);font-size:12px;letter-spacing:.06em;color:rgba(246,242,237,.5);flex:1}
.tc-seta{width:11px;height:11px;border-right:1.8px solid rgba(246,242,237,.6);border-bottom:1.8px solid rgba(246,242,237,.6);transform:rotate(45deg);transition:transform .3s;flex-shrink:0}
.tc-ano[aria-expanded="true"] .tc-seta{transform:rotate(-135deg)}
.tc-marcos{
  max-height:0;overflow:hidden;padding:0 4px;
  display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:20px;
  transition:max-height .5s cubic-bezier(.2,.7,.3,1);
}
.tc-marcos[data-aberto]{max-height:var(--tc-altura,3000px);padding:24px 4px 32px}
.tc-marco{
  position:relative;
  background:rgba(246,242,237,.04);border:1px solid rgba(246,242,237,.1);border-radius:var(--r-lg);overflow:hidden;
  /* scale/translate SEPARADOS do transform shorthand de proposito: o hover
     usa scale (transition curta), a entrada em onda usa translate+opacity
     (animation, mais lenta) -- num transform unico as duas brigariam pela
     mesma propriedade e uma cancelaria a outra. */
  transition:scale .25s cubic-bezier(.2,.7,.3,1),border-color .25s;
}
.tc-marco:hover{scale:1.035;border-color:rgba(220,171,91,.4)}
.tc-marco-foto{aspect-ratio:16/9;overflow:hidden;background:rgba(246,242,237,.06)}
/* marco sem foto real ainda (registro novo, acervo nao chegou) -- degrade
   discreto nos tons da marca em vez de caixa vazia ou imagem generica. */
.tc-marco-foto-vazia{display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,rgba(220,171,91,.16),rgba(168,40,42,.14))}
.tc-marco-foto-vazia span{font-family:var(--mono);font-size:13px;letter-spacing:.08em;color:rgba(246,242,237,.4)}
.tc-marco-foto img{width:100%;height:100%;object-fit:cover;display:block;scale:1;transition:scale .45s cubic-bezier(.2,.7,.3,1)}
.tc-marco-foto:hover img{scale:1.12}
.tc-marco-corpo{padding:16px 18px 20px}
.tc-marco-tag{display:block;font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--dourado);margin-bottom:8px}
.tc-marco-corpo h3{margin:0 0 8px;font-size:1.02rem;letter-spacing:-.01em}
.tc-marco-corpo p{margin:0;font-size:13.5px;line-height:1.6;color:rgba(246,242,237,.68)}

/* ano corrente ainda em aberto: nao e' rotulo de um marco nem do marcador
   do ano -- e' o proprio ULTIMO ITEM da sequencia (depois do ultimo marco
   real), um circulo proprio, separado de qualquer evento com data. Sinaliza
   "2026 nao fechou, pode vir mais coisa" sem grudar essa mensagem em nenhum
   fato especifico. Quando 2027 comecar, o circulo migra pro fim da lista. */
.tc-aberto-circulo{
  align-self:center;justify-self:center;flex:0 0 auto;
  width:clamp(120px,14vw,160px);aspect-ratio:1;border-radius:50%;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  border:1.5px dashed rgba(220,171,91,.45);background:rgba(220,171,91,.06);
  font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--dourado);
  text-align:center;line-height:1.4;
}
.tc-aberto-circulo .tc-pulso{width:9px;height:9px}
.tc-pulso{position:relative;width:6px;height:6px;border-radius:50%;background:var(--dourado);flex:none}
@media (prefers-reduced-motion:no-preference){
  .tc-pulso::after{
    content:"";position:absolute;inset:-5px;border-radius:50%;
    border:1.5px solid var(--dourado);animation:pulsoAberto 1.8s ease-out infinite;
  }
}
@keyframes pulsoAberto{from{scale:.4;opacity:1}to{scale:1.8;opacity:0}}

/* trilha horizontal: todos os 36 marcos em sequencia continua, so com
   scroll -- e' a visao PADRAO da linha do tempo agora (a sanfona vertical
   virou a opcao secundaria). Os cards reusam .tc-marco-foto/.tc-marco-corpo
   (mesmo HTML gerado pro mesmo dado), so a moldura .tc-h-marco e os
   marcadores de ano sao novos. Quebra o `.wrap` de proposito (formula
   50%/-50vw) pra ocupar a largura toda da tela, nao so a largura do
   conteudo -- pedido explicito, mais marcos visiveis de uma vez.
   --barra-rolagem (medida em site.js) desconta a faixa da barra de rolagem
   de 100vw -- sem isso, em qualquer pagina com barra de rolagem "de
   verdade" (nao overlay, o padrao do Chrome/Windows), 100vw fica alguns
   pixels mais largo que a pagina renderizada de fato, e a trilha sobra
   pra fora da area visivel de um lado, deixando margem em branco do outro. */
.tc-horizontal{
  position:relative;margin-top:8px;
  /* --palco-l no lugar de 100vw: com o palco fixo ligado, 100vw continua
     sendo a janela real (1366) enquanto o layout tem 1929 -- a trilha saia
     com 71% da largura em vez da tela toda. Fora da faixa do palco a
     variavel nao existe e vale a conta antiga, identica. */
  width:var(--palco-l,calc(100vw - var(--barra-rolagem,0px)));
  margin-left:calc(50% - var(--palco-l,calc(100vw - var(--barra-rolagem,0px))) / 2);
  margin-right:calc(50% - var(--palco-l,calc(100vw - var(--barra-rolagem,0px))) / 2);
}
.tc-h-trilha{
  display:flex;align-items:stretch;gap:18px;overflow-x:auto;scroll-behavior:smooth;
  -webkit-overflow-scrolling:touch;
  /* respiro do primeiro item: so um espacinho fixo, nao alinhado ao .wrap
     (isso ficou exagerado num teste anterior). Nada de scroll-snap aqui:
     testado e ele briga com o deslize continuo do hover (cada
     micro-incremento era revertido pelo snap antes do proximo frame,
     travando o efeito). Padding vertical maior que o "respiro" cosmetico:
     overflow-x:auto forca overflow-y a computar como auto tambem (nao da
     pra clipar so um eixo), entao o proprio scale(1.035) do hover no card
     cortava contra a borda da trilha sem essa folga. */
  padding:18px clamp(20px,6vw,64px) 26px 20px;
}
/* trilha "cresce" no hover sem MUDAR de tamanho: a faixa reservada
   (::-webkit-scrollbar) fica sempre com 10px, fixos -- e' isso que definia
   a altura da caixa (overflow-x:auto forca overflow-y a existir, entao
   esse espaco entra no calculo da altura de .tc-h-trilha, que e' auto).
   Animar esse numero fazia a section inteira pular uns pixels pra baixo
   no hover. Quem cresce de verdade e' so o THUMB: nasce fino (uma borda
   transparente grande "corta" ele por dentro da faixa de 10px, via
   background-clip:padding-box) e a borda encolhe no hover, entao o thumb
   passa a preencher a faixa toda -- cresce so ele, a caixa nunca muda. */
.tc-h-trilha::-webkit-scrollbar{height:10px}
.tc-h-trilha::-webkit-scrollbar-track{background:rgba(246,242,237,.06);border-radius:99px}
.tc-h-trilha::-webkit-scrollbar-thumb{
  background-color:rgba(246,242,237,.28);background-clip:padding-box;
  border:2.2px solid transparent;border-radius:99px;
}
.tc-h-trilha::-webkit-scrollbar-thumb:hover{background-color:rgba(220,171,91,.65);border-width:0}
/* a trilha NAO segue o tema claro/escuro global da barra de rolagem (ver
   :root[data-tema="claro"] ::-webkit-scrollbar-* no topo do arquivo) --
   ela mora sempre dentro de uma section escura (.tempo-completo), entao
   fica sempre no visual escuro dela, mesmo quando o scrollspy troca o tema
   da pagina pra "claro" por causa de outra section na tela. Precisa dessas
   overrides com :root[data-tema="claro"] na frente pra ganhar a mesma
   especificidade da regra global e nao ser sobrescrita por ela. */
:root[data-tema="claro"] .tc-h-trilha::-webkit-scrollbar-track{background:rgba(246,242,237,.06)}
:root[data-tema="claro"] .tc-h-trilha::-webkit-scrollbar-thumb{background-color:rgba(246,242,237,.28);border-color:transparent}
:root[data-tema="claro"] .tc-h-trilha::-webkit-scrollbar-thumb:hover{background-color:rgba(220,171,91,.65);border-width:0}
.tc-h-ano{flex:0 0 auto;display:flex;align-items:center;padding:0 10px}
.tc-h-ano-num{font-size:clamp(2rem,3.4vw,2.9rem);font-weight:700;letter-spacing:-.02em;color:rgba(220,171,91,.5);white-space:nowrap}
.tc-h-marco{
  position:relative;
  flex:0 0 260px;background:rgba(246,242,237,.04);border:1px solid rgba(246,242,237,.1);
  border-radius:var(--r-lg);overflow:hidden;
  transition:scale .25s cubic-bezier(.2,.7,.3,1),border-color .25s;
}
.tc-h-marco:hover{scale:1.035;border-color:rgba(220,171,91,.4)}

/* entrada em onda: os marcos (sanfona vertical e trilha horizontal) nascem
   invisiveis e leve deslocados; um script (ver script da pagina) marca
   .vis em todos, com animation-delay crescente por indice, quando a
   section "Linha do Tempo" entra na tela -- o efeito de onda vem so do
   atraso escalonado, a animacao em si e' a mesma pra todo mundo. translate
   e' propriedade separada de scale (ver acima) de proposito: animation
   cuida da entrada, transition cuida do hover, sem uma brigar com a outra. */
@media (prefers-reduced-motion:no-preference){
  .tc-marco,.tc-h-marco{opacity:0}
  .tc-marco.vis,.tc-h-marco.vis{animation:marcoRevela .7s cubic-bezier(.2,.7,.3,1) forwards}
}
@keyframes marcoRevela{from{opacity:0;translate:0 26px}to{opacity:1;translate:0 0}}
/* setas: paradas sobre a trilha, nas bordas da tela. Hover desliza continuo
   (feito em JS, scrollLeft incremental); clique pula 1,5 card de uma vez. */
.tc-h-seta{
  position:absolute;top:44%;translate:0 -50%;z-index:2;
  width:44px;height:44px;border-radius:50%;flex-shrink:0;
  background:rgba(0,0,51,.55);border:1px solid rgba(246,242,237,.25);color:#fff;
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  transition:background .2s,border-color .2s,color .2s;
}
.tc-h-seta:hover{background:var(--dourado);border-color:var(--dourado);color:var(--navy)}
.tc-h-seta svg{width:18px;height:18px}
.tc-h-seta-esq{left:14px}
.tc-h-seta-dir{right:14px}
@media (max-width:700px){
  .tempo-topo-direita{align-items:flex-start}
  .tc-controles{justify-content:flex-start}
  .tc-h-seta{display:none}
}

/* numeros que sobem contando, ao entrar na tela -- mesma familia de efeito
   do .gente-nums da home, mas versao propria porque aqui o formato real tem
   prefixo "+" E separador de milhar durante toda a contagem (1.000.000),
   nao so um sufixo solto. */
.contadores{padding:clamp(50px,6vw,80px) 0;background:var(--osso-2)}
.contadores-grade{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(14px,2vw,24px);text-align:center}
.stat-num{display:block;font-size:clamp(1.9rem,3.4vw,2.7rem);font-weight:700;letter-spacing:-.02em;color:var(--carmim)}
.stat-rot{display:block;margin-top:6px;font-family:var(--mono);font-size:12px;letter-spacing:.06em;color:var(--tinta-45)}

/* mesma marca-dagua decorativa do .solucoes (home): recorte outline do
   "VOX" do logotipo, com parallax sutil (mesmo esquema translateY via
   --paralaxe-fundo -- ver comentario em .solucoes::before sobre o
   background-attachment:fixed que isso substituiu). .wrap ganha z-index
   proprio pra ficar por cima da marca-dagua -- os cards, opacos, cobrem o
   trecho dela que fica atras deles, igual acontece com os cards de
   .solucoes la na home. */
.mvv{padding:clamp(50px,6vw,80px) 0;position:relative}
.mvv::before{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:url(/assets/bg-linhas-2.webp) center/cover no-repeat;
  opacity:.2;translate:0 var(--paralaxe-fundo,0px);
}
.mvv > .wrap{position:relative;z-index:1}
.mvv-grade{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(16px,2vw,26px)}
.mvv-card{
  background:var(--osso);border:1px solid var(--linha);border-radius:var(--r-lg);
  padding:clamp(24px,2.4vw,32px);box-shadow:var(--sombra-sm);
  transition:scale .3s cubic-bezier(.2,.7,.3,1),box-shadow .3s,border-color .3s;
}
.mvv-card:hover{scale:1.025;box-shadow:var(--sombra-md);border-color:rgba(168,40,42,.25)}
.mvv-ico{display:flex;align-items:center;justify-content:center;width:44px;height:44px;margin-bottom:16px;border-radius:var(--r-md);background:rgba(168,40,42,.08);color:var(--carmim)}
.mvv-ico svg{width:22px;height:22px}
/* respiro vivo nos icones: pulso continuo e sutil, sem sincronia entre os
   tres (delay escalonado por card) -- pra nao ficar "batendo" tudo junto,
   como um metronomo. */
@media (prefers-reduced-motion:no-preference){
  .mvv-ico{animation:mvvPulso 2.6s ease-in-out infinite}
  .mvv-card:nth-child(2) .mvv-ico{animation-delay:.5s}
  .mvv-card:nth-child(3) .mvv-ico{animation-delay:1s}
}
@keyframes mvvPulso{0%,100%{scale:1}50%{scale:1.14}}
.mvv-card .rot{color:var(--carmim);display:block;margin-bottom:12px}
.mvv-card p{margin:0;color:var(--tinta-70);font-size:.98rem;line-height:1.65}

.lideranca{padding:clamp(50px,6vw,90px) 0}
.lideranca-grade{display:grid;grid-template-columns:.9fr 1.1fr;gap:clamp(30px,5vw,56px);align-items:center}
.lideranca-foto img{width:100%;display:block;border-radius:var(--r-lg)}
.lideranca-foto figcaption{margin-top:8px;font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--tinta-45)}
.lideranca-corpo p{margin:0 0 18px;color:var(--tinta-70);font-size:1.02rem;line-height:1.7}
.lideranca-corpo p b{color:var(--tinta);font-weight:600}

.galeria{padding:clamp(50px,6vw,90px) 0;background:var(--osso-2)}
.galeria-grade{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(12px,1.6vw,20px)}
/* clique amplia a foto DENTRO do proprio grid (2x2, ver .ativo), nao abre
   mais aba nova (ver JS na pagina) -- as outras encolhem/apagam ao redor
   dela sozinhas, so por causa do reflow do grid, mais um empurrao a mais
   (scale+opacity) pra ficar claro que elas cederam espaco de proposito. */
.galeria-item{
  position:relative;border-radius:var(--r-lg);overflow:hidden;aspect-ratio:4/3;box-shadow:var(--sombra-sm);
  transition:grid-column .45s cubic-bezier(.2,.7,.3,1),grid-row .45s cubic-bezier(.2,.7,.3,1),
             scale .35s cubic-bezier(.2,.7,.3,1),opacity .35s,box-shadow .35s;
}
.galeria-item.ativo{grid-column:span 2;grid-row:span 2;z-index:1;box-shadow:var(--sombra-lg)}
.galeria-grade:has(.ativo) .galeria-item:not(.ativo){scale:.94;opacity:.6}
.galeria-item img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .5s cubic-bezier(.2,.7,.3,1)}
.galeria-item:hover img{transform:scale(1.06)}
.galeria-item span{
  position:absolute;left:0;right:0;bottom:0;padding:28px 16px 14px;
  background:linear-gradient(to top,rgba(0,0,51,.78),transparent);
  color:#fff;font-size:13px;line-height:1.4;
}
@media (max-width:980px){
  .tc-marcos{grid-template-columns:1fr}
  .contadores-grade{grid-template-columns:repeat(2,1fr)}
  .mvv-grade{grid-template-columns:1fr}
  .lideranca-grade{grid-template-columns:1fr}
  .galeria-grade{grid-template-columns:repeat(2,1fr)}
}

/* ---------- /sobre-nos/: ESTRUTURA ORGANIZACIONAL ----------
   Entra entre Lideranca e Galeria, as duas secoes de foto do fim da pagina:
   esta e' o VALE entre elas. Registro PIANO -- nenhuma imagem, nenhum
   movimento proprio; a materia vem da superficie (grao sobre o navy) e da
   tipografia.

   O navy nao e' gosto, e' a unica cor que sobra. Medido na pagina publicada:
   Lideranca e' transparente e Galeria e' osso-2, e as duas estao marcadas
   data-tema-secao="claro" -- nesta pagina esse atributo cobre quatro cores
   diferentes, entao quem decide o fundo de uma secao nova e' a MEDICAO dos
   vizinhos (node cpanel-tools/_fundo-sobre.mjs), nao o atributo.

   NAO e' grade de cards nem lista de pilulas (as duas reprovadas nesta
   obra): cada setor e' uma LINHA separada por filete, que e' como a casa
   lista. O unico tracinho de diagrama e' o filete vertical que desce do
   fundador ate' a primeira linha, e ele diz uma coisa verdadeira: os setores
   pendem da direcao. Sem numeracao nos setores -- eles nao sao uma
   sequencia, e numerar o que nao tem ordem e' enfeite. */
.estrutura{
  padding:clamp(50px,6vw,90px) 0;
  background:var(--navy);color:#fff;
  position:relative;isolation:isolate;overflow:hidden;
}
/* grao, o mesmo de .sent-extras: continuar vale mais que inventar */
.estrutura::before{
  content:'';position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:.42;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23g)' opacity='.22'/%3E%3C/svg%3E");
}
/* lavagem de luz pelo alto, como no veu do hero (so' que uma camada, nao
   quatro): tira o chapado do navy sem virar efeito. */
.estrutura::after{
  content:'';position:absolute;inset:0;z-index:-2;pointer-events:none;
  background:radial-gradient(900px 420px at 18% -20%,rgba(30,58,138,.5),transparent 70%);
}

/* ----- o rosto de quem dirige -----
   As fotos vem do painel de atendimento, cada uma num enquadramento (retrato
   de corpo inteiro, foto de evento, selfie). Foram recortadas no rosto antes
   de entrar aqui, pela mesma conta nas cinco, senao o circulo mostraria uma
   cabeca de tamanho diferente em cada linha: ver cpanel-tools/_avatar-corta.sh.
   O anel dourado e' box-shadow e nao border, pra nao mexer na medida do
   circulo; a sombra e' tingida de navy, nunca preta. */
.estrut-pessoa{display:flex;align-items:center;gap:12px;margin-top:15px}
.estrut-avatar{
  width:52px;height:52px;flex:none;display:block;
  border-radius:50%;object-fit:cover;
  background:rgba(246,242,237,.06);
  box-shadow:0 0 0 1px rgba(220,171,91,.45),0 6px 18px rgba(0,0,51,.55);
}
.estrut-pessoa-txt{min-width:0}

/* ----- AS COLUNAS: o arranjo que esta' no ar -----
   Uma coluna por setor, cinco lado a lado. Substituiu em 16/10/2026 o
   arranjo em cinco linhas, cujas regras continuam logo abaixo, marcadas
   como arquivo morto.

   O que o arranjo em coluna faz melhor: a leitura e' uma so' (escolhe-se uma
   coluna e desce, sem a duvida de "leio pra baixo ou pro lado"), e o tamanho
   de cada frente fica visivel -- Comunicacao tem 9 times e vai a 830px de
   altura, Comercial tem 3 e para em 392px. Em linhas essa diferenca sumia,
   porque toda linha tinha a mesma altura. O preco e' o rodape irregular. */
.estrut-cols{
  display:grid;
  grid-template-columns:repeat(5,1fr);
  gap:clamp(10px,1.2vw,16px);
  align-items:start;
}
/* A coluna cresce inteira no hover. 1.03 e nao o 1.014 que a linha usava: a
   coluna tem ~222px, e o mesmo 1,4% que se enxerga numa faixa de 1176px nao
   se enxerga numa de 222. */
.estrut-col{
  transition:scale .34s cubic-bezier(.2,.7,.3,1);
  will-change:scale;
}
.estrut-col:hover{scale:1.03}
@media (prefers-reduced-motion:reduce){
  .estrut-col{transition:none}
  .estrut-col:hover{scale:none}
}
/* min-height fixo e' o que mantem os cinco filetes na MESMA linha: os nomes
   de setor tem uma ou duas linhas ("Administrativo" x "Tecnologia da
   Informacao") e, sem isso, cada filete sairia numa altura. A medida vem do
   cabecalho mais alto e e' conferida por _colunas-mede.mjs, que acusa
   cabecalho estourando a caixa e filete fora de linha (medido: os cinco em
   y=807). */
.estrut-col-cab{
  --estrut-cab:166px;
  min-height:var(--estrut-cab);
  display:flex;flex-direction:column;align-items:flex-start;
  padding-bottom:15px;margin-bottom:14px;
  border-bottom:1px solid rgba(220,171,91,.22);
}
.estrut-col-cab .estrut-avatar{width:48px;height:48px;margin-bottom:12px}
.estrut-col-cab h3{
  margin:0 0 auto;font-size:clamp(.95rem,1.05vw,1.05rem);font-weight:600;
  color:var(--osso);line-height:1.28;text-wrap:balance;
}
/* 'margin:0 0 auto' no titulo empurra o par DIRECAO+nome pro pe' do
   cabecalho: assim eles ficam alinhados entre as cinco colunas mesmo com
   titulo de uma ou de duas linhas. */
.estrut-col-cab .rot{display:block;margin:12px 0 1px;color:var(--dourado)}
.estrut-col-cab .estrut-direcao{font-size:.9rem}

/* ----- a sigla do cargo, abaixo do nome -----
   Monoespacada e pequena: e' um codigo, nao um titulo, e tem de ler como
   codigo pra ninguem confundir com o nome. O filete pontilhado embaixo e' o
   sinal de que ali existe algo pra ler -- sem ele a sigla parece so' texto
   morto e ninguem passa o mouse.

   cursor:help e nao pointer: nao leva a lugar nenhum, so' explica
   (ver a regra da casa sobre cursor em texto puro). */
.estrut-sigla{
  display:inline-block;margin-top:7px;
  /* .66rem contra os .9rem do nome: 73% do corpo dele. Era 11.5px/600, que
     e' menor em numero que os 14.4px do nome mas le' IGUAL ou maior, porque
     peso 600 em caixa alta e com espacamento ocupa mais mancha que peso 400
     em caixa baixa. O peso cai pra 500, o mesmo do rotulo DIRECAO.
     Em rem e nao em px pra acompanhar a escada de desktop, como o nome. */
  font-family:var(--mono);font-size:.66rem;font-weight:500;letter-spacing:.08em;
  color:rgba(246,242,237,.6);
  border-bottom:1px dotted rgba(220,171,91,.5);
  padding-bottom:1px;cursor:help;position:relative;
  transition:color .22s;
}
.estrut-sigla:hover,.estrut-sigla:focus-visible{color:var(--dourado)}

/* O balao. Mesma gramatica da dica do /desenrola/: entra, fica e sai
   sozinho, em vez de ficar preso enquanto o mouse estiver em cima. Aqui sao
   4s (pedido) em vez de 3s, e duas linhas.

   As duas linhas chegam num atributo so', separadas por quebra de linha de
   verdade -- content:attr() le' um atributo apenas, e e' o white-space:
   pre-line que transforma a quebra em duas linhas. */
@keyframes estrutDica{
  0%{opacity:0;translate:-50% 5px}
  8%{opacity:1;translate:-50% 0}
  85%{opacity:1;translate:-50% 0}
  100%{opacity:0;translate:-50% 0}
}
.estrut-sigla::after{
  content:attr(data-dica);
  position:absolute;bottom:calc(100% + 10px);left:50%;translate:-50% 5px;
  background:var(--navy-3);color:#fff;border:1px solid rgba(220,171,91,.3);
  padding:8px 12px;border-radius:var(--r-sm);box-shadow:var(--sombra-md);
  font-family:var(--fonte);font-size:11.5px;font-weight:500;letter-spacing:0;
  line-height:1.45;white-space:pre-line;text-align:center;
  width:max-content;max-width:210px;
  opacity:0;pointer-events:none;z-index:8;
}
/* a primeira linha (ingles) em dourado, a segunda no branco do corpo: sao
   duas informacoes diferentes, o que a sigla abrevia e o que ela quer dizer
   aqui. Como e' um pseudo-elemento, nao da' pra estilizar linha a linha --
   o dourado fica no conjunto e o peso separa. */
.estrut-sigla:hover::after,.estrut-sigla:focus-visible::after{animation:estrutDica 4s ease forwards}
@media (prefers-reduced-motion:reduce){
  .estrut-sigla:hover::after,.estrut-sigla:focus-visible::after{animation:none;opacity:1;translate:-50% 0}
}
/* No celular o cabecalho e' centrado e a sigla segue junto. */
@media (max-width:560px){
  .estrut-sigla::after{max-width:min(260px,80vw)}
}

/* ===========================================================================
   ARQUIVO MORTO: regras do arranjo em CINCO LINHAS, de antes de 16/10/2026.
   Ficam porque o markup correspondente ficou guardado em
   _paginas/sobre-nos.php (num nowdoc, com a receita de como voltar).
   Nenhum seletor daqui casa com o HTML que esta' no ar hoje.
   Para voltar, alem de trocar o markup: em .estrut-itens, mudar
   --estrut-lajota de 66px para 74px, grid-template-columns de 1fr para
   repeat(auto-fill,minmax(240px,1fr)), e .estrut-item-cx de .875rem/1.36
   para .93rem/1.38.
   =========================================================================== */
.estrut-setor{
  padding:clamp(22px,2.6vw,30px) 0;
  border-top:1px solid rgba(220,171,91,.22);
}
/* A grade do bloco vive no WRAPPER, nao na .estrut-setor: e' o wrapper que
   cresce no hover, e o filete de cima tem de ficar parado -- se ele crescesse
   junto, a divisao entre os setores andaria com o mouse. */
.estrut-setor-cx{
  display:grid;grid-template-columns:clamp(190px,21vw,260px) 1fr;
  gap:clamp(18px,3vw,46px);
  transition:scale .34s cubic-bezier(.2,.7,.3,1);
  will-change:scale;
}
/* 1.014 sobre ~1176px de largura da' um crescimento de ~8px por lado, que
   cabe na goteira do .wrap -- nao encosta na borda da tela nem e' cortado
   pelo overflow:hidden da secao. */
.estrut-setor:hover .estrut-setor-cx{scale:1.014}
@media (prefers-reduced-motion:reduce){
  .estrut-setor-cx{transition:none}
  .estrut-setor:hover .estrut-setor-cx{scale:none}
}
.estrut-setor-cab h3{
  margin:0;font-size:clamp(1.02rem,1.3vw,1.16rem);font-weight:600;
  color:var(--osso);line-height:1.3;text-wrap:balance;
}
.estrut-setor-cab .rot{
  display:block;margin:0 0 1px;color:var(--dourado);
}
.estrut-direcao{
  margin:0;font-size:.95rem;color:rgba(246,242,237,.78);
}

/* ----- a composicao de cada setor -----
   GRADE, nao columns. columns flui de cima pra baixo e so' depois pro lado:
   o olho lia os dois primeiros itens a esquerda e tinha de voltar ao topo
   pra seguir na direita. Grade flui na ordem da leitura, esquerda pra
   direita, linha por linha.

   Cada item e' uma LAJOTA de largura igual, com superficie tingida. Nao e'
   card nem pilula (os dois reprovados nesta obra): nao tem contorno, nem
   sombra, nem borda em volta -- o peso vem da superficie, como em
   .sent-extras. O que a lajota resolve e' o que o usuario apontou: texto
   solto sobre o navy nao dava nenhuma margem pro olho se apoiar.

   auto-fill com minmax: o numero de colunas sai da largura disponivel, entao
   setor de 2 itens e setor de 7 usam a MESMA medida de lajota -- era o
   'estrut-itens-curta' que existia so' pra remendar isso.
   Linha da grade estica junto (align-items:stretch, o padrao), entao as
   lajotas lado a lado terminam sempre na mesma altura. */
.estrut-itens{
  /* altura unica de lajota, em toda a secao. Medida pelo item mais comprido
     ("Comunicacao Institucional e Relacoes Publicas") na largura de coluna
     real, nao chutada: ver cpanel-tools/_estrut-mede.mjs, que acusa qualquer
     lajota cujo conteudo passe da caixa. */
  /* Valores do arranjo em COLUNAS: uma lajota por linha, dentro de uma
     coluna de ~222px. Lajota mais baixa e corpo menor que no arranjo em
     linhas (que usava 74px e ~290px de largura), porque na coluna estreita o
     mesmo texto gasta mais linhas. */
  --estrut-lajota:66px;
  margin:0;padding:0;list-style:none;
  display:grid;
  grid-template-columns:1fr;
  gap:7px;
  /* align-content:start -- esta grade e' filha de outra (.estrut-setor) e
     era esticada ate' a altura do cabecalho do setor (h3 + avatar, ~96px).
     Com uma linha so' de lajotas, a linha esticava junto e o Comercial vinha
     com lajotas de 91px pra uma linha de texto. */
  align-content:start;
}
.estrut-itens li{
  display:flex;align-items:center;
  min-height:var(--estrut-lajota);
  padding:9px 13px;border-radius:var(--r-sm);
  background:rgba(246,242,237,.055);
  transition:background .26s cubic-bezier(.2,.7,.3,1),scale .26s cubic-bezier(.2,.7,.3,1);
}
/* min-width:0 + overflow-wrap: um item de flex nao encolhe abaixo do proprio
   conteudo por padrao, entao basta uma palavra comprida pra empurrar o texto
   pra fora da lajota. */
.estrut-itens li > *{min-width:0;overflow-wrap:break-word}
/* A lajota sob o cursor acende E cresce, por cima do crescimento da coluna.
   Os dois se somam: 1.03 da coluna x 1.025 da lajota = ~1.056 no item
   apontado, contra 1.03 nos vizinhos dele. E' o suficiente pra destacar um
   item dentro de uma coluna que ja' esta' destacada.

   origem no CENTRO e nao na esquerda: a lajota ocupa a largura inteira da
   coluna, e crescendo so' pra um lado ela avancaria 5px sobre a coluna
   vizinha. Pelo centro sao 2,8px por lado, dentro dos 16px de vao.

   z-index no hover: sem ele a lajota cresce POR BAIXO das vizinhas, e a
   borda dela some atras delas. */
.estrut-itens li{position:relative}
.estrut-itens li:hover{
  background:rgba(246,242,237,.11);
  scale:1.025;z-index:2;
}
@media (prefers-reduced-motion:reduce){
  .estrut-itens li:hover{scale:none}
}
.estrut-item-cx{font-size:.875rem;line-height:1.36;color:rgba(246,242,237,.9)}
.estrut-itens b{font-weight:600}
/* a glosa: MESMA cor e mesmo corpo do nome, so' o peso muda. Em cinza e numa
   linha propria ela dava duas alturas de item a uma lista em que so' 6 de 23
   tem glosa. */
.estrut-itens i{font-style:normal;font-weight:400}
@media (prefers-reduced-motion:reduce){
  .estrut-itens li{transition:none}
  .estrut-itens li:hover{translate:none}
}

/* Cinco colunas so' cabem em tela larga; abaixo disso o arranjo vira 3, 2 e
   1 coluna. */
@media (max-width:1180px){
  .estrut-cols{grid-template-columns:repeat(3,1fr)}
}
@media (max-width:860px){
  .estrut-cols{grid-template-columns:repeat(2,1fr)}
  /* arquivo morto, arranjo em linhas */
  .estrut-setor-cx{grid-template-columns:1fr;gap:14px}
  .estrut-pessoa{margin-top:12px}
}
/* CELULAR: uma coluna por vez, e o conjunto foto+setor+direcao+nome
   CENTRADO (pedido do usuario, 16/10/2026). Alinhado a esquerda, numa caixa
   da largura da tela, o avatar de 48px fica sozinho num canto com muito
   branco do lado. O min-height do cabecalho sai junto: com uma coluna por
   vez nao ha' filete nenhum pra alinhar com outro, e o espaco reservado
   viraria buraco. */
@media (max-width:560px){
  .estrut-cols{grid-template-columns:1fr;gap:26px}
  .estrut-col-cab{
    min-height:0;align-items:center;text-align:center;
    padding-bottom:17px;margin-bottom:15px;
  }
  .estrut-col-cab h3{margin:0}
  .estrut-col-cab .rot{margin-top:11px}
}

/* ============================================================
   PAGINAS DE SOLUCAO (Plataforma, App Personalizado, Atendimento)
   Componentes reutilizaveis entre as paginas internas de produto.
   ============================================================ */

/* respiro vertical das sections -- toda outra section do site (.mvv,
   .tempo-completo, .contadores, .historia, .lideranca, .galeria) define o
   proprio padding; estas ficaram sem, e o resultado foi sections coladas
   uma na outra, sem folga (achado real do usuario ao ver a pagina no ar).
   border-top: linha fina em toda section -- osso e osso-2 sao tons proximos
   de proposito (mesmo padrao de sobre-nos), mas so' a cor as vezes nao basta
   pra separacao ficar OBVIA; a linha garante o corte visivel independente
   da dupla de cores que caiu lado a lado. */
.visao-solucao,.recursos-solucao,.funcionalidades-solucao,.marca-solucao,
.suporte-solucao,.app-teaser,.porque-solucao,.planos-solucao,
.experiencia-solucao,.como-funciona-solucao,.integracao-solucao,.faq-solucao,
.demo-solucao,.integracoes-solucao,.cobranca-solucao,.video-solucao,.video-outros-solucao,
.exclusivos-solucao,.aplicacoes-solucao,.lara-solucao,.confianca-solucao,
.autenticidade-solucao,.modelos-solucao,.sentinela-solucao,.outros-solucao,.alem-solucao,
.modelos-tags-solucao,.privacidade-solucao,.modelos-dashcams-solucao,.recursos-dashcams-solucao,
.ferramentas-solucao,.cases-secao,.case-secao,.apl-solucao,
.msc-abertura,.msc-perfil,.msc-oportunidade,.msc-estrutura,.msc-investimento,
.msc-franquia,.msc-divide,.msc-plataforma,.msc-diferenciais,.msc-passos,
.mig-abertura,.mig-motivos,.mig-plataforma,.mig-resto,.mig-muda,
.apv-plataforma{
  padding:clamp(50px,6vw,80px) 0;border-top:1px solid var(--linha);
}
/* as 2 sections escuras de /montesuacentral/ (fundo navy via .secao-escura)
   seguem o mesmo respiro vertical, mas SEM a linha divisoria clara -- um
   filete --linha (claro) por cima de fundo escuro destoa, e as outras
   sections escuras do site (.cta) tambem nao levam essa linha. */
.msc-dinheiro,.msc-depoimentos,.msc-notebook,
.mig-entrada,.mig-atendimento,.mig-depoimentos,
.apv-atendimento{padding:clamp(50px,6vw,80px) 0}
/* .calc-solucao e' a section-base de TODAS as paginas de ferramentas
   (calculadora-frota, simulador-app, verificador-j16, calculadora-operacional)
   -- padrao de respiro entre migalhas e titulo definido 1a vez no
   verificador-j16, agora promovido pra regra unica em vez de repetido por
   pagina (o .sim-solucao/.verif-solucao de cada uma so' reduziam o proprio
   padding-top como excecao antes disso virar o padrao). .ferramentas-solucao
   (o HUB /ferramentas/) ficou de fora dessa regra na 1a passada -- aqui
   reduz so' o padding-top dela pro mesmo padrao, sem tocar no border-top nem
   nas outras paginas que compartilham a regra grande la' em cima. */
.calc-solucao{padding:clamp(22px,3vw,36px) 0;border-top:1px solid var(--linha)}
.ferramentas-solucao,.cases-secao{padding-top:clamp(22px,3vw,36px)}

/* secao-escura: fundo navy solido + texto branco, mesmo tratamento do
   .tempo-completo -- data-tema-secao="escuro" sozinho so controla a barra de
   rolagem (ver site.js), NAO pinta a section; quem precisa de fundo escuro
   de verdade leva esta classe tambem. */
.secao-escura{background:var(--navy);color:#fff}
.secao-escura .rot{color:rgba(246,242,237,.72)}
.secao-escura .lede{color:rgba(246,242,237,.72)}

/* promessa (Rastreadores): frase de impacto isolada, sem sec-topo -- e' um
   soco curto entre a prova social e o FAQ, nao mais uma section de conteudo.
   Google Sans Flex e' a UNICA variavel de verdade da familia (a "Google Sans"
   normal do resto do site so' vem em instancias estaticas 400/500/700 --
   confirmado direto na resposta da API do Google Fonts, wght@100..900 nela
   devolve 400 "font family not found"). Ela registra DOIS eixos (confirmado
   na mesma API: font-weight 100 900 E font-stretch 25% 151%). SEM animacao
   (pedido explicito) -- cada PALAVRA carrega seu proprio font-variation-
   settings fixo, ja' escrito inline no PHP (palavra de conteudo pesada e
   expandida, palavra de ligacao fina e condensada). E' o contraste de forma
   DENTRO da composicao parada que mostra a fonte variavel, nao um valor so'
   aplicado em tudo (isso lia como "so' um negrito", queixa real do usuario). */
.promessa-solucao{
  padding:clamp(74px,10vw,140px) 0;text-align:center;border-top:1px solid var(--linha);
  background:linear-gradient(150deg,var(--carmim-vivo),var(--carmim));
}
.promessa-solucao .rot{display:block;margin-bottom:18px;color:rgba(255,255,255,.75)}
.promessa-frase{
  font-family:'Google Sans Flex','Google Sans','Product Sans',system-ui,sans-serif;
  font-size:clamp(2rem,5.4vw,4.3rem);line-height:1.15;letter-spacing:-.01em;
  color:#fff;margin:0 auto;max-width:20ch;
}
.promessa-frase span{display:inline-block}
.secao-escura .rot{color:var(--dourado)}

/* feat: grade de recursos/funcionalidades, mesma linguagem visual do .mvv-card */
.feat-grade{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(16px,2vw,24px)}
.feat-grade.col4{grid-template-columns:repeat(4,1fr)}
/* col2: a grade nasceu com 3 colunas fixas, entao uma grade de 2 cards
   deixava a terceira coluna vazia (visto em /provedores-de-internet/ quando a
   area de Cases foi desligada). */
.feat-grade.col2{grid-template-columns:repeat(2,1fr)}
.feat-card{
  background:var(--osso);border:1px solid var(--linha);border-radius:var(--r-lg);
  padding:clamp(22px,2.2vw,30px);box-shadow:var(--sombra-sm);
  transition:scale .3s cubic-bezier(.2,.7,.3,1),box-shadow .3s,border-color .3s;
}
.feat-card:hover{scale:1.025;box-shadow:var(--sombra-md);border-color:rgba(168,40,42,.25)}
.feat-ico{display:flex;align-items:center;justify-content:center;width:44px;height:44px;margin-bottom:16px;border-radius:var(--r-md);background:rgba(168,40,42,.08);color:var(--carmim)}
.feat-ico svg{width:22px;height:22px}
.feat-ico img{width:26px;height:26px;object-fit:contain}
.feat-card h3{margin-bottom:8px;font-size:1.1rem}
.feat-card p{margin:0;color:var(--tinta-70);font-size:.96rem;line-height:1.6}
/* variante escura: quando a section e' data-tema-secao="escuro" (ex.: Atendimento) */
[data-tema-secao="escuro"] .feat-card{background:rgba(246,242,237,.05);border-color:rgba(246,242,237,.12)}
[data-tema-secao="escuro"] .feat-card h3{color:#fff}
[data-tema-secao="escuro"] .feat-card p{color:rgba(246,242,237,.72)}
[data-tema-secao="escuro"] .feat-ico{background:rgba(220,171,91,.14);color:var(--dourado)}

/* check-lista: lista compacta de recursos com icone-check circular */
.check-lista{display:grid;grid-template-columns:repeat(2,1fr);gap:16px 28px;margin-top:24px}
.check-item{display:flex;align-items:flex-start;gap:12px}
.check-item .check-ico{flex:none;width:22px;height:22px;border-radius:50%;background:rgba(168,40,42,.1);color:var(--carmim);display:flex;align-items:center;justify-content:center;margin-top:2px}
.check-item .check-ico svg{width:13px;height:13px}
.check-item b{display:block;font-size:.98rem}
.check-item span{display:block;color:var(--tinta-70);font-size:.9rem;margin-top:2px}
/* o .check-item nasceu em secao clara: o texto de apoio herda --tinta-70 e o
   circulo do visto usa carmim sobre um fundo de 10% de carmim. Em faixa navy
   as duas coisas somem (o mesmo que aconteceu com .passo p). Regra generica
   pra nao repetir em cada pagina nova que levar a lista pro escuro. */
[data-tema-secao="escuro"] .check-item span{color:rgba(246,242,237,.72)}
[data-tema-secao="escuro"] .check-item .check-ico{background:rgba(220,171,91,.16);color:var(--dourado)}

/* passo: fluxo numerado ("como funciona"), sem linha conectora entre os circulos */
.passo-grade{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(20px,2.4vw,30px)}
.passo-num{
  display:flex;align-items:center;justify-content:center;width:40px;height:40px;
  border-radius:50%;background:var(--carmim);color:#fff;font-family:var(--mono);
  font-size:14px;font-weight:500;margin-bottom:16px;
}
.passo h3{font-size:1.04rem;margin-bottom:8px}
.passo p{margin:0;color:var(--tinta-70);font-size:.94rem;line-height:1.6}
/* o .passo nasceu em secao clara (/montesuacentral/) e o texto herdava
   var(--tinta-70), que e' tinta escura. Posto em faixa navy (/migresuacentral/,
   "migramos juntos") o paragrafo media 1.04:1 contra o fundo -- invisivel na
   pratica, confirmado na captura. O titulo nao sofria porque ja' herda o
   branco da secao. */
[data-tema-secao="escuro"] .passo p{color:rgba(246,242,237,.72)}

/* plano: comparativo de niveis (App Personalizado). O tier de destaque usa o
   mesmo tratamento navy+dourado do .sol-cta -- ja e' a linguagem visual desta
   pagina pra "opcao especial". */
.plano-grade{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(16px,2vw,24px);align-items:stretch}
.plano-card{
  display:flex;flex-direction:column;background:var(--osso);border:1px solid var(--linha);
  border-radius:var(--r-lg);padding:clamp(24px,2.4vw,32px);box-shadow:var(--sombra-sm);
}
.plano-foto{
  aspect-ratio:16/11;margin-bottom:20px;border-radius:var(--r-md);
  overflow:hidden;background:var(--navy-2);border:1px solid var(--linha);
}
.plano-card--destaque .plano-foto{border-color:rgba(246,242,237,.14)}
.plano-foto img{width:100%;height:100%;object-fit:cover;object-position:top center;display:block}
.plano-card .rot{color:var(--carmim);display:block;margin-bottom:10px}
.plano-card h3{margin-bottom:10px}
.plano-card ul{margin:16px 0 0;padding:0;list-style:none;display:flex;flex-direction:column;gap:10px;flex:1}
.plano-card li{display:flex;align-items:flex-start;gap:9px;font-size:.94rem;color:var(--tinta-70);line-height:1.5}
.plano-card li::before{content:"";flex:none;width:6px;height:6px;margin-top:8px;border-radius:50%;background:var(--carmim)}
.plano-card--destaque{
  background:linear-gradient(150deg,var(--navy-2),var(--navy));border-color:rgba(246,242,237,.1);
  box-shadow:var(--sombra-lg);transform:scale(1.03);
}
.plano-card--destaque .rot{color:var(--dourado)}
.plano-card--destaque h3{color:#fff}
.plano-card--destaque p,.plano-card--destaque li{color:rgba(246,242,237,.78)}
.plano-card--destaque li::before{background:var(--dourado)}

/* faq: acordeao. Mesma tecnica do .tc-ano (altura animada via custom property
   medida em runtime, porque height:auto nao anima) -- abrir um item sempre
   fecha os outros (controlador unico no JS da pagina, nao onclick por item). */
.faq-lista{max-width:840px}
.faq-item{border-bottom:1px solid var(--linha)}
.faq-pergunta{
  width:100%;display:flex;align-items:center;justify-content:space-between;gap:20px;
  background:none;border:0;padding:20px 4px;text-align:left;font-size:1.02rem;font-weight:500;color:var(--tinta);
}
.faq-pergunta svg{flex:none;width:20px;height:20px;color:var(--carmim);transition:transform .3s cubic-bezier(.2,.7,.3,1)}
.faq-pergunta[aria-expanded="true"] svg{transform:rotate(180deg)}
.faq-resposta{height:var(--faq-altura,0px);overflow:hidden;transition:height .35s cubic-bezier(.2,.7,.3,1)}
.faq-resposta p{padding:0 4px 20px;color:var(--tinta-70);font-size:.96rem;line-height:1.65;max-width:70ch}

/* tour: navegacao por abas com screenshot real trocando ao lado (recursos da
   Plataforma) -- mesmo padrao ja usado na LP de origem (montesuaempresaderastreamento),
   so que reconstruido aqui em vez de reaproveitar o HTML/CSS Tailwind dela. */
.tour-grade{display:grid;grid-template-columns:.85fr 1.15fr;gap:clamp(20px,3vw,40px);align-items:stretch}
.tour-nav{display:flex;flex-direction:column;gap:4px}
.tour-item{
  display:flex;align-items:center;gap:14px;text-align:left;background:none;border:1px solid transparent;
  padding:13px 14px;border-radius:var(--r-md);transition:background .2s,border-color .2s;
}
.tour-item:hover{background:rgba(168,40,42,.05)}
.tour-item.ativo{background:var(--osso);box-shadow:var(--sombra-sm);border-color:var(--linha)}
.tour-ico{flex:none;display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:var(--r-md);background:rgba(168,40,42,.08);color:var(--carmim);transition:background .2s,color .2s}
.tour-ico svg{width:19px;height:19px}
.tour-item.ativo .tour-ico{background:var(--carmim);color:#fff}
.tour-item b{display:block;font-size:.96rem}
.tour-item .d{display:block;color:var(--tinta-70);font-size:.85rem;margin-top:2px;line-height:1.4}
.tour-tela{
  position:relative;border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sombra-lg);
  border:1px solid var(--linha);background:var(--navy-2);aspect-ratio:16/10;
}
.tour-tela img{width:100%;height:100%;object-fit:cover;display:block}
.tour-tela img[hidden]{display:none}

/* marca-grade: texto + prova visual (celpalco), na section de white label */
.marca-grade{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(30px,4vw,56px);align-items:center;margin-top:28px}

/* celpalco: os 3 celulares flutuantes com troca de tela (login -> em uso),
   copiado fielmente da LP montesuaempresaderastreamento (o mesmo componente
   do topo dela) -- mesmas proporcoes/percentuais (calculados pra essas fotos
   especificas), mesma animacao de flutuar+sombra+crossfade+carimbo. */
.celpalco{position:relative;width:100%;max-width:460px;margin:0 auto;aspect-ratio:696/521}
.celglow{position:absolute;left:50%;top:56%;width:88%;height:94%;transform:translate(-50%,-50%);
  background:radial-gradient(ellipse at 50% 46%,rgba(219,84,90,.44),rgba(37,99,235,.32) 45%,transparent 72%);
  filter:blur(38px);z-index:0;pointer-events:none}
.cel{position:absolute;z-index:1;transform-origin:50% 92%}
.cel img{width:100%;display:block;height:auto;border-radius:10px}
.cel .b{position:absolute;inset:0;opacity:0}
.c1{left:0;      top:9.98%; width:41.81%; z-index:1}
.c2{left:31.75%; top:0;     width:36.49%; z-index:3}
.c3{left:56.18%; top:9.98%; width:43.82%; z-index:2}
.celsombra{position:absolute;height:7.4%;z-index:0;pointer-events:none;opacity:.92;
  background:radial-gradient(ellipse 52% 62% at 50% 50%,rgba(0,0,0,.92),rgba(0,0,0,.62) 48%,rgba(0,0,0,.22) 70%,transparent 84%);
  filter:blur(7px);transform-origin:50% 50%;transition:opacity .38s,filter .38s}
.s1{left:7.9%;  top:95.4%; width:26.0%}
.s2{left:38.5%; top:98.4%; width:23.0%}
.s3{left:64.6%; top:95.6%; width:27.1%}
.celpalco.pronto .c1{animation:celsobe 6.2s ease-in-out infinite}
.celpalco.pronto .c2{animation:celsobe 7.4s ease-in-out infinite -1.2s}
.celpalco.pronto .c3{animation:celsobe 6.8s ease-in-out infinite -2.4s}
@keyframes celsobe{0%,100%{transform:translateY(0)}50%{transform:translateY(-11px)}}
.celpalco.pronto .s1{animation:celchao 6.2s ease-in-out infinite}
.celpalco.pronto .s2{animation:celchao 7.4s ease-in-out infinite -1.2s}
.celpalco.pronto .s3{animation:celchao 6.8s ease-in-out infinite -2.4s}
@keyframes celchao{0%,100%{scale:1 1}50%{scale:.86 1}}
.celcarimbo{position:absolute;right:-1%;bottom:7%;z-index:5;pointer-events:none;
  max-width:31%;padding:.5rem .8rem;border-radius:7px;text-align:center;
  background:var(--carmim);color:#fff;border:2px solid rgba(255,255,255,.9);
  box-shadow:0 0 0 3px var(--carmim),0 16px 38px -12px rgba(0,0,0,.75);
  font-family:var(--fonte);font-weight:800;text-transform:uppercase;
  font-size:clamp(.56rem,.92vw,.78rem);letter-spacing:.07em;line-height:1.22;text-indent:.07em;
  transform:rotate(-7deg);opacity:0}
.celpalco.carimbou .celcarimbo{animation:celcarimbar .68s cubic-bezier(.2,.85,.3,1) .15s both}
@keyframes celcarimbar{
  0%{opacity:0;scale:2.5;filter:blur(4px)}
  45%{opacity:1}
  68%{scale:.94;filter:blur(0)}
  84%{scale:1.035}
  100%{opacity:1;scale:1;filter:blur(0)}
}
@media (max-width:767px){.celcarimbo{bottom:auto;top:2%;right:-2%;max-width:38%;font-size:.6rem;padding:.42rem .62rem}}
.celpalco.pronto .b{animation:celtroca 11s ease-in-out infinite}
.celpalco.pronto .c2 .b{animation-delay:.55s}
.celpalco.pronto .c3 .b{animation-delay:1.1s}
@keyframes celtroca{0%,13%{opacity:0}23%,70%{opacity:1}80%,100%{opacity:0}}
@media (hover:hover){
  .cel{cursor:default;scale:1;transition:scale .38s cubic-bezier(.2,.7,.2,1)}
  .cel:hover{scale:1.06}
  .c1:hover ~ .s1,.c2:hover ~ .s2,.c3:hover ~ .s3{opacity:1;filter:blur(11px)}
}
@media (max-width:1023px){.celpalco{max-width:400px}}
@media (max-width:640px){.celglow{filter:blur(26px)} .celsombra{filter:blur(6px)}}
@media (prefers-reduced-motion:reduce){
  .celpalco.pronto .c1,.celpalco.pronto .c2,.celpalco.pronto .c3,
  .celpalco.pronto .s1,.celpalco.pronto .s2,.celpalco.pronto .s3{animation:none}
  .celpalco.pronto .b{animation:none;opacity:1}
  .celpalco .celcarimbo{opacity:1;animation:none}
}

/* video-fachada: thumbnail real do YouTube (sem baixar player nenhum ate'
   o clique) + botao de play -- so' troca pro iframe de verdade na interacao. */
.video-fachada{
  position:relative;aspect-ratio:16/9;border-radius:var(--r-lg);overflow:hidden;
  box-shadow:var(--sombra-lg);cursor:pointer;background:var(--navy-2);max-width:900px;margin:0 auto;
}
.video-fachada img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .5s cubic-bezier(.2,.7,.3,1)}
.video-fachada:hover img{transform:scale(1.03)}
.video-fachada iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.video-play{
  position:absolute;top:50%;left:50%;translate:-50% -50%;z-index:3;
  display:flex;align-items:center;justify-content:center;width:76px;height:76px;border-radius:50%;
  background:rgba(168,40,42,.92);color:#fff;box-shadow:var(--sombra-lg);transition:scale .25s,background .25s;
}
.video-play svg{width:30px;height:30px;margin-left:4px}
.video-fachada:hover .video-play{scale:1.08;background:var(--carmim-vivo)}
.video-play-pq{width:46px;height:46px;box-shadow:var(--sombra-md)}
.video-play-pq svg{width:18px;height:18px;margin-left:2px}

/* video-palco: o video principal fica sozinho na propria section -- o
   .sec-topo acima ja' da' o contexto (titulo+lede), aqui embaixo e' so' o
   video, grande, sem coluna nenhuma disputando espaco com ele. O glow atras
   e' a mesma receita do .celglow do celpalco (motivo ja estabelecido na
   pagina em vez de inventar um novo).
   PADRAO FIXO (pedido explicito do usuario): toda section de VIDEO SOLO EM
   DESTAQUE -- so' um video, sem leque/grade ao lado -- usa esta MESMA
   receita, sempre as tres pecas juntas: section.video-solucao com
   style="background:var(--osso-2)", o <span class="video-solo-fundo"> logo
   no topo da section (faixa vermelha atras, na base), e .video-palco >
   .video-glow + .video-fachada dentro do wrap. Nao inventar variacao nova
   pra pagina seguinte -- foi assim que /rastreadores/ ficou inconsistente
   com a /plataforma/ (a faixa vermelha e o fundo osso-2 faltavam la). */
.video-solucao{position:relative;z-index:0}
.video-solo-fundo{position:absolute;z-index:-1;left:0;right:0;bottom:0;height:44%;background:var(--carmim);pointer-events:none}
.video-palco{position:relative}
.video-palco .video-fachada{position:relative;z-index:1;max-width:none;margin:0}
.video-glow{
  position:absolute;inset:-10%;z-index:0;pointer-events:none;
  background:radial-gradient(ellipse at 50% 50%,rgba(168,40,42,.18),transparent 68%);
  filter:blur(34px);
}

/* video-tag: selo de categoria no canto do thumbnail -- some junto com o
   resto do conteudo do .video-fachada quando o clique troca pelo iframe
   (esta' dentro dele de proposito). */
.video-tag{
  position:absolute;top:12px;left:12px;z-index:2;
  background:rgba(0,0,51,.72);color:#fff;font-family:var(--mono);font-size:10.5px;
  letter-spacing:.06em;text-transform:uppercase;padding:5px 10px;border-radius:var(--pill);
}

/* tour-item-mais: ultimo item do tour, visualmente distinto (borda tracejada,
   sem cor solida no icone) porque nao e' mais uma tela real -- e' um convite
   pra saber que ha mais coisa por dentro. Clicar troca o print por texto+CTA
   no mesmo espaco do .tour-tela (ver .tour-mais-conteudo). */
.tour-item-mais{border-style:dashed;border-color:var(--linha)}
.tour-item-mais .tour-ico{background:transparent;border:1.5px dashed var(--linha);color:var(--tinta-45)}
.tour-item-mais.ativo{background:var(--osso);border-style:dashed;border-color:rgba(168,40,42,.35)}
.tour-item-mais.ativo .tour-ico{background:var(--carmim);border-style:solid;border-color:var(--carmim);color:#fff}
.tour-mais-conteudo{
  position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:18px;text-align:center;padding:clamp(24px,4vw,48px);
  background:linear-gradient(150deg,var(--navy-2),var(--navy));
}
.tour-mais-conteudo[hidden]{display:none}
.tour-mais-conteudo p{margin:0;max-width:32ch;color:rgba(246,242,237,.88);font-size:1.05rem;line-height:1.55}
.tour-mais-conteudo .btn{background:#fff;color:var(--carmim)}
.tour-mais-conteudo .btn:hover{background:var(--osso)}

/* tagline-pill: frase de efeito curta, em pilula -- usada onde um .lede puro
   ficava "jogado" ao lado do titulo sem nenhum peso visual proprio. */
.tagline-pill{
  display:inline-block;background:rgba(168,40,42,.08);color:var(--carmim);
  padding:9px 18px;border-radius:var(--pill);font-weight:600;font-size:.94rem;
}

/* lede-destaque: mesmo .lede ao lado do titulo, so' que com filete de
   destaque a esquerda -- o texto continua o mesmo, ganha so' um acabamento
   pra nao ficar "jogado" no espaco em branco do .sec-topo. */
.lede-destaque{border-left:2.5px solid var(--carmim);padding-left:16px}

/* integ: grade de integracoes por categoria (dados/bancos/comunicacao/assinaturas).
   Sem logo oficial disponivel pra nenhuma marca (nem local, nem na LP de
   origem) -- icone monocromatico num quadrado arredondado, mesma ideia do
   .parc da home so' que quadrado. Centralizacao por PADDING, nao flexbox:
   o `.integ-badge` tinha `display:flex` mas `.integ-item span{display:block}`
   (regra pro rotulo pequeno, ex. "Associações") tambem batia nele -- e' um
   <span> tambem, descendente de `.integ-item` -- com especificidade MAIOR
   (0,1,1 contra 0,1,0), entao vencia e forcava o badge pra `display:block`,
   sem centralizar nada (o svg ficava colado no canto superior). Corrigido
   nos dois pontos: o seletor do rotulo ficou mais especifico (so' pega o
   span de texto, nao o badge) e o badge trocou flex por padding simetrico
   (caixa fixa + padding + svg 100% -- centraliza sempre, nao depende de
   qual `display` ganhar a cascata). */
.integ-grade{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(24px,3vw,40px)}
.integ-cat{
  display:block;font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--carmim);margin-bottom:16px;padding-bottom:10px;border-bottom:1px solid var(--linha);
}
.integ-item{
  display:flex;align-items:center;gap:14px;padding:9px 0;
  transform-origin:left center;transition:scale .3s cubic-bezier(.2,.7,.3,1);
}
.integ-item:hover{scale:1.08}
.integ-badge{
  flex:none;box-sizing:border-box;width:52px;height:52px;padding:14px;
  border-radius:var(--r-lg);background:#fff;border:1px solid var(--linha);box-shadow:var(--sombra-sm);color:var(--carmim);
  transition:box-shadow .3s;
}
.integ-item:hover .integ-badge{box-shadow:var(--sombra-md)}
.integ-badge svg{display:block;width:100%;height:100%}
.integ-badge img{display:block;width:100%;height:100%;object-fit:contain}
.integ-item b{display:block;font-size:.94rem}
.integ-item div span{display:block;color:var(--tinta-45);font-size:.78rem;margin-top:1px}
.integ-tag{
  display:inline-block;margin-top:3px;font-family:var(--mono);font-size:.62rem;letter-spacing:.06em;
  text-transform:uppercase;color:var(--carmim-vivo);background:rgba(168,40,42,.1);padding:2px 7px;border-radius:var(--pill);
}

@media (max-width:980px){
  .feat-grade,.feat-grade.col4,.feat-grade.col2{grid-template-columns:1fr}
  .check-lista{grid-template-columns:1fr}
  .passo-grade{grid-template-columns:1fr 1fr}
  .plano-grade{grid-template-columns:1fr}
  .plano-card--destaque{transform:none;order:-1}
  .tour-grade{grid-template-columns:1fr}
  .tour-tela{order:-1}
  .marca-grade{grid-template-columns:1fr}
  .integ-grade{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:620px){
  .passo-grade{grid-template-columns:1fr}
  .integ-grade{grid-template-columns:1fr}
}

/* cobranca: Fatura Automatica em destaque (largura total, 3 fases dentro) +
   Suspensao/Cobranca pos-chave como par de cards abaixo. */
.cobra-fatura{
  background:var(--osso);border:1px solid var(--linha);border-radius:var(--r-xl);
  padding:clamp(24px,2.6vw,34px);box-shadow:var(--sombra-sm);margin-bottom:20px;
}
.cobra-fatura-cab{display:flex;align-items:center;gap:16px;margin-bottom:26px;padding-bottom:22px;border-bottom:1px solid var(--linha)}
.cobra-fatura-cab p{margin:4px 0 0;color:var(--tinta-70);font-size:.98rem}
.cobra-rot{font-size:1.05rem;font-weight:700;letter-spacing:-.01em;color:var(--tinta)}

.cobra-ico{
  flex:none;display:flex;align-items:center;justify-content:center;width:48px;height:48px;
  border-radius:var(--r-md);background:rgba(168,40,42,.08);color:var(--carmim);
}
.cobra-ico svg{width:24px;height:24px}

.cobra-fases{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(20px,2.6vw,32px)}
.cobra-fase-ico{
  display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:50%;
  background:#fff;border:2px solid var(--carmim);color:var(--carmim);margin-bottom:14px;
}
.cobra-fase-ico svg{width:18px;height:18px}
.cobra-fase-rot{display:block;font-weight:600;font-size:.92rem;margin-bottom:4px}
.cobra-fase-item p{margin:0;color:var(--tinta-70);font-size:.86rem;line-height:1.5}

.cobra-grade{display:grid;grid-template-columns:repeat(2,1fr);gap:20px}
.cobra-card{
  background:var(--osso);border:1px solid var(--linha);border-radius:var(--r-xl);
  padding:clamp(22px,2.4vw,30px);box-shadow:var(--sombra-sm);
}
.cobra-card h3{margin:14px 0 8px}
.cobra-card > p{margin:0;color:var(--tinta-70);font-size:.96rem;line-height:1.6}
.cobra-config{
  display:block;margin-top:14px;padding-top:14px;border-top:1px dashed var(--linha);
  font-size:.88rem;color:var(--tinta-70);
}
.cobra-config b{color:var(--carmim)}

@media (max-width:980px){
  .cobra-fases{grid-template-columns:1fr}
  .cobra-grade{grid-template-columns:1fr}
}
@media (max-width:640px){
  .cobra-fatura-cab{flex-direction:column;align-items:flex-start}
}

/* video-outros: secao PROPRIA, separada do video principal -- texto geral
   a esquerda, os 3 Shorts como cartas sobrepostas (leque) a direita. O
   thumbnail que o YouTube gera pra Shorts e' um frame 16:9 com o video real
   (vertical) encaixado no meio e as laterais preenchidas com copia
   borrada/ampliada -- por isso o card usa caixa VERTICAL (aspect-ratio
   9/16, o formato real do Short) com object-fit:cover, que cropa
   exatamente a faixa central e descarta o borrao das laterais sem precisar
   processar a imagem. O titulo de cada video fica SOBRE o proprio
   thumbnail (veu degrade + texto), como uma capa, em vez de legenda
   embaixo -- e' o mesmo .video-fachada, entao some junto quando o clique
   troca pelo iframe (nao precisa sobreviver a troca, e' so' o video). */
.video-outros-grade{display:grid;grid-template-columns:.85fr 1.15fr;gap:clamp(30px,4vw,56px);align-items:center}
.video-outros-texto .rot{display:block;color:var(--carmim);margin-bottom:10px}
.video-outros-texto h2{margin-bottom:14px}
.video-outros-texto p{margin:0;color:var(--tinta-70);font-size:1.02rem;line-height:1.65;max-width:38ch}

/* variante em grade do .video-outros-solucao pra quando sao 4+ videos --
   o leque (.video-stack, logo abaixo) e' calibrado a dedo pra exatamente 3
   cards (rotacao por nth-child), nao escala pra mais. Mesmo componente de
   card (.video-fachada-capa), so' o container que muda. */
.video-grade-outros{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:clamp(20px,2.6vw,32px)}
.video-grade-outros .video-fachada-capa{width:100%}
@media (max-width:760px){.video-grade-outros{grid-template-columns:repeat(2,1fr)}}
@media (max-width:480px){.video-grade-outros{grid-template-columns:1fr}}

.video-stack{display:flex;align-items:center;justify-content:center;padding:28px 0}
.video-fachada-capa{
  flex:none;width:min(30vw,178px);aspect-ratio:9/16;max-width:none;margin:0;
  border-radius:var(--r-lg);
  transform-origin:50% 100%;rotate:0deg;translate:0 0;scale:1;
  transition:margin .5s cubic-bezier(.2,.7,.2,1),rotate .5s cubic-bezier(.2,.7,.2,1),
             translate .5s cubic-bezier(.2,.7,.2,1),scale .3s cubic-bezier(.2,.7,.2,1),box-shadow .3s;
}
.video-stack .video-fachada-capa:nth-child(1){rotate:-7deg;translate:0 10px;z-index:1;margin-right:-70px}
.video-stack .video-fachada-capa:nth-child(2){z-index:3}
.video-stack .video-fachada-capa:nth-child(3){rotate:7deg;translate:0 10px;z-index:2;margin-left:-70px}
@media (hover:hover){
  .video-stack:hover .video-fachada-capa:nth-child(1){rotate:-3deg;translate:0 0;margin-right:12px}
  .video-stack:hover .video-fachada-capa:nth-child(3){rotate:3deg;translate:0 0;margin-left:12px}
  .video-fachada-capa:hover{scale:1.06;z-index:5;box-shadow:0 30px 60px -18px rgba(0,0,20,.45)}
}
.video-capa-veu{
  position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(to top,rgba(0,0,20,.88) 0%,rgba(0,0,20,.32) 45%,rgba(0,0,20,0) 70%);
}
.video-capa-titulo{
  position:absolute;left:14px;right:14px;bottom:13px;z-index:2;pointer-events:none;
  color:#fff;font-weight:700;font-size:.86rem;line-height:1.32;text-shadow:0 1px 4px rgba(0,0,0,.4);
}

@media (max-width:900px){
  .video-outros-grade{grid-template-columns:1fr}
}
@media (max-width:640px){
  .video-stack .video-fachada-capa{width:calc(33.333% - 7px)}
  .video-stack .video-fachada-capa:nth-child(1),.video-stack:hover .video-fachada-capa:nth-child(1),
  .video-stack .video-fachada-capa:nth-child(3),.video-stack:hover .video-fachada-capa:nth-child(3){
    rotate:0deg;translate:0 0;margin:0 4px;
  }
}

/* video-modal: os cards do leque abrem o video aqui, nao no proprio card
   (pequeno demais pra assistir) -- painel lateral deslizante (a mesma ideia
   de "gaveta" que aparece em apps de video), video vertical (9/16, formato
   real do Short) ocupando o painel quase inteiro. */
.video-modal{position:fixed;inset:0;z-index:100;visibility:hidden;pointer-events:none}
.video-modal-fundo{position:absolute;inset:0;background:rgba(0,0,20,.62);opacity:0;transition:opacity .35s}
.video-modal-painel{
  position:absolute;top:0;right:0;height:100%;width:min(90vw,440px);box-sizing:border-box;
  background:var(--navy);box-shadow:-30px 0 70px -24px rgba(0,0,0,.55);
  display:flex;align-items:center;justify-content:center;padding:clamp(20px,4vw,40px);
  translate:100% 0;transition:translate .4s cubic-bezier(.2,.8,.2,1);
}
.video-modal.aberto{visibility:visible;pointer-events:auto}
.video-modal.aberto .video-modal-fundo{opacity:1}
.video-modal.aberto .video-modal-painel{translate:0 0}
.video-modal-fechar{
  position:absolute;top:18px;right:18px;z-index:2;width:40px;height:40px;border-radius:50%;flex:none;
  display:flex;align-items:center;justify-content:center;background:rgba(246,242,237,.1);
  color:#fff;border:0;cursor:pointer;transition:background .2s;
}
.video-modal-fechar svg{width:18px;height:18px}
.video-modal-fechar:hover{background:rgba(246,242,237,.18)}
.video-modal-corpo{width:100%;aspect-ratio:9/16;max-height:calc(100vh - 64px);border-radius:var(--r-lg);overflow:hidden;background:#000}
.video-modal-corpo iframe{width:100%;height:100%;border:0;display:block}

@media (max-width:640px){
  .video-modal-painel{width:100%}
}

/* LIGHTBOX 16/9 (.video-modal.largo) -----------------------------------
   A gaveta da direita existe pros depoimentos VERTICAIS -- o corpo dela e'
   9/16. Video horizontal precisa do contrario: largura. E miniatura (o quadro
   do tour tem 281px) nao pode tocar no proprio lugar; esticar a celula pra
   linha inteira ja' foi tentado e desmontou a grade.
   Mesma peca de markup do modal, outro formato: nao existe um segundo modal
   no HTML. O painel deixa de ser laje navy e vira so' o video, centrado,
   entrando por escala -- o veu escuro atras ja' da' o isolamento.
   translate repetido no estado aberto de proposito: a regra
   `.video-modal.aberto .video-modal-painel{translate:0 0}` da gaveta tem a
   mesma especificidade e zeraria a centralizacao. */
.video-modal.largo .video-modal-painel{
  top:50%;left:50%;right:auto;
  width:min(92vw,1180px);height:auto;padding:0;
  background:transparent;box-shadow:none;
  translate:-50% -50%;scale:.94;opacity:0;
  transition:scale .34s cubic-bezier(.2,.8,.2,1),opacity .26s ease;
}
.video-modal.largo.aberto .video-modal-painel{translate:-50% -50%;scale:1;opacity:1}
.video-modal.largo .video-modal-corpo{
  width:100%;aspect-ratio:16/9;max-height:calc(100vh - 150px);
  border-radius:var(--r-lg);overflow:hidden;background:#000;box-shadow:var(--sombra-lg);
}
/* o X sai de dentro do video e vai pra cima dele: por cima da imagem ele
   disputa com o conteudo e ainda cobre o canto do player do YouTube. */
.video-modal.largo .video-modal-fechar{top:-50px;right:0}
@media (max-width:640px){
  .video-modal.largo .video-modal-painel{width:calc(100vw - 24px)}
  .video-modal.largo .video-modal-fechar{top:-44px}
}


/* exclusivos (App Personalizado): recurso exclusivo do nivel Full, texto +
   foto real do banner em uso lado a lado -- mesma proporcao de grid ja usada
   em .video-destaque/.marca-grade pra secao texto+midia. */
.exclusivos-grade{display:grid;grid-template-columns:1fr 1fr;gap:clamp(30px,4vw,56px);align-items:center}
.exclusivos-foto{border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sombra-lg);border:1px solid var(--linha)}
.exclusivos-foto img{width:100%;display:block}
@media (max-width:900px){.exclusivos-grade{grid-template-columns:1fr}}

/* experiencia-grade (App Personalizado): texto + video vertical lado a lado,
   dentro de uma section .secao-escura -- .lede tem cor fixa pra fundo claro
   (var(--tinta-70)), precisa de override aqui ou fica escuro sobre navy. */
.experiencia-grade{display:grid;grid-template-columns:1.1fr .9fr;gap:clamp(30px,4vw,56px);align-items:start}
.experiencia-grade h2{color:#fff}
.experiencia-grade .lede{color:rgba(246,242,237,.8);margin-bottom:clamp(26px,3vw,36px)}
.experiencia-grade .feat-grade{gap:14px}
/* video acompanha a rolagem enquanto o texto+cards (mais alto) passam --
   mesmo mecanismo do .historia-lado em /sobre-nos/, ja' testado no site. */
.experiencia-video-cx{position:sticky;top:110px}
.video-fachada-vertical{aspect-ratio:9/16;max-width:320px;margin:0 auto}
@media (max-width:900px){
  .experiencia-grade{grid-template-columns:1fr}
  .experiencia-video-cx{position:static;margin-top:clamp(28px,3.4vw,40px)}
}

/* marca-white-detalhe (Plataforma): grade de 4 cards com o detalhamento do
   White Label do PAINEL (nome/dominio/logo/cores) -- complementa, nao
   substitui, a check-lista+celpalco acima (aquela cobre dominio/logo/cores
   E o app; esta e' so' o painel, com copy real da LP de origem). Cards
   centralizados (texto+icone no meio), diferente do .feat-card padrao
   (alinhado a esquerda) porque a fonte real usa esse tratamento. */
.marca-white-detalhe{margin-top:clamp(40px,5vw,60px);padding-top:clamp(36px,4.5vw,52px);border-top:1px solid var(--linha)}
.marca-white-topo{text-align:center;max-width:640px;margin:0 auto clamp(28px,3.4vw,40px)}
.marca-white-topo h3{font-size:clamp(1.28rem,2.1vw,1.62rem);margin:14px 0 10px}
.marca-white-topo .lede{margin:0 auto;max-width:56ch}
.marca-white-grade{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(16px,2vw,22px)}
.marca-white-card{
  background:var(--osso);border:1px solid var(--linha);border-radius:var(--r-lg);
  padding:clamp(22px,2.2vw,28px) clamp(16px,2vw,20px);box-shadow:var(--sombra-sm);
  text-align:center;display:flex;flex-direction:column;align-items:center;
  transition:box-shadow .3s,transform .3s;
}
.marca-white-card:hover{box-shadow:var(--sombra-md);transform:translateY(-3px)}
.marca-white-ico{
  display:flex;align-items:center;justify-content:center;flex:none;width:52px;height:52px;margin-bottom:14px;
  border-radius:50%;background:rgba(168,40,42,.08);color:var(--carmim);
}
.marca-white-ico svg{width:24px;height:24px}
.marca-white-card h4{font-size:.98rem;margin-bottom:6px}
.marca-white-card p{margin:0;font-size:.86rem;color:var(--tinta-70);line-height:1.5}
.marca-white-nota{text-align:center;margin-top:22px;font-size:.85rem;color:var(--tinta-45)}
.marca-white-nota a{color:var(--carmim);font-weight:600}

@media (max-width:900px){.marca-white-grade{grid-template-columns:repeat(2,1fr)}}
@media (max-width:520px){.marca-white-grade{grid-template-columns:1fr}}

/* ================= chips-m2m ================= */

/* aviso-caixa: alerta visual (ex.: "nao e chip de celular") -- mesmo idioma
   de cor/borda do resto do site (carmim em baixa opacidade), so' que num
   card dedicado em vez de paragrafo solto. */
.aviso-caixa{
  display:flex;gap:16px;align-items:flex-start;margin-top:24px;
  background:rgba(168,40,42,.05);border:1.5px solid rgba(168,40,42,.25);
  border-radius:var(--r-lg);padding:clamp(18px,2.2vw,26px);
}
.aviso-caixa-ico{flex:none;display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background:rgba(168,40,42,.1);color:var(--carmim)}
.aviso-caixa-ico svg{width:20px;height:20px}
.aviso-caixa b{display:block;margin-bottom:6px;font-size:1rem;color:var(--tinta)}
.aviso-caixa p{margin:0;color:var(--tinta-70);font-size:.92rem;line-height:1.55}

.chips-stat-num{font-family:var(--fonte);font-weight:800;font-size:1.5rem;letter-spacing:-.01em;color:var(--tinta);margin-bottom:2px}

/* chips-destaque: resumo em grade de 1 linha (icone+rotulo) antes do grid de
   planos -- so' entra em vez do paragrafo simples "20 MB e 50 MB -- ...";
   auto-fit deixa a mesma regra servir tanto a fileira de 7 itens (Megabytes)
   quanto a de 5 (Gigabytes), sem precisar de contagem de coluna por instancia
   (senao um media-query nao conseguiria vencer um estilo inline por item).
   O 1o item (o volume de dados) leva --chave: fundo carmim solido, selo
   diagonal no canto com o icone, e o valor escrito grande embaixo -- pra
   virar a ancora visual da fileira em vez de mais uma caixa igual as outras.
   Os icones dos demais itens sao PRETOS de proposito: as fotos reais (PNG)
   ja' nascem pretas, mas os SVG desenhados a mao (Outros equipamentos,
   Dashcams/Videotelemetria/CFTV/Telemetria pesada em Gigabytes) usam
   stroke="currentColor" e herdavam o carmim do badge -- sem querer, cada
   grid ficava com mistura de icone preto (foto) e vermelho (svg). Cor do
   badge trocada pra preto resolve os dois de uma vez (nao afeta a img,
   so' o svg que realmente lia currentColor). */
.chips-destaque{display:grid;grid-template-columns:repeat(auto-fit,minmax(124px,1fr));gap:12px;margin:22px 0 30px}
.chips-destaque-item{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:11px;text-align:center;
  min-height:132px;background:var(--osso);border:1px solid var(--linha);border-radius:var(--r-lg);
  padding:18px 12px;box-shadow:var(--sombra-sm);transition:box-shadow .3s,transform .3s;
}
.chips-destaque-item:hover{box-shadow:var(--sombra-md);transform:translateY(-3px)}
.chips-destaque-ico{
  display:flex;align-items:center;justify-content:center;flex:none;width:50px;height:50px;
  border-radius:50%;background:rgba(168,40,42,.08);color:#161616;
}
.chips-destaque-ico svg{width:25px;height:25px}
.chips-destaque-ico img{width:30px;height:30px;object-fit:contain}
.chips-destaque-item:not(.chips-destaque-item--chave) span:last-child{font-size:.84rem;font-weight:700;color:var(--tinta);line-height:1.3}

/* --chave: selo em corte diagonal no canto superior esquerdo (triangulo via
   border-trick, sem clip-path) com respiro proprio, e o valor empilhado em
   3 linhas apertadas embaixo, ancorado no rodape do card (nao centralizado
   com o resto, pra nunca disputar espaco vertical com o selo). */
.chips-destaque-item--chave{
  position:relative;overflow:hidden;justify-content:center;align-items:center;gap:0;
  background:linear-gradient(150deg,var(--carmim-vivo),var(--carmim));border-color:transparent;
  box-shadow:0 16px 32px -16px rgba(168,40,42,.55);
}
.chips-chave-selo{
  position:absolute;top:0;left:0;width:60px;height:60px;
  background:rgba(255,255,255,.18);clip-path:polygon(0 0,100% 0,0 100%);
  display:flex;align-items:flex-start;justify-content:flex-start;
}
.chips-chave-selo svg{width:20px;height:20px;margin:10px 0 0 10px;color:#fff}
.chips-chave-texto{display:flex;flex-direction:column;align-items:center;line-height:1.02}
.chips-chave-texto span{font-size:1.22rem;font-weight:800;color:#fff;letter-spacing:-.01em}
.chips-chave-texto em{font-family:'Caveat',cursive;font-style:normal;font-weight:600;font-size:1.2rem;color:rgba(255,255,255,.85);display:inline-block;translate:0 -1.5px}

/* --outros: "outros equipamentos de baixo consumo" e' o item catch-all da
   fileira, nao uma aplicacao especifica como as demais -- formato tracejado
   (mesmo idioma do .tour-item-mais ja usado na pagina de Plataforma) separa
   visualmente "peca com a gente" de "essa aplicacao especifica existe". */
.chips-destaque-item--outros{background:transparent;border-style:dashed;box-shadow:none}
.chips-destaque-item--outros .chips-destaque-ico{background:transparent;border:1.5px dashed rgba(168,40,42,.35);color:var(--tinta-45)}
.chips-destaque-item--outros span:last-child{color:var(--tinta-70)}

/* plano-op-card: card de plano com logo REAL da operadora (cores originais
   da marca, nao recolorido -- diferente dos icones de integracao internos,
   aqui reconhecer a marca (Vivo roxo, Claro vermelho, Tim azul) e' o ponto). */
.plano-op-card{
  position:relative;background:var(--osso);border:1px solid var(--linha);border-radius:var(--r-lg);
  padding:clamp(20px,2.2vw,26px);box-shadow:var(--sombra-sm);display:flex;flex-direction:column;
  transition:box-shadow .3s,transform .3s;
}
.plano-op-card:hover{box-shadow:var(--sombra-md);transform:translateY(-3px)}
.plano-op-card--destaque{border-color:var(--carmim)}
.plano-op-tag{
  position:absolute;top:-11px;left:20px;background:var(--carmim);color:#fff;
  font-family:var(--mono);font-size:10px;letter-spacing:.05em;text-transform:uppercase;
  padding:4px 10px;border-radius:var(--pill);box-shadow:var(--sombra-sm);white-space:nowrap;
}
.op-badge{display:inline-flex;align-items:center;height:32px;margin-bottom:14px}
.op-badge img{height:100%;width:auto;max-width:140px;object-fit:contain;display:block}
.plano-op-card h4{font-size:1.02rem;margin-bottom:6px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.op-selo{font-family:var(--mono);font-size:.6rem;font-weight:600;letter-spacing:.04em;color:var(--tinta-45);background:var(--osso-2);padding:2px 7px;border-radius:var(--pill)}
.plano-op-card > p{margin:0 0 14px;font-size:.88rem;color:var(--tinta-70);line-height:1.5}
.op-dados{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}
.op-dados span{font-family:var(--mono);font-size:.72rem;font-weight:600;color:var(--tinta-70);background:var(--osso-2);border:1px solid var(--linha);padding:3px 9px;border-radius:var(--pill)}
.plano-op-card ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:7px}
.plano-op-card li{position:relative;padding-left:15px;font-size:.84rem;color:var(--tinta-70);line-height:1.4}
.plano-op-card li::before{content:"";position:absolute;left:0;top:.55em;width:5px;height:5px;border-radius:50%;background:var(--carmim)}

.chips-planos-nota{margin-top:28px;text-align:center;font-size:.9rem;color:var(--tinta-45)}
.chips-planos-nota a{color:var(--carmim);font-weight:600;text-decoration:none}

/* ---------- carrossel de planos (mini): cross-sell de chips M2M nas paginas
   de ferramenta (cobertura-movel, antenas, ...). Reusa .plano-op-card/.op-badge/
   .op-dados do /chips-m2m, so' com um modificador --mini bem mais baixo. */
.planos-mini-solucao{padding:clamp(28px,3.4vw,44px) 0;border-top:1px solid var(--linha)}
.planos-mini-cab{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:18px}
.planos-mini-cab h3{margin-top:4px;font-size:1.24rem}
.planos-mini-nav{display:flex;gap:8px;flex:none}
.planos-mini-btn{width:38px;height:38px;border-radius:50%;border:1px solid var(--linha);background:#fff;color:var(--tinta-70);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:border-color .2s,color .2s,box-shadow .2s}
.planos-mini-btn:hover{border-color:rgba(168,40,42,.3);color:var(--carmim);box-shadow:var(--sombra-sm)}
.planos-mini-btn svg{width:18px;height:18px}
.planos-mini-track{display:flex;gap:16px;overflow-x:auto;scroll-behavior:smooth;padding:18px 8px 32px;scrollbar-width:none}
.planos-mini-track::-webkit-scrollbar{display:none}
.plano-mini-card{flex:0 0 240px;padding:16px 18px;background:#fff}
.plano-mini-card .op-badge{height:24px;margin-bottom:8px}
.plano-mini-card .op-badge img{width:62px;height:100%;object-fit:contain;object-position:left center}
.plano-mini-card h4{font-size:.9rem;margin-bottom:4px}
.plano-mini-card>p{font-size:.79rem;margin-bottom:10px;line-height:1.4;min-height:2.2em}
.plano-mini-card .op-dados{margin-bottom:0}
@media (max-width:560px){.plano-mini-card{flex-basis:78vw}}

/* chips-xlista: mesma ideia do check-lista, so' que com "x" vermelho em vez
   de check (lado "fornecedor comum" do comparativo). */
.chips-xlista{margin:16px 0 0;padding:0;list-style:none;display:flex;flex-direction:column;gap:12px}
.chips-xlista li{position:relative;padding-left:24px;font-size:.9rem;color:var(--tinta-45);line-height:1.5}
.chips-xlista li::before{content:"×";position:absolute;left:0;top:-2px;font-size:1.15rem;font-weight:700;color:#c33}

/* chips-trilha: linha do tempo compacta (4 marcos), leve -- nao e' a
   .tc-anos completa de /sobre-nos/, so' um resumo com 4 pontos fixos. */
.chips-trilha{position:relative;display:grid;grid-template-columns:repeat(4,1fr);gap:22px;margin-top:clamp(40px,5vw,56px)}
.chips-trilha::before{
  content:"";position:absolute;top:7px;left:10%;right:10%;height:2px;z-index:0;
  background:linear-gradient(90deg,var(--linha),var(--carmim) 55%,var(--dourado));
}
.chips-trilha-item{position:relative;z-index:1;padding-top:34px;text-align:center}
.chips-trilha-item::before{
  content:"";position:absolute;top:0;left:50%;translate:-50% 0;width:14px;height:14px;
  border-radius:50%;background:var(--osso);border:3px solid var(--carmim);
}
.chips-trilha-item b{display:block;font-weight:800;font-size:1.1rem;color:var(--carmim);margin-bottom:6px}
.chips-trilha-item--hoje b{color:var(--tinta)}
.chips-trilha-item--hoje::before{background:var(--carmim)}
.chips-trilha-item span{display:block;font-size:.82rem;color:var(--tinta-70);line-height:1.45;max-width:23ch;margin:0 auto}

.chips-pills-eyebrow{text-align:center;margin:36px 0 14px;font-size:.86rem;font-weight:600;color:var(--tinta-45)}
.chips-pills{display:flex;flex-wrap:wrap;justify-content:center;gap:9px}
.chips-pill{
  position:relative;font-size:.84rem;font-weight:500;color:var(--tinta-70);background:var(--osso);
  border:1px solid var(--linha);padding:8px 16px;border-radius:var(--pill);cursor:default;
  transition:border-color .2s,color .2s;
}
.chips-pill:hover{border-color:rgba(168,40,42,.35);color:var(--tinta)}
/* dica no hover, mesma receita do .escala button::after -- so' que aqui o
   texto e' uma frase inteira, entao quebra linha e alinha a esquerda em vez
   de nowrap/centralizado. */
.chips-pill::after{
  content:attr(data-tip);
  position:absolute;top:calc(100% + 10px);left:50%;transform:translate(-50%,4px);
  width:250px;max-width:70vw;padding:12px 14px;border-radius:var(--r-md);
  background:var(--navy);color:#e2e8f0;font-family:var(--fonte);font-size:.78rem;font-weight:400;
  line-height:1.5;text-align:left;white-space:normal;
  opacity:0;visibility:hidden;pointer-events:none;z-index:20;box-shadow:var(--sombra-lg);
  transition:opacity .2s,transform .2s,visibility .2s;
}
.chips-pill:hover::after{opacity:1;visibility:visible;transform:translate(-50%,0)}

/* chips-vtabs: alterna qual video (App/Web) o palco mostra -- pill simples,
   sem reusar .tour-item (que carrega troca de screenshot, nao de video). */
.chips-vtabs{display:flex;gap:8px;margin-bottom:14px}
.chips-vtab{
  flex:1;padding:10px 14px;border-radius:var(--r-md);cursor:pointer;
  border:1px solid rgba(246,242,237,.16);background:rgba(246,242,237,.05);
  color:rgba(246,242,237,.75);font-size:.86rem;font-weight:600;font-family:var(--fonte);
  transition:background .2s,color .2s,border-color .2s;
}
.chips-vtab.on{background:var(--carmim);border-color:var(--carmim);color:#fff}
.chips-vtab:hover:not(.on){background:rgba(246,242,237,.1)}

/* dep-grade: depoimentos em video, grade simples (nao e' o leque do
   .video-stack -- aqui sao 5 rostos reais, ler como "prova em fileira" e'
   melhor que leque, que sugeria "mais conteudo pra explorar"). */
.dep-grade{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;margin-top:clamp(28px,3.4vw,40px)}
.dep-card{text-align:center}
.dep-card .video-fachada-capa{width:100%;margin-bottom:12px}
.dep-card > b{display:block;font-size:.9rem;color:var(--tinta)}
.dep-card > span{display:block;font-size:.78rem;color:var(--tinta-45);margin-top:2px}

.chips-badges{display:flex;flex-wrap:wrap;justify-content:center;gap:10px;margin:clamp(32px,4vw,44px) 0 24px}
.chips-badge{
  display:inline-flex;align-items:center;font-size:.86rem;font-weight:600;color:var(--tinta);
  background:var(--osso);border:1px solid var(--linha);padding:9px 18px;border-radius:var(--pill);
}

.chips-fotos{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.chips-fotos img{width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:var(--r-lg);border:1px solid var(--linha);box-shadow:var(--sombra-sm)}

@media (max-width:980px){
  .plano-op-card{padding:20px}
  .dep-grade{grid-template-columns:repeat(3,1fr)}
}
@media (max-width:760px){
  .chips-trilha{grid-template-columns:repeat(2,1fr);row-gap:36px}
  .chips-trilha::before{display:none}
  .chips-fotos{grid-template-columns:1fr}
}
@media (max-width:620px){
  .dep-grade{grid-template-columns:repeat(2,1fr)}
}

/* ================= rastreadores ================= */

/* aviso-caixa ganha variante com borda solida carmim (usada como fechamento
   do checklist de autenticidade) -- reusa o componente do chips-m2m. */
.aviso-caixa svg{width:20px;height:20px}

/* .modelos-solucao e' .secao-escura (navy) -- .lede tem cor fixa pra fundo
   claro (var(--tinta-70)), mesmo caso do .experiencia-grade em App
   Personalizado. Faltou aqui (achado real do usuario: "continua preto"
   depois do resto da section ja' estar branco). */
.modelos-solucao .lede{color:rgba(246,242,237,.78)}

/* jmod-hero: J16 Original em destaque (foto real com alpha + selo), texto ao
   lado -- mesma proporcao de grid ja usada em .video-destaque/.marca-grade.
   Card proprio (fundo navy-3 + canto arredondado), pra nao ficar so' texto
   solto boiando direto no navy chapado da section (achado real do usuario:
   sem esse card, a leitura era de "texto sem fundo nenhum", quase sumindo
   contra o escuro da section). */
.jmod-hero{
  display:grid;grid-template-columns:.85fr 1.15fr;gap:clamp(30px,4vw,56px);align-items:center;
  margin-bottom:clamp(40px,5vw,56px);
  background:var(--navy-3);border:1px solid rgba(246,242,237,.1);border-radius:var(--r-xl);
  padding:clamp(26px,3.2vw,44px);
}
.jmod-hero-foto{position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;background:rgba(246,242,237,.05);border:1px solid rgba(246,242,237,.12);border-radius:var(--r-xl);padding:clamp(24px,3vw,40px)}
.jmod-hero-foto img{width:100%;max-width:320px;height:auto;display:block;transition:transform .7s cubic-bezier(.2,.7,.3,1)}
.jmod-hero:hover .jmod-hero-foto img{transform:scale(1.05)}
.jmod-selo{position:absolute;bottom:16px;left:16px;background:var(--carmim);color:#fff;font-size:.78rem;font-weight:700;padding:6px 14px;border-radius:var(--pill);box-shadow:var(--sombra-md)}
.jmod-hero-texto .rot{color:var(--dourado);display:block;margin-bottom:10px}
.jmod-hero-texto h3{color:#fff;font-size:clamp(1.3rem,2.2vw,1.7rem);margin-bottom:14px}
.jmod-hero-texto p{color:rgba(246,242,237,.78);margin:0 0 20px;font-size:1rem;line-height:1.65}
.jmod-hero-texto .check-lista{grid-template-columns:repeat(2,1fr)}
.jmod-hero-texto .check-item b{color:#fff}

/* jmod-grade/jmod-card: Easy e Mag lado a lado (tambem reusado por J-4/EC33
   em #outros, com 2 colunas simetricas). */
.jmod-grade{display:grid;grid-template-columns:repeat(2,1fr);gap:clamp(18px,2.2vw,26px);margin-bottom:clamp(32px,4vw,44px)}
.jmod-card{background:rgba(246,242,237,.04);border:1px solid rgba(246,242,237,.12);border-radius:var(--r-lg);padding:clamp(20px,2.2vw,26px)}
.jmod-foto{position:relative;background:#fff;border-radius:var(--r-md);overflow:hidden;margin-bottom:16px;aspect-ratio:4/3;display:flex;align-items:center;justify-content:center}
.jmod-foto img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .7s cubic-bezier(.2,.7,.3,1)}
.jmod-card:hover .jmod-foto img{transform:scale(1.06)}
/* jmod-video-play: badge de "assistir video" no canto da foto do produto --
   reaproveita .video-play/.video-play-pq (mesmo circulo vermelho com
   triangulo branco do resto do site), so' reposicionado do centro (uso
   padrao, video ocupando a foto inteira) pro canto (aqui a foto do produto
   continua visivel, o video abre no modal lateral, ver JS da pagina). */
.jmod-video-play{top:auto;left:auto;bottom:10px;right:10px;translate:none;border:0;padding:0;cursor:pointer;font:inherit}
.jmod-video-play:hover{scale:1.08;background:var(--carmim-vivo)}
.jmod-card h3{color:#fff;font-size:1.15rem;margin:12px 0 8px}
.jmod-card p{color:rgba(246,242,237,.75);margin:0 0 14px;font-size:.92rem;line-height:1.55}
.jmod-card .op-dados span{background:rgba(246,242,237,.08);border-color:rgba(246,242,237,.16);color:rgba(246,242,237,.8)}

/* jmod-card--claro: variante clara do .jmod-card (que nasceu pensado pro
   fundo escuro do #modelos, J16). Reusado em Rastreadores#outros (J-4/EC33),
   Tags BLE e Dashcams -- todas fora de .secao-escura. */
.jmod-card--claro{background:var(--osso);border-color:var(--linha);box-shadow:var(--sombra-sm)}
.jmod-card--claro .jmod-foto{background:var(--osso-2);border:1px solid var(--linha)}
.jmod-card--claro h3{color:var(--tinta)}
.jmod-card--claro p{color:var(--tinta-70)}
.jmod-card--claro .op-dados span{background:var(--osso-2);border-color:var(--linha);color:var(--tinta-70)}
.jmod-card--claro .op-badge{margin-bottom:12px}

.jmod-tabela{overflow-x:auto;border:1px solid rgba(246,242,237,.14);border-radius:var(--r-lg)}
.jmod-tabela table{width:100%;border-collapse:collapse;font-size:.92rem}
.jmod-tabela th,.jmod-tabela td{padding:14px 18px;text-align:left;white-space:nowrap}
.jmod-tabela thead tr{background:rgba(246,242,237,.06)}
.jmod-tabela th{color:#fff;font-weight:700}
.jmod-tabela td{color:rgba(246,242,237,.8);border-top:1px solid rgba(246,242,237,.1)}
.jmod-tabela tbody tr td:first-child{font-weight:600;color:#fff}

.sentinela-print{margin-top:clamp(32px,4vw,44px);max-width:900px;margin-inline:auto}
.sentinela-print img{width:100%;border-radius:var(--r-lg);border:1px solid var(--linha);box-shadow:var(--sombra-md);display:block}
.sentinela-print figcaption{text-align:center;margin-top:14px;font-size:.88rem;color:var(--tinta-45)}

/* gancho-grade: 2 cards de link cruzado entre as 3 paginas de equipamento
   (Rastreadores/Tags BLE/Dashcams) -- mesmo icone ja usado no mega-menu,
   pra reforcar que e' o mesmo item, so' que virando link de verdade aqui. */
.gancho-grade{display:grid;grid-template-columns:repeat(2,1fr);gap:clamp(18px,2.2vw,26px);margin-top:clamp(28px,3.4vw,40px)}
.gancho-card{
  display:flex;gap:18px;align-items:flex-start;background:var(--osso);border:1px solid var(--linha);
  border-radius:var(--r-lg);padding:clamp(22px,2.4vw,28px);box-shadow:var(--sombra-sm);
  text-decoration:none;transition:box-shadow .3s,transform .3s,border-color .3s;
}
.gancho-card:hover{box-shadow:var(--sombra-md);transform:translateY(-3px);border-color:rgba(168,40,42,.3)}
.gancho-ico{flex:none;display:flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:var(--r-md);background:rgba(168,40,42,.08);color:var(--carmim)}
.gancho-ico svg{width:24px;height:24px}
.gancho-card h3{font-size:1.05rem;margin-bottom:6px}
.gancho-card p{margin:0 0 10px;color:var(--tinta-70);font-size:.9rem;line-height:1.55}
.gancho-link{font-size:.86rem;font-weight:700;color:var(--carmim)}
.gancho-link i{margin-left:2px;font-style:normal}

/* ---------- ferramentas (/ferramentas/) ---------- */
.ferramenta-grade{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(18px,2.2vw,26px);margin-top:clamp(28px,3.4vw,40px)}
.ferramenta-card{
  position:relative;display:flex;flex-direction:column;background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);
  padding:clamp(22px,2.4vw,28px);box-shadow:var(--sombra-sm);text-decoration:none;color:inherit;
  transition:box-shadow .3s,transform .3s,border-color .3s;
}
a.ferramenta-card:hover{box-shadow:var(--sombra-md);transform:translateY(-3px);border-color:rgba(168,40,42,.3)}
.ferramenta-card.em-breve{opacity:.72}
.ferramenta-topo{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px}
.ferramenta-status{
  font-family:var(--mono);font-size:10px;font-weight:700;
  letter-spacing:.05em;text-transform:uppercase;padding:4px 10px;border-radius:var(--pill);
}
.ferramenta-status.disponivel{background:rgba(1,171,68,.1);color:#01ab44}
.ferramenta-status.em-breve{background:var(--osso-2);color:var(--tinta-45);border:1px solid var(--linha)}
.ferramenta-ico{display:flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:var(--r-md);background:rgba(168,40,42,.08);color:var(--carmim)}
.ferramenta-ico svg{width:22px;height:22px}
.ferramenta-card h3{font-size:1.05rem;margin:0 0 8px}
.ferramenta-card p{margin:0;color:var(--tinta-70);font-size:.9rem;line-height:1.55}
.ferramenta-link{display:inline-block;margin-top:auto;padding-top:14px;font-size:.86rem;font-weight:700;color:var(--carmim)}
.ferramenta-link i{margin-left:2px;font-style:normal}

/* ---------- calculadora de frota (/ferramentas/calculadora-frota/) ---------- */
.calc-grade{display:grid;grid-template-columns:1.1fr .9fr;gap:clamp(20px,2.4vw,32px);margin-top:clamp(28px,3.4vw,40px);align-items:start}
.calc-form,.calc-resultado{background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);padding:clamp(22px,2.4vw,30px);box-shadow:var(--sombra-sm)}
.calc-form h3,.calc-resultado h3{font-size:1rem;margin:0}
.calc-passo-cab{display:flex;align-items:baseline;gap:10px;margin-bottom:18px}
.calc-passo-num{font-family:var(--mono);font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--carmim);background:rgba(168,40,42,.08);padding:3px 9px;border-radius:var(--pill)}
.calc-passo-acoes{display:flex;gap:10px;margin-top:8px}
.calc-campo{margin-bottom:14px}
.calc-seg{display:flex;gap:6px;background:var(--osso-2);padding:4px;border-radius:var(--r-sm);border:1px solid var(--linha)}
.calc-seg button{
  flex:1;display:flex;align-items:center;justify-content:center;font:inherit;font-size:.86rem;font-weight:600;
  color:var(--tinta-70);background:none;border:0;text-align:center;
  border-radius:calc(var(--r-sm) - 3px);padding:8px 10px;cursor:pointer;transition:background .2s,color .2s;
}
.calc-seg button.ativo{background:#fff;color:var(--carmim);box-shadow:var(--sombra-sm)}
.calc-stepper{display:flex;align-items:stretch;width:fit-content;border:1px solid var(--linha);border-radius:var(--r-sm);overflow:hidden;background:#fff}
.calc-stepper button{width:38px;font-size:1.1rem;font-weight:600;color:var(--carmim);background:var(--osso-2);border:0;cursor:pointer}
.calc-stepper input{width:64px;text-align:center;border:0;border-left:1px solid var(--linha);border-right:1px solid var(--linha);font:inherit;font-size:.92rem;padding:8px 4px}
.calc-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}
.calc-chips button{
  font-family:var(--mono);font-size:.76rem;font-weight:400;color:var(--tinta-70);background:#fff;
  border:1px solid var(--linha);border-radius:var(--pill);padding:6px 12px;cursor:pointer;transition:border-color .2s,color .2s;
}
.calc-chips button.ativo{border-color:var(--carmim);color:var(--carmim);background:rgba(168,40,42,.06)}
.calc-campo-acao{display:flex;gap:8px}
.calc-campo-acao input{flex:1}
.calc-mini-btn{
  flex:none;font:inherit;font-size:.78rem;font-weight:700;color:var(--carmim);background:none;
  border:1px solid rgba(168,40,42,.3);border-radius:var(--r-sm);padding:0 14px;cursor:pointer;white-space:nowrap;
}
.calc-mini-btn:hover{background:rgba(168,40,42,.06)}
.calc-campo-nota{display:block;margin-top:6px;font-size:.74rem;color:var(--tinta-45);line-height:1.4}
.calc-campo label{display:block;font-size:.82rem;font-weight:600;color:var(--tinta-70);margin-bottom:6px}
.calc-campo label i{font-style:normal;font-weight:400;color:var(--tinta-45)}
.calc-campo select,.calc-campo input{
  width:100%;font-family:inherit;font-size:.92rem;color:var(--tinta);background:#fff;
  border:1px solid var(--linha);border-radius:var(--r-sm);padding:10px 12px;
}
.calc-campo select:disabled{color:var(--tinta-45);cursor:not-allowed}
.calc-campo input[readonly]{background:var(--osso-2);color:var(--tinta-70)}
.busca-select{position:relative}
.campo-com-limpar{position:relative}
.campo-limpar-btn{
  position:absolute;left:9px;top:50%;transform:translateY(-50%);z-index:2;
  width:18px;height:18px;border:0;background:none;padding:0;cursor:pointer;
  color:var(--carmim);display:flex;align-items:center;justify-content:center;
}
.campo-limpar-btn[hidden]{display:none}
.campo-limpar-btn svg{width:16px;height:16px}
.campo-com-limpar select.tem-valor,.busca-select input.tem-valor{padding-left:32px}
.busca-select input{cursor:text}
.busca-select input:disabled{background:var(--osso-2);color:var(--tinta-45);cursor:not-allowed}
.busca-select-lista{
  position:absolute;z-index:5;top:calc(100% + 4px);left:0;right:0;max-height:240px;overflow-y:auto;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-sm);box-shadow:var(--sombra-md);padding:4px;
}
.busca-select-lista button{
  display:block;width:100%;text-align:left;font:inherit;font-size:.88rem;color:var(--tinta);background:none;
  border:0;border-radius:6px;padding:8px 10px;cursor:pointer;
}
.busca-select-lista button:hover,.busca-select-lista button.destacado{background:var(--osso-2)}
.busca-select-vazio{padding:10px;font-size:.84rem;color:var(--tinta-45);text-align:center}
.calc-fipe{
  display:flex;flex-direction:column;gap:2px;background:rgba(168,40,42,.06);border:1px solid rgba(168,40,42,.2);
  border-radius:var(--r-sm);padding:12px 14px;margin:4px 0 18px;
}
.calc-fipe span{font-size:.76rem;color:var(--tinta-70)}
.calc-fipe b{font-size:1.15rem;color:var(--carmim)}
.calc-fipe small{font-size:.74rem;color:var(--tinta-45)}
.calc-resultado{position:sticky;top:20px}
.calc-linha{display:flex;justify-content:space-between;gap:12px;padding:11px 0;border-top:1px solid var(--linha)}
.calc-linha[hidden]{display:none}
.calc-linha:first-of-type{border-top:0}
.calc-linha span{font-size:.86rem;color:var(--tinta-70)}
.calc-linha span i{font-style:normal;display:block;font-size:.74rem;color:var(--tinta-45)}
.calc-linha b{font-size:.95rem;font-weight:700;white-space:nowrap}
.calc-linha-total{border-top:1.5px solid var(--carmim);margin-top:4px}
.calc-linha-total b{color:var(--carmim);font-size:1.15rem}
.calc-linha-frota{background:var(--osso-2);margin:8px -14px -14px;padding:14px;border-radius:var(--r-sm)}
.calc-aviso{font-size:.78rem;color:var(--tinta-45);line-height:1.5;margin:16px 0 0}
.calc-resultado-vazio{
  background:var(--osso-2);border:1px dashed var(--linha);border-radius:var(--r-lg);
  padding:clamp(22px,2.4vw,30px);color:var(--tinta-45);font-size:.9rem;text-align:center;
  grid-column:2;align-self:start;
}
.calc-fonte{font-size:.78rem;color:var(--tinta-45);margin-top:20px}
.calc-fonte a{color:var(--carmim)}
@media (max-width:900px){
  .calc-grade{grid-template-columns:1fr}
  .calc-resultado-vazio{grid-column:1}
  .calc-resultado{position:static}
}

/* ---------- simulador de app (/ferramentas/simulador-app/) ---------- */
.sim-grade{display:grid;grid-template-columns:.9fr 1.1fr;gap:clamp(20px,2.4vw,32px);margin-top:clamp(28px,3.4vw,40px);align-items:start}
.sim-form-eyebrow{display:block;font-family:var(--mono);font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--tinta-45);margin:22px 0 12px}
.sim-campos-imagem{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:6px}
.sim-campos-imagem .calc-campo{margin-bottom:0}
.sim-campos-imagem label{font-size:.78rem}

/* dropzone: um card so' que alterna entre estado vazio (icone+texto,
   clicavel via <label for>) e estado cheio (preview + trocar/remover) --
   pedido explicito do usuario pra parecer upload de verdade, nao so' um
   <input type=file> cru do lado de uma miniatura. */
.sim-drop{position:relative;border:1.5px dashed var(--linha);border-radius:var(--r-md);overflow:hidden;background:#fff;aspect-ratio:1;transition:border-color .2s}
.sim-drop-alto{aspect-ratio:9/16}
.sim-drop.tem-imagem{border-style:solid}
/* especificidade: ".calc-campo label{display:block}" (regra generica do
   formulario) tem 1 classe + 1 tipo = empata com ".sim-drop-vazio" sozinha
   (1 classe) e VENCE por vir depois no arquivo -- resultado: o flex nunca
   se aplicava e o "label" (que e' o proprio dropzone clicavel) desabava pro
   fluxo normal (icone e texto emendados, colados no topo). Precisa de
   ".sim-drop" na frente pra ganhar em especificidade de verdade. */
.sim-drop .sim-drop-vazio{
  position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  cursor:pointer;color:var(--tinta-45);text-align:center;padding:10px;
}
.sim-drop-vazio:hover{color:var(--carmim)}
.sim-drop-vazio svg{width:24px;height:24px;flex:none}
.sim-drop-vazio span{font-size:.72rem;font-weight:600;color:var(--tinta-70);line-height:1.3}
/* mesma familia de bug (3a vez): dar "display:flex" pra vencer especificidade
   tambem vence o "display:none" que o atributo [hidden] pediria sozinho --
   sem essa regra, marcar hidden=true no JS nao escondia nada, e a logo
   enviada (PNG transparente) ficava sobreposta ao "Adicionar Arquivo" que
   deveria ter sumido. */
.sim-drop .sim-drop-vazio[hidden]{display:none}
.sim-drop[hidden]{display:none}
.sim-drop-cheio[hidden]{display:none}
.sim-drop-cheio{position:absolute;inset:0}
.sim-drop-cheio img{width:100%;height:100%;object-fit:cover;display:block}
.sim-drop-x{
  position:absolute;top:6px;right:6px;width:20px;height:20px;border-radius:50%;background:rgba(18,22,31,.72);
  color:#fff;border:0;font-size:15px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;
}
.sim-drop-x:hover{background:rgba(18,22,31,.9)}
.sim-drop-trocar{
  position:absolute;left:0;right:0;bottom:0;padding:7px 4px 6px;font:inherit;font-size:.68rem;font-weight:700;
  color:#fff;text-align:center;background:linear-gradient(0deg,rgba(18,22,31,.78),transparent);border:0;cursor:pointer;
}
.sim-cor-linha{display:flex;gap:8px;align-items:center}
.sim-cor-linha input[type="color"]{width:44px;height:40px;padding:3px;flex:none;cursor:pointer}
.sim-cor-linha input[type="text"]{font-family:var(--mono);text-transform:uppercase}

/* cor predominante + cor do botao lado a lado, com o botao de vincular
   entre as duas -- pedido explicito, no lugar do antigo "Usar a mesma".
   align-items:start (nao stretch/center) porque so' quero alinhar o
   BOTAO com a LINHA do color-picker, nao esticar os 2 campos pra mesma
   altura (as notas de cada um tem tamanhos diferentes). */
.sim-cores-linha{display:grid;grid-template-columns:1fr auto 1fr;gap:10px;align-items:start}
.sim-campo-cor{margin-top:0}
.sim-cor-vincular{
  position:relative;flex:none;width:36px;height:36px;margin-top:25px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:#fff;border:1.5px solid var(--linha);color:var(--tinta-45);cursor:pointer;
  transition:color .15s,border-color .15s,background .15s;
}
.sim-cor-vincular svg{width:16px;height:16px}
.sim-cor-vincular:hover{border-color:var(--tinta-45)}
/* mesmo padrao de tooltip do .sim-logo-dica, so' que preso a esse botao */
.sim-cor-vincular-dica{
  position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);
  background:rgba(18,22,31,.92);color:#fff;font-size:.66rem;font-weight:600;padding:5px 10px;
  border-radius:6px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s;z-index:5;
}
.sim-cor-vincular:hover .sim-cor-vincular-dica{opacity:1}
/* ativo = "linkado": as 2 cores passam a andar juntas -- fica no azul do
   proprio simulador (nao o carmim do site), pra nao competir com o resto
   da UI do formulario. */
.sim-cor-vincular[aria-pressed="true"]{background:#e8f0fb;border-color:#003f84;color:#003f84}
@media (max-width:520px){
  .sim-cores-linha{grid-template-columns:1fr}
  .sim-cor-vincular{margin:4px auto;transform:rotate(90deg)}
}

.sim-preview{position:sticky;top:20px}

/* controles (Android/iOS + carrossel Icone/Login/Pos-login) vivem no
   .sec-topo, no lugar onde a lede ficava -- pedido explicito do usuario.
   O proprio titulo da secao virou a chamada pro simulador (pedido
   explicito), entao o h2 generico (clamp 1.9-3.2rem) fica pequeno demais
   pro proposito de titulo aqui e precisa de um tamanho proprio. */
.sim-solucao .sec-topo > div:first-child{flex:1;min-width:0}
.sim-solucao .sec-topo h2{font-size:clamp(1.15rem,1.8vw,1.4rem);font-weight:600;max-width:44ch}
.sim-solucao .sec-topo h2 strong{font-weight:700}
.sim-solucao .sec-topo h2 span{color:var(--carmim);font-weight:700}
.sim-topo-controles{display:flex;align-items:center}
.sim-topo-segs{display:flex;flex-direction:row;flex-wrap:wrap;gap:10px;align-items:center;justify-content:flex-end}
.sim-topo-segs .calc-seg{width:fit-content}
.sim-topo-segs .calc-seg button{padding:8px 16px;white-space:nowrap}
/* barra de progresso: uma animacao CSS pura (width 0->100%) que roda so' no
   botao ativo -- o JS escuta o "animationend" dela pra saber a hora de
   trocar de tela, entao o tempo visual e o tempo real nunca desincronizam. */
.sim-topo-segs .sim-seg-tela button{position:relative;overflow:hidden;padding-bottom:10px}
.sim-seg-progresso{position:absolute;left:0;bottom:0;height:2px;width:0;background:currentColor;opacity:.5}
/* o tempo de exibicao mora AQUI, num lugar so': a barrinha e o anel do botao
   de pausa leem a mesma variavel. Dois numeros em dois lugares seria o comeco
   de dois relogios diferentes. */
.sim-solucao{--sim-tempo-tela:4.5s}
.sim-seg-progresso.rodando{animation:simSegProgresso var(--sim-tempo-tela,4.5s) linear forwards}
@keyframes simSegProgresso{from{width:0}to{width:100%}}

/* ---------- pausa da troca automatica ----------
   Mesma moldura .calc-seg dos outros dois grupos. align-self:stretch deixa a
   altura casar com a do grupo de telas sozinha, sem numero chutado: o grupo
   de telas e' 2px mais alto que o de Android/iOS (tem o padding extra da
   barrinha), entao qualquer altura fixa aqui erraria num dos dois. */
.sim-seg-pausa{align-self:stretch;flex:none}
.sim-topo-segs .sim-seg-pausa button{padding:0;width:40px}
.sim-topo-segs .sim-seg-pausa button:hover{background:rgba(255,255,255,.6)}
/* pausado usa o MESMO estado visual de botao ligado do segmentado */
#simPausa[aria-pressed="true"]{background:#fff;color:var(--carmim);box-shadow:var(--sombra-sm)}
.sim-pausa-anel{position:relative;display:flex;align-items:center;justify-content:center;width:26px;height:26px}
.sim-pausa-svg{position:absolute;inset:0;width:100%;height:100%;overflow:visible}
.sim-pausa-trilho,.sim-pausa-arco{fill:none;stroke-width:2.2}
.sim-pausa-trilho{stroke:currentColor;opacity:.2}
/* r=15.9155 da' circunferencia 100, entao o dashoffset anda de 100 a 0 como
   se fosse porcentagem. O giro de -90deg faz o arco comecar as 12h. */
.sim-pausa-arco{
  stroke:currentColor;stroke-linecap:round;stroke-dasharray:100;stroke-dashoffset:100;
  transform:rotate(-90deg);transform-origin:50% 50%;
}
.sim-pausa-arco.rodando{animation:simPausaAnel var(--sim-tempo-tela,4.5s) linear forwards}
@keyframes simPausaAnel{from{stroke-dashoffset:100}to{stroke-dashoffset:0}}
.sim-pausa-ico{position:relative;width:11px;height:11px}
.sim-pausa-ico-play{display:none}
#simPausa[aria-pressed="true"] .sim-pausa-ico-ii{display:none}
#simPausa[aria-pressed="true"] .sim-pausa-ico-play{display:block}

/* sem movimento nao ha' troca automatica (e' o animationend da barrinha quem
   avanca), entao o botao de pausar nao teria o que pausar: um controle que
   nao faz nada mente pra quem clica. Some junto. */
@media (prefers-reduced-motion:reduce){
  .sim-seg-progresso.rodando{animation:none;width:100%}
  .sim-pausa-arco.rodando{animation:none;stroke-dashoffset:0}
  .sim-seg-pausa{display:none}
}

/* palco: fundo escuro com brilho ambiente na cor escolhida atras do
   aparelho -- e' o que tira o "div solto no vazio" e da' sensacao de
   apresentacao de produto de verdade. */
.sim-palco{
  position:relative;border-radius:var(--r-lg);overflow:hidden;padding:clamp(36px,5vw,52px) 20px;
  background-color:#262c38;background-image:radial-gradient(rgba(255,255,255,.2) 1px,transparent 1px);background-size:20px 20px;
}
.sim-palco::before{
  content:'';position:absolute;left:50%;top:38%;width:380px;height:380px;margin:-190px 0 0 -190px;
  background:var(--sim-cor);opacity:.35;filter:blur(70px);border-radius:50%;
}
.sim-palco::after{
  content:'';position:absolute;inset:0;background:radial-gradient(ellipse at 50% 100%,rgba(0,0,0,.5),transparent 60%);
}
/* selo -- so' pra deixar claro que mapa/velocidade/placa aqui sao mock,
   sem competir com o mockup: fita diagonal no canto, presa no proprio
   .sim-palco (que ja tem overflow:hidden) pra nao vazar da caixa. */
/* o padding e' simetrico (50px dos 2 lados) desde sempre -- confirmado
   sem o corte do .sim-palco (overflow:hidden). O que ficava "sem respiro"
   de um lado so' era o proprio corte do CANTO (2 bordas perpendiculares,
   topo + direita) tirando uma fatia maior da ponta MERAMENTE do que da
   ponta ILUSTRATIVO. Corte de canto nao e' um espelho simples: calculado
   via trigonometria (o quanto cada ponta perde depende de top E right ao
   mesmo tempo, nao só da posicao vertical) pra equilibrar exatamente o
   quanto sobra visivel de cada lado do texto. */
.sim-ilustrativo{
  position:absolute;top:47px;right:-46px;z-index:4;transform:rotate(40deg);
  background:var(--carmim);color:#fff;font-size:.62rem;font-weight:700;
  letter-spacing:.03em;text-transform:uppercase;padding:4px 50px;white-space:nowrap;text-align:center;
  box-shadow:0 2px 6px rgba(0,0,0,.3);pointer-events:none;
}

/* moldura do telefone: dois "esqueletos" (android/ios) no mesmo tamanho,
   so' variando raio de canto e o formato do recorte de camera no topo.
   Botoes laterais (span) sao so' pra parecer aparelho de verdade, nao tem
   funcao -- ficam por fora do padding, encostados na moldura. */
/* achado real (pixel a pixel, tela a 100% de escala): o "fiapo branco" no
   canto nao era bug de clipping/sub-pixel -- era a PROPRIA cor de inicio
   do degrade da moldura (#3d4149, um cinza claro) aparecendo forte bem
   perto do topo arredondado, onde a moldura e' so' uma faixa fina de 5px
   -- lida junto com o realce interno (inset shadow branco), lia como uma
   linha. Degrade escurecido e realce removido pra moldura ficar fosca. */
.sim-phone{
  width:264px;height:552px;margin:0 auto;border-radius:32px;padding:5px;position:relative;z-index:1;
  background:linear-gradient(155deg,#24272d,#0e0f13 65%);
  box-shadow:0 2px 3px rgba(0,0,0,.35),0 30px 60px -20px rgba(0,0,0,.6);
}
.sim-phone[data-frame="ios"]{border-radius:44px;padding:7px}
.sim-phone-botao{position:absolute;background:#101216;border-radius:2px}
.sim-phone-botao-power{right:-2.5px;top:118px;width:2.5px;height:58px}
.sim-phone-botao-vol1{left:-2.5px;top:92px;width:2.5px;height:34px}
.sim-phone-botao-vol2{left:-2.5px;top:134px;width:2.5px;height:34px}
.sim-phone-status{position:absolute;top:9px;left:0;right:0;height:18px;display:flex;align-items:flex-start;justify-content:center;z-index:3}
.sim-phone-notch{width:7px;height:7px;border-radius:50%;background:#050608;box-shadow:inset 0 0 0 1px rgba(255,255,255,.08)}
.sim-phone[data-frame="ios"] .sim-phone-notch{width:70px;height:17px;border-radius:12px}
/* raio da tela 2px menor que o "encaixe perfeito" (raio do aparelho menos
   o padding) de proposito: garante uma faixa minima da moldura escura em
   volta de toda a curva, escondendo qualquer fiapo de antialiasing entre
   os dois raios que aparecia em telas com escala fracionada (ex.: Windows
   a 125%/150%) -- reportado como "detalhezinho branco" nos cantos. */
/* fundo na cor da MOLDURA (nao branco) -- pedido explicito: se sobrar
   qualquer fresta de sub-pixel na curva do canto (entre isso aqui e o
   conteudo da tela por cima), o que vaza e' a propria cor escura da
   moldura, se misturando, em vez de uma linha branca destacando. As telas
   com conteudo branco (pos-login) continuam brancas NELAS MESMAS -- so' o
   que fica atras, nas extremidades, mudou. */
.sim-phone-tela{position:relative;width:100%;height:100%;border-radius:25px;overflow:hidden;background:#0e0f13}
.sim-phone[data-frame="ios"] .sim-phone-tela{border-radius:34px}
/* inset:-1px (nao 0): a tela de conteudo "estoura" 1px pra fora em cada
   lado, escondido pelo overflow:hidden + border-radius do .sim-phone-tela
   (pai). Sem essa folga, um gap de sub-pixel entre os dois (mais visivel
   em telas com escala fracionada tipo Windows 125%/150%) deixava o fundo
   branco do pai vazar como uma linha fina bem na curva do canto. */
.sim-tela{position:absolute;inset:-1px;overflow:hidden}

/* tela de login */
.sim-tela-login{background:#0e1420}
.sim-login-bg{
  position:absolute;inset:0;background-size:cover;background-position:center;
  background-image:url('/assets/ferramentas/simulador-app/bg-padrao.webp');
}
.sim-login-sombra{position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,0) 32%,rgba(0,0,0,.9) 100%)}
.sim-login-logo-cx{position:absolute;top:78px;left:22px;right:22px;z-index:2;text-align:center}
/* logo sempre renderiza em branco solido (filtro, nao arquivo) -- assim
   funciona tanto pro logo azul padrao do Localizador quanto pra qualquer
   logo escuro que o revendedor suba, igual ao fundo com foto+veu de toda
   tela de login do app real. */
/* sem max-width/height mais: o tamanho de verdade e' a largura (px) que o
   JS aplica direto na img (ver recalculaBaseLogo/aplicaPosicaoLogo) --
   isso e' o que deixa .sim-logo-editavel (inline-block) refluir sozinho
   junto com o redimensionamento, entao as alcas (filhas, posicionadas nos
   cantos) sempre acompanham o tamanho atual sem calculo duplicado. Os
   valores abaixo sao so' um teto de seguranca. */
.sim-login-logo-cx img{max-width:260px;max-height:90px;display:inline-block}
/* o filtro pra branco solido e' so' pro logo PADRAO (a marca azul/marinho
   do proprio Localizador) -- um logo que o revendedor sobe pode ja vir na
   cor certa (ou branco de proposito), forcar branco nele destruiria a
   identidade que ele escolheu. A classe liga/desliga via JS conforme a
   origem da imagem atual (padrao vs enviada). */
.sim-login-logo-cx.padrao img{filter:brightness(0) invert(1)}

/* logo ajustavel na propria previa: mover e' so' vertical (trilho), com um
   limite -- pedido explicito. Redimensionar e' pelas alcas dos 4 cantos,
   estilo Photoshop -- sem botao de +/-, tambem pedido explicito. Nada
   aqui tem transition: o cursor tem que ser acompanhado 1:1, em tempo
   real, sem "correr atras" da posicao (achado real: um transition de 50ms
   no transform, mesmo curto, dava uma sensacao de atraso no arrasto). */
.sim-logo-editavel{position:relative;display:inline-block;cursor:grab}
.sim-logo-editavel.arrastando{cursor:grabbing}
.sim-logo-editavel img{display:block;-webkit-user-drag:none;user-select:none}
.sim-logo-dica{
  position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);
  background:rgba(18,22,31,.92);color:#fff;font-size:.66rem;font-weight:600;padding:5px 10px;
  border-radius:6px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s;z-index:5;
}
.sim-logo-editavel:hover .sim-logo-dica{opacity:1}
.sim-logo-editavel.ativo .sim-logo-dica{opacity:0}
.sim-logo-editavel::before{
  content:'';position:absolute;inset:-10px;border:1.5px dashed rgba(255,255,255,.85);border-radius:6px;
  opacity:0;pointer-events:none;transition:opacity .12s;
}
.sim-logo-editavel.ativo::before{opacity:1}
/* pointer-events fica sempre "auto" (mesmo invisivel/opacity:0) -- assim
   da' pra agarrar direto um canto e redimensionar mesmo antes de ja' ter
   selecionado (o proprio drag da alca seleciona, ver iniciaResizeLogo).
   Achado real: com pointer-events preso ao .ativo, a PRIMEIRA tentativa de
   redimensionar (antes de qualquer selecao previa) passava direto pra
   imagem por baixo e so' movia verticalmente, sem nunca redimensionar. */
.sim-logo-alca{
  position:absolute;width:12px;height:12px;background:#fff;border:1.5px solid var(--carmim);border-radius:3px;
  z-index:6;opacity:0;transition:opacity .12s;box-shadow:0 1px 3px rgba(0,0,0,.45);
}
.sim-logo-editavel.ativo .sim-logo-alca{opacity:1}
.sim-logo-alca-tl{top:-11px;left:-11px;cursor:nwse-resize}
.sim-logo-alca-tr{top:-11px;right:-11px;cursor:nesw-resize}
.sim-logo-alca-bl{bottom:-11px;left:-11px;cursor:nesw-resize}
.sim-logo-alca-br{bottom:-11px;right:-11px;cursor:nwse-resize}
.sim-login-rodape{position:absolute;left:20px;right:20px;bottom:22px;z-index:2;text-align:center}
.sim-login-rodape h2{color:#fff;font-size:1.15rem;margin:0 0 14px}
.sim-btn-entrar{
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--sim-cor-botao);color:var(--sim-cor-botao-texto,#fff);border:1.5px solid rgba(255,255,255,.7);
  border-radius:var(--r-md);font:inherit;font-weight:700;font-size:.86rem;letter-spacing:.02em;padding:12px 54px;cursor:pointer;
}
.sim-icone-app{cursor:pointer}
.sim-login-trocar{color:rgba(255,255,255,.92);font-size:.78rem;font-weight:600;margin:12px 0 16px}
.sim-login-rodape small{color:rgba(255,255,255,.5);font-size:.66rem}

/* tela pos-login */
/* base em 2 cores, nao branco solido: SO' nos ~30px do topo (a faixa onde
   o raio arredondado da tela do celular de fato corta) fica na cor da
   moldura -- pedido explicito, pra uma fresta ali se misturar com o
   escuro em vez de vazar branco. Nao pode ser mais alto que isso: usar a
   altura do BLOCO inteiro de boas-vindas (~127px) passava da curva do
   celular e chegava a aparecer atras do cartao do mapa (que sobrepoe a
   faixa de proposito, com margin-top negativo) -- achado real, reportado
   com print. Do resto do card de boas-vindas pra baixo, fundo continua
   branco (e' onde nao ha risco nenhum de fresta). */
.sim-tela-home{background:linear-gradient(#0e0f13,#0e0f13 30px,#fff 30px)}
.sim-home-topo{
  background:var(--sim-cor);color:var(--sim-cor-texto,#12161f);border-radius:0 0 50% 50% / 0 0 20px 20px;
  padding:46px 24px 42px;text-align:center;
}
.sim-home-topo p{margin:0;font-size:.86rem;line-height:1.4}
.sim-home-corpo{padding:0 14px;margin-top:-14px;position:relative;z-index:1}
.sim-home-mapa{position:relative;border-radius:14px;height:130px;overflow:hidden;box-shadow:0 1px 2px rgba(0,0,0,.08)}
.sim-home-mapa-svg{position:absolute;inset:0;width:100%;height:100%;display:block}
.sim-home-placa{position:absolute;top:8px;left:8px;background:#fff;font-size:.62rem;font-weight:700;padding:3px 7px;border-radius:6px;box-shadow:0 1px 2px rgba(0,0,0,.08)}
/* icone real do veiculo (vista de cima), nao um pino generico -- imagem
   fixa, sem cor customizavel: pedido explicito pra "cor predominante" nao
   vazar pro mapa. */
.sim-home-pino{position:absolute;top:52%;left:58%;width:34px;transform:translate(-50%,-50%);filter:drop-shadow(0 2px 3px rgba(0,0,0,.35))}
.sim-home-pino img{width:100%;height:auto;display:block}
.sim-home-expandir{position:absolute;bottom:8px;right:8px;width:22px;height:22px;background:#fff;border-radius:6px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 2px rgba(0,0,0,.08)}
.sim-home-expandir svg{width:12px;height:12px;color:rgba(18,22,31,.7)}
.sim-home-card{display:flex;align-items:center;gap:10px;background:#eef1f4;border-radius:14px;padding:10px;margin-top:10px}
.sim-home-card-foto{flex:none;width:36px;height:36px;border-radius:10px;background:#12161f;color:#fff;display:flex;align-items:center;justify-content:center}
.sim-home-card-foto svg{width:18px;height:18px}
.sim-home-card-txt{flex:1;display:flex;flex-direction:column;min-width:0}
.sim-home-card-txt b{font-size:.78rem}
.sim-home-card-txt span{font-size:.68rem;color:rgba(18,22,31,.45)}
.sim-home-card-vel{flex:none;font-size:.9rem;font-weight:700;text-align:center;line-height:1.1}
.sim-home-card-vel i{display:block;font-style:normal;font-size:.56rem;font-weight:500;color:rgba(18,22,31,.45)}
.sim-home-card-ignicao{flex:none;width:28px;height:28px;border-radius:8px;background:rgba(194,51,53,.12);color:#c23335;display:flex;align-items:center;justify-content:center}
.sim-home-card-ignicao svg{width:13px;height:13px}
/* divisor grosso arredondado, so' pra separar visualmente o bloco de
   fatura/SAC/SOS do resto -- pedido explicito, com respiro em cima e
   embaixo (margin cuida disso, entao a linha2 nao precisa de margin propria). */
.sim-home-separador{width:110px;height:6px;border-radius:var(--pill);background:#e5e8ec;margin:14px auto}
.sim-home-linha2{display:flex;gap:8px}
.sim-home-fatura{flex:1;background:#eef1f4;border-radius:12px;padding:9px 10px;font-size:.68rem;color:rgba(18,22,31,.7)}
/* cor fixa (nao mais var(--sim-cor)): "cor predominante" e' so' pro fundo
   da faixa de boas-vindas, pedido explicito pra nao vazar pra ca. */
.sim-home-fatura b{background:#12161f;color:#fff;border-radius:5px;padding:0 5px;margin-right:4px}
.sim-home-mini{flex:none;width:52px;background:#eef1f4;border-radius:12px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:6px 0;font-size:.58rem;font-weight:700;color:#12161f}
.sim-home-mini svg{width:14px;height:14px}
.sim-home-mini-sos{color:#c23335}
.sim-home-tabs{position:absolute;left:0;right:0;bottom:0;display:flex;border-top:1px solid #e5e8ec;background:#fff;padding:8px 4px 10px}
.sim-home-tabs span{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;font-size:.56rem;color:rgba(18,22,31,.45)}
.sim-home-tabs span svg{width:16px;height:16px}
.sim-home-tabs span.ativo{color:#12161f}

/* tela inicial do celular -- unico lugar onde o icone do app (e o nome, de
   novo) aparecem de verdade: nenhum app mostra o proprio icone por dentro
   de si mesmo, entao sem essa tela o campo "Icone" nao tinha onde se ver. */
.sim-tela-icone{background:linear-gradient(165deg,#4a5568,#1a202c 70%);padding:34px 18px 0;display:flex;flex-direction:column}
/* align-items:start (nao o "stretch" padrao do grid) e' o que importa aqui:
   sem isso, a linha que tem o icone de verdade (mais alta, por causa do
   rotulo de texto embaixo) esticava a ALTURA dos icones vazios vizinhos na
   mesma linha; e' o aspect-ratio:1 deles reagindo a essa altura esticada
   que fazia a COLUNA inteira do icone de verdade sair menor que as outras
   (achado real via inspecao de grid-template-columns computado no
   navegador -- uma coluna vinha 47px contra 67px das demais). */
.sim-icone-grade{flex:1;display:grid;grid-template-columns:repeat(3,1fr);gap:20px 10px;align-content:start;align-items:start}
.sim-icone-outro{aspect-ratio:1;border-radius:24%;background:rgba(255,255,255,.16);transition:transform .18s ease}
.sim-icone-app{display:flex;flex-direction:column;align-items:center;gap:5px;min-width:0;cursor:pointer}
/* fundo branco e' so' pro icone PADRAO (.padrao, tem margem transparente
   por natureza e precisa de uma "placa" atras pra nao ficar com buraco).
   Um icone ENVIADO fica sem fundo nenhum -- pedido explicito: um arquivo
   que ja' vem pronto (cantos + fundo proprios, tipico de export de app
   real) mostrava um contorno branco esquisito onde o arredondamento dele
   nao batia exatamente com o nosso border-radius:24%; sem fundo aqui,
   esse descompasso nao tem mais o que revelar. */
.sim-icone-app-img{position:relative;display:block;width:100%;aspect-ratio:1;border-radius:24%;overflow:hidden;box-shadow:0 3px 8px rgba(0,0,0,.32);transition:transform .18s ease}
.sim-icone-app-img.padrao{background:#fff}
/* mesma folga de 1px que .sim-tela -- sem ela, o mesmo gap de sub-pixel
   deixava o fundo branco do container vazar na curva do icone. */
.sim-icone-app-img img{position:absolute;inset:-1px;width:calc(100% + 2px);height:calc(100% + 2px);object-fit:cover;display:block}
.sim-icone-app b{font-size:.6rem;font-weight:500;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* hover no icone real: ele cresce e os vazios ao redor encolhem de leve,
   como se fossem empurrados -- :has() da' pra fazer isso so' com CSS. */
.sim-icone-app:hover .sim-icone-app-img{transform:scale(1.1)}
.sim-icone-grade:has(.sim-icone-app:hover) .sim-icone-outro{transform:scale(.92)}
/* ultima linha da grade "afunda" num fade, em vez de terminar seca colada
   no dock -- mascara vertical em cada quadrado vazio da ultima linha. */
.sim-icone-grade > *:nth-last-child(-n+3){
  -webkit-mask-image:linear-gradient(to bottom,#000 55%,transparent 100%);
  mask-image:linear-gradient(to bottom,#000 55%,transparent 100%);
}
.sim-icone-dock{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;background:rgba(255,255,255,.14);border-radius:26px;margin:0 0 18px;padding:11px 14px}

/* .cta-cx e' sitewide com align-items:end (ambos os lados terminam na
   mesma linha de baixo) -- funciona quando os 2 lados tem altura parecida,
   mas aqui o texto da esquerda (so' selo+titulo) e' bem mais curto que o da
   direita (paragrafo+botao), entao o "end" sobrava respiro so' em cima da
   esquerda. Scoped so' pra essa pagina, nao mexe no padrao das outras. */
.sim-solucao + .cta .cta-cx{align-items:center}
.sim-icone-dock .sim-icone-outro{background:rgba(255,255,255,.32)}

@media (max-width:900px){
  .sim-grade{grid-template-columns:1fr}
  .sim-preview{position:static}
}

/* modal de recorte -- pan+zoom num canvas, pra nenhuma imagem enviada pelo
   revendedor entrar esticada ou cortada no lugar errado no mockup. */
.sim-crop-modal{position:fixed;inset:0;z-index:200;background:rgba(11,18,32,.72);display:flex;align-items:center;justify-content:center;padding:20px}
.sim-crop-modal[hidden]{display:none}
.sim-crop-cx{background:#fff;border-radius:var(--r-lg);padding:clamp(20px,3vw,28px);max-width:380px;width:100%;box-shadow:var(--sombra-md)}
.sim-crop-cx h3{margin:0 0 4px;font-size:1.05rem}
.sim-crop-dica{margin:0 0 16px;font-size:.82rem;color:var(--tinta-45)}
.sim-crop-area{
  margin:0 auto;width:300px;border-radius:var(--r-sm);overflow:hidden;background:#111;
  touch-action:none;cursor:grab;box-shadow:0 0 0 1px var(--linha);
}
.sim-crop-area:active{cursor:grabbing}
.sim-crop-area canvas{display:block}
.sim-crop-zoom{display:flex;align-items:center;gap:10px;margin-top:18px;color:var(--tinta-45)}
.sim-crop-zoom svg{width:16px;height:16px;flex:none}
.sim-crop-zoom svg:last-child{width:18px;height:18px}
.sim-crop-zoom input[type="range"]{flex:1}
.sim-crop-acoes{display:flex;gap:10px;margin-top:20px}
.sim-crop-acoes .btn{flex:1}

/* ---------- verificador j16 (/ferramentas/verificador-j16/) ---------- */
/* achado real: .verif-checklist e .verif-veredito tem display:flex, que (regra
   normal de autor) vence o display:none de UA do atributo [hidden] mesmo com
   JS setando .hidden=true -- sem isso os dois ficavam sempre visiveis (circulos
   vazios na carga da pagina, e o veredito "Parabens" nao sumia ao resetar). */
.verif-checklist[hidden],.verif-veredito[hidden]{display:none}
.verif-solucao .calc-fonte{text-align:center}
.verif-solucao + .cta{padding-top:clamp(14px,2vw,24px)}
.verif-grade{display:flex;justify-content:center;margin-top:clamp(28px,3.4vw,40px)}
.verif-card{width:100%;max-width:560px}
.verif-imei-cx{position:relative}
.verif-imei-cx input{
  width:100%;font-family:var(--mono);font-size:1.05rem;letter-spacing:.03em;
  padding:12px 68px 12px 14px;border:1px solid var(--linha);border-radius:var(--r-sm);
  background:#fff;color:var(--tinta);
}
.verif-imei-cx input:focus{outline:2px solid rgba(168,40,42,.25);outline-offset:1px}
.verif-imei-contador{
  position:absolute;right:14px;top:50%;transform:translateY(-50%);
  font-family:var(--mono);font-size:.76rem;color:var(--tinta-45);pointer-events:none;transition:color .2s;
}
.verif-imei-contador.completo{color:#01ab44;font-weight:700}
.verif-onde-btn{
  display:inline-block;margin-top:9px;font:inherit;font-size:.78rem;font-weight:600;color:var(--carmim);
  background:none;border:0;padding:0;cursor:pointer;text-decoration:underline;text-decoration-color:rgba(168,40,42,.35);
}
.verif-onde{margin-top:10px;background:var(--osso-2);border-radius:var(--r-sm);padding:12px 14px;font-size:.8rem;color:var(--tinta-70);line-height:1.5}
.verif-vazio{margin:22px 0 0;padding:18px 0 4px;font-size:.86rem;color:var(--tinta-45);text-align:center;border-top:1px solid var(--linha)}
.verif-checklist{display:flex;flex-direction:column;margin-top:18px;border-top:1px solid var(--linha)}
.verif-item{display:flex;align-items:center;gap:14px;padding:13px 2px;border-bottom:1px solid var(--linha)}
.verif-item-ico{
  flex:none;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;
  background:var(--osso-2);color:var(--tinta-45);transition:background .2s,color .2s;
}
.verif-item-ico svg{width:15px;height:15px}
.verif-item.ok .verif-item-ico{background:rgba(1,171,68,.14);color:#01ab44}
.verif-item-spinner{width:13px;height:13px;border-radius:50%;border:2px solid rgba(11,18,32,.15);border-top-color:var(--tinta-45);animation:verifGira .7s linear infinite}
@keyframes verifGira{to{transform:rotate(360deg)}}
.verif-item-texto{display:flex;flex-direction:column;gap:2px;min-width:0}
.verif-item-texto b{font-size:.9rem;font-weight:600;color:var(--tinta)}
.verif-item-texto span{font-size:.78rem;color:var(--tinta-45);line-height:1.4}
.verif-veredito{margin-top:18px;border-radius:var(--r-md);padding:18px 20px;display:flex;flex-direction:column;gap:10px;animation:verifSurge .3s ease}
@keyframes verifSurge{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.verif-veredito p{margin:0;font-size:.86rem;line-height:1.55;color:var(--tinta-70)}
.verif-veredito p:first-child b{font-size:.96rem}
.verif-veredito.ok{background:rgba(1,171,68,.08);border:1px solid rgba(1,171,68,.3)}
.verif-veredito.ok p:first-child b{color:#01ab44}
.verif-veredito.falha{background:rgba(168,40,42,.06);border:1px solid rgba(168,40,42,.25)}
.verif-veredito.falha p:first-child b{color:var(--carmim)}
.verif-veredito-acoes{display:flex;flex-wrap:wrap;gap:10px;margin-top:4px}
.verif-veredito-acoes .btn{padding-top:10px;padding-bottom:10px}
.verif-outro{
  font:inherit;font-size:.82rem;font-weight:600;color:var(--tinta-70);background:none;
  border:1px solid var(--linha);border-radius:var(--r-sm);padding:0 16px;cursor:pointer;
}
.verif-outro:hover{background:var(--osso-2)}

/* ---------- desenrola (/desenrola/ -- trazido de voxter.com.br/desenrola) ---------- */
/* so' o rodape da section: o topo ja' fica logo abaixo das migalhas, com
   respiro padrao de .calc-solucao -- o pedido foi so' mais folga embaixo,
   antes da section escura seguinte comecar. */
.desenrola-solucao{padding-bottom:clamp(44px,6vw,68px)}
.desenrola-grade{display:flex;justify-content:center;margin-top:clamp(28px,3.4vw,40px)}
.desenrola-card{width:100%;max-width:640px}
/* selo fora da caixa, centralizado na pagina -- icone e texto ficam na
   mesma linha de base visual (line-height:1 nos dois, senao o texto some
   um pouco mais alto que o centro geometrico do svg, mesmo bug ja visto
   no badge "atendentes online"). */
.desenrola-selo-seguro{display:flex;align-items:center;justify-content:center;gap:6px;margin-top:20px;font-family:var(--mono);font-size:.66rem;line-height:1;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--tinta-45)}
/* alinhamento por caixa (align-items:center) nao basta aqui: o box-model
   do <span> em CAIXA ALTA reserva espaco de descendente que a fonte nunca
   usa (sem minusculas), entao a TINTA do texto fica mais alta que o centro
   geometrico da propria caixa -- e o icone, sem essa folga, acaba parecendo
   pra baixo mesmo com os dois "centralizados" pela caixa. Ajuste fino
   visual (nao da' pra resolver isso so' com box-model). */
.desenrola-selo-seguro svg{width:12px;height:12px;flex:none;transform:translateY(-1.5px)}
.desenrola-selo-seguro span{display:inline-block;line-height:1}
/* align-items:center (nao o stretch padrao do flex) -- sem isso a caixa do
   campo esticava pra altura do botao "Consultar" (mais alto), sobrando
   respiro embaixo do input e descentralizando o X, que se posiciona a 50%
   da CAIXA, nao do input. */
.desenrola-busca-cx{display:flex;align-items:center;gap:10px}
.desenrola-doc-cx{flex:1}
.desenrola-busca-cx input{width:100%}
.desenrola-doc-cx input.tem-valor{padding-left:32px}
.desenrola-busca-cx .btn{flex:0 0 auto;white-space:nowrap;display:flex;align-items:center;gap:8px}
/* Corpo e largura vem da coluna da Ponte (.sec-topo:has(.tit-forte)
   .lede-destaque), como em toda pagina da casa. O corpo menor e o max-width
   de 34rem que moravam aqui eram do cabecalho antigo, de duas colunas; na
   grade da Ponte eles so' faziam esta frase destoar das outras. */
.desenrola-lede b{font-weight:700}
.desenrola-erro{color:var(--carmim)}
.desenrola-erro[hidden]{display:none}
.desenrola-campo-cab{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.desenrola-campo-cab label{margin:0}
.desenrola-online{display:flex;align-items:center;gap:6px;font-family:var(--fonte);font-size:.66rem;line-height:1;font-weight:700;letter-spacing:.01em;text-transform:uppercase;color:#01ab44;background:rgba(1,171,68,.08);border:1px solid rgba(1,171,68,.25);padding:5px 10px 5px 8px;border-radius:var(--pill);margin-bottom:6px}
.desenrola-online[hidden]{display:none}
.desenrola-online-hora{display:flex;align-items:center;line-height:1;color:#333;font-weight:400;padding-right:6px;border-right:1px solid rgba(1,171,68,.25)}
.desenrola-online-texto{display:inline-block;line-height:1}

/* relogio tipo letreiro/painel de aeroporto: cada digito e' uma janelinha
   (overflow:hidden) com o digito ANTIGO e o NOVO empilhados; ao trocar, o
   antigo sobe e sai, o novo sobe e entra por baixo -- .girando dispara a
   transicao (ver atualizaRelogioBadge/giraDigito no JS). font-variant-
   numeric:tabular-nums garante que todo digito tem a MESMA largura, senao
   a janelinha "pula" de tamanho a cada troca. */
.hora-slot{position:relative;display:inline-block;overflow:hidden;height:1em;width:.62em;vertical-align:top;font-variant-numeric:tabular-nums}
.hora-slot-old,.hora-slot-new{position:absolute;left:0;top:0;width:100%;text-align:center}
.hora-slot-new{transform:translateY(100%)}
.hora-dp{display:inline-block;padding:0 1px}
@media (prefers-reduced-motion:no-preference){
  .hora-slot.girando .hora-slot-old{transition:transform .32s cubic-bezier(.4,0,.2,1);transform:translateY(-100%)}
  .hora-slot.girando .hora-slot-new{transition:transform .32s cubic-bezier(.4,0,.2,1);transform:translateY(0)}
}
.desenrola-online-dot{position:relative;width:7px;height:7px;border-radius:50%;background:#01ab44;flex:none}
@media (prefers-reduced-motion:no-preference){
  .desenrola-online-dot::after{content:"";position:absolute;inset:-6px;border-radius:50%;border:1.5px solid #01ab44;animation:pulsoAberto 1.8s ease-out infinite}
}
.desenrola-loader{width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:verifGira .7s linear infinite}

.desenrola-resultado{max-width:640px;margin:26px auto 0;animation:verifSurge .3s ease}
.desenrola-cliente{display:flex;align-items:center;gap:14px;background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);padding:20px 22px;box-shadow:var(--sombra-sm);margin-bottom:20px}
.desenrola-cliente-ico{flex:0 0 auto;width:48px;height:48px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(168,40,42,.08);color:var(--carmim)}
.desenrola-cliente-ico svg{width:22px;height:22px}
.desenrola-cliente h3{margin:2px 0 0;font-size:1.15rem}

.desenrola-divida{background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);padding:clamp(20px,2.4vw,28px);box-shadow:var(--sombra-sm)}
.desenrola-divida-cab{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;padding-bottom:20px;border-bottom:1px solid var(--linha)}
.desenrola-divida-cab h4{margin:0;font-size:1.05rem}
.desenrola-divida-original{display:flex;flex-direction:column;align-items:flex-end;gap:2px}
.desenrola-divida-original span:last-child{font-size:1.1rem;color:var(--tinta-45);text-decoration:line-through}

.desenrola-oferta{position:relative;text-align:center;background:var(--osso);border:1px solid rgba(168,40,42,.18);border-radius:var(--r-md);padding:22px 20px;margin:32px 0 22px}
.desenrola-oferta-selo{position:absolute;top:-11px;right:18px;background:#01ab44;color:#fff;font-family:var(--mono);font-size:.68rem;font-weight:700;letter-spacing:.03em;padding:4px 10px;border-radius:var(--r-sm);box-shadow:var(--sombra-sm)}
.desenrola-oferta .rot{color:var(--carmim);display:block;margin-top:6px}
.desenrola-oferta-valor{display:block;font-family:var(--fonte);font-weight:800;font-size:1.7rem;color:var(--tinta);margin-top:2px}
.desenrola-oferta-nota{display:block;font-size:.78rem;color:var(--tinta-45);margin-top:4px}

.desenrola-canais h4{margin:0 0 14px;font-size:.98rem}
.desenrola-canais-grade{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.desenrola-canal{display:flex;flex-direction:column;align-items:center;text-align:center;gap:6px;padding:20px 14px;border:1px solid var(--linha);border-radius:var(--r-md);text-decoration:none;transition:border-color .2s,box-shadow .2s,transform .2s}
.desenrola-canal:hover{border-color:var(--carmim);box-shadow:var(--sombra-sm);transform:translateY(-2px)}
.desenrola-canal-ico{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:rgba(168,40,42,.08);color:var(--carmim);margin-bottom:2px}
.desenrola-canal-ico svg{width:20px;height:20px}
.desenrola-canal b{font-size:.92rem;color:var(--tinta)}
.desenrola-canal span{font-family:var(--mono);font-size:.82rem;color:var(--tinta-70)}
.desenrola-canal i{font-style:normal;font-size:.72rem;color:var(--tinta-45)}
.desenrola-horario{display:flex;align-items:center;justify-content:center;gap:9px;margin:18px 0 0;font-size:.82rem;color:var(--tinta-45)}

.desenrola-regular{text-align:center;background:rgba(1,171,68,.08);border:1px solid rgba(1,171,68,.3);border-radius:var(--r-lg);padding:clamp(28px,3vw,40px) 24px}
.desenrola-regular-ico{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:rgba(1,171,68,.12);color:#01ab44;margin-bottom:14px}
.desenrola-regular-ico svg{width:24px;height:24px}
.desenrola-regular h4{margin:0 0 8px;font-size:1.1rem}
.desenrola-regular p{margin:0;color:var(--tinta-70)}

@media (max-width:700px){
  .desenrola-busca-cx{flex-direction:column}
  .desenrola-canais-grade{grid-template-columns:1fr}
  .desenrola-divida-cab{flex-direction:column;align-items:flex-start}
  .desenrola-divida-original{align-items:flex-start}
}

/* vantagens: mesma receita fixa do "video solo em destaque" (.video-solucao/
   .video-solo-fundo em site.css, ~linha 2080) -- metade clara (osso-2) em
   cima, faixa vermelha solida atras na base. Nome proprio (nao reusa as
   classes .video-*) pra nao sugerir que esta section tem video. Motivo de
   nao usar navy solido aqui: a section anterior a esta (rodape) TAMBEM e'
   navy -- duas secoes escuras iguais coladas viram um bloco so', sem
   separacao nenhuma. */
.desenrola-vantagens{position:relative;z-index:0;padding-top:clamp(48px,6.5vw,72px);padding-bottom:clamp(48px,6.5vw,72px)}
.desenrola-vantagens-fundo{position:absolute;z-index:-1;left:0;right:0;bottom:0;height:44%;background:var(--carmim);pointer-events:none}
/* a faixa vermelha termina exatamente onde o rodape (tambem escuro) comeca.
   Isto aqui dependia de um override (.desenrola-vantagens + .rodape) que
   zerava o margin-top do rodape so' nesta pagina; o margin-top saiu de vez
   (ver .rodape), entao o encontro agora e' limpo em qualquer pagina. */

/* ---------- calculadora operacional (/ferramentas/calculadora-operacional/) ---------- */
/* trilha do slider preenchida via --pct (setado no JS a cada input) --
   acabamento revisado pra bater com o slider da LP original
   (montesuaempresaderastreamento): puxador maior (24px) e sombra mais funda,
   pedido explicito do usuario ("o mesmo nivel de acabamento no CSS da barra
   seletora" pra TODAS as calculadoras de /ferramentas/). Compartilhado pelas
   3 paginas do site que usam input[type=range]: Calculadora Operacional,
   /montesuacentral/ e o zoom de recorte do Simulador de App.
   ACHADO REAL (o "preenchido e a bolinha nao parecem conectados" reportado
   pelo usuario): o input de range vive dentro de .calc-campo, cuja regra
   generica ".calc-campo input" da padding:10px 12px e border:1px pra
   campos de texto/numero. Com box-sizing:border-box, altura minima de um
   elemento nao pode ficar abaixo de padding+border (miolo nao pode ser
   negativo) -- entao o range virava uma caixa de ~22px em vez dos 6px
   pedidos aqui, com aquela borda clara sobrando ao redor da trilha e do
   puxador. padding/border:0 abaixo anulam isso (especificidade ja favorece
   este seletor, so' faltava a propriedade). A LP original nunca teve esse
   problema pq o range dela nao vivia dentro de um campo de formulario
   generico. */
.opc-solucao input[type=range],.msc-dinheiro input[type=range],.sim-crop-zoom input[type=range]{
  -webkit-appearance:none;appearance:none;width:100%;height:6px;padding:0;border:0;border-radius:var(--pill);outline:none;margin:4px 0 0;
  background:linear-gradient(90deg,var(--carmim) 0%,var(--carmim) var(--pct,15%),var(--osso-2) var(--pct,15%),var(--osso-2) 100%);
}
.opc-solucao input[type=range]::-webkit-slider-thumb,.msc-dinheiro input[type=range]::-webkit-slider-thumb,.sim-crop-zoom input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none;appearance:none;box-sizing:border-box;width:24px;height:24px;border-radius:50%;
  background:#fff;border:4px solid var(--carmim);cursor:grab;box-shadow:0 4px 14px rgba(0,0,0,.35);
}
.opc-solucao input[type=range]::-webkit-slider-thumb:active,.msc-dinheiro input[type=range]::-webkit-slider-thumb:active,.sim-crop-zoom input[type=range]::-webkit-slider-thumb:active{cursor:grabbing;transform:scale(1.08)}
.opc-solucao input[type=range]::-moz-range-thumb,.msc-dinheiro input[type=range]::-moz-range-thumb,.sim-crop-zoom input[type=range]::-moz-range-thumb{box-sizing:border-box;width:24px;height:24px;border-radius:50%;background:#fff;border:4px solid var(--carmim);cursor:grab;box-shadow:0 4px 14px rgba(0,0,0,.35)}
.opc-solucao input[type=range]::-moz-range-track,.msc-dinheiro input[type=range]::-moz-range-track,.sim-crop-zoom input[type=range]::-moz-range-track{background:transparent}
/* /montesuacentral/ reaproveita o MESMO slider da calculadora operacional
   (pedido explicito do usuario: "pode ser exatamente a mesma da LP"), mas a
   section aqui e' escura (.secao-escura) -- os componentes .opc-* tem cor
   explicita fixa (pensada pra fundo claro) que precisa de override; ver o
   bloco ".msc-dinheiro .opc-*" perto de ".msc-conta-card" mais abaixo. */
.opc-slider-cab{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:6px;gap:10px}
.opc-slider-cab label{margin:0}
.opc-slider-cab-val{display:flex;align-items:baseline;gap:8px;font-family:var(--mono);font-weight:700;font-size:1.05rem;color:var(--tinta);font-variant-numeric:tabular-nums}
.opc-badge{font-family:var(--mono);font-size:.6rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--carmim);background:rgba(168,40,42,.1);border:1px solid rgba(168,40,42,.25);border-radius:var(--pill);padding:2px 8px}
.opc-slider-legenda{display:flex;justify-content:space-between;align-items:center;margin-top:7px;font-size:.72rem;color:var(--tinta-45);font-weight:600}
.opc-mais-cap{display:inline-flex;align-items:center;gap:7px}
.opc-mais-btn{
  display:inline-flex;align-items:center;justify-content:center;width:19px;height:19px;padding:0;border-radius:6px;
  border:1px solid var(--linha);background:none;color:var(--tinta-45);font-size:13px;font-weight:800;line-height:1;cursor:pointer;
  transition:border-color .18s,color .18s,background .18s,box-shadow .18s,transform .18s;
}
.opc-mais-btn:hover,.opc-mais-btn.ativo{border-color:var(--carmim);color:#fff;background:var(--carmim);box-shadow:0 5px 14px -5px rgba(168,40,42,.7);transform:translateY(-1px)}
.opc-mais-caixa{
  margin-top:12px;display:flex;align-items:center;gap:8px;flex-wrap:nowrap;background:var(--osso-2);
  border:1px solid var(--linha);border-radius:var(--r-sm);padding:8px 8px 8px 12px;animation:opcPlop .22s ease;
}
/* achado real (mesma familia do bug ja corrigido no verificador-j16): display:flex
   incondicional vence o display:none de UA do atributo [hidden] -- sem isso a caixa
   "Mais de 1.000?" nunca fechava de verdade ao voltar pro controle do slider. */
.opc-mais-caixa[hidden]{display:none}
@keyframes opcPlop{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.opc-mais-caixa > span{flex:none;font-size:.78rem;font-weight:600;color:var(--tinta-70);white-space:nowrap}
.opc-mais-input{
  flex:1 1 auto;min-width:0;width:auto;font-family:var(--mono);font-weight:700;font-size:.86rem;color:var(--tinta);background:#fff;
  border:1px solid var(--linha);border-radius:var(--r-sm);padding:7px 10px;
}
.opc-mini-ok,.opc-mini-x{width:30px;height:30px;flex:none;border:0;border-radius:var(--r-sm);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}
.opc-mini-ok svg,.opc-mini-x svg{width:14px;height:14px}
.opc-mini-ok{background:var(--carmim);color:#fff}
.opc-mini-ok:hover{background:var(--carmim-vivo)}
.opc-mini-x{background:#fff;border:1px solid var(--linha);color:var(--tinta-45)}
.opc-mini-x:hover{background:var(--osso-2)}
.opc-barra{display:flex;width:100%;height:10px;border-radius:var(--pill);overflow:hidden;background:var(--osso-2);margin:16px 0 8px}
.opc-barra-seg{height:100%;transition:width .25s ease}
.opc-barra-custo{background:#c9432f}
.opc-barra-lucro{background:#01ab44}
.opc-barra-legenda{display:flex;justify-content:space-between;font-size:.76rem;color:var(--tinta-70);margin-bottom:14px}
.opc-barra-legenda b{color:var(--tinta);margin-left:3px;font-variant-numeric:tabular-nums}
.opc-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px;vertical-align:middle}
.opc-dot-custo{background:#c9432f}
.opc-dot-lucro{background:#01ab44}
.opc-crescimento{margin-top:6px;padding-top:16px;border-top:1px solid var(--linha)}
.opc-crescimento-titulo{margin:0 0 10px;font-size:.72rem;font-weight:700;color:var(--tinta-45);text-transform:uppercase;letter-spacing:.05em;font-family:var(--mono)}
.opc-marco-grade{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.opc-marco{background:var(--osso-2);border-radius:var(--r-sm);padding:12px 10px;text-align:center;display:flex;flex-direction:column;gap:3px}
.opc-marco span{font-size:.66rem;font-weight:700;color:var(--tinta-45);text-transform:uppercase;letter-spacing:.04em}
.opc-marco b{font-size:.86rem;font-weight:700;color:var(--tinta);font-variant-numeric:tabular-nums}
.opc-marco i{font-style:normal;font-size:.82rem;font-weight:700;font-variant-numeric:tabular-nums}
.opc-anual{
  display:flex;flex-direction:column;gap:3px;background:var(--osso-2);border:1px solid var(--linha);
  border-radius:var(--r-sm);padding:14px 16px;margin-top:16px;
}
.opc-anual span{font-size:.76rem;font-weight:600;color:var(--tinta-70)}
.opc-anual b{font-size:1.7rem;font-variant-numeric:tabular-nums}
.opc-anual small{font-size:.74rem;color:var(--tinta-45);line-height:1.5;margin-top:2px}
/* faturamento = so' um fato (nunca negativo), fica neutro feito as outras
   linhas de receita da lista acima -- nao compete visualmente com o veredito
   do lucro logo abaixo. */
.opc-anual-receita b{color:var(--tinta)}
/* lucro liquido = o veredito: a CAIXA INTEIRA (fundo+borda), nao so' o
   numero, muda com o sinal -- pedido explicito pra diferenciar claramente da
   caixa de faturamento (que fica sempre neutra) em fundo E valor. */
.opc-anual-lucro.opc-valor-pos{background:rgba(37,99,235,.08);border-color:rgba(37,99,235,.3)}
.opc-anual-lucro.opc-valor-pos b{color:#2563eb}
.opc-anual-lucro.opc-valor-neg{background:rgba(211,47,47,.07);border-color:rgba(211,47,47,.3)}
.opc-anual-lucro.opc-valor-neg b{color:#d32f2f}
/* lucro/caixa positivo (nas linhas da lista e nos marcos) NAO usa a cor de
   marca (carmim = vermelho = prejuizo aqui) -- azul quando >=0, vermelho
   quando <0. Seletor por ID pra vencer, de forma nao-ambigua, o color: de
   ".calc-linha-total b", sem depender de ordem de declaracao. */
#opcResLucro.opc-valor-pos,#opcResCaixa.opc-valor-pos,
#opcMarco1Lucro.opc-valor-pos,#opcMarco6Lucro.opc-valor-pos,#opcMarco12Lucro.opc-valor-pos{color:#2563eb}
#opcResLucro.opc-valor-neg,#opcResCaixa.opc-valor-neg,
#opcMarco1Lucro.opc-valor-neg,#opcMarco6Lucro.opc-valor-neg,#opcMarco12Lucro.opc-valor-neg{color:#d32f2f}
.opc-outros-linhas{display:flex;flex-direction:column;gap:8px}
.opc-outros-linha{display:flex;align-items:center;gap:8px}
.opc-outros-linha input{flex:1;min-width:0}
.opc-outros-controles{display:flex;gap:6px;flex:none}
.opc-outros-add,.opc-outros-remove{
  width:34px;height:34px;flex:none;border-radius:var(--r-sm);display:inline-flex;align-items:center;justify-content:center;
  font-size:16px;font-weight:700;line-height:1;cursor:pointer;background:none;border:1px solid var(--linha);color:var(--tinta-45);
  transition:background .15s,border-color .15s,color .15s;
}
.opc-outros-add:hover{border-color:var(--carmim);color:var(--carmim)}
.opc-outros-remove:hover{border-color:#d32f2f;color:#d32f2f;background:rgba(211,47,47,.06)}
@media (max-width:520px){
  .opc-marco-grade{gap:6px}
  .opc-marco{padding:10px 5px}
  .opc-marco b{font-size:.76rem}
  .opc-marco i{font-size:.72rem}
}
/* campos "avancados" revelados por pilula -- SEM propriedade display aqui:
   qualquer display incondicional (mesmo "block", igual ao padrao) venceria o
   display:none de UA do atributo [hidden] (achado real, mesma familia do bug
   ja corrigido 2x nessa leva de ferramentas). Só anima opacidade/posição. */
.opc-extra{animation:opcExtraAparece .2s ease}
@keyframes opcExtraAparece{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}

/* ---------- envio de sms (/ferramentas/envio-sms/) ---------- */
.sms-grade{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(18px,2.2vw,26px);margin-top:clamp(28px,3.4vw,40px)}
.sms-card{
  display:flex;flex-direction:column;background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);
  padding:clamp(22px,2.4vw,26px);box-shadow:var(--sombra-sm);transition:box-shadow .3s,transform .3s,border-color .3s;
}
.sms-card:hover{box-shadow:var(--sombra-md);transform:translateY(-3px);border-color:rgba(168,40,42,.3)}
.sms-card-topo{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}
.sms-card-ico{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:var(--r-md);background:rgba(168,40,42,.08);color:var(--carmim)}
.sms-card-ico svg{width:20px;height:20px}
.sms-card-tag{
  font-family:var(--mono);font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  padding:4px 10px;border-radius:var(--pill);background:var(--osso-2);color:var(--tinta-45);border:1px solid var(--linha);
}
.sms-card h3{font-size:1.1rem;margin:0 0 8px}
.sms-card > p{margin:0 0 14px;color:var(--tinta-70);font-size:.88rem;line-height:1.55}
.sms-card-fatos{list-style:none;margin:0 0 18px;padding:0;display:flex;flex-direction:column;gap:9px;flex:1}
.sms-card-fatos li{position:relative;padding-left:18px;font-size:.82rem;color:var(--tinta-70);line-height:1.5}
.sms-card-fatos li::before{content:"";position:absolute;left:0;top:.55em;width:6px;height:6px;border-radius:50%;background:rgba(1,171,68,.7)}
.sms-card-link{margin-top:auto;font-size:.86rem;font-weight:700;color:var(--carmim);text-decoration:none}
.sms-card-link i{margin-left:2px;font-style:normal}
@media (max-width:900px){
  .sms-grade{grid-template-columns:1fr}
}

/* ---------- cobertura de sinal movel (/ferramentas/cobertura-movel/) ---------- */
.cob-ou{display:flex;align-items:center;gap:10px;margin:4px 0 16px;color:var(--tinta-45);font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;font-family:var(--mono)}
.cob-ou::before,.cob-ou::after{content:"";flex:1;height:1px;background:var(--linha)}
.cob-resultado-cab{display:flex;align-items:baseline;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:16px}
.cob-resultado-cab h3{font-size:1.15rem}
.cob-tecs{margin:0}
.cob-tecs button{padding:5px 11px;font-size:.72rem}
.cob-metrica-seg{width:100%;margin:0 0 18px}
.cob-metrica-seg button{padding:9px 12px;font-size:.86rem;font-weight:700}
.cob-metrica-grupo{margin-bottom:18px}
.cob-metrica-desc{font-size:.82rem;color:var(--tinta-45);margin:0 0 10px}
.cob-tiers{display:flex;flex-wrap:wrap;gap:8px}
.cob-tier{
  flex:1 1 0;min-width:70px;background:#fff;border:1px solid var(--linha);border-radius:var(--r-sm);padding:12px 8px;text-align:center;
  transition:scale .3s cubic-bezier(.2,.7,.3,1),box-shadow .3s,border-color .3s;
}
.cob-tier:hover{scale:1.025;box-shadow:var(--sombra-md);border-color:rgba(168,40,42,.25)}
.cob-tier span{display:block;font-family:var(--mono);font-size:.66rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--tinta-45);margin-bottom:6px}
.cob-tier b{display:block;font-size:1.35rem;color:var(--carmim);line-height:1.1}
.cob-tabela-titulo{font-size:.86rem;font-weight:700;color:var(--tinta-70);margin:20px 0 10px}
.cob-tabela-wrap{overflow-x:auto}
.cob-tabela{width:100%;border-collapse:collapse;font-size:.86rem}
.cob-tabela th,.cob-tabela td{padding:9px 8px;text-align:center;white-space:nowrap}
.cob-tabela th:first-child,.cob-tabela td:first-child{text-align:left}
.cob-tabela thead th{font-family:var(--mono);font-size:.66rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--tinta-45);border-bottom:1px solid var(--linha);padding-bottom:8px}
.cob-tabela tbody td{border-top:1px solid var(--linha)}
.cob-tabela tbody td:first-child{font-weight:600}
.cob-tabela-nota{font-size:.84rem;color:var(--tinta-45);padding:14px 0}
@media (max-width:560px){
  .cob-tiers{grid-template-columns:repeat(2,1fr)}
}

/* ---------- mapa de erb (/ferramentas/antenas/) ---------- */
.erb-controles{
  display:flex;gap:22px;align-items:center;flex-wrap:wrap;margin-top:clamp(28px,3.4vw,40px);
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);
  padding:clamp(16px,2vw,20px) clamp(18px,2.2vw,24px);box-shadow:var(--sombra-sm);
}
.erb-bloco{margin:0}
.erb-bloco-uf{min-width:220px}
.erb-bloco-uf select{
  width:100%;font-family:inherit;font-size:.92rem;color:var(--tinta);background:#fff;
  border:1px solid var(--linha);border-radius:var(--r-sm);padding:10px 12px;
}
.erb-select-inativo{color:var(--tinta-45) !important;border-color:var(--linha) !important;background-color:var(--osso-2) !important}
.erb-bloco-cidade{min-width:240px}
.erb-bloco-cidade input{
  width:100%;font-family:inherit;font-size:.92rem;color:var(--tinta);background:#fff;
  border:1px solid var(--linha);border-radius:var(--r-sm);padding:10px 12px;
}
/* seta customizada com mais recuo da borda -- padrao unico pra todo select de ferramenta.
   vem depois das regras base (.calc-campo select / .erb-bloco-uf select) de proposito:
   ambas usam "background"/"padding" em shorthand, que reseta os sub-valores daqui se vier antes. */
.calc-campo select,.erb-bloco-uf select{
  -webkit-appearance:none;-moz-appearance:none;appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='rgba(11,18,32,.55)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;background-size:15px;
  padding-right:34px;
}
.calc-campo select::-ms-expand,.erb-bloco-uf select::-ms-expand{display:none}
.erb-rotulo{display:block;font-family:var(--mono);font-size:.66rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--tinta-45);margin-bottom:8px}
.erb-filtros{display:flex;gap:22px;flex-wrap:wrap;align-items:center}
/* .calc-chips tem margin-bottom:8px (pensado pra formulario vertical, onde
   sobra espaco pro campo seguinte); aqui dentro da barra horizontal essa
   margem empurrava as pilulas pra cima dentro do proprio .erb-bloco (a
   margem conta na altura do bloco, mas fica so' embaixo, deslocando o
   conteudo visivel ~4px pra cima do centro real da barra). */
.erb-filtros .calc-chips{margin-bottom:0}
.erb-filtros[hidden]{display:none}
.erb-separador{width:1px;align-self:stretch;background:var(--linha)}
.erb-controles-direita{display:flex;gap:8px;margin-left:auto}
.erb-camada-sel{position:relative;z-index:5}
.erb-fullscreen-btn{
  display:flex;align-items:center;justify-content:center;flex:none;width:42px;
  font:inherit;color:var(--tinta-70);background:#fff;border:1px solid var(--linha);
  border-radius:var(--r-sm);cursor:pointer;transition:border-color .2s,color .2s;
}
.erb-fullscreen-btn:hover,.erb-fullscreen-btn.ativo{border-color:rgba(168,40,42,.3);color:var(--carmim)}
.erb-fullscreen-btn svg{width:17px;height:17px}
.erb-camada-btn{
  display:flex;align-items:center;gap:8px;font:inherit;font-size:.86rem;font-weight:600;color:var(--tinta-70);
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-sm);padding:10px 14px;cursor:pointer;
  transition:border-color .2s,color .2s;white-space:nowrap;
}
.erb-camada-btn:hover{border-color:rgba(168,40,42,.3);color:var(--carmim)}
.erb-camada-btn svg{width:17px;height:17px;flex:none}
.erb-camada-menu{
  position:absolute;top:calc(100% + 12px);right:0;z-index:5;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-md);box-shadow:var(--sombra-md);
  padding:10px;display:grid;grid-template-columns:repeat(2,1fr);gap:8px;width:190px;
}
.erb-camada-menu[hidden]{display:none}
.erb-camada-menu::before{content:"";position:absolute;top:-7px;right:18px;width:12px;height:12px;background:#fff;border-left:1px solid var(--linha);border-top:1px solid var(--linha);transform:rotate(45deg)}
.erb-camada-menu button{
  display:flex;flex-direction:column;align-items:center;gap:6px;background:none;border:1.5px solid transparent;
  border-radius:var(--r-sm);padding:6px;cursor:pointer;font:inherit;font-size:.72rem;color:var(--tinta-70);
  transition:border-color .2s,background .2s;
}
.erb-camada-menu button:hover{background:var(--osso-2)}
.erb-camada-menu button.ativo{border-color:var(--carmim);color:var(--carmim);background:rgba(168,40,42,.05)}
.erb-camada-menu img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:6px;border:1px solid var(--linha);background:var(--osso-2)}
.erb-tile-escuro{filter:invert(1) hue-rotate(180deg) brightness(.95) contrast(.9)}
.cob-atualizacao-ts,.erb-atualizacao-ts,.cob-atualizacao-proxima,.erb-atualizacao-proxima{margin-top:4px !important;font-size:.78rem !important;color:var(--tinta-45) !important}
.erb-marcador-logo span{
  display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:50%;
  border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.35);overflow:hidden;
  transition:transform .18s cubic-bezier(.2,.7,.3,1);
}
.erb-marcador-logo:hover span{transform:scale(2.2)}
.erb-marcador-logo:hover{z-index:10000 !important}
/* logos originais sao coloridos (ver chips-m2m); dentro da bolinha da marca
   viram silhueta branca pra ler por cima da cor da operadora -- a versao
   colorida de verdade aparece no popup ao clicar. */
.erb-marcador-logo img{width:58% !important;height:auto !important;filter:brightness(0) invert(1)}
.erb-mapa-cx{margin-top:18px}
.erb-mapa{position:relative;z-index:0;height:min(600px,70vh);width:100%;border-radius:var(--r-lg);border:1px solid var(--linha)}
/* "tela cheia" dentro da propria pagina (nao a Fullscreen API do navegador,
   que sai da janela do browser) -- um overlay fixed cobrindo a viewport
   inteira, so' com a barra de controles + o mapa (com seus overlays) por
   cima; z-index bem acima do nav (60) pra cobrir a pagina inteira mesmo. */
body.erb-fullscreen-travado{overflow:hidden}
.erb-fullscreen-alvo.erb-fullscreen-ativo{
  position:fixed;inset:0;z-index:300;display:flex;flex-direction:column;
  justify-content:center;gap:14px;background:var(--osso);padding:20px;
}
.erb-fullscreen-alvo.erb-fullscreen-ativo .erb-mapa-cx{margin-top:0;flex:1;min-height:0}
.erb-fullscreen-alvo.erb-fullscreen-ativo .erb-mapa{height:100%}
.erb-fullscreen-alvo.erb-fullscreen-ativo .erb-controles{margin-top:0;flex:none}
/* o widget de contato/WhatsApp (#voxter-contact-widget) e' injetado fora
   deste repo (script global do site), com z-index:999999 -- bem acima do
   overlay de fullscreen (300), entao sem isso ele fica flutuando por cima
   do mapa cheio. !important pq nao controlamos a ordem/especificidade do
   CSS dele. */
body.erb-fullscreen-travado #voxter-contact-widget{display:none !important}
/* setas de zoom do leaflet no nosso padrao visual (plano, com borda, sem
   sombra pesada), botoes separados um do outro em vez do bloco unico colado.
   !important nas 3 propriedades que o proprio leaflet.css sobrescreve em modo
   touch (.leaflet-touch .leaflet-bar tem a MESMA especificidade que a nossa
   aqui -- 2 classes -- e o navegador as vezes marca a pagina como touch mesmo
   em desktop, entao sem important o estilo deles vencia por ordem de arquivo). */
.erb-mapa .leaflet-bar{display:flex;flex-direction:column;gap:6px;border:none !important;background:transparent;box-shadow:none !important;overflow:visible}
.erb-mapa .leaflet-bar a{
  width:32px;height:32px;line-height:32px;background-color:#fff;color:var(--tinta-70);
  border:1px solid var(--linha) !important;border-radius:var(--r-sm) !important;
  font-weight:700;transition:background-color .2s,color .2s,border-color .2s;
}
.erb-mapa .leaflet-bar a:hover,.erb-mapa .leaflet-bar a:focus{background-color:var(--osso-2);color:var(--carmim);border-color:rgba(168,40,42,.3) !important}
.erb-mapa .leaflet-control-zoom-in,.erb-mapa .leaflet-control-zoom-out{font:700 18px/32px var(--mono);text-indent:0}
.erb-carregando{padding:60px 0;text-align:center;color:var(--tinta-45);font-size:.92rem}
.erb-pontos::after{content:'...';display:inline-block;width:1em;overflow:hidden;vertical-align:bottom}
@media (prefers-reduced-motion:no-preference){
  .erb-pontos::after{width:0;animation:erb-pontos-anim 1.4s steps(4) infinite}
}
@keyframes erb-pontos-anim{to{width:1em}}
.erb-contagem{margin:0;font-size:.82rem;color:var(--tinta-45);text-align:center}
/* painel de ranking por operadora ao lado da contagem -- uma unica barra
   composta (segmentos coloridos = fatia de cada operadora no total filtrado)
   em vez de 3 barras separadas, pra caber na mesma linha sem empurrar o
   mapa pra baixo. cores dos segmentos = CORES (as mesmas dos marcadores). */
.linha-lado{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap;margin:10px 2px 0}
.linha-lado .erb-contagem{flex:1;min-width:180px;text-align:left}
.ranking-lado{flex:none;display:flex;flex-direction:column;gap:7px;min-width:200px}
.ranking-lado-barra{display:flex;height:8px;border-radius:var(--pill);overflow:hidden;background:var(--osso-2)}
.ranking-lado-seg{height:100%;transition:width .3s}
.ranking-lado-legenda{display:flex;gap:12px;font-family:var(--mono);font-size:.68rem;color:var(--tinta-70)}
.ranking-lado-legenda span{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.ranking-lado-legenda i{width:7px;height:7px;border-radius:50%;display:inline-block;flex:none}
.ranking-lado-legenda b{color:var(--tinta);font-weight:700}
@media (max-width:640px){
  .linha-lado{flex-direction:column;align-items:stretch}
  .linha-lado .erb-contagem{text-align:center}
  .ranking-lado{align-items:center}
}
.erb-mapa-assinatura{background:rgba(255,255,255,.85);padding:5px 9px;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.15);line-height:0}
.erb-mapa-assinatura img{height:14px;width:auto !important}
/* atribuicao Leaflet/OSM no mesmo padrao "chip" da assinatura Voxter (canto
   oposto) -- por padrao o leaflet cola ela nas bordas, sem fundo/sombra;
   !important pra vencer a regra deles (mesma especificidade, definida depois
   no arquivo deles) sem depender de ordem de carregamento entre stylesheets. */
.erb-mapa .leaflet-control-attribution{
  background:rgba(255,255,255,.85) !important;border-radius:4px !important;
  box-shadow:0 1px 3px rgba(0,0,0,.15) !important;margin:0 0 10px 10px !important;
  padding:5px 9px !important;
}
.erb-mapa-planos-card{
  display:flex;flex-direction:column;align-items:flex-start;gap:4px;width:136px;
  background:rgba(255,255,255,.95);border-radius:var(--r-sm);box-shadow:var(--sombra-sm);
  padding:9px 10px 10px;transition:opacity .22s;
}
.erb-mapa-planos-card:hover{box-shadow:var(--sombra-md)}
.erb-mapa-planos-card.erb-mapa-planos-fade{opacity:0}
.erb-mapa-planos-eyebrow{font-family:var(--mono);font-size:.5rem;font-weight:700;letter-spacing:.02em;text-transform:uppercase;color:var(--carmim);white-space:nowrap}
.erb-mapa-planos-card img{height:16px;width:64px !important;object-fit:contain;object-position:left center}
.erb-mapa-planos-card b{font-size:.72rem;color:var(--tinta);line-height:1.2;font-weight:700}
#erbMapaPlanosDado{font-family:var(--mono);font-size:.62rem;color:var(--tinta-45)}
/* especificidade dupla de proposito: o leaflet tem uma regra .leaflet-container a
   { color:#0078A8 } que e' mais especifica que uma classe unica e vencia essa aqui,
   deixando o texto do botao azul em vez de branco. */
.erb-mapa-planos-card .erb-mapa-planos-cta{
  display:block;align-self:stretch;text-align:center;margin-top:5px;
  background:var(--carmim);color:#fff;font-size:.66rem;font-weight:700;
  padding:6px 0;border-radius:var(--r-xs);text-decoration:none;transition:background-color .2s;
}
.erb-mapa-planos-card .erb-mapa-planos-cta:hover{background:#8a2224;color:#fff}
.leaflet-popup-content b{color:var(--tinta)}
.erb-popup{display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:1px 0}
.erb-popup img{height:24px;width:72px !important;max-width:none !important;object-fit:contain;object-position:left center}
.erb-popup-tecs{display:flex;gap:5px;flex-wrap:wrap}
.erb-popup-tec{font-family:var(--mono);font-size:.66rem;font-weight:700;letter-spacing:.03em;color:var(--tinta-70);background:var(--osso-2);border:1px solid var(--linha);border-radius:var(--r-sm);padding:3px 7px;line-height:1.3}
@media (max-width:720px){
  .erb-camada-sel{margin-left:0;width:100%}
  .erb-camada-btn{width:100%;justify-content:center}
}

/* ---------- catalogo (/catalogo/) ---------- */
/* modelo de referencia pedido pelo usuario: voxter.com.br/marketplace --
   busca no topo, categorias e marcas numa lateral fixa, grid CONTINUO a'
   direita (um so' <div class="catalogo-grade">, sem sub-grade por grupo --
   a 1a versao quebrava em varios grids pequenos, um por "linha", e sobrava
   espaco vazio enorme quando o grupo tinha so' 1-2 itens). O filtro inteiro
   e' feito escondendo/mostrando CARDS dentro dessa unica grade (ver JS no
   fim da pagina), nunca trocando a estrutura do grid. */
.catalogo-secao{padding:clamp(22px,2.6vw,32px) 0 clamp(50px,6vw,80px);border-top:1px solid var(--linha)}
.catalogo-layout{display:grid;grid-template-columns:230px 1fr;gap:clamp(24px,3vw,32px);align-items:start}

/* --- lateral: painel bem delimitado (cartao branco com borda+sombra),
   2 niveis (categoria > subcategoria expansivel, TODAS as 3 categorias tem
   sub agora -- Software/Conectividade/Equipamentos, espelhando o mega menu
   de Solucoes) com icone nos dois niveis -- replica o voxter.com.br/
   marketplace, que o usuario apontou como referencia visual mais resolvida. --- */
.catalogo-sidebar{position:sticky;top:calc(var(--secao-offset) + 16px)}
.catalogo-painel{background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);padding:22px}
/* busca da lateral: pedido explicito do usuario -- sai da barra de controles
   (onde era uma lupa que so' expandia no hover) e vira campo FIXO, do tamanho
   da coluna, ja aberto, acima de "Categorias". Sem rotulo (.rot) -- so'
   icone + campo, o placeholder ja basta. */
.catalogo-sidebar-busca{
  display:flex;align-items:center;gap:10px;width:100%;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-sm);
  padding:11px 14px;margin-bottom:24px;transition:border-color .2s;
}
.catalogo-sidebar-busca:focus-within{border-color:var(--carmim)}
.catalogo-sidebar-busca svg{width:16px;height:16px;flex:none;color:var(--tinta-45);transition:color .2s}
.catalogo-sidebar-busca:focus-within svg{color:var(--carmim)}
.catalogo-sidebar-busca input{
  flex:1;min-width:0;border:0;outline:0;background:none;
  font-family:inherit;font-size:.88rem;color:var(--tinta);
}
.catalogo-sidebar-busca input::placeholder{color:var(--tinta-45)}
.catalogo-sidebar-bloco{margin-bottom:24px}
.catalogo-sidebar-bloco:last-child{margin-bottom:0}
.catalogo-sidebar-bloco .rot{color:var(--tinta-45);display:block;margin-bottom:10px}
.catalogo-nav-cx{margin-bottom:2px}
.catalogo-nav-item{
  display:flex;align-items:center;gap:10px;width:100%;text-align:left;background:transparent;border:1px solid transparent;
  padding:8px 10px;border-radius:var(--r-sm);font-size:.88rem;
  color:var(--tinta-70);cursor:pointer;transition:background .2s,color .2s;
}
.catalogo-nav-item:hover{background:rgba(0,0,51,.05)}
.catalogo-nav-item.ativo{background:rgba(168,40,42,.08);color:var(--carmim);border-color:rgba(168,40,42,.14);font-weight:600}
.catalogo-nav-ico{flex:none;display:flex;width:16px;height:16px}
.catalogo-nav-ico svg{display:block;width:16px;height:16px}
.catalogo-nav-label{flex:1}
.catalogo-nav-chevron{flex:none;width:14px;height:14px;transition:transform .25s}
.catalogo-nav-cx.aberto .catalogo-nav-chevron{transform:rotate(180deg)}
.catalogo-nav-sub{
  display:grid;grid-template-rows:0fr;transition:grid-template-rows .25s ease;
  margin-left:10px;
}
.catalogo-nav-sub > div{overflow:hidden}
.catalogo-nav-cx.aberto .catalogo-nav-sub{grid-template-rows:1fr;margin-top:2px}
.catalogo-nav-subitem{
  display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:transparent;border:0;
  padding:6px 10px;border-radius:var(--r-sm);font-size:.82rem;color:var(--tinta-70);cursor:pointer;
}
.catalogo-nav-subitem:hover{color:var(--tinta);background:rgba(0,0,51,.05)}
.catalogo-nav-subitem.ativo{color:var(--carmim);font-weight:600}
.catalogo-nav-sub-ico{flex:none;display:flex;width:14px;height:14px;opacity:.85}
.catalogo-nav-sub-ico svg{display:block;width:14px;height:14px}
.catalogo-nav-subitem.ativo .catalogo-nav-sub-ico{opacity:1}
.catalogo-marcas-lista{display:flex;flex-wrap:wrap;gap:7px}
.catalogo-marca-pill{
  font-size:12px;font-weight:500;padding:6px 13px;border-radius:var(--pill);
  border:1px solid var(--linha);background:#fff;color:var(--tinta-70);
  cursor:pointer;transition:background .2s,color .2s,border-color .2s;
}
/* mesmo tom de vermelho do .catalogo-nav-item.ativo -- pedido explicito do
   usuario, pra marca e categoria ativas lerem como o MESMO estado visual. */
.catalogo-marca-pill.ativo{background:rgba(168,40,42,.08);border-color:rgba(168,40,42,.35);color:var(--carmim);font-weight:600}
.catalogo-limpar{
  display:block;width:100%;margin-top:32px;background:none;border:0;padding:0;
  font-family:inherit;font-size:.8rem;font-weight:500;color:var(--carmim);
  text-align:center;cursor:pointer;text-decoration:none;
}
.catalogo-limpar:hover{color:var(--carmim-vivo)}

/* botao de icone generico (quadrado, borda+fundo branco) -- reaproveitado
   pelo gatilho do modal "Categorias e Marcas" E pelo gatilho de "Ordenar"
   (ver mais abaixo), os 2 so' existem de verdade <=900px/<=760px (ver
   medias abaixo); em telas largas ficam display:none, a sidebar e o
   <select> de sempre continuam visiveis normalmente. */
.catalogo-icone-btn{
  display:none;align-items:center;justify-content:center;flex:none;
  /* 36px, nao 38: acerta a altura EXATA do grupo .catalogo-modo ao lado
     (30+28 do botao + 3+3 de padding + 1+1 de borda = 36px) -- pedido
     explicito do usuario, o de Ordenar estava nascendo 2px mais alto. */
  width:36px;height:36px;padding:0;border:1px solid var(--linha);border-radius:var(--r-sm);
  background:#fff;color:var(--tinta-70);cursor:pointer;transition:background .2s,border-color .2s;
}
.catalogo-icone-btn svg{width:17px;height:17px}
/* icone de "Ordenar" um pouco menor que o padrao -- pedido explicito do
   usuario -- sem mexer no icone de "Categorias e Marcas" (mesma classe
   .catalogo-icone-btn, botao diferente). */
#catalogoOrdenarBtn svg{width:14px;height:14px}
.catalogo-icone-btn:hover{background:var(--osso-2)}

/* linha busca+botao "Categorias e Marcas": o botao so' aparece <=900px (ver
   media abaixo) -- em tela larga a linha mostra so' a busca, identica a
   antes (o wrapper nao soma padding/margem propria, .catalogo-sidebar-busca
   segue com a MESMA margem que tinha sozinha). */
.catalogo-busca-linha{display:flex;align-items:center;gap:10px;margin-bottom:24px}
.catalogo-busca-linha .catalogo-sidebar-busca{margin-bottom:0;flex:1}

/* modal "Categorias e Marcas": em tela larga os 3 niveis de wrapper somem
   do layout (display:contents) -- Categorias/Marcas ficam filhos "diretos"
   de .catalogo-painel pra fins de caixa, exatamente como eram antes desse
   modal existir. So' na media <=900px eles viram de verdade uma folha
   deslizante (mesmo molde de .menu-movel), com display:block. */
.catalogo-filtros-modal,.catalogo-filtros-painel,.catalogo-filtros-corpo{display:contents}
.catalogo-filtros-fundo,.catalogo-filtros-cab{display:none}

/* --- barra de controles: contagem + ordenar + grade/lista, no mesmo
   "painel" da lateral (era so' texto solto antes). A busca saiu daqui --
   agora mora fixa na lateral, acima de "Categorias" (.catalogo-sidebar-busca,
   ver acima). --- */
.catalogo-controles{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:14px;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);padding:14px 18px;
  margin-bottom:clamp(20px,2.4vw,28px);
}
/* rotulo do filtro ativo (Categoria, ou Categoria / Subcategoria) antes da
   contagem -- pedido explicito do usuario, formato "Categoria | Mostrando X
   produtos". O separador reaproveita .migalhas-sep (mesmo tom de "|" ja
   usado alhures no site). So' some/aparece quando ha'/deixa de haver filtro
   (categoria "Todas" nao conta) -- SEM gap fixo aqui: o espaco antes de
   "Mostrando" vem do padding-right do proprio bloco do filtro (ver abaixo),
   que so' existe quando ele esta' visivel. */
.catalogo-contagem{display:flex;align-items:center;font-size:.88rem;color:var(--tinta-45);margin:0}
.catalogo-contagem b{color:var(--tinta)}
/* entrada/saida deslizante -- pedido explicito do usuario ("empurrando
   deslizando o Mostrando pro lado"). NAO usa grid-template-columns 0fr<->1fr
   (a 1a versao usava): esse truque so' anima ENTRADA/SAIDA -- 1fr pra 1fr nao
   e' uma mudanca de valor, entao trocar de "Categoria" pra "Categoria /
   Subcategoria" com o painel ja aberto nao disparava nada (achado real do
   usuario: "a animacao deve acontecer quando o subitem surgir tambem").
   Em vez disso, o JS mede a largura natural do rotulo (.-inner e' inline-flex,
   sempre se dimensiona pelo proprio conteudo) e aplica via width inline --
   QUALQUER troca de valor de "width" anima, entao os 3 casos (fechado->
   aberto, aberto->aberto com texto maior/menor, aberto->fechado) usam a
   MESMA transicao, sem caso especial. */
.catalogo-contagem-filtro-cx{
  flex:none;overflow:hidden;width:0;
  transition:width .3s cubic-bezier(.2,.7,.3,1);
}
.catalogo-contagem-filtro-inner{
  display:inline-flex;white-space:nowrap;align-items:center;gap:10px;padding-right:12px;
}
.catalogo-contagem-filtro{color:var(--tinta);font-weight:500}
.catalogo-controles-dir{display:flex;align-items:center;gap:8px}
.catalogo-select{
  font-family:inherit;font-size:.86rem;color:var(--tinta-70);background:#fff;
  border:1px solid var(--linha);border-radius:var(--r-sm);padding:8px 12px;cursor:pointer;margin-right:4px;
  /* seta customizada, no mesmo padrao ja' estabelecido em .calc-campo select
     / .erb-bloco-uf select -- pedido explicito do usuario, esse select ainda
     ficou com a seta nativa do navegador. */
  -webkit-appearance:none;-moz-appearance:none;appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='rgba(11,18,32,.55)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;background-size:15px;
  padding-right:34px;
}
.catalogo-select::-ms-expand{display:none}
.catalogo-modo{display:flex;gap:2px;background:#fff;border:1px solid var(--linha);border-radius:var(--r-sm);padding:3px}
.catalogo-modo-btn{display:flex;align-items:center;justify-content:center;width:30px;height:28px;border:0;background:transparent;border-radius:var(--r-xs);color:var(--tinta-45);cursor:pointer}
.catalogo-modo-btn svg{width:16px;height:16px}
/* ativo = fundo vermelho solido + icone branco (pedido do usuario -- antes
   era o inverso, fundo branco com icone vermelho, contraste fraco demais). */
.catalogo-modo-btn.ativo{background:var(--carmim);color:#fff}

/* "Ordenar" via icone+popover (<=760px, ver media abaixo): so' pilota o
   <select> de sempre (nao duplica ordena()/aplica()) -- mesmo molde visual
   do dropdown de idioma do nav (.idioma/.idioma-lista, ver mais acima). */
.catalogo-ordenar-cx{position:relative;display:none}
/* display:none (nao opacity/visibility) de proposito -- ACHADO REAL: um
   popover invisivel mas com display:block AINDA soma na area rolavel da
   pagina se a caixa extrapolar o viewport (visibility:hidden esconde a
   pintura, nao o layout). Com min-width:196px ancorado dentro de uma barra
   estreita, isso vazava pra' scroll horizontal na PAGINA INTEIRA. display:
   none elimina a caixa de vez enquanto fechado -- sem essa, nao ha' o que
   transicionar (aparece/some direto, sem fade).
   position:fixed (nao absolute) + left/top calculados no JS (ver
   posicionaOrdenarLista() no script da pagina) -- 2o ACHADO REAL: o botao
   fica perto da borda direita da barra (do lado do grupo grade/lista), e um
   popover de 196px ancorado nele (left:0 OU right:0) estourava pra' fora da
   tela de um dos dois lados dependendo da largura. Calcular a posicao em px,
   grudada nas bordas do viewport com 10px de folga, resolve pra' qualquer
   largura de tela sem precisar advinhar o lado. */
.catalogo-ordenar-lista{
  display:none;position:fixed;min-width:196px;padding:6px;z-index:130;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-md);
  box-shadow:var(--sombra-lg);
}
.catalogo-ordenar-cx.aberto .catalogo-ordenar-lista{display:block}
.catalogo-ordenar-lista button{
  display:block;width:100%;text-align:left;padding:9px 12px;border:0;background:none;border-radius:var(--r-sm);
  font-family:inherit;font-size:13.5px;color:var(--tinta-70);cursor:pointer;white-space:nowrap;
}
.catalogo-ordenar-lista button:hover{background:var(--osso-2);color:var(--tinta)}
.catalogo-ordenar-lista button[aria-current="true"]{color:var(--carmim);font-weight:600}

.catalogo-grade{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:20px}
.catalogo-vazio{padding:60px 0;text-align:center;color:var(--tinta-45)}
.catalogo-vazio p{margin:0}
/* termo buscado e filtro ativo, destacados na mensagem de "nao encontrado"
   -- pedido explicito do usuario (peso um pouco mais pesado que o regular +
   cor vermelha), pra' o filtro "culpado" pelo zero resultado saltar aos
   olhos, nao so' o termo digitado. */
.catalogo-vazio-filtro{color:var(--carmim);font-weight:600}
/* botao "Limpar Filtro" abaixo do feedback -- pedido explicito do usuario
   (branco com letra vermelha): reaproveita .btn.linha, o mesmo par
   transparente-com-borda-vermelha ja usado em "Detalhes" nos cards. */
.catalogo-vazio-limpar{margin-top:18px}
/* segunda tentativa do FAB do WhatsApp -- a 1a (mask criando um buraco +
   circulo pequeno boiando) nao batia com a referencia real do usuario:
   la' o "botao" e' uma CUNHA grande e escura que nasce do proprio canto
   (nao um circulo solto por cima), com uma curva concava separando ela do
   conteudo branco -- a seta fica encaixada perto da quina, dentro dela.
   Tecnica: .catalogo-whats-btn e' um circulo BEM maior que o botao visual
   final (150px), a maior parte dele posicionada PRA FORA do card (right/
   bottom negativos) -- o overflow:hidden do proprio .catalogo-card corta
   esse circulo gigante na forma do card (cantos arredondados), sobrando
   exatamente aquela cunha com a borda em curva. Nao precisa de mask nem de
   wrapper extra: o'overflow:hidden' de sempre ja' faz o corte sozinho. */
.catalogo-card{
  position:relative;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);overflow:hidden;
  display:flex;flex-direction:column;transition:transform .3s,box-shadow .3s;cursor:pointer;
}
/* sombra SO' no hover -- pedido do usuario, o card fica "chato"/sem elevacao
   em repouso, so' ganha profundidade quando o mouse passa por cima. */
.catalogo-card:hover{transform:translateY(-4px);box-shadow:var(--sombra-md)}
/* foto de ponta a ponta no topo do card (sem moldura/padding ao redor,
   diferente do .jmod-foto usado nas paginas de produto) -- e' exatamente o
   detalhe que faltava pra parecer "loja de verdade" em vez de teaser. */
.catalogo-card-foto{position:relative;aspect-ratio:4/3;background:var(--foto-fundo);overflow:hidden;flex:none}
/* ">" (filho direto), NAO descendente: a foto da marca (.catalogo-marca-selo)
   tambem mora dentro de .catalogo-card-foto e tem um <img> proprio (o logo)
   -- com seletor descendente essa regra vazava pra' dentro do selo (que e'
   um flex shrink-to-fit sem tamanho definido) e o width:100%/height:100%
   virava indeterminado, sobrando so' o padding do fallback .contida como
   caixa visivel: uma bolha branca vazia no canto. */
.catalogo-card-foto > img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .5s cubic-bezier(.2,.7,.3,1)}
.catalogo-card:hover .catalogo-card-foto > img{transform:scale(1.06)}
/* fallback pra foto que precise ficar inteira visivel (sem cortar) -- hoje
   nenhum item usa, ver nota de imagem_contida em dados-catalogo.php. */
.catalogo-card-foto.contida > img{object-fit:contain;padding:26px}
/* selo ("mais vendido", "incluso"...) DENTRO da foto, a' esquerda -- pedido
   do usuario, antes vivia solto no corpo do card feito pilula de texto. */
.catalogo-selo-badge{
  position:absolute;top:10px;left:10px;background:#fff;color:var(--carmim);
  font-size:11px;font-weight:600;padding:5px 12px;border-radius:var(--pill);
  border:1px solid var(--linha);line-height:1;
}
/* selo de marca: SO' texto, pra padronizar (pedido do usuario -- antes
   misturava logo/imagem por marca, cada uma com proporcao diferente). A cor
   do texto e' a identidade de cada marca (ver $catalogo_marca_cores em
   dados-catalogo.php -- amostrada dos proprios logos, nao inventada),
   aplicada inline por item. */
.catalogo-marca-selo{
  position:absolute;top:10px;right:10px;background:#fff;border-radius:var(--pill);
  padding:5px 12px;border:1px solid var(--linha);line-height:1;
  font-family:var(--mono);font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
}
/* CARD RETOMADO -- pedido explicito do usuario pra' voltar a' hierarquia
   anterior: foto no topo, DEPOIS categoria/titulo/descricao (revertendo o
   "CARD REPENSADO" de uma rodada anterior, que tinha invertido isso).
   .catalogo-card-principal segue sendo o wrapper de [foto, corpo] -- a
   ordem de DOM dos 2 e' o que muda o layout: foto primeiro = ela fica em
   cima no modo grade (column) e a' esquerda no modo lista (row), sem
   precisar de regra extra nenhuma pra cada modo. */
.catalogo-card-principal{display:flex;flex-direction:column;flex:1}
/* padding-bottom reduzido de 34 pra 18 -- pedido explicito do usuario: o
   preco (.catalogo-preco, empurrado pro rodape via margin-top:auto em
   .catalogo-acoes) tem que alinhar na MESMA altura do icone do WhatsApp
   dentro da cunha. Medido ao vivo (Puppeteer) que o icone ficava 15.8px
   mais embaixo que o preco -- 34-16=18 fecha essa conta. */
.catalogo-card-corpo{padding:16px 20px 18px;display:flex;flex-direction:column;flex:1}
.catalogo-card-linha{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--carmim);margin-bottom:9px;line-height:13px}
.catalogo-card-linha-ico{flex:none;display:flex;align-items:center;width:13px;height:13px}
.catalogo-card-linha-ico svg{display:block;width:13px;height:13px}
.catalogo-card-corpo h3{margin:0 0 12px;font-size:1.05rem;line-height:1.3}

/* ---- Letreiro de aeroporto no titulo de um card ------------------------
   Hoje so' o App Full Personalizado usa (campo nome_letreiro em
   dados-catalogo.php). Exigencia do usuario: nao pode ocupar mais espaco que
   os titulos dos cards vizinhos, nem deslocar nada. Por isso a caixa do <h3>
   continua sendo medida por um texto NORMAL (.letreiro-medida, invisivel mas
   ocupando lugar, com o nome mais longo da lista) e o que gira vive numa
   camada absoluta por cima. Medido ao vivo: a 320px o nome mais longo ocupa
   2 linhas e nenhum outro da lista passa disso, entao a caixa da medida
   cobre todos os nomes em qualquer largura. */
.catalogo-letreiro{position:relative}
.catalogo-letreiro .letreiro-medida{visibility:hidden}
.catalogo-letreiro .letreiro-palco{position:absolute;left:0;top:0;right:0}
/* uma aba por caractere, agrupadas por PALAVRA: o grupo e' inline-block, logo
   a quebra de linha so' pode cair nos espacos, igual a texto comum -- sem
   isso o navegador quebraria entre duas letras quaisquer e o palco deixaria
   de bater com a medida. */
.catalogo-letreiro .fl-pal{display:inline-block;white-space:nowrap}
/* a largura da aba vem do PROPRIO caractere de destino (.fl-med, invisivel),
   entao a linha ja' nasce com a geometria final e nada treme enquanto as
   letras passam. O que gira (.fl-car) e' absoluto, nao mede nada. */
.catalogo-letreiro .fl{position:relative;display:inline-block;perspective:600px}
.catalogo-letreiro .fl-med{visibility:hidden}
.catalogo-letreiro .fl-car{position:absolute;left:50%;top:0;white-space:pre;transform:translateX(-50%);transform-origin:50% 50%;backface-visibility:hidden}
/* o vinco horizontal da aba so' existe enquanto ela gira -- parado, o titulo
   e' um titulo limpo igual aos outros (um filete fixo no meio leria como
   texto riscado). */
.catalogo-letreiro .fl.gira::after{content:'';position:absolute;left:-.03em;right:-.03em;top:47%;height:1px;background:rgba(0,0,51,.2)}
.catalogo-card-corpo p{color:var(--tinta-70);font-size:.88rem;line-height:1.5;margin:0 0 12px}
/* Detalhes escondido (pedido explicito do usuario -- clicar em qualquer
   parte do card ja' abre os detalhes, ver JS) sem tirar do DOM (o
   [data-detalhe] continua funcional se algum dia voltar a aparecer).
   margin-top:auto empurra a linha inteira (preco + Detalhes escondido) pro
   rodape do card, no mesmo nivel da cunha do WhatsApp a' direita. */
.catalogo-acoes{display:flex;align-items:center;margin-top:auto}
.catalogo-acoes .btn.linha{display:none}
/* preco censurado -- pedido explicito do usuario: preenche o vazio a'
   esquerda da cunha do WhatsApp, em vermelho, com dica no hover explicando
   o porque' (mesma receita de tooltip do .chips-pill::after, so' que abrindo
   pra CIMA em vez de baixo -- aqui embaixo colaria no rodape/proxima linha
   de cards, ou seria cortado pelo overflow:hidden do card). */
.catalogo-preco{position:relative;font-family:var(--mono);font-weight:700;font-size:.92rem;color:var(--carmim);cursor:default}
.catalogo-preco::after{
  content:attr(data-tip);
  position:absolute;bottom:calc(100% + 10px);left:0;
  width:200px;max-width:60vw;padding:10px 12px;border-radius:var(--r-md);
  background:var(--navy);color:#e2e8f0;font-family:var(--fonte);font-size:.74rem;font-weight:400;
  line-height:1.45;text-align:left;white-space:normal;
  opacity:0;visibility:hidden;pointer-events:none;z-index:20;box-shadow:var(--sombra-lg);
  transition:opacity .2s,transform .2s,visibility .2s;transform:translateY(4px);
}
.catalogo-preco:hover::after{opacity:1;visibility:visible;transform:translateY(0)}
/* Cunha do WhatsApp -- 3a tentativa. A 1a (circulo 75px de raio) ficava
   "meia-lua" -- redonda demais pro pedaco pequeno que sobrava, lida como
   bolha, nao como cunha desenhada. Testado localmente varias proporcoes
   (ver scratchpad) antes de subir pro site de novo: o que bate com a
   referencia e' uma ELIPSE grande e achatada (bem mais larga que alta,
   pouquissima curvatura -- quase uma diagonal suave, nao um arco fechado),
   ocupando uma fatia generosa do canto (~38% da largura, ~30% da altura do
   card). border-radius:50% numa caixa NAO quadrada (600x260) da' elipse,
   nao circulo. Navy + hover carmim: mesma dupla do .subir (voltar ao
   topo), identidade Voxter em vez do verde generico do WhatsApp. */
.catalogo-whats-btn{
  position:absolute;right:-496px;bottom:-116px;z-index:3;
  /* height 220 (era 260) -- pedido explicito do usuario. */
  width:600px;height:220px;border-radius:50%;
  display:flex;align-items:flex-end;justify-content:flex-end;
  /* padding resolvido pela equacao real da elipse (nao "width menos
     sangria" -- essa conta so' vale pra circulo; numa elipse os 2 eixos
     sao acoplados). Alvo: folga GENEROSA (o icone deve ficar claramente
     dentro da area escura, longe da curva -- tentativa anterior encostava
     quase na borda, arriscado e nao batia com a referencia, onde a seta
     fica confortavel dentro do preto, nao espremida no limite). bottom
     reduzido (era -158) -- pedido explicito do usuario, cunha sobe mais,
     invadindo mais a area da descricao. */
  padding-right:516px;padding-bottom:136px;
  background:var(--navy);color:#fff;cursor:pointer;
  transition:background .2s;
}
.catalogo-whats-btn:hover{background:var(--carmim)}
/* wrapper proprio do icone (nao a caixa de 600x220 inteira, que e' quase
   toda invisivel/fora do card) -- serve de ancora pro tooltip abaixo,
   sem precisar calcular offset dentro do circulo gigante. */
.catalogo-whats-ico{position:relative;display:block}
.catalogo-whats-btn svg{width:20px;height:20px;display:block;transition:transform .25s}
/* icone cresce no hover -- pedido explicito do usuario. */
.catalogo-whats-btn:hover svg{transform:scale(1.2)}
/* tooltip de identificacao -- pedido explicito do usuario: aparece no
   hover e some sozinho em 2s (mesmo com o mouse parado em cima), diferente
   do .catalogo-preco::after (que fica visivel enquanto hover durar). Um
   unico @keyframes cobre entrada+espera+saida -- sem JS, sem timer. */
.catalogo-whats-tip{
  position:absolute;bottom:calc(100% + 12px);right:0;
  white-space:nowrap;padding:7px 12px;border-radius:var(--r-sm);
  background:var(--navy);color:#fff;font-family:var(--fonte);font-size:.76rem;font-weight:500;
  opacity:0;visibility:hidden;pointer-events:none;z-index:20;box-shadow:var(--sombra-md);
}
.catalogo-whats-btn:hover .catalogo-whats-tip{animation:catalogo-whats-tip-sumir 2s ease forwards}
@keyframes catalogo-whats-tip-sumir{
  0%{opacity:0;visibility:visible;transform:translateY(4px)}
  12%{opacity:1;transform:translateY(0)}
  75%{opacity:1;transform:translateY(0)}
  100%{opacity:0;visibility:hidden;transform:translateY(0)}
}

/* --- modo lista: mesma "linha" horizontal do marketplace -- foto fixa a'
   esquerda, corpo a' direita (categoria/titulo/descricao/acoes, todos
   empilhados dentro do corpo -- ver comentario acima sobre a ordem no DOM). --- */
.catalogo-grade.modo-lista{grid-template-columns:1fr}
.catalogo-grade.modo-lista .catalogo-card-principal{flex-direction:row}
.catalogo-grade.modo-lista .catalogo-card-foto{width:220px;aspect-ratio:auto}

/* --- modal deslizante "Ver Detalhes": mesma ideia de "gaveta" do
   .video-modal (paginas de solucao), so' que tema claro (o catalogo e' uma
   pagina clara, painel navy ali ficaria destoante) e conteudo de produto em
   vez de video. --- */
.catalogo-drawer{position:fixed;inset:0;z-index:100;visibility:hidden;pointer-events:none}
.catalogo-drawer-fundo{position:absolute;inset:0;background:rgba(0,0,51,.45);opacity:0;transition:opacity .35s}
.catalogo-drawer-painel{
  position:absolute;top:0;right:0;height:100%;width:min(92vw,480px);box-sizing:border-box;
  background:#fff;box-shadow:-30px 0 70px -24px rgba(0,0,51,.35);overflow-y:auto;
  /* overflow-x:hidden explicito -- sem isso o navegador trata o eixo X como
     'auto' tambem (so' declaramos overflow-y), e o translateX do arrasto/troca
     de produto (#catalogoDrawerCorpo, ver JS) faz nascer uma barra horizontal
     por uma fracao de segundo durante a animacao. */
  overflow-x:hidden;
  translate:100% 0;transition:translate .4s cubic-bezier(.2,.8,.2,1);
}
.catalogo-drawer.aberto{visibility:visible;pointer-events:auto}
.catalogo-drawer.aberto .catalogo-drawer-fundo{opacity:1}
.catalogo-drawer.aberto .catalogo-drawer-painel{translate:0 0}
.catalogo-drawer-fechar{
  position:absolute;top:16px;right:16px;z-index:2;width:38px;height:38px;border-radius:50%;flex:none;
  display:flex;align-items:center;justify-content:center;background:rgba(0,0,51,.06);
  color:var(--tinta);border:0;cursor:pointer;transition:background .2s;
}
.catalogo-drawer-fechar:hover{background:rgba(0,0,51,.12)}
.catalogo-drawer-fechar svg{width:16px;height:16px}
/* navegacao entre produtos dentro do proprio modal -- pedido explicito do
   usuario ("continuar navegando, pulando pro proximo ou voltando pro
   anterior, de forma continua"). Espelha a .catalogo-drawer-fechar (mesmo
   top:16px, lado oposto) flutuando sobre a foto. Contador da orientacao
   (ex. "3 de 12") reflete a lista VISIVEL no momento (respeita filtro/busca/
   ordenacao correntes -- ver listaVisivel() no JS), nao o catalogo inteiro. */
.catalogo-drawer-nav{
  position:absolute;top:16px;left:16px;z-index:2;display:flex;align-items:center;gap:2px;
  background:rgba(0,0,51,.06);border-radius:var(--pill);padding:4px;
}
.catalogo-drawer-nav-btn{
  display:flex;align-items:center;justify-content:center;flex:none;
  width:30px;height:30px;border:0;background:transparent;border-radius:50%;
  color:var(--tinta);cursor:pointer;transition:background .2s;
}
.catalogo-drawer-nav-btn:hover{background:rgba(0,0,51,.14)}
.catalogo-drawer-nav-btn svg{width:16px;height:16px;display:block}
.catalogo-drawer-nav-conta{font-family:var(--mono);font-size:10.5px;font-weight:600;color:var(--tinta-45);padding:0 6px;white-space:nowrap}
.catalogo-drawer-foto{position:relative;aspect-ratio:16/10;background:var(--foto-fundo)}
.catalogo-drawer-foto > img{width:100%;height:100%;object-fit:cover;display:block}
.catalogo-drawer-foto.contida > img{object-fit:contain;padding:36px}
/* pilula "Fabricante: X" sobre a foto -- mesmo detalhe do modal do
   voxter.com.br/marketplace (la' e' a UNICA identificacao de marca no
   modal, nao repete como texto solto no corpo). */
.catalogo-drawer-fabricante{
  /* bottom-left, nao top-left: o topo da foto agora tem o cluster </>/fechar
     por cima (ver .catalogo-drawer-nav/.catalogo-drawer-fechar) -- ficaria
     colado em cima do selo. */
  position:absolute;bottom:14px;left:14px;background:#fff;color:var(--tinta);
  font-size:11px;font-weight:700;padding:5px 12px;border-radius:var(--pill);border:1px solid var(--linha);
}
.catalogo-drawer-corpo-txt{padding:26px 28px 34px}
.catalogo-drawer-linha{display:flex;align-items:center;gap:7px;font-family:var(--mono);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--carmim);margin-bottom:14px}
.catalogo-drawer-linha svg{display:block;width:14px;height:14px}
.catalogo-drawer-corpo-txt .tagline-pill{display:inline-block;margin-bottom:12px}
.catalogo-drawer-corpo-txt h3{font-size:1.5rem;line-height:1.25;margin:0 0 8px}
.catalogo-drawer-corpo-txt p.resumo{font-size:1rem;color:var(--tinta-70);line-height:1.6;margin:0 0 20px}
.catalogo-drawer-disclaimer{font-size:.78rem;font-style:italic;color:var(--tinta-45);margin:-10px 0 20px}
/* ficha tecnica: linhas com icone + rotulo pequeno + valor, mesmo padrao do
   modal de referencia (2 campos: conectividade + alimentacao/franquia). */
.catalogo-drawer-h4{display:flex;align-items:center;gap:7px;font-size:.82rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--tinta);margin:0 0 14px}
.catalogo-drawer-h4 svg{flex:none;width:15px;height:15px;color:var(--carmim)}
.catalogo-drawer-ficha{display:flex;flex-direction:column;gap:10px;margin-bottom:26px}
.catalogo-drawer-ficha-item{display:flex;align-items:flex-start;gap:12px;background:var(--osso);border:1px solid var(--linha);border-radius:var(--r-md);padding:12px 14px}
.catalogo-drawer-ficha-item svg{flex:none;width:17px;height:17px;color:var(--carmim);margin-top:1px}
.catalogo-drawer-ficha-item .rotulo{display:block;font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--tinta-45);margin-bottom:2px}
.catalogo-drawer-ficha-item .valor{display:block;font-size:.88rem;color:var(--tinta);font-weight:500}
/* diferenciais: bolinha vermelha + texto, mesmo padrao do modal de
   referencia (nao e' checklist -- so' specs sem correspondente la' cai pro
   fallback .catalogo-drawer-specs/check-item, ver JS). */
.catalogo-drawer-feats{list-style:none;margin:0 0 26px;padding:0;display:flex;flex-direction:column;gap:9px}
.catalogo-drawer-feats li{display:flex;align-items:flex-start;gap:10px;font-size:.88rem;color:var(--tinta-70);border:1px solid var(--linha);border-radius:var(--r-sm);padding:9px 12px}
.catalogo-drawer-feats .ponto{flex:none;width:6px;height:6px;border-radius:50%;background:var(--carmim);margin-top:6px}
.catalogo-drawer-feats strong{color:var(--tinta)}
.catalogo-drawer-specs{list-style:none;margin:0 0 28px;padding:0;display:flex;flex-direction:column;gap:10px}
.catalogo-drawer-acoes{display:flex;flex-direction:column;gap:10px}
.catalogo-drawer-acoes .btn{width:100%;font-family:inherit;cursor:pointer;text-align:center}

@media (max-width:900px){
  .catalogo-layout{grid-template-columns:1fr}
  .catalogo-sidebar{position:static}
  .catalogo-icone-btn{display:flex}

  /* .catalogo-filtros-modal vira folha deslizante -- escondida por padrao
     (visibility:hidden, position:fixed nao ocupa espaco no fluxo), so' entra
     quando o botao "Categorias e Marcas" abre (.aberto, via
     montaFolhaMovel() no JS da propria pagina). Mesmo molde visual de
     .menu-movel (fundo+painel deslizando de baixo pra cima). top+height:
     100svh, NAO inset:0 -- de proposito: inset:0 acompanha o viewport
     DINAMICO (junto com o overflow:hidden do scroll travado, o mobile as
     vezes reporta innerHeight maior que o svh "estavel"), enquanto
     .catalogo-filtros-painel logo abaixo usa max-height:80svh (fixo);
     misturar as duas bases faz o rodape da folha nascer fora da area
     visivel de verdade -- achado real, ver historico. */
  .catalogo-filtros-modal{
    display:block;position:fixed;top:0;left:0;right:0;height:100svh;z-index:120;visibility:hidden;
    transition:visibility 0s linear .35s;
  }
  .catalogo-filtros-modal.aberto{visibility:visible;transition-delay:0s}
  .catalogo-filtros-fundo{
    display:block;position:absolute;inset:0;background:rgba(0,0,51,.5);
    opacity:0;transition:opacity .3s ease;
  }
  .catalogo-filtros-modal.aberto .catalogo-filtros-fundo{opacity:1}
  .catalogo-filtros-painel{
    display:block;position:absolute;left:0;right:0;bottom:0;max-height:80svh;
    background:#fff;border-radius:var(--r-xl) var(--r-xl) 0 0;box-shadow:var(--sombra-lg);
    overflow-y:auto;-webkit-overflow-scrolling:touch;
    transform:translateY(100%);transition:transform .35s cubic-bezier(.2,.7,.3,1);
  }
  .catalogo-filtros-modal.aberto .catalogo-filtros-painel{transform:translateY(0)}
  .catalogo-filtros-cab{
    display:flex;align-items:center;justify-content:space-between;
    position:sticky;top:0;z-index:1;background:#fff;
    padding:18px 20px 14px;border-bottom:1px solid var(--linha);
    font-family:var(--mono);font-size:11.5px;font-weight:500;letter-spacing:.16em;text-transform:uppercase;color:var(--tinta-45);
  }
  .catalogo-filtros-cab button{display:flex;background:none;border:0;padding:6px;margin:-6px;color:var(--tinta-45);cursor:pointer}
  .catalogo-filtros-cab svg{width:20px;height:20px}
  .catalogo-filtros-corpo{display:block;padding:4px 20px 24px}
  .catalogo-sidebar-bloco{margin:20px 0 0}
  /* .catalogo-busca-linha tem margin-bottom:24px pra abrir espaco ate'
     Categorias, que na base (desktop) e' o proximo irmao real dentro do
     mesmo .catalogo-painel. Aqui a modal ja' saiu do fluxo (position:fixed,
     ver acima) -- sem irmao depois, aquela margem so' virava respiro extra
     embaixo do card (mais que o padding:22px de cima). Zerando, sobra so'
     o padding do .catalogo-painel dos 2 lados, igual em cima e embaixo. */
  .catalogo-busca-linha{margin-bottom:0}

  /* "Ordenar" troca de <select> visivel pra' icone+popover, e a grade
     padrao (nao-lista) passa a 2 colunas -- pedido explicito do usuario,
     escala de e-commerce. NA MESMA media do resto do modulo mobile (900px),
     de proposito -- ACHADO REAL (reportado pelo usuario com print de
     celular de verdade): tinha posto esses 3 num @media(760px) separado, e
     em telas entre 761-900 (celulares grandes reais, nao so' tablet) o
     <select> normal ficava visivel AO MESMO TEMPO que o sistema de busca+
     modal mobile ja' estava ativo -- hibrido quebrado. Unificar tudo numa
     media so' elimina esse meio-termo pra qualquer largura de aparelho. */
  .catalogo-select{display:none}
  .catalogo-ordenar-cx{display:flex}
  .catalogo-grade{grid-template-columns:repeat(2,1fr);gap:12px}
  .catalogo-card-linha{font-size:9px;gap:4px;margin-bottom:6px;line-height:11px}
  .catalogo-card-linha-ico{width:11px;height:11px}
  .catalogo-card-linha-ico svg{width:11px;height:11px}
  .catalogo-card-corpo{padding:12px 14px 11px}
  .catalogo-card-corpo h3{font-size:.86rem;margin-bottom:8px}
  .catalogo-card-corpo p{font-size:.76rem;margin-bottom:10px}
  .catalogo-selo-badge,.catalogo-marca-selo{font-size:9.5px;padding:4px 9px}
  /* cunha reescalada pro grid apertado de 2 colunas -- mesma logica do
     desktop (ver .catalogo-whats-btn la' em cima), so' menor. Sem risco de
     encostar no card vizinho: o overflow:hidden de .catalogo-card corta o
     circulo na propria caixa, entao nada disso pinta fora do card mesmo,
     gap do grid nem entra na conta. Resolvido pra' largura REAL do card
     mobile (~169px, 2 colunas), equacao da elipse, folga generosa (mesmo
     criterio do desktop -- ver comentario la' em cima). */
  .catalogo-whats-btn{width:300px;height:130px;right:-222px;bottom:-34px;padding-right:236px;padding-bottom:48px}
  .catalogo-whats-btn svg{width:15px;height:15px}
  /* card de 2 colunas e' estreito (~169px) -- tooltip no tamanho desktop
     estoura a largura inteira e o overflow:hidden do card corta. */
  .catalogo-whats-tip{font-size:.68rem;padding:6px 9px;bottom:calc(100% + 8px)}
  .catalogo-preco{font-size:.82rem}
  /* tooltip mais estreito -- 200px (valor desktop) estoura a largura
     inteira de um card de 2 colunas (~169px) e o overflow:hidden do card
     corta a dica pela metade. */
  .catalogo-preco::after{width:135px;font-size:.7rem;padding:8px 10px}

  .jmod-hero{grid-template-columns:1fr}
  .jmod-hero-texto .check-lista{grid-template-columns:1fr}
}
@media (max-width:760px){
  .jmod-grade{grid-template-columns:1fr}

  .catalogo-grade.modo-lista{grid-template-columns:1fr}
  .catalogo-grade.modo-lista .catalogo-card-principal{flex-direction:column}
  .catalogo-grade.modo-lista .catalogo-card-foto{width:auto;aspect-ratio:4/3}
  .catalogo-drawer-painel{width:100%}
  /* modal de detalhes: textos/espacos pensados pro painel de 480px de
     desktop ficavam grandes demais tomando a tela inteira -- pedido
     explicito do usuario, "otimizar pra caber mais info antes da rolagem,
     em alguns vai ate eliminar a necessidade de rolagem". Reduz foto,
     paddings e fontes em cascata (mesma hierarquia, so' mais compacta). */
  .catalogo-drawer-foto{aspect-ratio:16/9}
  .catalogo-drawer-corpo-txt{padding:18px 18px 24px}
  .catalogo-drawer-corpo-txt .tagline-pill{margin-bottom:8px}
  .catalogo-drawer-corpo-txt h3{font-size:1.2rem;margin-bottom:6px}
  .catalogo-drawer-corpo-txt p.resumo{font-size:.88rem;line-height:1.5;margin-bottom:14px}
  .catalogo-drawer-disclaimer{font-size:.72rem;margin:-6px 0 14px}
  .catalogo-drawer-h4{font-size:.76rem;margin-bottom:10px}
  .catalogo-drawer-ficha{gap:8px;margin-bottom:18px}
  .catalogo-drawer-ficha-item{padding:9px 11px}
  .catalogo-drawer-ficha-item svg{width:15px;height:15px}
  .catalogo-drawer-ficha-item .rotulo{font-size:9.5px;margin-bottom:1px}
  .catalogo-drawer-ficha-item .valor{font-size:.82rem}
  .catalogo-drawer-feats{gap:7px;margin-bottom:18px}
  .catalogo-drawer-feats li{font-size:.82rem;padding:8px 10px}
  .catalogo-drawer-specs{gap:8px;margin-bottom:18px}
  .catalogo-drawer-acoes{gap:8px}
  /* "Ver Pagina Completa" some no mobile -- pedido explicito do usuario: dali
     (a propria ficha de detalhes) o caminho natural e' direto pro orcamento,
     nao mandar o visitante pra outra pagina. So' fica "Solicitar Orcamento",
     que ja' ocupa a linha inteira sozinho. */
  .catalogo-drawer-acoes .btn.linha{display:none}
  .gancho-grade{grid-template-columns:1fr}
  .outros-solucao .feat-grade{grid-template-columns:1fr!important}

  /* grid de 2 colunas tambem no celular -- pedido explicito do usuario,
     mesma escala do /catalogo/. Antes so' ganhava 2 colunas em tablet
     (761-1000px, ver media logo abaixo); com essa faixa entrando na mesma
     contagem, fica uma unica progressao sem costura (2 colunas de ~320px
     ate 1000px, 3 so' a partir dai). Card mais estreito (~165px) precisa
     encolher tudo dentro dele -- mesmo tratamento ja' usado no card do
     catalogo. */
  .ferramenta-grade{grid-template-columns:repeat(2,1fr);gap:12px}
  .ferramenta-card{padding:14px}
  .ferramenta-topo{margin-bottom:12px;gap:6px}
  .ferramenta-ico{width:36px;height:36px}
  .ferramenta-ico svg{width:17px;height:17px}
  .ferramenta-status{font-size:8.5px;padding:3px 7px}
  .ferramenta-card h3{font-size:.88rem;margin-bottom:6px}
  .ferramenta-card p{font-size:.76rem;line-height:1.45}
  .ferramenta-link{font-size:.78rem;padding-top:10px}
}
@media (max-width:1000px) and (min-width:761px){
  .ferramenta-grade{grid-template-columns:repeat(2,1fr)}
}
/* titulo "Feitas pra ajudar no dia a dia" quebrava em 2 linhas no celular --
   pedido explicito do usuario: reduzir so' o suficiente pra caber numa
   linha so'. Escopado <=700px (mesma media onde .sec-topo vira coluna, ver
   acima -- so' ali o h2 ocupa a largura cheia do container; testado nas
   larguras reais de telefone, do menor ao maior desse intervalo). Fluido
   (calc com vw), nao um px fixo: manter grande no canto de cima do
   intervalo (perto de 700px) e so' encolher mais no canto de baixo (perto
   de 320px), onde precisa de verdade. */
@media (max-width:700px){
  .ferramentas-solucao .sec-topo h2{font-size:clamp(1.35rem, calc(7.5vw - 2.2px), 1.85rem)}
}

/* ---------- cases de sucesso (/cases/) ---------- */
/* selo de segmento (.post-cat cuida de posicao/tamanho/formato -- so'
   acrescenta a cor por segmento, paleta propria pra nao acoplar com as
   cores de categoria de posts). */
.case-cat.cat-central{background:var(--navy);color:#fff}
.case-cat.cat-associacao{background:var(--dourado);color:var(--navy)}
.case-cat.cat-monitoramento{background:var(--carmim);color:#fff}
/* chips de produto (link, nao botao) na secao "A Solucao" -- mesma
   linguagem visual dos .posts-cat (pilula, borda, mono), so' como <a>. */
.case-produtos{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}
.case-produto-chip{
  font-family:var(--mono);font-size:12.5px;letter-spacing:.03em;padding:8px 16px;border-radius:var(--pill);
  border:1px solid var(--linha);color:var(--tinta-70);text-decoration:none;transition:border-color .2s,color .2s;
}
.case-produto-chip:hover{border-color:var(--carmim);color:var(--carmim)}
/* cartao "vazio" do video de destaque (/cases/), enquanto ele nao existe --
   mesmo formato/tamanho do .video-fachada real (max-width:900px), pra secao
   nao mudar de layout quando o video de verdade entrar (ver dados-cases.php). */
.video-fachada-vazia{
  aspect-ratio:16/9;max-width:900px;margin:0 auto;border-radius:var(--r-lg);
  background:var(--osso);border:1px dashed var(--linha);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;
  color:var(--tinta-45);font-family:var(--mono);font-size:.86rem;
}
.video-play-vazio{position:static;background:transparent;color:var(--tinta-45);box-shadow:none}

/* "Continue vendo" (cases relacionados, mesmo segmento) -- cartao BEM mais
   compacto que o .post/.grade-posts do blog (pedido explicito do usuario:
   "cards muito grandes"). Logo do cliente centralizado numa faixa pequena,
   nome + selo de segmento embaixo -- sem foto grande nem resumo. */
.grade-cases-mini{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
.case-mini{
  display:flex;flex-direction:column;text-decoration:none;background:#fff;
  border:1px solid var(--linha);border-radius:var(--r-md);overflow:hidden;
  transition:transform .25s,box-shadow .25s,border-color .25s;
}
.case-mini:hover{transform:translateY(-3px);box-shadow:var(--sombra-sm);border-color:rgba(168,40,42,.25)}
.case-mini-logo-cx{display:flex;align-items:center;justify-content:center;height:64px;background:var(--osso-2);padding:10px 16px}
.case-mini-logo-cx img{max-width:100%;max-height:100%;object-fit:contain}
.case-mini-logo-cx .case-icone-oculto{width:40px;height:40px}
.case-mini-inicial{font-family:var(--fonte);font-weight:800;font-size:1.4rem;color:var(--tinta-45)}
.case-mini-corpo{display:flex;flex-direction:column;gap:6px;padding:12px 14px 14px}
.case-mini-corpo b{font-size:.88rem;color:var(--tinta);line-height:1.25}
.case-mini-corpo .case-cat{position:static;align-self:flex-start;box-shadow:none}
@media (max-width:900px){.grade-cases-mini{grid-template-columns:repeat(2,1fr)}}
@media (max-width:480px){.grade-cases-mini{grid-template-columns:1fr}}

/* nome de cliente com identidade preservada (case fictício/anonimizado) --
   desfoque de verdade em vez de so' trocar o texto por "Confidencial", pra
   parecer um case real com o nome escondido, nao um rascunho. select:none
   evita copiar o texto ilegivel por engano; aria-hidden nos usos + um rotulo
   alternativo acessivel ficam por conta de quem usa a classe (ver ver.php). */
.case-censura{filter:blur(7px);user-select:none}
.case-confidencial-tag{
  display:inline-flex;align-items:center;gap:5px;margin-top:6px;
  font-family:var(--mono);font-size:.68rem;letter-spacing:.03em;color:var(--tinta-45);
}
/* mesmo logo, tratamento oposto dependendo do fundo -- ver case_logo_classe()
   em dados-cases.php. Substituem a antiga .case-logo-inverte (uso unico). */
.case-logo-fica-escuro{filter:invert(1)}
.case-logo-fica-branco{filter:brightness(0) invert(1)}

/* ---------- /cases/: card com topo colorido por segmento (substitui o
   .post-foto bege liso -- pedido explicito do usuario: "mais recursos
   visuais"). Reaproveita .post-corpo (texto) por baixo, so' o topo muda. */
.case-card{text-decoration:none;display:flex;flex-direction:column;background:#fff;border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sombra-sm);transition:transform .3s,box-shadow .3s}
.case-card:hover{transform:translateY(-4px);box-shadow:var(--sombra-md)}
.case-card-topo{position:relative;aspect-ratio:16/10;display:flex;align-items:center;justify-content:center;padding:22px;overflow:hidden}
.case-card-icone{position:absolute;top:14px;left:16px;width:34px;height:34px;color:rgba(255,255,255,.32)}
.case-card-icone svg{width:100%;height:100%}
.case-card-topo img{max-width:62%;max-height:42%;object-fit:contain;position:relative;z-index:1}
.case-card-cadeado{position:relative;z-index:1;width:72px;height:72px}
.case-card-cadeado .case-icone-oculto{width:100%;height:100%}

/* ---------- /cases/: titulo da abertura ("Prova social") menor que o
   padrao de h2 do site. Alinhamento do filete/centralizacao do texto contra
   o H2: ver .sec-topo-alto e .lede-centrada (genericas). */
.cases-secao .sec-topo h2{font-size:clamp(1.7rem,3vw,2.6rem)}

/* ---------- /cases/: painel de escala -- os 3 numeros da Voxter (chips,
   ativos, centrais) em destaque antes do carrossel, pedido explicito do
   usuario pra nao deixar essa frase "jogada" solta como paragrafo comum.
   Filete carmim->dourado, mesmo raciocinio do .lede-destaque (nao ficar
   "jogado" no espaco em branco), so' que num painel proprio. ---------- */
.cases-escala{
  /* respiro simetrico (esquerda = direita) -- pedido explicito do usuario,
     antes a direita era mais estreita que a esquerda "de proposito" (pra
     compensar o filete decorativo), mas sobrava vazio a toa do lado direito. */
  position:relative;padding:clamp(28px,4vw,44px) clamp(34px,5.4vw,60px);
  border-radius:var(--r-xl);background:linear-gradient(155deg,var(--osso) 0%,var(--osso-2) 100%);
  border:1px solid var(--linha);margin-bottom:clamp(24px,3vw,36px);overflow:hidden;
}
.cases-escala::before{content:"";position:absolute;top:0;left:0;width:4px;height:100%;background:linear-gradient(var(--carmim),var(--dourado))}
.cases-escala .rot{color:var(--carmim);display:block;margin-bottom:12px}
/* font-size menor + sem max-width em "ch" (pedido explicito do usuario --
   um limite de caracteres deixava o paragrafo bem mais estreito que o
   card, sobrando vazio a toa do lado direito; agora ocupa a largura real
   do card). */
.cases-escala-texto{font-size:clamp(1rem,1.5vw,1.2rem);line-height:1.6;color:var(--tinta);margin:0;text-wrap:balance}
.cases-escala-num{color:var(--navy);font-weight:800;font-variant-numeric:tabular-nums}
.cases-escala-texto em{font-style:italic;color:var(--carmim);font-weight:700}

/* ---------- /cases/: carrossel-palco -- vitrine grande no topo da listagem,
   um case por vez, girando sozinho (cross-fade por classe .ativo). A versao
   "em caixa", com os vizinhos espiando cortados nas laterais, foi reprovada
   pelo usuario ("nao quero ele dentro de uma caixa delimitada") -- volta pro
   card unico em tela cheia. Mantidos os 2 ajustes que vieram junto dessa
   tentativa e que funcionaram: barra de progresso no topo (administra a
   expectativa de quando chega o proximo slide automatico, pausa de verdade
   no hover/foco) e setas que so' aparecem no hover/foco. ---------- */
.case-palco{position:relative;border-radius:var(--r-xl);overflow:hidden;box-shadow:var(--sombra-lg);min-height:clamp(340px,44vw,440px);margin-bottom:clamp(28px,3.4vw,40px)}
.case-palco-progresso{position:absolute;top:0;left:0;right:0;height:3px;z-index:3;background:rgba(255,255,255,.16)}
.case-palco-progresso-fill{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--dourado),var(--carmim-vivo))}
.case-palco-progresso-fill.anda{animation:case-palco-anda 5s linear forwards}
.case-palco:hover .case-palco-progresso-fill.anda,
.case-palco:focus-within .case-palco-progresso-fill.anda{animation-play-state:paused}
@keyframes case-palco-anda{from{width:0}to{width:100%}}
.case-palco-card{
  position:absolute;inset:0;display:grid;grid-template-columns:1fr auto;gap:clamp(20px,4vw,56px);
  align-items:center;padding:clamp(28px,4.5vw,56px) clamp(28px,5vw,64px);
  text-decoration:none;color:#fff;opacity:0;visibility:hidden;transition:opacity .6s ease;
}
.case-palco-card.ativo{opacity:1;visibility:visible}
.case-palco-icone{position:absolute;top:24px;left:28px;width:52px;height:52px;color:rgba(255,255,255,.22)}
.case-palco-icone svg{width:100%;height:100%}
.case-palco-conteudo{display:flex;flex-direction:column;align-items:flex-start;gap:12px;max-width:52ch}
.case-palco-conteudo img{height:30px;width:auto;max-width:170px;object-fit:contain;object-position:left center}
.case-palco-conteudo .post-cat{position:static;background:rgba(255,255,255,.16);color:#fff;backdrop-filter:blur(3px)}
.case-palco-conteudo h3{font-size:clamp(1.4rem,2.6vw,1.9rem);color:#fff;margin:0}
.case-palco-conteudo p{color:rgba(255,255,255,.82);font-size:.98rem;line-height:1.55;margin:0}
.case-palco-stat{flex:none;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.25);border-radius:var(--r-lg);padding:clamp(20px,2.6vw,32px);text-align:center;min-width:180px}
.case-palco-stat-num{font-family:var(--fonte);font-weight:800;font-size:clamp(1.8rem,3.4vw,2.6rem);color:#fff;font-variant-numeric:tabular-nums;line-height:1.1}
.case-palco-stat-rot{font-family:var(--mono);font-size:.74rem;color:rgba(255,255,255,.78);margin-top:8px;max-width:19ch;margin-inline:auto}
.case-palco-pontos{position:absolute;z-index:2;bottom:18px;left:50%;translate:-50% 0;display:flex;gap:7px}
.case-palco-pontos button{width:8px;height:8px;border-radius:50%;background:rgba(255,255,255,.4);border:none;padding:0;cursor:pointer;transition:background .2s,scale .2s}
.case-palco-pontos button.ativo{background:#fff;scale:1.3}
.case-palco-seta{
  position:absolute;z-index:2;top:50%;translate:0 -50%;width:38px;height:38px;border-radius:50%;
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.3);color:#fff;
  display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.2rem;
  opacity:0;pointer-events:none;transition:opacity .25s ease,background .2s;
}
.case-palco:hover .case-palco-seta,.case-palco:focus-within .case-palco-seta{opacity:1;pointer-events:auto}
.case-palco-seta:hover{background:rgba(255,255,255,.28)}
.case-palco-seta-esq{left:16px}
.case-palco-seta-dir{right:16px}
@media (max-width:760px){
  .case-palco-card{grid-template-columns:1fr;text-align:center}
  .case-palco-conteudo{align-items:center;max-width:none}
  .case-palco-seta{display:none}
}
@media (prefers-reduced-motion:reduce){
  .case-palco-card{transition:none}
  .case-palco-progresso-fill.anda{animation:none;width:0}
}

/* ---------- /cases/{slug}/: hero colorido por segmento, substitui o
   .post-leitor-topo claro (sem foto de capa nenhum dos cases ainda -- em vez
   de ficar vazio, o proprio painel de cor + icone do segmento vira a "capa"). */
.case-hero{color:#fff;padding:clamp(44px,6vw,76px) 0;position:relative;overflow:hidden}
.case-hero-grade{display:grid;grid-template-columns:1fr auto;gap:clamp(24px,4vw,56px);align-items:center;position:relative}
/* icone gigante sangrando pro canto -- faz as vezes de "foto"/ilustracao da
   capa, ja que nenhum case tem imagem real ainda (ver dados-cases.php). */
.case-hero-icone{position:absolute;top:50%;right:-6%;translate:0 -50%;width:clamp(300px,34vw,460px);height:clamp(300px,34vw,460px);color:rgba(255,255,255,.16);pointer-events:none;animation:case-icone-flutua 7s ease-in-out infinite}
@keyframes case-icone-flutua{0%,100%{translate:0 -50%}50%{translate:0 -56%}}
@media (prefers-reduced-motion:reduce){.case-hero-icone{animation:none}}
.case-hero-icone svg{width:100%;height:100%}
.case-hero-texto{display:flex;flex-direction:column;align-items:flex-start;gap:12px;position:relative}
/* logo-avatar: quadrado de cantos arredondados, ao lado do nome+categoria
   (nao mais empilhado em cima) -- pedido explicito do usuario. */
.case-hero-titulo-linha{display:flex;align-items:center;gap:20px}
.case-hero-titulo-textos{display:flex;flex-direction:column;align-items:flex-start;gap:12px;min-width:0}
.case-hero-avatar{
  flex:none;width:92px;height:92px;border-radius:var(--r-lg);
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.25);
  display:flex;align-items:center;justify-content:center;padding:9px;
}
.case-hero-avatar img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
.case-hero-avatar .case-icone-oculto{width:100%;height:100%}
@media (max-width:480px){.case-hero-avatar{width:66px;height:66px;padding:7px}}
/* h1 reduzido (pedido explicito do usuario -- estava grande demais em
   relacao ao avatar) e o proprio avatar cresceu + perdeu respiro interno,
   pra a "linha" nome+label ficar alinhada com ele em vez de sobrar espaco
   morto dentro do quadrado. */
.case-hero-texto h1{color:#fff;margin:0;font-size:clamp(1.7rem,3.4vw,2.6rem);line-height:1.05}
.case-hero-texto .post-cat{position:static;background:rgba(255,255,255,.16);color:#fff;backdrop-filter:blur(3px)}
.case-hero-resumo{color:rgba(255,255,255,.85);font-size:1.05rem;line-height:1.6;max-width:52ch;margin:0}
.case-hero-stat{flex:none;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.25);border-radius:var(--r-lg);padding:clamp(22px,2.8vw,34px);text-align:center;min-width:190px;position:relative}
.case-hero-stat-num{font-family:var(--fonte);font-weight:800;font-size:clamp(2.1rem,3.8vw,3rem);color:#fff;font-variant-numeric:tabular-nums;line-height:1.05}
.case-hero-stat-rot{font-family:var(--mono);font-size:.78rem;color:rgba(255,255,255,.8);margin-top:8px;max-width:19ch;margin-inline:auto}

/* ---------- placeholder do cliente com NOME OCULTO, em qualquer lugar que
   normalmente teria o logo real (hero .case-hero-avatar, card da listagem
   .case-card-cadeado, mini-card de relacionados) -- ver case_icone_oculto_html()
   em dados-cases.php. Logotipo generico (nao e' marca de nenhum cliente
   real) desfocado e apagado atras, icone de olhos por cima -- sugere "existe
   uma marca ali, encoberta" em vez de um cadeado generico. A cor (branca ou
   escura, conforme o fundo) vem inline, definida por quem chama a funcao. */
.case-icone-oculto{position:relative;display:block}
.case-icone-oculto-logo{position:absolute;inset:12%;width:76%;height:76%;opacity:.3;filter:blur(2px)}
.case-icone-oculto-olho{position:absolute;inset:29%;width:42%;height:42%}
@media (max-width:760px){.case-hero-grade{grid-template-columns:1fr}.case-hero-icone{opacity:.5;right:-20%}}

/* ---------- /cases/{slug}/: bento grid -- Sobre + Desafio + Solucao +
   Produtos, tudo num grid so' de ladrilhos de tamanhos variados, em vez de 4
   sections cheias (a maioria com so' 1 paragrafo -- "sections muito grandes,
   que ocupam muita tela com pouca coisa", pedido explicito do usuario).
   4 colunas: Sobre ocupa 2x2 (tem foto), Desafio/Solucao 2x1 cada, cada
   Produto 1x1 -- o proprio grid-auto-flow:dense encaixa os ladrilhos de
   produto nos buracos que sobram do lado da Sobre, sem calculo manual. */
.case-bento{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:minmax(150px,auto);grid-auto-flow:dense;gap:20px}
/* SEM align-self:start (era o que causava o "vazio no final" -- cada
   ladrilho so' ficava alto o quanto o PROPRIO conteudo pedia, ignorando a
   altura real da linha do grid; ao lado de um vizinho mais alto, sobrava um
   buraco embaixo do menor e os dois pareciam desalinhados/quebrados).
   Voltando ao "stretch" padrao do grid, todo ladrilho de uma mesma linha
   estica pra bater com o mais alto -- pedido explicito do usuario, "cards
   sempre alinhados". */
.case-bento-item{background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);box-shadow:var(--sombra-sm)}
.case-bento-item h3{margin:0 0 8px;font-size:1.15rem}
.case-bento-item .post-leitor-corpo{font-size:.95rem}
/* Sobre a empresa: a foto e' SEMPRE uma FAIXA horizontal baixa (2.4/1, nao
   mais 16/9 -- pedido explicito do usuario, "menos altura, so' uma faixa
   mesmo"), com a MESMA area de respiro do texto abaixo dela -- margin:0 e'
   o reset do <figure>, que por padrao do navegador vem com 1em 40px de
   margem lateral (era isso que fazia a foto entrar mais que o texto, nao
   um erro de padding do card). Credito da foto agora so' no ALT (ver
   ver.php) -- nao mais uma legenda visivel sobre a imagem. */
.case-bento-sobre{grid-column:span 2;grid-row:span 2;display:flex;flex-direction:column;gap:18px;padding:26px}
/* foto reduzida a uma faixa BEM baixa (3/1, era 2.4/1) -- pedido explicito
   do usuario, "reduzir mais a altura". */
.case-bento-foto{position:relative;margin:0;aspect-ratio:3/1;border-radius:var(--r-md);overflow:hidden;flex:none}
.case-bento-foto img{width:100%;height:100%;object-fit:cover;transform:scale(1.14);transition:transform 1.4s cubic-bezier(.2,.7,.2,1)}
.case-bento.vis .case-bento-foto img{transform:scale(1)}
@media (prefers-reduced-motion:reduce){.case-bento-foto img{transform:none;transition:none}}
.case-bento-corpo{min-height:0}
/* flex+justify-content:center: sem stretch (ver .case-bento-item acima), se
   esse ladrilho ficar mais alto que o proprio conteudo (linha compartilhada
   com um vizinho maior, ex. a Sobre), o respiro extra fica distribuido em
   cima/embaixo do bloco -- nao empilhado so' no final feito antes. */
.case-bento-texto{grid-column:span 2;padding:30px;display:flex;flex-direction:column;justify-content:center}
.case-bento-icone{
  width:44px;height:44px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:rgba(168,40,42,.08);color:var(--carmim);margin-bottom:12px;
}
.case-bento-icone svg{width:22px;height:22px}
#solucao.case-bento-texto .case-bento-icone{background:rgba(0,0,51,.06);color:var(--navy)}
/* produtos: icone grande + nome grande (pedido explicito do usuario --
   "cards de itens... com icones grandes, texto grande tambem"), num
   circulo de destaque em vez do circulinho pequeno de antes. */
.case-bento-produto{
  grid-column:span 1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;gap:14px;padding:30px 18px;text-decoration:none;color:inherit;
  transition:transform .2s,box-shadow .2s;
}
.case-bento-produto:hover{transform:translateY(-3px);box-shadow:var(--sombra-md)}
.case-bento-produto-icone{width:64px;height:64px;border-radius:50%;background:var(--osso-2);display:flex;align-items:center;justify-content:center;color:var(--carmim)}
.case-bento-produto-icone svg{width:32px;height:32px}
.case-bento-produto-nome{font-weight:700;font-size:1.02rem;color:var(--tinta);line-height:1.3}
/* produto "largo": quando o proprio ladrilho vira o "coringa" que fecha o
   espaco sobrando da linha (ver case_bento_plano() em dados-cases.php --
   ex. Rastrek, unico produto da lista, sem mapa pra fechar a grade), o
   icone+nome centralizado de um card 1x1 ficaria boiando sozinho num card
   largo -- vira layout horizontal (icone a esquerda, nome a direita) em
   vez de esticar o mesmo desenho quadrado. */
.case-bento-produto-largo{flex-direction:row;justify-content:flex-start;text-align:left;gap:22px;padding:26px 34px}
.case-bento-produto-largo .case-bento-produto-nome{font-size:1.2rem}
/* resultados: entram no MESMO grid dos produtos, mas com tratamento
   proprio -- numero grande tabular sem icone, pra ficar claro que sao
   "prova"/metrica, nao um item de catalogo. Pedido explicito do usuario
   ("Resultados... junto com as celulas do bento, com hierarquia definida"). */
.case-bento-resultado{
  grid-column:span 1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;gap:6px;padding:26px 18px;
  /* branco puro, igual todo o resto do bento -- ja' passou por --osso
     (idêntico ao fundo da propria section, ficava "transparente" na
     pratica), --osso-2 e ate' um tingido de carmim (#fbeeee); pedido
     explicito do usuario: nada de "branco sujo" no bento, so' branco de
     verdade ou, quando tiver motivo real pra destacar algo, uma cor
     SOLIDA de verdade -- nao um neutro subtraido do fundo da pagina. */
  background:#fff;
}
.case-bento-resultado-num{font-family:var(--fonte);font-weight:800;font-size:clamp(1.7rem,2.6vw,2.15rem);color:var(--carmim);font-variant-numeric:tabular-nums;line-height:1.05}
.case-bento-resultado-rot{font-family:var(--mono);font-size:.72rem;color:var(--tinta-45);line-height:1.4;max-width:20ch}
.case-bento-resultado .case-barra-cx{width:100%;margin-top:6px}
/* resultado "largo" (span vem do PHP, ver case_bento_plano() -- so' fica
   largo quando o proprio NUMERO tem letra, ex. "Norte e Nordeste", "Chips
   M2M" -- um numero curto tipo "2018" continua largura 1): alinhamento a
   esquerda, senao o texto fica espremido/cortado no formato quadrado. */
.case-bento-resultado-texto{align-items:flex-start;text-align:left}
.case-bento-resultado-texto .case-bento-resultado-num{font-size:clamp(1.3rem,2vw,1.6rem)}
/* .case-bento-mapa, .case-bento-mapa-rot: ver bloco proprio mais abaixo
   (perto do resto do CSS de mapa) -- o span/aspect-ratio de cada um vem
   inline do PHP (case_bento_plano()), calculado por caso. */
@media (max-width:900px){
  .case-bento{grid-template-columns:repeat(2,1fr)}
  .case-bento-sobre,.case-bento-texto{grid-column:span 2}
  /* os ladrilhos de largura DINAMICA (resultado/produto/mapa) tem
     grid-column inline vindo do PHP, calculado pra uma grade de 4
     colunas -- nessa largura a grade cai pra 2, entao qualquer span>2
     inline extrapolaria as colunas reais e criaria coluna implicita
     (rolagem horizontal). O !important aqui e' necessario so' por isso:
     e' a UNICA forma de vencer um style="" inline vindo do servidor. */
  .case-bento-resultado,.case-bento-resultado-texto,.case-bento-produto,.case-bento-produto-largo,.case-bento-mapa{grid-column:span 2 !important}
}
@media (max-width:560px){
  .case-bento{grid-template-columns:1fr}
  .case-bento-sobre{grid-row:span 1}
  .case-bento-sobre,.case-bento-texto{grid-column:span 1}
  .case-bento-resultado,.case-bento-resultado-texto,.case-bento-produto,.case-bento-produto-largo,.case-bento-mapa{grid-column:span 1 !important}
  .case-bento-produto-largo{flex-direction:column;text-align:center;gap:14px}
  .case-bento-mapa{aspect-ratio:1.3 !important;grid-row:span 1 !important}
}

/* numeros de resultado maiores dentro de /cases/{slug}/ -- .chips-stat-num
   sozinho (compartilhado com chips-m2m) fica pequeno demais pro peso que um
   resultado de case precisa ter aqui. */
.case-secao#resultados .chips-stat-num{font-size:clamp(1.9rem,2.6vw,2.3rem)}
/* grafico simples (barra) so' pros resultados em formato de percentual --
   "grafico quando fizer sentido": nao da' pra plotar "Centenas" ou "+40 mil"
   numa barra 0-100, entao so' entra quando o proprio numero e' um "NN%". */
.case-barra-cx{margin-top:14px}
.case-barra-trilha{height:6px;border-radius:var(--pill);background:var(--osso-2);overflow:hidden}
.case-barra-fill{height:100%;border-radius:var(--pill);background:var(--carmim);transition:width 1s cubic-bezier(.2,.7,.2,1)}

/* ---------- /cases/{slug}/: setas de navegacao continua (infinita) entre
   cases -- fixas na lateral da tela, centralizadas na vertical, do primeiro
   pro ultimo e vice-versa (ordem calculada em ver.php). Em repouso e' so' a
   setinha (sem circulo); no hover ganha o circulo vermelho + tooltip de 2
   linhas. Pedido explicito do usuario.
   Cor em repouso: mix-blend-mode:difference no SVG (nao na cor fixa) --
   contra qualquer fundo, o resultado e' sempre o "negativo" dele (fundo
   escuro tipo o hero -> seta clara; fundo claro tipo o bento -> seta
   escura), sem precisar de JS pra saber que section esta' por baixo. So'
   funciona pintando de branco e deixando o blend inverter -- por isso a
   opacidade sobe pra 1 (era .4, "apagada demais") e o tamanho aumentou. No
   hover, o blend e' desligado (senao o proprio circulo vermelho tambem
   inverteria de cor). */
.case-nav-seta{
  position:fixed;top:50%;translate:0 -50%;z-index:60;
  width:58px;height:58px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:transparent;color:#fff;text-decoration:none;
  /* o blend tem que estar AQUI, no proprio elemento fixed -- nao num filho.
     position:fixed ja' cria um novo contexto de empilhamento; um
     mix-blend-mode posto no FILHO so' teria o fundo transparente deste
     .case-nav-seta pra comparar (nunca via a pagina de verdade atras),
     por isso a seta ficava sempre branca. No proprio elemento fixed, o
     blend enxerga o que estiver pintado atras dele na pagina. */
  mix-blend-mode:difference;
  transition:background .25s ease,mix-blend-mode .1s;
}
.case-nav-seta svg{width:28px;height:28px}
.case-nav-seta:hover,.case-nav-seta:focus-visible{background:var(--carmim);mix-blend-mode:normal}
.case-nav-seta-ant{left:24px}
.case-nav-seta-prox{right:24px}
/* tooltip de 2 linhas -- elemento de verdade (nao mais content:attr() no
   ::before), pra poder ter 2 tamanhos de fonte na mesma caixa. */
.case-nav-seta-tip{
  position:absolute;top:50%;translate:0 -50%;z-index:5;
  display:flex;flex-direction:column;gap:2px;padding:9px 14px;border-radius:8px;
  background:var(--navy);color:#fff;white-space:nowrap;box-shadow:var(--sombra-sm);
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .18s,translate .18s,visibility .18s;
}
.case-nav-seta-tip-rot{font-family:var(--mono);font-size:9px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:rgba(255,255,255,.65)}
.case-nav-seta-tip-nome{font-family:var(--fonte);font-size:13px;font-weight:700;line-height:1.15}
.case-nav-seta-tip::after{content:"";position:absolute;top:50%;translate:0 -50%;border:5px solid transparent}
.case-nav-seta-ant .case-nav-seta-tip{left:calc(100% + 12px);translate:-6px -50%}
.case-nav-seta-ant .case-nav-seta-tip::after{right:100%;border-right-color:var(--navy)}
.case-nav-seta-prox .case-nav-seta-tip{right:calc(100% + 12px);translate:6px -50%}
.case-nav-seta-prox .case-nav-seta-tip::after{left:100%;border-left-color:var(--navy)}
.case-nav-seta:hover .case-nav-seta-tip,
.case-nav-seta:focus-visible .case-nav-seta-tip{opacity:1;visibility:visible;translate:0 -50%}
@media (max-width:900px){
  .case-nav-seta{width:48px;height:48px}
  .case-nav-seta svg{width:24px;height:24px}
  .case-nav-seta-ant{left:12px}
  .case-nav-seta-prox{right:12px}
}
/* telas estreitas: o tooltip lateral nao cabe (esbarra na borda ou no
   proprio texto do case) -- some, a seta continua funcionando normal. */
@media (max-width:560px){
  .case-nav-seta-tip{display:none}
}

/* ---------- /cases/{slug}/: video "por que a Voxter?" quando o CASE tem um
   video PROPRIO vertical (Shorts) -- layout dedicado (texto de apoio a
   esquerda, video em pe' a direita), pedido explicito do usuario ao mandar
   o video vertical da Alfa Rastreamento. Reaproveita .video-fachada-vertical
   (ja' existia, usada em /plataforma/) so' pro recorte 9/16 -- aqui e' o
   grid ao redor que muda. */
.case-video-vertical-grade{display:grid;grid-template-columns:1.2fr .8fr;gap:clamp(32px,5vw,64px);align-items:center}
.case-video-vertical-texto .lede{margin-top:12px;max-width:44ch}
.case-video-vertical-grade .video-palco{margin:0}
.case-video-vertical-grade .video-fachada-vertical{max-width:300px;margin:0 0 0 auto}
@media (max-width:760px){
  .case-video-vertical-grade{grid-template-columns:1fr;text-align:center}
  .case-video-vertical-texto .lede{margin-inline:auto}
  .case-video-vertical-grade .video-fachada-vertical{margin:0 auto}
}

/* ---------- /cases/{slug}/: mapa da regiao de atuacao, agora como mais um
   ladrilho do bento (nao mais uma section dedicada -- pedido explicito do
   usuario, "transforme o mapa em mais uma celula do bento e acabe com essa
   section"). Mapa recortado (so' a area de atuacao + respiro, ver
   case_mapa_viewbox() em dados-cases.php), com ponto(s) piscando sobre o(s)
   estado(s) atendido(s). O SPAN e o aspect-ratio de .case-bento-mapa vem
   inline do PHP (case_bento_plano()) -- e' o unico ladrilho "coringa" da
   pagina, seu tamanho muda de caso pra caso pra fechar a grade certinho. */
.case-bento-mapa{position:relative;padding:0;overflow:hidden}
.case-bento-mapa-rot{
  position:absolute;top:12px;left:12px;z-index:1;font-family:var(--mono);
  font-size:.68rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:#fff;background:rgba(0,0,51,.55);padding:5px 12px;border-radius:var(--pill);
  backdrop-filter:blur(3px);
}
/* fundo branco (nao --osso-2, ver .case-bento-resultado acima -- regra vale
   pra qualquer ladrilho do bento) so' aparece na borda, quando o SVG nao
   cobre 100% do card. */
.case-bento-mapa .case-mapa-cx{width:100%;height:100%;border-radius:0;box-shadow:none;background:#fff}
.case-mapa-cx{position:relative;border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sombra-md);background:var(--osso-2)}
.case-mapa-cx svg{display:block;width:100%;height:auto}
.case-bento-mapa .case-mapa-cx svg{height:100%;object-fit:cover}
.case-mapa-cx svg path{transition:fill 1s ease}
@keyframes case-ponto-ping{0%{transform:scale(1);opacity:.7}70%{transform:scale(2.6);opacity:0}100%{opacity:0}}
/* centro do pontinho e' SEMPRE branco (fixo aqui, nao mais herdado da cor
   do estado ativo) -- antes, dot e estado usavam a MESMA $corGlow, entao o
   pontinho sumia em cima do proprio estado que deveria marcar. So' o anel
   (box-shadow) e o pulso (::after) usam a cor da marca, vinda da variavel
   --cor-glow (inline, por caso -- ver case_mapa_html() em dados-cases.php). */
.case-mapa-ponto{
  position:absolute;width:10px;height:10px;margin:-5px 0 0 -5px;border-radius:50%;
  background:#fff;box-shadow:0 0 0 2px var(--cor-glow,var(--carmim)),0 0 8px 2px var(--cor-glow,var(--carmim));
}
.case-mapa-ponto::after{
  content:"";position:absolute;inset:0;border-radius:50%;background:var(--cor-glow,var(--carmim));
  animation:case-ponto-ping 2.2s cubic-bezier(0,0,.2,1) infinite;
}
@media (prefers-reduced-motion:reduce){.case-mapa-ponto::after{animation:none}}

/* ---------- /cases/{slug}/: depoimento como citacao grande, secao escura
   (mesmo peso visual do CTA final, nao mais um blockquote pequeno em fundo
   bege) -- aspas gigantes decorativas atras do texto. */
.case-depoimento-secao-v2{overflow:hidden;padding:clamp(48px,6vw,84px) 0;background:linear-gradient(135deg,var(--navy) 0%,var(--navy-2) 100%)}
.case-depoimento-secao-v2 .wrap{position:relative}
.case-aspas{position:absolute;top:-.5em;left:-.06em;font-family:Georgia,"Times New Roman",serif;font-size:10rem;line-height:1;color:rgba(220,171,91,.18);pointer-events:none;user-select:none}
.case-depoimento-texto-v2{position:relative;margin:0;font-family:var(--fonte);font-weight:700;letter-spacing:-.02em;font-size:clamp(1.5rem,2.8vw,2.2rem);line-height:1.32;color:#fff;max-width:30ch}
.case-depoimento-autor-v2{position:relative;margin:22px 0 0;font-family:var(--mono);font-size:.86rem;color:var(--dourado)}
.case-depoimento-autor-v2 b{color:#fff}

/* ---------- /montesuacentral/ ---------- */
/* Bento da section "A estrutura": grid de 12 colunas pra caber 3 celulas
   iguais (as "pecas" da central) OU larguras mistas (o "que vem na
   parceria") na mesma composicao, sem precisar de dois grids separados. */
.msc-bento{display:grid;grid-template-columns:repeat(12,1fr);gap:20px}
.msc-bento-item{background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);box-shadow:var(--sombra-sm);padding:clamp(24px,2.6vw,32px);display:flex;flex-direction:column;gap:10px}
.msc-bento-num{font-family:var(--mono);font-size:.72rem;font-weight:700;letter-spacing:.08em;color:var(--carmim)}
.msc-bento-item h3{font-size:1.15rem;margin:0}
.msc-bento-item p{margin:0;color:var(--tinta-70);font-size:.94rem;line-height:1.6}
.msc-bento-pilar{grid-column:span 4}
.msc-bento-pilar .msc-bento-num{font-family:var(--fonte);font-size:1.6rem;font-weight:800;color:rgba(168,40,42,.22)}
.msc-bento-largo{grid-column:span 6}
.msc-bento-terco{grid-column:span 4}
@media (max-width:980px){
  .msc-bento-pilar,.msc-bento-largo,.msc-bento-terco{grid-column:span 6}
}
@media (max-width:640px){
  .msc-bento-pilar,.msc-bento-largo,.msc-bento-terco{grid-column:span 12}
}

/* Comparativo "Franquia tradicional" x "Modelo Voxter" -- duas listas
   lado a lado, mesma estrutura visual, tom oposto (uma desencoraja, com X
   cinza; outra confirma, com check carmim e leve destaque de borda). */
/* a frase que fecha "Quem muda, muda quase sempre por isto". Nao e' card
   nem caixa: e' uma linha de texto com peso, centrada, com o filete por cima
   fazendo a separacao do grid de motivos. A segunda metade vai pro carmim,
   que e' o mesmo recurso da palavra forte dos titulos. */
.mig-provoca{
  margin:clamp(34px,4vw,48px) auto 0;max-width:60ch;text-align:center;
  padding-top:clamp(26px,3vw,34px);border-top:1px solid var(--linha);
  font-size:clamp(1.05rem,1.5vw,1.25rem);line-height:1.5;
  color:var(--tinta);font-weight:600;text-wrap:balance;
}
.mig-provoca i{font-style:normal;color:var(--carmim)}

/* MEDIDO: a aurora desta section estava desenhando em cima do HERO e da
   primeira section da pagina, nao aqui. Causa: .aurora e' position:absolute
   com inset:0, e .mig-entrada nao era ancestral POSICIONADO -- sem isso o
   inset:0 resolve contra o bloco inicial, ou seja, o canto de cima da pagina
   (medido: aurora em 0..950 enquanto a section vivia em 2126..2599). Era a
   luz vermelha e a azul "vazando do hero": nao vinham do hero, vinham daqui.
   .msc-notebook, a outra section com aurora, ja' tinha position:relative --
   por isso la' nunca vazou. */
.mig-entrada{position:relative}

/* lista de duas colunas no meio da faixa escura: fica centrada e com medida
   curta, senao as duas frases correm a largura toda e perdem o par. */
.mig-entrada-lista{
  max-width:860px;margin-inline:auto;gap:22px 40px;
  margin-top:clamp(28px,3.2vw,38px);
}
@media (max-width:700px){.mig-entrada-lista{grid-template-columns:1fr}}

/* ---------- /associacoes-protecao-veicular/ ---------------------------
   A pagina trocou a foto de banco de imagem por tela de produto e ganhou
   duas sections de video. Tres pecas novas, o resto e' reaproveitado. */

/* as tres capturas da plataforma, no lugar da foto generica */
.apv-telas{
  display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(16px,2vw,24px);
  margin-top:clamp(28px,3.4vw,40px);
}
.apv-tela{margin:0}
.apv-tela img{
  display:block;width:100%;height:auto;border-radius:var(--r-lg);
  border:1px solid var(--linha);box-shadow:0 1px 4px rgba(0,0,51,.045);
}
.apv-tela figcaption{
  margin-top:10px;font-size:.86rem;color:var(--tinta-45);text-align:center;
}
/* hover: a captura e a legenda crescem JUNTAS, como um objeto so'. A escala
   vai na <figure> inteira em vez de so' na imagem, senao a legenda fica
   parada embaixo de uma foto que cresceu e a peca se parte em duas. Mesmo
   gesto sutil de /aplicacoes/ (scale ~1.02), nao um salto.
   transform-origin no centro pra ela crescer pros dois lados e nao empurrar
   a vizinha; z-index pra passar por cima na hora que cresce. */
.apv-tela{
  transition:scale .28s cubic-bezier(.2,.7,.3,1);
  transform-origin:50% 50%;position:relative;z-index:0;
}
.apv-tela img{transition:box-shadow .28s ease,border-color .28s ease}
@media (hover:hover){
  .apv-tela:hover{scale:1.025;z-index:1}
  .apv-tela:hover img{box-shadow:0 10px 30px rgba(0,0,51,.11);border-color:rgba(168,40,42,.22)}
  .apv-tela:hover figcaption{color:var(--tinta-70)}
}
@media (prefers-reduced-motion:reduce){
  .apv-tela{transition:none}
  .apv-tela:hover{scale:1}
}

/* dois videos lado a lado, com titulo e descricao embaixo */
.apv-video-grade{
  display:grid;grid-template-columns:1fr 1fr;gap:clamp(20px,2.6vw,34px);
  margin-top:clamp(28px,3.4vw,40px);
}
.apv-video h3{font-size:1.02rem;margin:14px 0 6px}
.apv-video p{margin:0;color:var(--tinta-70);font-size:.93rem;line-height:1.55}
[data-tema-secao="escuro"] .apv-video h3{color:#fff}
[data-tema-secao="escuro"] .apv-video p{color:rgba(246,242,237,.72)}
.apv-check{margin-top:clamp(28px,3.4vw,40px)}

@media (max-width:860px){
  .apv-telas{grid-template-columns:1fr;gap:20px}
  .apv-video-grade{grid-template-columns:1fr}
}

/* ---------- /migresuacentral/ ----------------------------------------
   A pagina reaproveita o que ja existe (sec-topo/Ponte, feat-grade,
   passo-grade, msc-comp-*, dep-grade, faq, parceiros, cta). A unica peca
   so' dela e' a ressalva comercial do "migramos juntos".

   O comparativo .msc-comp-* nasceu em /montesuacentral/ (franquia x Voxter) e
   serve igual aqui (como esta hoje x com a Voxter): mesma forma, duas colunas
   e duas listas. Reaproveitado em vez de duplicado; o prefixo msc- ficou,
   renomear mexeria na outra pagina sem ganho nenhum. */

/* a ressalva fica DENTRO da secao dos quatro passos, logo abaixo deles: e'
   o que separa promessa de contrato, entao nao pode virar nota de rodape. */
.mig-ressalva{
  margin:clamp(22px,2.6vw,30px) auto 0;max-width:62ch;text-align:center;
  font-size:.85rem;line-height:1.55;color:rgba(246,242,237,.52);
}

.msc-comp-grade{display:grid;grid-template-columns:1fr 1fr;gap:24px}
.msc-comp-card{background:#fff;border-radius:var(--r-lg);padding:clamp(24px,2.8vw,34px);border:1px solid var(--linha)}
.msc-comp-card .rot{display:block;margin-bottom:18px}
.msc-comp-card ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:14px}
.msc-comp-card li{display:flex;align-items:flex-start;gap:10px;font-size:.95rem;line-height:1.5}
.msc-comp-card li svg{flex:none;width:19px;height:19px;margin-top:1px}
.msc-comp-card--franquia .rot{color:var(--tinta-45)}
.msc-comp-card--franquia li{color:var(--tinta-45)}
.msc-comp-card--franquia li svg{color:var(--tinta-45)}
.msc-comp-card--voxter{border-color:var(--carmim);box-shadow:var(--sombra-md)}
.msc-comp-card--voxter .rot{color:var(--carmim)}
.msc-comp-card--voxter li{color:var(--tinta)}
.msc-comp-card--voxter li svg{color:var(--carmim)}
@media (max-width:760px){.msc-comp-grade{grid-template-columns:1fr}}

/* "Quem faz o que": mesma ideia de 2 listas lado a lado, mas sem duelo --
   as duas contam positivo, so' dividindo responsabilidade. */
.msc-divide-grade{display:grid;grid-template-columns:1fr 1fr;gap:24px}
.msc-divide-card{background:#fff;border-radius:var(--r-lg);padding:clamp(24px,2.8vw,34px);border:1px solid var(--linha)}
.msc-divide-card .rot{display:block;margin-bottom:18px;color:var(--carmim)}
.msc-divide-card:last-child .rot{color:var(--navy)}
.msc-divide-card ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:14px}
.msc-divide-card li{display:flex;align-items:flex-start;gap:10px;font-size:.95rem;line-height:1.5;color:var(--tinta-70)}
.msc-divide-card li svg{flex:none;width:18px;height:18px;margin-top:2px;color:var(--carmim)}
.msc-divide-card:last-child li svg{color:var(--navy)}
@media (max-width:760px){.msc-divide-grade{grid-template-columns:1fr}}

/* Section escura "como o dinheiro entra": simulador de verdade, mesmo
   layout/estilo da LP original (montesuaempresaderastreamento) -- pedido
   explicito do usuario apos comparar com print da LP: "quero esse nivel de
   refino, exatamente assim". Coluna esquerda = controles soltos direto no
   fundo escuro (sem cartao); coluna direita = cartao "vidro" so' com o
   resultado, valor principal em verde (mesmo tom da LP: contraste
   proposital contra o navy, e' o unico lugar do site que usa essa cor). */
.msc-dinheiro-grade{display:grid;grid-template-columns:1.1fr .9fr;gap:clamp(30px,4vw,60px);align-items:center}
.msc-sim-controles{margin-top:28px;display:flex;flex-direction:column;gap:26px}
.msc-sim-controles .calc-campo{margin-bottom:0}
.msc-sim-controles .calc-campo label{color:rgba(246,242,237,.85);font-weight:700;font-size:.9rem}
.msc-conta-card{background:rgba(246,242,237,.05);border:1px solid rgba(246,242,237,.14);border-radius:var(--r-lg);padding:clamp(28px,3.2vw,40px)}
.msc-conta-rot{margin:0 0 10px;font-family:var(--mono);font-size:.72rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:rgba(246,242,237,.55)}
.msc-conta-principal{display:flex;align-items:baseline;gap:8px;line-height:1}
.msc-conta-num{font-family:var(--fonte);font-weight:800;font-size:clamp(2.2rem,4vw,2.8rem);color:var(--verde-simulador);font-variant-numeric:tabular-nums}
.msc-conta-unid{font-size:1.05rem;font-weight:600;color:rgba(246,242,237,.5)}
.msc-conta-legenda{margin:8px 0 0;font-size:.86rem;color:rgba(246,242,237,.55)}
.msc-conta-anual{margin-top:22px;background:rgba(246,242,237,.05);border:1px solid rgba(246,242,237,.12);border-radius:var(--r-lg);padding:18px 20px}
.msc-conta-anual .msc-conta-rot{margin-bottom:6px}
.msc-conta-num--sm{font-size:clamp(1.35rem,2.2vw,1.7rem);color:#fff}
.msc-conta-legenda--sm{margin-top:4px;font-size:.76rem;color:rgba(246,242,237,.45)}
.msc-conta-nota{margin-top:20px;font-size:.76rem;color:rgba(246,242,237,.4);line-height:1.5}
/* link simples (pedido explicito: "nao botao") pro cross-link com a
   Calculadora Operacional completa -- mesmo espirito do .sol-link (seta
   desliza no hover), so' que no tom carmim de sempre, legivel em fundo escuro. */
.msc-link-simular{display:inline-flex;align-items:center;gap:7px;margin-top:16px;color:var(--carmim-vivo);font-weight:600;font-size:.9rem}
.msc-link-simular i{font-style:normal;transition:transform .25s}
.msc-link-simular:hover i{transform:translateX(4px)}
/* os componentes .opc-* (rotulo do slider, badge "manual", caixa "+") foram
   pensados pra fundo claro -- --tinta-45/--tinta-70/--linha/--osso-2 ficam
   quase invisiveis sobre o navy. So' cor muda aqui; espacamento e logica
   sao os mesmos da Calculadora Operacional. */
.msc-dinheiro .opc-slider-cab-val{color:#fff;font-size:1.35rem;font-weight:800}
.msc-dinheiro .opc-slider-legenda{color:rgba(246,242,237,.5)}
.msc-dinheiro .opc-badge{color:#f79196;background:rgba(219,84,90,.14);border-color:rgba(219,84,90,.3)}
.msc-dinheiro .opc-mais-btn{border-color:rgba(246,242,237,.28);color:rgba(246,242,237,.55)}
.msc-dinheiro .opc-mais-btn:hover,.msc-dinheiro .opc-mais-btn.ativo{border-color:var(--carmim-vivo);background:var(--carmim-vivo)}
.msc-dinheiro .opc-mais-caixa{background:rgba(246,242,237,.05);border-color:rgba(246,242,237,.14)}
.msc-dinheiro .opc-mais-caixa>span{color:rgba(246,242,237,.6)}
.msc-dinheiro .opc-mais-input{background:rgba(0,0,51,.35);border-color:rgba(246,242,237,.18);color:#fff}
.msc-dinheiro .opc-mais-input::placeholder{color:rgba(246,242,237,.35)}
.msc-dinheiro .opc-mini-x{background:rgba(246,242,237,.06);border-color:transparent;color:rgba(246,242,237,.55)}
.msc-dinheiro .opc-mini-x:hover{background:rgba(246,242,237,.14);color:#fff}
@media (max-width:900px){.msc-dinheiro-grade{grid-template-columns:1fr}}

/* Secao "Sua marca" (plataforma white label), refeita apos o usuario
   reportar "conteudo solto, sem design elaborado": reaproveita, tal como
   estao, os 3 componentes ja existentes e provados de /plataforma/ --
   .marca-grade+.celpalco (os 3 celulares flutuantes, com animacao e
   posicionamento identicos, pedido explicito do usuario) e
   .marca-white-detalhe (o grid de 4 cartoes). O que sobra aqui de proprio
   da pagina e' so' a mini-vitrine "veja por dentro" abaixo: 2 capturas +
   2 videos, MESMO tratamento visual, numa unica grade de 4 -- antes eram
   3 blocos empilhados (capturas / legenda com links / videos), cada um
   com seu proprio respiro, inflando a altura da secao sem necessidade. */
.msc-tour-mini{margin-top:clamp(36px,4.4vw,52px);padding-top:clamp(28px,3.4vw,40px);border-top:1px solid var(--linha)}
.msc-tour-cab{display:flex;align-items:baseline;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:20px}
.msc-tour-cab h3{font-size:1.1rem;margin:0}
.msc-tour-cab a{display:inline-flex;align-items:center;gap:5px;font-size:.86rem;font-weight:600;color:var(--carmim);white-space:nowrap}
.msc-tour-cab a i{font-style:normal;transition:transform .25s}
.msc-tour-cab a:hover i{transform:translateX(4px)}
.msc-tour-grade{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}
.msc-tour-item{display:flex;flex-direction:column;gap:9px}
/* width:100%;margin:0 (e nao o margin:0 auto da regra geral): a fachada vive
   dentro de um flex-column, e margem automatica no eixo transversal impede o
   stretch -- a largura passa a vir do CONTEUDO. Como o thumbnail e'
   loading="lazy" e nao declara dimensao, antes de ele carregar o conteudo e'
   nada e a celula do tour nascia com 0px de largura (medido), aparecendo so'
   depois que a imagem chegava. Com largura explicita, o quadro ja' nasce no
   tamanho certo e o aspect-ratio 16/9 cuida da altura. */
.msc-tour-item .video-fachada{width:100%;margin:0;border-radius:var(--r-md);box-shadow:var(--sombra-sm)}
.msc-tour-thumb{position:relative;display:block;aspect-ratio:16/9;border-radius:var(--r-md);overflow:hidden;box-shadow:var(--sombra-sm);border:1px solid var(--linha)}
.msc-tour-thumb img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .4s cubic-bezier(.2,.7,.3,1)}
.msc-tour-thumb:hover img{transform:scale(1.05)}
.msc-tour-item-legenda{font-size:.82rem;font-weight:600;color:var(--tinta-70);text-align:center}
@media (max-width:760px){.msc-tour-grade{grid-template-columns:repeat(2,1fr)}}

/* ---------- /montesuacentral/: "A plataforma por dentro" (mockup notebook) ---------- */
/* Copiado fielmente da LP de origem (mesmo pedido do celpalco, acima):
   flutuacao, inclinacao, crossfade das 6 capturas, navegacao (setas/pontos/
   play-pause) e barra de progresso. Prefixo "np-" (nao "tour-*", que ja
   existe em /plataforma/ com um layout inteiro diferente -- colidiria). */
.msc-notebook{position:relative;overflow:hidden}
.np-cab{text-align:center;max-width:640px;margin:0 auto clamp(36px,4.5vw,52px)}
/* o h2 tinha 12px de respiro pra se separar do rotulo "NN / ASSUNTO" que
   ficava acima; o rotulo saiu de circulacao (ver a nota da Ponte). */
.np-cab h2{margin-top:0}
.np-privacidade{margin-top:10px;font-size:.78rem;color:rgba(246,242,237,.4)}

.np-wrap{position:relative;z-index:5;width:92%;max-width:960px;margin:48px auto 0;animation:npFlutua 8s ease-in-out infinite}
@keyframes npFlutua{0%,100%{transform:translateY(0)}50%{transform:translateY(-18px)}}
.np-wrap:hover{animation-play-state:paused}
.np-zoom{position:relative;width:100%;transform:rotate(-4deg);transition:transform .6s cubic-bezier(.25,1,.5,1)}
.np-wrap:hover .np-zoom{transform:rotate(0deg) scale(1.03)}
/* moldura estilo MacBook -- base arredondada, sem clip-path (fiel ao original) */
.np-tampa{position:relative;background:#0f172a;border-radius:24px 24px 0 0;padding-bottom:60%;box-shadow:inset 0 0 0 2px #94a3b8,inset 0 0 0 6px #020617,0 42px 74px -20px rgba(2,6,23,.72)}
.np-cam{position:absolute;top:2.5%;left:50%;transform:translateX(-50%);width:8px;height:8px;border-radius:50%;background:#000;box-shadow:inset 0 0 2px rgba(255,255,255,.4),inset 0 0 4px #0284c7;z-index:10}
.np-brilho{position:absolute;inset:0;border-radius:24px 24px 0 0;background:linear-gradient(135deg,rgba(255,255,255,.06) 0%,rgba(255,255,255,0) 40%);pointer-events:none;z-index:5}
.np-tela{position:absolute;top:6%;left:3%;right:3%;bottom:7%;background:#000;border-radius:8px;overflow:hidden;border:1px solid #1e293b;box-shadow:inset 0 0 8px rgba(0,0,0,1)}
.np-dobradica{position:absolute;bottom:-5px;left:12%;right:12%;height:10px;background:linear-gradient(to bottom,#1e293b,#020617);border-radius:0 0 6px 6px;z-index:1}
.np-base{position:absolute;bottom:-26px;left:-3%;right:-3%;height:26px;background:linear-gradient(to bottom,#f8fafc 0%,#cbd5e1 30%,#94a3b8 100%);border-radius:0 0 24px 24px;box-shadow:inset 0 2px 2px rgba(255,255,255,1),inset 0 -6px 8px rgba(15,23,42,.4),0 25px 40px -10px rgba(0,0,0,.5);display:flex;justify-content:center;z-index:2}
.np-encaixe{width:18%;max-width:140px;height:6px;background:linear-gradient(to bottom,#94a3b8,#475569);border-radius:0 0 6px 6px;box-shadow:inset 0 3px 5px rgba(15,23,42,.5),0 1px 0 rgba(255,255,255,.7)}
.np-imagens{position:relative;width:100%;height:100%}
.np-imagem{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:top center;opacity:0;transition:opacity .8s ease-in-out}
.np-imagem.ativo{opacity:1}
/* barra DENTRO da tela: legenda (descricao) + botao de CTA lado a lado */
.np-barra{position:absolute;right:14px;bottom:16px;z-index:15;display:flex;align-items:stretch;gap:10px;max-width:calc(100% - 28px)}
.np-legenda{display:flex;flex-direction:column;justify-content:center;text-align:left;background:linear-gradient(135deg,rgba(11,18,32,.8),rgba(11,18,32,.64));backdrop-filter:blur(9px);-webkit-backdrop-filter:blur(9px);border:1px solid rgba(255,255,255,.14);border-radius:12px;padding:8px 13px;box-shadow:0 14px 32px -14px rgba(2,6,23,.75)}
.np-cta{display:inline-flex;align-items:center;gap:8px;white-space:nowrap;background:linear-gradient(90deg,var(--carmim-vivo),var(--carmim-fundo));color:#fff;font-weight:700;font-size:12.5px;padding:0 16px;border-radius:12px;border:1px solid rgba(255,255,255,.16);box-shadow:0 14px 30px -12px rgba(168,40,42,.7);transition:transform .2s,box-shadow .2s}
.np-cta svg{width:15px;height:15px}
.np-cta:hover{transform:translateY(-1px);box-shadow:0 18px 36px -12px rgba(168,40,42,.9)}
.np-barra-fora{display:none} /* so' no mobile (abaixo do notebook) */
.np-num{display:flex;align-items:center;gap:5px;font-family:var(--fonte);font-weight:800;font-size:11.5px;letter-spacing:.04em;color:#f79196;margin-bottom:3px;font-variant-numeric:tabular-nums}
.np-num svg{width:10px;height:10px;opacity:.9}
.np-lbl{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#eef2f8;line-height:1.3}
.np-lbl svg{width:13px;height:13px;color:#f79196;flex:none}
/* UI de navegacao (aparece no hover, desktop) */
.np-ui{position:absolute;inset:0;opacity:0;transition:opacity .3s ease;pointer-events:none;z-index:12;background:linear-gradient(to top,rgba(2,6,23,.5) 0%,rgba(2,6,23,0) 32%)}
.np-zoom:hover .np-ui{opacity:1;pointer-events:auto}
.np-nav{position:absolute;inset:0;display:flex;align-items:center;justify-content:space-between;padding:0 12px}
.np-btn{background:rgba(11,18,32,.55);backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);border:1px solid rgba(255,255,255,.28);color:#fff;width:42px;height:42px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;box-shadow:0 6px 16px -6px rgba(2,6,23,.55)}
.np-btn svg{width:16px;height:16px}
.np-btn:hover{background:rgba(11,18,32,.8);transform:scale(1.08)}
.np-rodape{position:absolute;left:0;bottom:0;display:flex;align-items:center;gap:15px;padding:0 16px 14px}
.np-play{background:none;border:none;color:#fff;cursor:pointer;opacity:.85;transition:opacity .2s,transform .2s;display:flex;padding:0}
.np-play svg{width:15px;height:15px}
.np-play:hover{opacity:1;transform:scale(1.1)}
.np-pontos{display:flex;gap:7px;align-items:center}
.np-ponto{width:7px;height:7px;border-radius:50%;background:rgba(255,255,255,.42);cursor:pointer;transition:all .3s ease;border:0;padding:0}
.np-ponto:hover{background:rgba(255,255,255,.8)}
.np-ponto.ativo{background:#fff;width:22px;border-radius:4px}
.np-progresso{position:absolute;bottom:0;left:0;width:100%;height:4px;background:rgba(255,255,255,.14);z-index:20}
.np-progresso>i{display:block;height:100%;width:0;background:linear-gradient(90deg,#f79196,var(--carmim-vivo))}
.np-fatos{margin-top:78px;display:flex;gap:14px 34px;justify-content:center;flex-wrap:wrap;color:#94a3b8;font-size:14px;font-weight:600}
.np-fatos span{display:inline-flex;align-items:center;gap:8px}
.np-fatos svg{width:16px;height:16px;color:#f79196;flex:none}
/* nota de reforco abaixo do notebook -- composta (icone + hierarquia), nao texto solto */
.np-nota{margin:40px auto 0;max-width:560px;display:flex;align-items:center;gap:17px;text-align:left;padding:18px 24px;border-radius:16px;background:linear-gradient(135deg,rgba(255,255,255,.06),rgba(255,255,255,.018));border:1px solid rgba(255,255,255,.1);box-shadow:0 22px 54px -26px rgba(0,0,0,.7);position:relative;z-index:5}
.np-nota-ico{flex-shrink:0;width:46px;height:46px;border-radius:13px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--carmim-vivo),var(--carmim-fundo));color:#fff;box-shadow:0 12px 26px -8px rgba(168,40,42,.6)}
.np-nota-ico svg{width:20px;height:20px}
.np-nota-txt{margin:0;color:#c8d3e2;font-size:15.5px;line-height:1.45;font-weight:500}
.np-nota-txt strong{display:block;color:#fff;font-weight:800;font-size:18px;margin-bottom:3px;font-family:var(--fonte);letter-spacing:-.01em}
@media (max-width:1024px){
  .np-wrap{max-width:520px;margin-top:34px}
  .np-wrap:hover .np-zoom,.np-zoom{transform:none}
  .np-ui{opacity:1;pointer-events:auto}
  /* mobile: legenda + botao SAEM da tela e vao pra baixo, sobrepondo a base do notebook */
  .np-barra{display:none}
  .np-barra-fora{display:flex;align-items:stretch;justify-content:center;gap:9px;margin:-14px 16px 0;position:relative;z-index:8}
  .np-legenda{padding:7px 11px}
  .np-lbl{font-size:11.5px}
  .np-cta{font-size:11px;padding:0 13px;gap:6px}
  /* play/pause continua dentro da tela, no topo-esquerdo (circulo escuro), bullets escondem */
  .np-rodape{top:8px;left:8px;bottom:auto;padding:0}
  .np-play{background:rgba(11,18,32,.62);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);border:1px solid rgba(255,255,255,.28);border-radius:50%;width:34px;height:34px;align-items:center;justify-content:center;line-height:0;box-shadow:0 6px 16px -6px rgba(2,6,23,.6)}
  .np-pontos{display:none}
  /* base do notebook mais fina no mobile (proporcional ao mockup menor) */
  .np-base{height:15px;bottom:-15px;border-radius:0 0 16px 16px}
  .np-encaixe{height:4px;max-width:96px}
  .np-dobradica{height:7px;bottom:-4px}
  .np-fatos{margin-top:52px}
  .np-nota{margin:40px 16px 0;padding:16px 18px;gap:13px;max-width:none}
  .np-nota-ico{width:42px;height:42px;border-radius:12px}
  .np-nota-ico svg{width:18px;height:18px}
  .np-nota-txt strong{font-size:16px}
  .np-nota-txt{font-size:14px}
}
@media (prefers-reduced-motion:reduce){.np-wrap{animation:none}.np-imagem{transition:none}}

/* ---------- /{segmento}/: paginas do menu "Segmentos" ---------- */
/* foto generica de contexto (banco Unsplash, mesmas fotos de
   $cases_segmento_foto em dados-cases.php -- reaproveitada aqui na secao
   de abertura de cada pagina de segmento, credito vai no alt). */
.segmento-foto{margin-top:clamp(26px,3.2vw,38px);border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sombra-md)}
.segmento-foto img{width:100%;display:block;max-height:420px;object-fit:cover}

/* ---------- KIT DE TITULOS: quatro tratamentos tipograficos ----------
   Substitui o rotulo "NN / ASSUNTO" em monoespaçada de caixa alta que abria
   toda seção. Aquele numero prometia uma ordem que nao existe (ninguem
   precisa ler a 03 depois da 02) e e' o tique mais reconhecivel de pagina
   gerada por IA -- reprovado pelo usuario.
   Regra de uso, pra nao virar maneirismo: por pagina, no maximo 1 vazado e
   1 escada (peças de impacto), e sempre uma seção quieta entre duas
   tratadas. .tit-forte e .tit-faixa aguentam repetir mais. */

/* 1) VAZADO (bloco de cor com foto por dentro das letras): DESCARTADO.
   Testado ao vivo em /centrais-de-rastreamento/ e reprovado -- mesmo com
   foto de contraste alto o efeito fica sujo dentro das letras e o bloco
   de cor vira um corpo estranho no meio da pagina. Nao reintroduzir. */

/* 2) PALAVRA FORTE: a palavra que carrega o sentido vai pro carmim. */
.tit-forte i{font-style:normal;color:var(--carmim)}
/* dentro da caixa do CTA o fundo E' carmim: o destaque em carmim da'
   contraste 1.00:1 (medido no gradiente real) e some. Ouro da' 3.34:1 no
   ponto mais claro e 4.83:1 no escuro, e e' a mesma saida que a ponte ja'
   usa em secao escura. */
.cta-cx .tit-forte i{color:var(--dourado)}
/* Mesma razao, fora da caixa do CTA: carmim sobre navy mede 2.86:1 (cores
   lidas do DOM, rgb(168,40,42) sobre rgb(0,0,51)), abaixo dos 3:1 que
   titulo grande pede; o ouro no mesmo fundo da' 9.56:1. E' a mesma saida que a ponte e a frase de apoio ja' usam em
   secao escura, logo abaixo. Escopado nas tres secoes escuras de
   /montesuacentral/; home (jornadas, porque, depoimentos) e
   /ferramentas/sentinela/ (painel, saidas) continuam em carmim e ficam de
   fora ate' alguem decidir mexer nelas. */
.msc-dinheiro .tit-forte i,
.msc-notebook .tit-forte i,
.msc-depoimentos .tit-forte i,
.mig-entrada .tit-forte i,
.mig-atendimento .tit-forte i,
.mig-depoimentos .tit-forte i,
.apv-atendimento .tit-forte i,
.estrutura .tit-forte i{color:var(--dourado)}

/* 3) ESCADA (linhas deslocadas de proposito): DESCARTADA.
   Reprovada duas vezes ao vivo. A primeira versao tinha os recuos em
   ziguezague (as linhas comecavam em 0 / 90 / 28px: a terceira voltava pra
   esquerda); corrigida pra diagonal de verdade, continuou ruim -- o bloco
   fica com rag dos dois lados e nao forma massa nenhuma, o oposto dos
   titulos que o usuario aprova, que sao retangulos de linhas parecidas.
   Nao reintroduzir. */

/* 4) FAIXA: marca-texto na altura do miolo da palavra, 1 grau torto pra nao
   virar retangulo de software. Ouro por padrao -- carmim atras de texto
   escuro embarra a leitura (testado). .meia cobre so' parte da palavra. */
/* position/z-index no proprio h2: a faixa e' um ::before com z-index:-1, e
   sem um contexto de empilhamento aqui ela cai ATRAS do fundo de qualquer
   ancestral que tenha cor propria (achado numa seção de fundo navy: a faixa
   sumia por completo). Com o contexto no h2, o -1 fica preso dentro dele,
   atras do texto e na frente do fundo da seção. */
/* MARCA-TEXTO EM CORPO DE TEXTO -------------------------------------------
   Para leitura dinamica: quem varre a pagina sem ler tudo para primeiro no
   que esta' marcado.
   Nao e' a faixa cheia do titulo (.tit-faixa mark, logo abaixo): dourado
   solido atras de texto de 15px fecha o contraste e a frase vira botao. Aqui
   a tinta cobre so' a parte de baixo da linha, como caneta marca-texto de
   verdade, deixando a altura das maiusculas livre.
   box-decoration-break:clone: frase que quebra em duas linhas recebe tinta
   nas duas. Sem isso so' a primeira sai marcada.
   As duas regras com escopo proprio (titulo e painel de busca) tem
   especificidade maior e continuam mandando onde valem. */
mark{
  color:inherit;
  /* background-color EXPLICITO em transparent: a folha do proprio navegador
     pinta mark com amarelo solido, e so' declarar background-image deixa o
     amarelo aparecendo por baixo/ao redor da tinta. */
  background-color:transparent;
  background-image:linear-gradient(to top,rgba(220,171,91,.52) 0,rgba(220,171,91,.52) .76em,transparent .76em);
  padding:0 .12em;
  box-decoration-break:clone;-webkit-box-decoration-break:clone;
}
/* em fundo escuro o texto e' claro e a tinta precisa de menos corpo, senao
   ela compete com a propria frase */
[data-tema-secao="escuro"] mark{background-color:transparent;background-image:linear-gradient(to top,rgba(220,171,91,.38) 0,rgba(220,171,91,.38) .76em,transparent .76em)}

.tit-faixa{position:relative;z-index:0}
.tit-faixa mark{background:none;color:inherit;position:relative;white-space:nowrap}
.tit-faixa mark::before{
  content:"";position:absolute;z-index:-1;left:-.06em;right:-.12em;bottom:.1em;height:.55em;
  background:var(--dourado);transform:rotate(-1deg);
}
.tit-faixa mark.meia::before{right:45%;transform:none}
/* em seção escura o texto e' claro: a faixa vai atras e precisa de menos peso */
[data-tema-secao="escuro"] .tit-faixa mark::before{opacity:.9}
/* COMPOSICAO DO CABECALHO: PONTE (titulo | filete que estica | apoio).
   Escolhida pelo usuario entre 13 estudos (ver /estudo-titulos/).
   O que ela resolve: o arranjo anterior prendia a frase de apoio na margem
   direita (justify-content:space-between), entao TODA folga do titulo virava
   buraco no meio; medido em /centrais-de-rastreamento/ dava 340px no pior
   caso. A correcao seguinte foi apertar a caixa do titulo em ch pra ela
   encostar na frase: funcionava, mas exigia calcular uma medida a mao pra
   cada frase nova.
   Aqui a coluna do meio e' um filete que ocupa exatamente o que sobrar: o
   vao deixa de ser sobra e vira ligacao, e titulo curto ou longo fecha
   sozinho, sem medida obrigatoria por frase.
   Arranjos ja' testados e reprovados, pra nao voltarem:
     - frase de apoio jogada embaixo do titulo (deixa metade da largura morta);
     - titulo esticado na largura toda ("ocupando a tela quase inteira");
     - filete vertical com a altura do titulo ao lado da frase.
   O text-wrap:balance fica: sem ele a segunda linha saia tocada (medido
   691/297 e 685/152, com "Voxter" sozinho na linha). */
.sec-topo:has(.tit-forte),.sec-topo:has(.tit-faixa){
  display:grid;grid-template-columns:auto 1fr auto;align-items:center;
}
.sec-topo:has(.tit-forte) > div:first-child,
.sec-topo:has(.tit-faixa) > div:first-child{min-width:0}
/* margin-top:0 -- o .sec-topo h2 tinha 12px de respiro pra se separar do
   rotulo "NN / ASSUNTO" que ficava acima; o rotulo saiu de circulacao. */
.sec-topo:has(.tit-forte) h2,
.sec-topo:has(.tit-faixa) h2{max-width:var(--tit-med,16ch);margin-top:0;text-wrap:balance}
/* a ponte. So' entra em seção que TEM frase de apoio; sem ela o filete
   correria ate' a margem sem chegar a lugar nenhum. */
.sec-ponte{height:1.5px;background:var(--carmim);opacity:.5;margin:0 clamp(16px,2vw,26px)}
.sec-topo:has(.tit-forte) .lede-destaque,
.sec-topo:has(.tit-faixa) .lede-destaque{
  width:clamp(190px,19vw,250px);max-width:none;
  border-left:0;padding-left:0;                 /* <- quem liga agora e' a ponte */
  font-size:1.02rem;line-height:1.5;color:var(--tinta-70);
}
/* SEÇÃO ESCURA. O kit nasceu so' pra fundo claro; a primeira vez que um
   cabecalho dele foi parar numa faixa navy, a frase de apoio ficou em
   var(--tinta-70) sobre navy, praticamente invisivel. Ouro na ponte porque
   carmim sobre navy quase nao aparece. */
[data-tema-secao="escuro"] .sec-topo:has(.tit-forte) .lede-destaque,
[data-tema-secao="escuro"] .sec-topo:has(.tit-faixa) .lede-destaque{color:rgba(246,242,237,.74)}
[data-tema-secao="escuro"] .sec-ponte{background:var(--dourado);opacity:.7}

@media (max-width:860px){
  .sec-topo:has(.tit-forte),.sec-topo:has(.tit-faixa){display:block}
  .sec-ponte{display:none}
  /* empilhado a frase recupera o filete da esquerda (padrao do
     .lede-destaque): sem ponte e sem filete ela ficaria solta. */
  .sec-topo:has(.tit-forte) .lede-destaque,
  .sec-topo:has(.tit-faixa) .lede-destaque{
    width:auto;margin-top:22px;
    border-left:2.5px solid var(--carmim);padding-left:16px;
  }
  /* a medida apertada so' serve pro layout de 3 colunas. Empilhado ela
     aperta a' toa (medido a 768px: 310px numa faixa de 690); e soltar de vez
     virava UMA linha ocupando 87% da faixa, forma ja' reprovada. 20ch e' o
     meio termo medido. */
  .sec-topo:has(.tit-forte) h2,
  .sec-topo:has(.tit-faixa) h2{max-width:20ch}
}

/* ---------- tratamentos editoriais de imagem (paginas de Segmento) ----------
   Substituem o .segmento-foto, que era uma <figure> solta no meio do texto
   -- "imagem jogada do nada, como texto de doc do Word" (reprovado direto
   pelo usuario). Aqui a imagem PARTICIPA do layout em vez de ilustrar. */

/* A) SPLIT full-bleed: a foto ocupa metade da tela inteira, sangrando ate' a
   borda; o conteudo (lista, grid, numeros) ocupa a outra metade, respeitando
   o gutter do lado de fora. Mesma mecanica do .gente-cx da home, ja' testada.
   .seg-split-inv troca os lados (foto a' direita) -- e' o que quebra o ritmo
   quando a pagina usa o recurso mais de uma vez. */
.seg-split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);align-items:stretch;background:var(--osso-2)}
.seg-split-foto{position:relative;min-height:clamp(340px,42vw,560px);overflow:hidden}
.seg-split-foto img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.seg-split-txt{padding:clamp(44px,5.5vw,84px) var(--gut) clamp(44px,5.5vw,84px) clamp(28px,4vw,72px);align-self:center;max-width:none}
/* foto a' esquerda (padrao): o texto encosta no gutter da direita.
   invertido: espelha os dois paddings junto com a ordem das colunas. */
.seg-split-inv .seg-split-foto{order:2}
.seg-split-inv .seg-split-txt{order:1;padding:clamp(44px,5.5vw,84px) clamp(28px,4vw,72px) clamp(44px,5.5vw,84px) var(--gut)}
.seg-split-txt h2{max-width:18ch;margin:12px 0 16px}
.seg-split-txt .lede{max-width:52ch}
/* lista com filete, nao pilula/chip (ver feedback "listar nao e' encaixotar"):
   a hierarquia vem da tipografia e de uma linha fina, sem componente. */
.seg-lista{list-style:none;margin:clamp(22px,2.6vw,30px) 0 0;padding:0}
.seg-lista li{padding:14px 0;border-top:1px solid var(--linha)}
.seg-lista li:last-child{border-bottom:1px solid var(--linha)}
.seg-lista b{display:block;font-weight:600;font-size:1.02rem;letter-spacing:-.01em}
.seg-lista span{display:block;margin-top:3px;color:var(--tinta-70);font-size:.92rem;line-height:1.5}
@media (max-width:900px){
  .seg-split,.seg-split-inv{grid-template-columns:1fr}
  .seg-split-foto{min-height:260px;order:1}
  .seg-split-txt,.seg-split-inv .seg-split-txt{order:2;padding:clamp(34px,6vw,52px) var(--gut)}
}

/* B) IMERSIVO: a foto vira FUNDO da section inteira, dessaturada, sob um veu
   navy translucido -- a imagem deixa de competir com o texto e vira
   atmosfera. Texto a' esquerda, elemento visual (numeros/card) a' direita. */
.seg-imersivo{position:relative;overflow:hidden;background:var(--navy);color:#fff}
.seg-imersivo-fundo{position:absolute;inset:0;z-index:0}
.seg-imersivo-fundo img{width:100%;height:100%;object-fit:cover;filter:grayscale(1) contrast(1.1)}
/* o veu e' o que garante contraste de texto: sem ele, foto clara apaga o
   branco. Gradiente (nao cor chapada) pra imagem ainda respirar de um lado. */
.seg-imersivo-fundo::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(100deg,rgba(0,0,51,.94) 0%,rgba(0,0,51,.86) 42%,rgba(0,0,51,.62) 100%);
}
.seg-imersivo .wrap{position:relative;z-index:1;padding-top:clamp(52px,6vw,92px);padding-bottom:clamp(52px,6vw,92px)}
.seg-imersivo-grade{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);gap:clamp(32px,5vw,72px);align-items:center}
.seg-imersivo .rot{color:var(--dourado)}
.seg-imersivo h2{color:#fff;max-width:19ch;margin:12px 0 18px}
.seg-imersivo p{color:rgba(246,242,237,.82);max-width:52ch}
/* painel de numeros a' direita: vidro sobre a foto, mesma familia visual do
   resto do site (raio + filete claro), sem virar um card pesado. */
.seg-painel{
  display:grid;grid-template-columns:1fr 1fr;gap:1px;
  background:var(--linha-clara);border:1px solid var(--linha-clara);border-radius:var(--r-lg);overflow:hidden;
}
.seg-painel div{background:rgba(0,0,51,.55);padding:clamp(20px,2.6vw,30px) clamp(16px,2vw,24px);backdrop-filter:blur(2px)}
.seg-painel b{display:block;font-size:clamp(1.6rem,2.8vw,2.3rem);font-weight:700;letter-spacing:-.02em;color:#fff;line-height:1.05}
.seg-painel span{display:block;margin-top:8px;font-family:var(--mono);font-size:11.5px;letter-spacing:.05em;color:rgba(246,242,237,.6);line-height:1.45}
@media (max-width:900px){
  .seg-imersivo-grade{grid-template-columns:1fr;gap:clamp(28px,4vw,40px)}
}

/* E) BLOCO DE DADOS com fonte citada. Substitui o uso de .contadores-grade +
   .stat-rot aqui: aquele par joga o ROTULO e a LINHA DE FONTE no mesmo
   tamanho e na mesma mono (12px), entao os dois competiam e nada lia como
   principal ou secundario (reprovado pelo usuario: "os subs nao tem boa
   leitura"). Aqui a hierarquia e' explicita em 3 degraus:
     numero  -> grande, carmim, peso 700
     rotulo  -> fonte de TEXTO (nao mono), 15px, tinta-70, alinhado a esquerda
     credito -> 11.5px, tinta-45, separado por filete, claramente terciario
   Mono some do rotulo de proposito: monoespaçada com tracking e' boa pra tag
   curta, nao pra frase de 4-5 palavras. */
.seg-dados{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(18px,2.4vw,32px)}
.seg-dados > div{border-top:2px solid var(--carmim);padding-top:clamp(12px,1.4vw,16px)}
.seg-dados b{
  display:block;line-height:1;letter-spacing:-.025em;
  font-size:clamp(1.75rem,3.1vw,2.6rem);font-weight:700;color:var(--carmim);
}
.seg-dados span{
  display:block;margin-top:10px;max-width:24ch;
  font-family:var(--fonte);font-size:.95rem;line-height:1.4;color:var(--tinta-70);
}
.seg-dados-fonte{
  margin-top:clamp(20px,2.4vw,28px);padding-top:14px;border-top:1px solid var(--linha);
  font-family:var(--fonte);font-size:11.5px;line-height:1.5;color:var(--tinta-45);max-width:88ch;
}
@media (max-width:860px){
  .seg-dados{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:460px){
  .seg-dados{grid-template-columns:1fr;gap:14px}
  .seg-dados span{max-width:none}
}

/* D) DEPOIMENTO: video vertical (alto) de um lado exige peso do outro, senao
   sobra um vazio enorme na coluna de texto (achado do usuario na secao de
   depoimento de /centrais-de-rastreamento/). Foto real + numeros reais + link
   equilibram a altura do 9:16. */
/* grade PROPRIA, nao .experiencia-grade: aquela e' feita pra section de fundo
   NAVY e forca .lede{color:rgba(246,242,237,.8)} (o proprio comentario dela
   diz "ou fica escuro sobre navy"). Reusada aqui, num fundo claro, deixava o
   paragrafo BRANCO SOBRE CLARO, ilegivel -- bug real reportado pelo usuario,
   e meu primeiro diagnostico errou o elemento e disse que nao era branco.
   Aqui a cor do texto e' a padrao da pagina clara. */
.seg-depo-grade{
  display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);
  gap:clamp(30px,4vw,56px);align-items:start;
}
.seg-depo-video{justify-self:center;width:100%;max-width:300px}
/* numeros em filete, nao em card (ver "listar nao e' encaixotar") */
.seg-depo-nums{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(12px,1.6vw,20px);margin-top:clamp(22px,2.6vw,28px);border-top:1px solid var(--linha);padding-top:clamp(18px,2.2vw,24px)}
.seg-depo-nums b{display:block;font-size:clamp(1.3rem,2.1vw,1.75rem);font-weight:700;letter-spacing:-.02em;color:var(--carmim);line-height:1.05}
.seg-depo-nums span{display:block;margin-top:5px;font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--tinta-45);line-height:1.4}
.seg-depo-cap{margin-top:14px;text-align:center;font-family:var(--mono);font-size:11.5px;letter-spacing:.03em;color:var(--tinta-45);line-height:1.5}
@media (max-width:900px){
  .seg-depo-nums{grid-template-columns:repeat(3,1fr)}
}
@media (max-width:480px){
  .seg-depo-nums{grid-template-columns:1fr;gap:10px}
  .seg-depo-nums > div{display:flex;align-items:baseline;gap:10px}
  .seg-depo-nums span{margin-top:0}
}

/* C) TRANSBORDO: texto a' esquerda, elemento visual a' direita que COMECA
   dentro da section e vaza pra dentro da seguinte, como se estivesse saindo
   dela. Pedido explicito do usuario.
   Mecanica: a section NAO pode ter overflow:hidden (senao corta o vazamento),
   e a imagem usa translateY -- nao margin negativa. Translate nao reserva
   espaco no fluxo, entao a section de baixo sobe naturalmente por baixo da
   ponta da imagem, que e' exatamente o efeito de "saindo pra outra". O
   z-index mantem a ponta POR CIMA da proxima section. */
.seg-transbordo{position:relative;overflow:visible;z-index:1}
/* align-items:start, nao center: a figura e' alta (4/5) e o texto e' curto,
   entao "center" empurrava o texto pro meio da linha e abria um vao enorme
   logo abaixo do paragrafo de abertura (achado do usuario). Com start, o
   texto comeca junto com a imagem e o vazio some. */
.seg-transbordo-grade{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.92fr);gap:clamp(30px,4.5vw,64px);align-items:start}
.seg-transbordo-txt{align-self:start}
.seg-transbordo-txt h2{max-width:18ch}
.seg-transbordo-txt .lede{max-width:52ch}
/* o vazamento mora no INVOLUCRO, nunca no elemento que leva .rev:
   .rev.vis{transform:none} (scroll-reveal) zera qualquer transform do proprio
   elemento, entao um translate posto junto com .rev funcionava ate' a secao
   revelar e sumia em seguida. Medido ao vivo: a ponta voltava pra dentro no
   instante em que .vis entrava. Dois elementos = duas transforms que nao
   disputam. */
.seg-transbordo-cx{
  position:relative;z-index:2;align-self:end;
  /* a "pontinha" que invade a proxima section. Precisa ser MAIOR que o
     padding-bottom da section (clamp(50px,6vw,80px)), senao o vazamento
     morre dentro do proprio respiro da section. */
  transform:translateY(clamp(70px,11vw,160px));
}
.seg-transbordo-fig{
  position:relative;margin:0;
  border-radius:var(--r-lg);overflow:hidden;
  /* sombra em CAMADAS, nao um borrao so'. --sombra-lg (0 24px 60px) e' um
     unico blur largo e, contra a troca de fundo entre as duas sections, lia
     como mancha liquida (reprovado pelo usuario). A pilha abaixo imita queda
     de luz real: um fio de contorno que define a aresta, depois sombras cada
     vez mais largas e mais fracas. */
  box-shadow:
    0 0 0 1px rgba(0,0,51,.05),
    0 1px 2px rgba(0,0,51,.04),
    0 4px 8px rgba(0,0,51,.045),
    0 12px 20px rgba(0,0,51,.05),
    0 28px 40px rgba(0,0,51,.055),
    0 48px 72px rgba(0,0,51,.06);
}
.seg-transbordo-fig img{display:block;width:100%;aspect-ratio:4/5;object-fit:cover}
/* a section seguinte precisa de respiro extra no topo pra ponta da imagem
   pousar sobre ela sem cobrir texto. */
.seg-apos-transbordo{padding-top:clamp(74px,9vw,150px)}
@media (max-width:900px){
  .seg-transbordo-grade{grid-template-columns:1fr}
  /* no celular o transbordo vira ruido: a imagem empilha e o efeito perde
     sentido (nao ha' duas colunas pra criar a tensao). Desliga limpo. */
  .seg-transbordo-cx{transform:none;margin-top:clamp(26px,4vw,34px)}
  .seg-transbordo-fig img{aspect-ratio:16/10}
  .seg-apos-transbordo{padding-top:clamp(44px,6vw,64px)}
}

/* ===== /ferramentas/sentinela/ ==========================================
   A pagina tem UMA materia visual forte (a captura do painel sobre superficie
   navy sangrada) e o resto em piano com acabamento: tipografia, filete e
   superficie tingida. Nada de grade de caixas iguais nem de pilula. */

/* provas curtas: filete separando, nao caixa em volta */
.sent-provas{
  display:grid;grid-template-columns:repeat(3,1fr);
  margin-top:clamp(28px,3.4vw,42px);border-top:1px solid var(--linha);
}
.sent-prova{padding:22px clamp(16px,2vw,28px) 4px 0}
.sent-prova + .sent-prova{border-left:1px solid var(--linha);padding-left:clamp(16px,2vw,28px)}
.sent-prova b{display:block;font-size:1.02rem;line-height:1.35;color:var(--tinta)}
.sent-prova span{display:block;margin-top:6px;color:var(--tinta-70);font-size:.92rem;line-height:1.55}

/* letra miuda de condicao/escopo: mono pequena, sem virar aviso vermelho */
.sent-nota{
  margin-top:clamp(22px,2.6vw,30px);padding-left:14px;border-left:2px solid var(--dourado);
  font-size:.88rem;line-height:1.6;color:var(--tinta-70);max-width:72ch;
}
.sent-passos{grid-template-columns:repeat(3,1fr)}
.sent-fecho{
  margin-top:clamp(26px,3vw,36px);max-width:62ch;
  font-size:1.05rem;line-height:1.6;color:var(--tinta);
}

/* --- o pico da pagina ---------------------------------------------------
   Superficie navy sangrada com a MESMA lavagem do hero (azul pelo alto
   direito, carmim pelo pe esquerdo), grao por cima e a captura flutuando com
   sombra tingida de navy. O z-index:0 no proprio <section> cria o contexto de
   empilhamento -- sem ele as duas camadas decorativas caem atras do fundo. */
.sent-painel{
  position:relative;z-index:0;overflow:hidden;
  background:linear-gradient(150deg,var(--navy-2),var(--navy));
  padding:clamp(60px,7vw,110px) 0;
}
.sent-painel-luz{
  position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(1200px 500px at 82% -10%, rgba(30,58,138,.55), transparent 70%),
    radial-gradient(900px 500px at 0% 110%, rgba(168,40,42,.4), transparent 70%);
}
.sent-painel-grao{
  position:absolute;inset:0;pointer-events:none;opacity:.5;mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='r'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='3'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23r)' opacity='.38'/%3E%3C/svg%3E");
}
.sent-painel .wrap{position:relative;z-index:1}
.sent-captura{margin:clamp(30px,3.6vw,46px) 0 0}
.sent-captura img{
  display:block;width:100%;height:auto;border-radius:var(--r-lg);
  border:1px solid rgba(246,242,237,.14);
  box-shadow:0 40px 90px -30px rgba(0,0,51,.85), 0 2px 0 rgba(246,242,237,.06) inset;
}
.sent-captura figcaption{
  margin-top:16px;font-size:.86rem;line-height:1.55;color:rgba(246,242,237,.6);max-width:70ch;
}

/* parametros: sao DADO, entao saem em monoespacada e separados por filete */
.sent-params{
  display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(22px,3vw,44px);
  margin-top:clamp(28px,3.4vw,42px);
}
.sent-param-col .rot{display:block;margin-bottom:12px;color:var(--carmim)}
.sent-param-col ul{list-style:none;margin:0;padding:0;border-top:1px solid var(--linha)}
.sent-param-col li{
  padding:9px 0;border-bottom:1px solid var(--linha);
  font-family:var(--mono);font-size:.88rem;color:var(--tinta);
}
/* os dois extras ganham corpo numa SUPERFICIE SO' -- lavagem carmim bem
   diluida sobre o osso, grao por cima e um filete separando as colunas. Duas
   caixas iguais lado a lado seria justamente a grade de cards ja' reprovada;
   aqui o peso vem da superficie e do icone, nao de borda em volta de cada um. */
.sent-extras{
  position:relative;isolation:isolate;overflow:hidden;
  display:grid;grid-template-columns:repeat(2,1fr);
  margin-top:clamp(30px,3.6vw,46px);
  border:1px solid var(--linha);border-radius:var(--r-lg);
  background:
    linear-gradient(135deg,rgba(168,40,42,.055),rgba(0,0,51,.035) 60%,rgba(220,171,91,.05)),
    var(--osso);
  box-shadow:var(--sombra-sm);
}
.sent-extras::before{
  content:'';position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:.5;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23g)' opacity='.22'/%3E%3C/svg%3E");
}
.sent-extra{padding:clamp(24px,2.8vw,34px) clamp(22px,2.6vw,34px)}
/* no hover o CONTEUDO cresce um pouco e a superficie fica parada: e' o texto
   que se aproxima, nao a caixa que incha. O wrapper existe pra isso -- o
   filete entre as colunas e' border-left do .sent-extra, e transformar o
   proprio elemento levaria o filete junto.
   transform-origin no canto de leitura (esquerda/topo) pra massa crescer pro
   lado de dentro, sem empurrar nada contra o filete. */
.sent-extra-cx{
  transform-origin:left top;
  transition:transform .32s cubic-bezier(.2,.7,.3,1);
  will-change:transform;
}
.sent-extra:hover .sent-extra-cx{transform:scale(1.035)}
/* a lavagem tambem responde, de leve: a coluna sob o cursor acende um pouco */
.sent-extra{transition:background .32s}
.sent-extra:hover{background:rgba(168,40,42,.035)}
@media (prefers-reduced-motion:reduce){
  .sent-extra-cx{transition:none}
  .sent-extra:hover .sent-extra-cx{transform:none}
}
.sent-extra + .sent-extra{border-left:1px solid var(--linha)}
.sent-extra-ico{
  display:flex;align-items:center;justify-content:center;width:34px;height:34px;
  margin-bottom:14px;border-radius:var(--r-sm);color:var(--carmim);
  background:rgba(168,40,42,.09);
}
.sent-extra-ico svg{width:18px;height:18px}
.sent-extra b{display:block;font-size:1.04rem;line-height:1.3;color:var(--tinta)}
.sent-extra p{margin:7px 0 0;color:var(--tinta-70);font-size:.94rem;line-height:1.6;max-width:42ch}

/* as duas saidas: nao sao "cards", sao dois caminhos com peso diferente --
   quem ja' e' cliente sai pelo botao cheio, quem ainda nao e' sai pelo de
   linha, e a borda esquerda em carmim marca qual e' qual */
.sent-saidas{position:relative;background:linear-gradient(150deg,var(--navy-2),var(--navy));padding:clamp(56px,6.4vw,96px) 0}
/* esta e' a unica pagina que fecha escuro (as outras terminam no .cta claro) e
   o degrade chega ao pe' em --navy, exatamente a cor do rodape: sem marca, a
   emenda nao existe. O filete dourado e' o fim da pagina.
   As pontas apagam pra ler como linha de luz, nao como borda de uma caixa. */
.sent-saidas::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:linear-gradient(90deg,rgba(220,171,91,0),var(--dourado) 7%,var(--dourado) 93%,rgba(220,171,91,0));
}
.sent-saida-grade{display:grid;grid-template-columns:repeat(2,1fr);gap:clamp(24px,3vw,44px);margin-top:clamp(26px,3vw,38px)}
.sent-saida{border-left:2px solid var(--carmim);padding-left:clamp(18px,2vw,26px)}
.sent-saida h3{margin:0;color:#fff;font-size:1.16rem;line-height:1.35}
.sent-saida p{margin:10px 0 20px;color:rgba(246,242,237,.72);font-size:.95rem;line-height:1.6;max-width:42ch}
.sent-saida .btn.linha{border-color:rgba(246,242,237,.4);color:#fff}
.sent-saida .btn.linha:hover{background:rgba(246,242,237,.1)}

@media (max-width:860px){
  .sent-provas{grid-template-columns:1fr}
  .sent-prova + .sent-prova{border-left:0;border-top:1px solid var(--linha);padding-left:0}
  .sent-passos{grid-template-columns:1fr}
  .sent-params{grid-template-columns:1fr}
  .sent-extras,.sent-saida-grade{grid-template-columns:1fr}
  .sent-extra + .sent-extra{border-left:0;border-top:1px solid var(--linha)}
}

/* ===== TESTE: tipografia arredondada (por enquanto so' na home) ==========
   A "Google Sans" que o site usa NAO tem eixo de arredondamento. Conferido na
   metadata do Google Fonts, nao suposto: ela registra GRAD (-50..200),
   opsz (17..18) e wght (400..700), e mais nada. Quem tem ROND e' a
   Google Sans Flex: GRAD 0..100, ROND 0..100, opsz 6..144, slnt -10..0,
   wdth 25..151, wght 1..1000.
   Ou seja: arredondar exige TROCAR de familia, nao da' pra ajustar a atual.

   A troca e' feita redefinindo o token --fonte no proprio <body>: custom
   property e' herdada, entao todo `font-family:var(--fonte)` espalhado pelo
   site passa a resolver pra Flex sem precisar tocar em cada regra.
   font-variation-settings tambem e' herdada, entao o ROND desce junto.

   --rond: o valor do teste. Trocar aqui muda a pagina inteira. */
body.fonte-arredondada{
  --rond:40;
  --fonte:"Google Sans Flex","Google Sans","Product Sans",system-ui,sans-serif;
  font-family:var(--fonte);
  font-variation-settings:"ROND" var(--rond);
}


/* ============================================================
   APLICACOES (/aplicacoes/)
   ============================================================
   Indice das aplicacoes da Voxter, em duas formas de ver: LISTA (o padrao) e
   GRADE. A escolha e' do visitante -- as duas servem a leituras diferentes:
   a lista deixa comparar as descricoes de cima a baixo, a grade deixa bater
   o olho nas marcas. O alternador aparece em cada grupo, mas muda os dois
   juntos (ver o script no fim de _paginas/aplicacoes.php).

   A materia visual sao os proprios logotipos, que sao arte de verdade e
   coloridos. E' por isso que a LINHA nao precisa de moldura: o filete entre
   as linhas e o rotulo em monoespacada ja' dao a estrutura, e caixa em volta
   de cada item seria o cartao que esta obra ja' reprovou. Na GRADE a caixa
   existe porque sem ela nao ha' grade -- mas ela e' superficie TINGIDA
   (lavagem de navy), nao cartao branco com sombra.

   Os sete lockups foram casados em tamanho um a um (as artes nao saem do
   mesmo sistema: o Install tem icone mais alto que a palavra, o LARA nao tem
   icone), entao cada PNG ja' vem no tamanho certo e o width/height sai do
   proprio arquivo. A regra aqui so' poe um teto de seguranca: normalizar
   altura desfaria o ajuste. */
.apl-lista{margin-top:clamp(28px,3.4vw,40px)}
.apl-cab{
  display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding-bottom:12px;border-bottom:1px solid var(--linha);margin-bottom:6px;
}
.apl-cat{
  display:block;font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--carmim);
}
/* o alternador e' o .calc-seg da casa (mesmo do simulador), so' que menor:
   aqui ele e' um controle de apoio, nao o assunto da secao */
.apl-vista{flex:none}
.apl-vista button{gap:6px;padding:6px 11px;font-size:.8rem}
.apl-vista button svg{width:15px;height:15px;flex:none}

/* ---------------------------------------------------------- forma LISTA */
.apl-item{
  display:grid;grid-template-columns:190px 1fr auto;
  align-items:center;gap:clamp(18px,3vw,44px);
  padding:clamp(20px,2.4vw,28px) 14px;border-bottom:1px solid var(--linha);
  /* o -14px devolve o alinhamento do texto a' coluna da pagina: o padding
     existe so' pra lavagem do hover sobrar um pouco pra fora das palavras,
     em vez de encostar nelas */
  margin-inline:-14px;border-radius:var(--r-md);
  transition:background .28s ease,scale .28s cubic-bezier(.2,.7,.3,1);
}
/* cresce a partir da esquerda: a linha comeca na margem do texto, e crescer
   pelo centro faria ela invadir a margem esquerda da pagina */
.apl-itens[hidden]{display:none}
.apl-lista[data-vista="lista"] .apl-item{transform-origin:left center}
.apl-lista[data-vista="lista"] .apl-item:hover{background:rgba(168,40,42,.045);scale:1.012}

/* o logotipo E' o titulo da linha: o nome vive no alt, nao repetido ao lado.
   O teto e' rede de seguranca pra arte futura fora de medida, bem acima do
   maior de hoje (39px) -- se ele estiver recortando algo, o arquivo e' que
   esta' errado. */
/* PLACA do logotipo. As sete artes tem larguras de 89 a 155px e alturas de
   29 a 39px -- mesmo depois de casadas opticamente, lado a lado elas deixam
   a coluna serrilhada. A placa resolve isso sem mexer nas artes: todas
   passam a ocupar a MESMA pegada, e o ajuste optico continua valendo dentro
   dela (o logo entra centrado, no tamanho dele; nao e' esticado pra
   preencher, senao o Install, que e' o mais estreito, cresceria demais).

   E' a mesma placa das integracoes da /plataforma/ (.integ-badge): branca,
   filete, sombra pequena, raio --r-lg. Branco aqui e' proposital -- a
   superficie em volta e' tingida, e o branco fica reservado pro que esta'
   vivo, que e' a marca. */
.apl-nome{
  margin:0;flex:none;box-sizing:border-box;
  display:flex;align-items:center;justify-content:flex-start;gap:12px;
  width:190px;max-width:100%;height:80px;padding:10px 14px;
  background:#fff;border:1px solid var(--linha);border-radius:var(--r-lg);
  /* Sombra PROPRIA, nao os tokens --sombra-sm/md. Eles foram calibrados pra
     superficie grande e aparecendo uma vez; aqui sao nove placas pequenas
     lado a lado, e na forca do token o conjunto vira ruido cinza em volta
     das marcas. Mais curta (menos deslocamento e menos borrao) e mais clara
     (.045 contra .08), pra ela levantar a placa sem sujar o fundo. */
  box-shadow:0 1px 4px rgba(0,0,51,.045);
  transition:box-shadow .28s ease,border-color .28s ease;
}
.apl-item:hover .apl-nome{box-shadow:0 4px 14px rgba(0,0,51,.075);border-color:rgba(168,40,42,.22)}
/* NAO declarar width/height aqui. Os atributos width/height do <img> entram
   na cascata com prioridade baixissima, e um `width:auto` no CSS os anula --
   a imagem volta ao tamanho natural (3x), a placa recorta pelo max-* e todas
   acabam do tamanho da placa. Foi exatamente o que aconteceu na primeira
   versao desta regra: o ajuste optico de cada lockup sumiu e o LARA passou
   de 106x32 pra 152x46. Aqui so' o teto, e object-fit:contain pra que um
   teto que chegue a pegar encolha a arte em vez de deformar. */
/* ICONE da aplicacao. Vem como background-image de um <span>, nao como <img>:
   protecao pedida contra salvar e copiar -- sem elemento de imagem o menu de
   contexto nao oferece "salvar imagem como" nem "copiar imagem", e
   pointer-events:none tira o arrastar. Nao e' blindagem (devtools, aba de
   rede e print continuam existindo); e' o caminho que o visitante usaria.
   Tamanho fixo: icone e' simbolo, nao lockup -- aqui nao ha' ajuste optico
   individual a preservar como havia nas artes antigas. */
.apl-ico{
  flex:none;width:44px;height:44px;
  background-repeat:no-repeat;background-position:center;background-size:contain;
  pointer-events:none;user-select:none;-webkit-user-select:none;-webkit-user-drag:none;
}
/* o nome, que antes vinha dentro do proprio lockup e agora precisa ser dito */
.apl-rotulo{
  min-width:0;line-height:1.18;font-size:.98rem;font-weight:700;letter-spacing:-.02em;
  color:var(--navy);
}
/* duas linhas sempre: cada span e' uma linha, e a quebra ja' vem decidida do
   PHP (ver app_titulo). Sem isso, nome curto voltava pra uma linha so' e os
   nomes ficavam em alturas diferentes de placa pra placa. */
.apl-rotulo span{display:block}
/* sem icone ainda: o nome sozinho, centrado, ocupando a placa toda */
.apl-nome > span:only-child{
  display:block;line-height:1.15;font-size:1.05rem;font-weight:700;letter-spacing:-.02em;
  color:var(--navy);text-align:center;
}
.apl-item > p{margin:0;color:var(--tinta-70);font-size:.93rem;line-height:1.55;max-width:62ch}

/* acao: o endereco e' informacao (a pessoa pode querer digitar), entao ele
   aparece por extenso e o verbo vem embaixo, menor. Sem sublinhado em
   nenhum estado -- o hover muda a cor, que e' a regra da casa. */
.apl-acao{
  display:flex;flex-direction:column;align-items:flex-end;gap:3px;text-align:right;
  color:var(--tinta-70);transition:color .25s;
}
.apl-acao:hover,.apl-item:hover .apl-acao{color:var(--carmim)}
.apl-host{font-family:var(--mono);font-size:.78rem;letter-spacing:.01em;color:var(--tinta-45);transition:color .25s}
.apl-acao:hover .apl-host,.apl-item:hover .apl-host{color:var(--carmim)}
.apl-verbo{font-size:.86rem;font-weight:700;color:var(--carmim);white-space:nowrap}
.apl-verbo i{font-style:normal;transition:translate .25s}
.apl-acao:hover .apl-verbo i,.apl-item:hover .apl-verbo i{translate:3px 0}

.apl-lojas{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end}
.apl-lojas a,.apl-loja-off{
  display:inline-flex;align-items:center;gap:7px;padding:8px 14px;border-radius:var(--pill);
  border:1px solid var(--linha);font-size:.84rem;font-weight:600;white-space:nowrap;
}
.apl-lojas a{
  background:#fff;box-shadow:var(--sombra-sm);color:var(--navy);
  transition:box-shadow .25s,color .25s,border-color .25s;
}
.apl-lojas a:hover{box-shadow:var(--sombra-md);color:var(--carmim);border-color:rgba(168,40,42,.35)}
.apl-lojas svg{width:17px;height:17px;flex:none}
/* app ainda nao publicado: os dois botoes continuam na tela, apagados, pra
   dizer PARA QUAIS sistemas ele vai sair. Nao e' link e nao pode parecer um:
   sem fundo, sem sombra, cursor de texto. O "em breve" vai no title e na
   marca de leitor de tela, entao a informacao nao se perde. */
.apl-loja-off{
  background:none;color:var(--tinta-45);opacity:.72;cursor:default;border-style:dashed;
}

/* ---------------------------------------------------------- forma GRADE */
.apl-lista[data-vista="grade"] .apl-itens{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));
  gap:clamp(14px,1.8vw,20px);margin-top:clamp(18px,2.2vw,26px);
}
.apl-lista[data-vista="grade"] .apl-item{
  display:flex;flex-direction:column;align-items:flex-start;gap:14px;
  margin-inline:0;padding:clamp(20px,2vw,26px);border-bottom:0;
  /* superficie TINGIDA, nao cartao branco com sombra: a cor entra por
     lavagem, e o branco fica reservado pros botoes, que e' o que esta' vivo */
  background:rgba(0,0,51,.032);border:1px solid var(--linha);
  transform-origin:center;
}
.apl-lista[data-vista="grade"] .apl-item:hover{background:rgba(168,40,42,.06);scale:1.022}
/* na grade a placa toma a largura do cartao: 190px fixos deixavam uma
   sobra so' do lado direito, que lia como desalinho em vez de recuo. O
   logo continua centrado no tamanho dele -- o ajuste optico nao muda. */
.apl-lista[data-vista="grade"] .apl-nome{width:100%}
.apl-lista[data-vista="grade"] .apl-item > p{font-size:.88rem;max-width:none}
/* a acao desce pro pe' do cartao e alinha a' esquerda, com os cartoes todos
   da mesma altura -- acao em altura diferente em cada um vira serrilha */
.apl-lista[data-vista="grade"] .apl-acao{margin-top:auto;align-items:flex-start;text-align:left}
.apl-lista[data-vista="grade"] .apl-lojas{margin-top:auto;justify-content:flex-start}

/* quem pediu menos movimento continua com a lavagem do hover (que e' cor,
   nao movimento) e perde so' a escala */
@media (prefers-reduced-motion:reduce){
  .apl-item{transition:background .28s ease}
  .apl-lista[data-vista="lista"] .apl-item:hover,
  .apl-lista[data-vista="grade"] .apl-item:hover{scale:1}
}

/* so' pra leitor de tela: texto que precisa ser anunciado mas nao desenhado */
.so-leitor{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0;
}

@media (max-width:900px){
  .apl-lista[data-vista="lista"] .apl-item{grid-template-columns:1fr;gap:12px;align-items:start}
  .apl-lista[data-vista="lista"] .apl-acao{align-items:flex-start;text-align:left}
  .apl-lista[data-vista="lista"] .apl-lojas{justify-content:flex-start}
  .apl-nome img{max-height:40px}
  .apl-cab{align-items:center}
}

/* opcao do seletor que NAO leva pra mesma pagina (ela ainda nao existe
   naquele idioma) e sim pra home dele: o codigo do idioma da' lugar a
   "inicio", em caixa baixa e mais apagado, pra a troca ser esperada em vez
   de surpresa. O title continua ali com a frase inteira. */
.idioma-lista .op-home{text-transform:lowercase;opacity:.55;font-style:normal}
