:root{
  --bg:#ffffff;
  --bg-card:#ffffff;
  --bg-card-alt:#f1f7f0;
  --accent:#1e7d3b;
  --accent-dim:rgba(30,125,59,.12);

  /* Quanto o miolo do header pende pra esquerda do centro da tela, no desktop.
     O .nav usa space-between, que dá vãos IGUAIS entre logo→menu e menu→botão;
     como o botão (196px) é mais largo que a logo (121px), o conjunto inteiro
     desce 37,5px pra esquerda. A faixa branca usa o mesmo número pra ficar no
     mesmo eixo do menu — as duas linhas se leem como uma coluna só.
     É METADE da diferença entre as duas larguras. Se a logo mudar de tamanho ou
     o texto do botão mudar, medir de novo:
       (largura do .nav-cta − largura do .logo) ÷ 2
     e conferir no navegador que os dois centros voltam a bater. */
  --nav-desvio:38px;
  --text:#14181a;
  --text-dim:#5c675f;
  --border:rgba(20,24,26,.14);
  --border-strong:rgba(20,24,26,.4);
  /* vermelho de erro — usado quando um campo recusa o valor digitado (hoje, a
     entrada abaixo do mínimo do carnê). Escuro o bastante pra ler em texto de
     12px sobre branco, e longe do verde da marca pra não parecer confirmação. */
  --erro:#c0392b;
  /* âmbar do bloco "Reserve o seu" na página do modelo — o estado de quem está
     publicado com zero unidade no Estoque. Não é verde (verde no site quer dizer
     "tem pronto") e não é cinza (cinza lê como produto morto): é convite, não
     recusa. Só a página de produto usa: CARD NÃO LEVA SELO, decisão do Kelvim
     em 21/08 — o catálogo se lê pela foto e pelo preço, e etiqueta sobre a foto
     é ruído em oito cards seguidos. Quem quiser separar usa o filtro. */
  --encomenda:#b26a00;
  --encomenda-bg:#fff5e6;
  --encomenda-linha:rgba(178,106,0,.35);
  /* linha que fecha as caixas brancas (cards, simulador, ficha) sobre o fundo
     branco — mesmo peso das linhas internas dos cards, sem contorno pesado */
  --border-card:var(--border);
}
*{margin:0;padding:0;box-sizing:border-box;}
html{scroll-behavior:smooth;background:var(--bg);}
body{
  background:var(--bg);
  color:var(--text);
  font-family:'Inter',sans-serif;
  line-height:1.5;
  overflow-x:hidden;
}
h1,h2,h3,h4{
  font-family:'Poppins',sans-serif;
  font-weight:700;
  letter-spacing:-.01em;
}
a{color:inherit;text-decoration:none;}
img{max-width:100%;display:block;}
.container{width:100%;max-width:1180px;margin:0 auto;padding:0 24px;}
::selection{background:var(--accent);color:#fff;}

/* background — branco puro, sem sombra verde */
.grid-glow{
  position:fixed;inset:0;z-index:-1;
  background:var(--bg);
}

/* Topo fixo — a faixa branca da frase + o header preto sobem juntos e param
   colados no alto da tela (19/08/2026). Antes só o header era sticky e a faixa
   rolava embora. O sticky mora AQUI, no par, e não em cada um: se os dois
   fossem sticky com top:0 separados, o header subiria por cima da faixa.
   Por isso o `header` abaixo não tem mais position/top nem z-index: quem carrega
   os três agora é este bloco.
   O bloco é filho direto do <body>, no mesmo lugar onde o header sticky já
   morava e funcionava — a única mudança é que agora o sticky vale pro par. */
.topo-fixo{position:sticky;top:0;z-index:100;}
/* o topo fixo cobre ~99px no desktop e ~92px no celular. Sem isso, clicar em
   "Modelos" ou "Financiamento" no menu leva o título da seção pra debaixo dele.
   Vale um pouco a mais que a altura real, pra sobrar respiro. */
:target{scroll-margin-top:112px;}

/* faixa de aviso — branca, logo acima do header preto, nas duas telas. */
.topbar-aviso{background:#fff;overflow:hidden;}
.topbar-aviso-trilha{display:flex;justify-content:center;}
.topbar-aviso span{
  padding:9px 16px;white-space:nowrap;
  font-size:12px;font-weight:500;letter-spacing:.07em;color:var(--text);
}
.topbar-aviso b{font-weight:800;}
/* <i> e não <span>: a regra de cima é `.topbar-aviso span` e pegaria um span
   aninhado junto, aplicando nele o padding da faixa inteira. */
.topbar-cidade{font-style:normal;}
/* Parada e numa linha só, nas duas telas (19/08/2026).
   No celular ela já foi letreiro: duas cópias da frase formavam a trilha e uma
   animação deslocava metade dela. Saiu tudo — animação, @keyframes, a 2ª cópia
   no HTML e o bloco de prefers-reduced-motion, que existia só pra desligar o
   movimento. Mesma regra do botão flutuante do WhatsApp: o padrão é parado.
   A frase encurtou junto (saiu "NA CIDADE OCIDENTAL-GO"), que é o que permite
   ela caber numa linha só no celular sem virar letra de bula. */
/* a faixa acompanha o eixo do menu, e não o da tela — ver --nav-desvio no :root.
   transform e não margem: o deslocamento é só visual e não mexe na caixa, então
   a frase continua podendo usar a largura inteira antes de encostar nas bordas.
   Só no desktop: no celular o header é logo + hambúrguer, sem miolo a acompanhar,
   e a faixa fica centrada na tela mesmo. */
@media (min-width:921px){
  .topbar-aviso-trilha{transform:translateX(calc(var(--nav-desvio) * -1));}
}

@media (max-width:920px){
  /* vw e não px: com `nowrap` a frase não quebra, ela vazaria pela direita numa
     tela mais estreita. Assim ela encolhe junto com o aparelho e o teto de 11px
     impede que fique maior que a do desktop num tablet. */
  .topbar-aviso span{font-size:min(11px, 3.1vw);padding:8px 12px;}
  /* a cidade fica só no desktop. No celular a frase precisa caber numa linha e
     foi por isso que ela saiu em 19/08 — voltar aqui desfaria aquilo. */
  .topbar-cidade{display:none;}
}

/* header — preto puro, igual ao rodapé e à barra de categorias. Era
   rgba(0,0,0,.95) com blur: com o fundo do site branco, os 5% de transparência
   clareavam o preto e o header ficava visivelmente mais fraco que a barra logo
   abaixo dele. Opaco, o blur não teria efeito nenhum, então saiu junto. */
/* `position:relative` existe pro menu hamburguer: ele e absoluto e precisa se
   pendurar no PE DO HEADER. Sem isso o ancestral posicionado mais proximo vira
   o .topo-fixo (sticky), que comeca la em cima na faixa branca — e o menu abria
   no meio da barra preta, cortando a logo ao meio. Nao cria contexto de
   empilhamento novo (z-index continua auto), entao o par sticky segue mandando
   na sobreposicao com o resto da pagina. */
header{
  position:relative;
  background:#000;
  border-bottom:1px solid rgba(255,255,255,.1);
}
.nav{display:flex;align-items:center;justify-content:space-between;padding:10px 24px;}
.logo img{height:42px;width:auto;display:block;}
.nav-links{display:flex;gap:26px;font-size:13px;font-weight:500;text-transform:uppercase;letter-spacing:.05em;}
.nav-links a{color:#c7cec9;transition:color .2s;}
/* Verde da Ciclodandi, não o do WhatsApp: no header ele é o botão de ação da
   marca e fica ao lado da logo — o verde-claro do WhatsApp puxava a atenção pra
   longe dela. Chegou a ser #25d366 em 20/08 e voltou no mesmo dia, a pedido do
   Kelvim. O ÍCONE ficou: ele já diz de que canal se trata, sem precisar da cor.
   Os "Falar no WhatsApp" do corpo da página seguem no verde do WhatsApp
   (.btn-whats) — lá eles não disputam com nada. */
.nav-cta{
  display:inline-flex;align-items:center;gap:9px;
  background:var(--accent);color:#fff;padding:10px 20px;border-radius:6px;
  font-weight:700;font-size:14px;box-shadow:0 4px 14px rgba(30,125,59,.3);
  transition:transform .2s, box-shadow .2s;
}
.nav-cta svg{width:17px;height:17px;flex-shrink:0;}
.burger{display:none;flex-direction:column;gap:5px;cursor:pointer;background:none;border:none;}
.burger span{width:24px;height:2px;background:#c7cec9;}

/* navegação por categoria — o conteúdo dos dois pontos onde ela aparece sai de
   CATEGORIAS (dados.js). Aqui fica só a aparência:
     .cat-circulos   fileira de círculos acima do "Escolha seu modelo"
     .nav-cat        os mesmos links no menu "Categorias" do header
   Em todas, `nowrap` + rolagem horizontal: as categorias não cabem lado a lado
   em tela estreita, e rolar no dedo é melhor que quebrar em duas linhas.

   A BARRA BRANCA sob o header saiu em 20/08/2026: as categorias passaram a
   morar dentro do próprio header, no menu suspenso do "Categorias" (que tomou
   o lugar do antigo link "Modelos"). Junto dela saíram `.cat-nav-topo`, o
   `catNavTopo()` do dados.js e o `.cat-topo-wrap` do index.html. */
.cat-nav{
  display:flex;align-items:center;
  flex-wrap:nowrap;overflow-x:auto;
  scrollbar-width:none;-ms-overflow-style:none;
}
.cat-nav::-webkit-scrollbar{display:none;}

/* fileira de círculos. A imagem da loja entra dentro do mesmo círculo e é
   recortada por object-fit, então o desenho provisório e a foto definitiva
   ocupam exatamente o mesmo espaço — trocar um pelo outro não mexe no layout. */
/* o padding vertical existe por causa do hover: `overflow-x:auto` também recorta
   no eixo vertical, então o círculo que sobe 3px no hover (e a sombra que cai
   embaixo) ficavam cortados na borda da trilha. O respiro é interno pra rolagem
   continuar de ponta a ponta. */
.cat-circulos{
  display:flex;align-items:flex-start;justify-content:center;gap:52px;
  flex-wrap:nowrap;overflow-x:auto;padding:10px 0 16px;
  scrollbar-width:none;-ms-overflow-style:none;
}
.cat-circulos::-webkit-scrollbar{display:none;}
/* 160px de círculo com 52px entre eles — medida tirada da referência do desktop.
   As 5 categorias somam 1008px e cabem nos 1132px úteis do container. */
.cat-circulo{
  flex:0 0 auto;width:160px;
  display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center;
  /* o navegador pinta um retângulo translúcido por cima do <a> inteiro a cada
     toque — um quadrado em volta do círculo e do nome. Quem marca o toque aqui
     é o :active do círculo, mais abaixo. */
  -webkit-tap-highlight-color:transparent;
}
/* aro verde vazado, com o conteúdo por dentro — o círculo já foi preto e depois
   verde chapado. A referência trazia um raio no canto de cada círculo; ele
   chegou a existir aqui e foi retirado a pedido do Kelvim — não repropor. */
.cat-circulo-img{
  width:160px;height:160px;border-radius:50%;overflow:hidden;
  background:transparent;border:3px solid var(--accent);color:var(--accent);
  display:flex;align-items:center;justify-content:center;
  transition:transform .2s, background .2s;
}

/* Tratamento escolhido pelo Danilo em 19/08/2026: aro verde vazado com a foto do
   produto real por dentro, o mesmo dos "Patinetes". Estiveram na tela cinco
   variações ao mesmo tempo (aro vazado com foto, círculo verde cheio com foto e
   círculo verde cheio com ícone branco); as duas de círculo cheio saíram, junto
   com o hover escuro que só elas usavam.

   Como o fundo é branco, a arte de cada categoria é a foto do produto em PNG
   transparente. As cinco chegaram em 19/08 (silhueta branca não servia: era o
   que "Scooters" e "Acessórios" usavam pro círculo cheio e, no aro vazado,
   sumiriam).

   O QUE IGUALA O TAMANHO das cinco não é o CSS, é o preparo do arquivo: cada
   PNG é recortado rente ao contorno do produto, sem margem vazia, e reduzido
   pra 300px no lado maior. Aí o `object-fit:contain` encaixa todos na mesma
   caixa de 124px e cada um preenche a caixa no seu lado mais longo. Se uma
   imagem nova vier com margem em volta, ela vai parecer menor que as outras —
   e o defeito está no arquivo, não aqui. */
/* o capacete é quase quadrado e por isso enche o círculo, enquanto os outros são
   largos e baixos e sobram nas laterais. O respiro extra só nele deixa os cinco
   com peso parecido na fileira. */
.cat-circulo[data-cat="acessorios"] .cat-circulo-img img{padding:32px;}
.cat-circulo-img svg{width:72px;height:72px;}
/* `contain` e não `cover`: a foto da categoria é um produto recortado e precisa
   caber inteira dentro do aro. Com `cover` ela encheria o círculo e o corte
   levaria guidão e roda junto. O padding afasta o produto da borda verde. */
.cat-circulo-img img{width:100%;height:100%;object-fit:contain;padding:18px;}
.cat-circulo-nome{font-size:14px;font-weight:600;color:var(--text);line-height:1.25;}
/* no aro vazado a sombra do hover não lia; quem marca agora é o fundo verde
   claro por dentro.
   O hover fica trancado em `hover:hover` — só onde existe ponteiro de verdade.
   No celular o :hover GRUDA depois do toque: a categoria tocada ficava verde
   indefinidamente, até tocar em outro lugar da tela, e ainda pintava o nome
   junto. */
@media (hover:hover){
  .cat-circulo:hover .cat-circulo-img{transform:translateY(-3px);background:var(--accent-dim);}
  .cat-circulo:hover .cat-circulo-nome{color:var(--accent);}
}
/* No toque o verde vem de duas fontes. O :active vale só enquanto o dedo está
   encostado e nem sempre dispara (no iOS ele exige que a página tenha ouvinte de
   toque), então quem garante o retorno visual é a classe .tocado, posta pelo
   pointerdown no dados.js.
   Ela SAI SOZINHA (24/08/2026): dura enquanto o dedo está no círculo e mais um
   instante depois de levantar — o bastante pra a página do catálogo abrir, sem o
   círculo apagar antes e parecer que o toque não pegou. Ficava até a troca de
   página, e isso recriava o :hover grudado: a fileira ROLA de lado, e o arrasto
   que começava em cima de um círculo o deixava verde pra sempre. Quem controla o
   tempo é o dados.js (pointermove/cancel/up); a volta pelo botão "voltar" limpa
   a classe no pageshow.
   Verde igual ao do mouse por cima: fundo do círculo e nome. Sem o translateY do
   hover — no toque o pulinho lê como a página se mexendo sozinha. */
@media (hover:none){
  .cat-circulo:active .cat-circulo-img,
  .cat-circulo.tocado .cat-circulo-img{background:var(--accent-dim);}
  .cat-circulo.tocado .cat-circulo-nome{color:var(--accent);}
}

/* indicador de rolagem — uma bolinha por tela cheia da fileira, não por
   categoria. Quem manda aqui é o montaDots() (dados.js): ele põe a classe
   `tem-dots` só quando a fileira realmente tem mais de uma tela.
   Antes isso era um @media (max-width:600px), e ficava errado no meio do
   caminho: as cinco categorias somam 1008px, então a fileira já rola abaixo de
   ~1055px de tela. Entre 601px e 1055px o 5º círculo aparecia cortado, sem
   pontinho e sem barra de rolagem (escondida logo acima), e a fileira parecia
   quebrada em vez de rolável. */
.cat-dots{display:none;justify-content:center;align-items:center;gap:6px;margin-top:14px;}
.cat-dots.tem-dots{display:flex;}
/* a cor troca na hora, só a largura é que anima: com `background` na transição,
   durante os 200ms o pontinho que sai ainda estava esverdeado e o que entra já
   estava — os dois verdes, lado a lado e largos ao mesmo tempo, viravam um
   traço verde só. */
.cat-dot{
  width:6px;height:6px;border-radius:999px;background:var(--border-strong);opacity:.3;
  transition:width .2s, opacity .2s;
}
.cat-dot.ativo{width:18px;background:var(--accent);opacity:1;}

/* Base: tudo escondido. Cada largura reintroduz o que precisa — o desktop como
   menu suspenso (aqui embaixo) e o celular como sanfona dentro do hambúrguer
   (no bloco de 920px). O mesmo HTML serve aos dois: um <button> "Categorias" e
   uma lista de links, montados por montaCategorias() em dados.js. */
.nav-cat,.nav-cat-titulo,.nav-cat-lista{display:none;}

/* ---- desktop: "Categorias" abre no CLIQUE ----
   Ocupa o lugar do antigo link "Modelos", que levava ao mesmo catálogo.
   Já abriu no passar do mouse e saiu (20/08/2026): o painel disparava só de
   atravessar a barra a caminho de outra coisa, e uma vez aberto tapava o banner
   sem ninguém ter pedido. No clique, o mesmo atributo `hidden` que o celular usa
   governa as duas telas — deixou de haver dois caminhos de estado pro mesmo
   menu. */
@media (min-width:921px){
  /* CENTRALIZAÇÃO DO MIOLO — duas leituras que NÃO cabem juntas, e a escolhida
     é a segunda (20/08/2026, decisão do Kelvim):

       a) menu no centro da TELA — bate com a frase da faixa branca logo acima,
          mas deixa o vão da esquerda 75px maior que o da direita;
       b) VÃOS IGUAIS entre logo→menu e menu→botão — o que o `space-between` do
          .nav já faz sozinho, e é por isso que não há regra de grid aqui.

     As duas só coincidiriam se a logo (121px) e o botão (196px) tivessem a mesma
     largura. Enquanto não tiverem, o menu fica ~37px à esquerda do centro da
     tela — de propósito. Não "corrigir" isso sem falar com o Kelvim: já foi
     para o centro da tela uma vez e voltou. */
  .nav-cat-bloco{position:relative;display:flex;align-items:center;}
  .nav-cat-titulo{
    display:flex;align-items:center;gap:7px;
    padding:0;background:none;border:none;cursor:pointer;
    font-family:'Inter',sans-serif;
    font-size:13px;font-weight:500;text-transform:uppercase;letter-spacing:.05em;
    color:#c7cec9;transition:color .2s;
  }
  .nav-cat-seta{display:block;width:13px;height:13px;transition:transform .2s;}
  /* a cor ainda responde ao mouse — é o realce que todo link do menu tem. O que
     saiu foi só a ABERTURA por hover; a seta gira pelo estado, não pelo mouse. */
  .nav-cat-titulo[aria-expanded="true"]{color:#7ed957;}
  .nav-cat-titulo[aria-expanded="true"] .nav-cat-seta{transform:rotate(180deg);}

  /* O painel nasce no pé do RÓTULO, que fica uns 20px acima do pé do header —
     essa sobra some dentro da barra preta, e o menu parece descer dela.
     Por isso o painel NÃO tem borda: uma linha clara subiria junto e cruzaria a
     barra na vertical, denunciando a caixa. Quem separa o painel do banner é a
     sombra, que só aparece onde ele passa da barra.
     O padding de cima é maior que o de baixo pelo mesmo motivo: os primeiros
     ~20px ficam escondidos e, com padding igual, o "Todos" nascia colado no fio
     do header. */
  .nav-cat-lista{
    position:absolute;top:100%;left:50%;transform:translateX(-50%);
    min-width:200px;padding:30px 0 12px;flex-direction:column;gap:0;z-index:30;
    background:#000;border:none;
    border-radius:0 0 10px 10px;box-shadow:0 14px 30px rgba(0,0,0,.4);
  }
  /* `display:flex` de autor vence o display:none que o navegador dá ao atributo
     hidden — que é o que o celular usa pra fechar a sanfona. No desktop o hidden
     é ignorado de propósito: quem manda aqui é o mouse. */
  .nav-cat-lista{display:flex;}
  .nav-cat-lista[hidden]{display:none;}
  .nav-cat-lista .nav-cat{
    display:block;padding:10px 20px;white-space:nowrap;
    font-size:13px;font-weight:500;text-transform:uppercase;letter-spacing:.05em;
    color:#c7cec9;transition:color .2s, background .2s;
  }
  /* a divisória do fim da lista é coisa do hambúrguer; aqui o painel já termina
     na própria borda */
  .nav-cat-fim{padding-bottom:10px;border-bottom:none;}
}

/* buttons */
.btn{
  padding:13px 26px;border-radius:8px;font-weight:700;font-size:14px;
  text-transform:uppercase;letter-spacing:.04em;
  display:inline-flex;align-items:center;gap:10px;
  transition:transform .2s, box-shadow .2s, background .2s;
  cursor:pointer;border:none;font-family:'Inter',sans-serif;
}
.btn-primary{background:var(--accent);color:#fff;box-shadow:0 6px 18px rgba(30,125,59,.3);}
.btn-ghost{background:transparent;color:var(--text);border:1px solid rgba(0,0,0,.15);}
.btn-whats{background:#25d366;color:#fff;box-shadow:0 6px 18px rgba(37,211,102,.35);}

/* footer — preto */
footer{
  padding:44px 0 26px;
  background:#000000;
  color:#c7cec9;
}
/* Três colunas: marca à esquerda (mais larga, é ela que carrega o texto) e duas
   listas iguais à direita. As duas da direita têm a MESMA largura de propósito —
   é o que faz "NAVEGAÇÃO" e "CONTATO" começarem em colunas alinhadas mesmo com
   o número de linhas diferente. */
.footer-grid{display:grid;grid-template-columns:1.5fr 1fr 1.15fr;gap:40px;margin-bottom:40px;}
.footer-grid h4{font-size:12px;color:#8a938c;text-transform:uppercase;letter-spacing:.14em;margin-bottom:18px;font-style:normal;font-weight:700;}
.footer-grid p, .footer-grid a{font-size:14px;color:#c7cec9;display:block;margin-bottom:12px;}

/* coluna da marca */
.footer-marca img{height:40px;width:auto;display:block;margin-bottom:18px;}
/* a frase é o que a loja é em duas linhas; largura travada pra não esticar numa
   linha só em tela larga, que é onde texto corrido fica ruim de ler */
.footer-marca p{max-width:34ch;line-height:1.65;margin-bottom:0;}

/* linha de contato com rótulo em cima (Endereço, Horário) — o mesmo par de
   informação que aparece em "Visite nossa loja", repetido aqui porque é o que
   se procura no pé de uma página */
.footer-grid .footer-linha{margin-bottom:12px;line-height:1.55;}

/* botões redondos das redes. Só entram as redes que a loja realmente tem:
   WhatsApp, Instagram e o perfil no Google (o mesmo do mapa). Ícone de rede que
   não existe é link morto no pé de toda página. */
.footer-redes{display:flex;gap:10px;margin-top:20px;}
.footer-redes a{
  display:flex;align-items:center;justify-content:center;
  width:38px;height:38px;margin:0;border-radius:50%;
  background:#141414;border:1px solid rgba(255,255,255,.14);color:#c7cec9;
  transition:background .2s, color .2s, border-color .2s;
}
.footer-redes svg{width:17px;height:17px;}
.footer-bottom{
  border-top:1px solid rgba(255,255,255,.1);padding-top:24px;
  display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px;
  font-size:12px;color:#8a938c;
}

/* whatsapp float — verde padrão do WhatsApp, botão estático */
.wa-float{
  position:fixed;bottom:24px;right:24px;z-index:200;
  background:#25d366;width:60px;height:60px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  box-shadow:0 6px 20px rgba(37,211,102,.5);
}

/* scooter icon placeholder — até termos fotos reais dos modelos */
.scooter-icon{width:46%;color:var(--accent);opacity:.55;}

/* section shared */
section{padding:48px 0;}
/* título de seção — sempre centralizado. Existiu uma variante alinhada à
   esquerda (.section-head-left), usada no catálogo, no simulador e nas
   categorias; saiu em 19/08/2026 pra todas as seções ficarem iguais. */
.section-head{text-align:center;max-width:600px;margin:0 auto 32px;}
.eyebrow{color:var(--accent);font-size:12px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;margin-bottom:10px;display:block;}
/* tamanho de e-commerce: o título de seção não disputa com o preço nem com o
   produto. Era clamp(26px,3.2vw,36px), escala de landing page. */
.section-head h2{font-size:clamp(20px,2.2vw,26px);margin-bottom:10px;}
.section-head p{color:var(--text-dim);font-size:14px;}

/* catálogo / cards de modelo — usado em index.html e modelos.html */
.catalog-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;}
.card{
  background:var(--bg-card);border:1px solid var(--border-card);border-radius:10px;
  overflow:hidden;transition:border-color .25s, transform .25s, box-shadow .25s;
  display:flex;flex-direction:column;
  cursor:pointer;
}
.card-media{
  aspect-ratio:4/3;background:
    radial-gradient(circle at 30% 20%, rgba(30,125,59,.15), transparent 55%),
    var(--bg-card-alt);
  display:flex;align-items:center;justify-content:center;
  border-bottom:1px solid var(--border);position:relative;overflow:hidden;
}
.card-media img{width:100%;height:100%;object-fit:cover;}
.card-body{padding:20px;display:flex;flex-direction:column;gap:12px;flex:1;}
.brand-tag{display:flex;align-items:center;gap:8px;margin-bottom:-2px;}
.brand-tag-dash{flex:none;width:22px;height:2px;border-radius:2px;background:var(--accent);}
.brand-tag-text{
  font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--text-dim);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;
}
.card-name{
  font-size:18px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  text-transform:none;
}
.spec-item{
  display:flex;justify-content:space-between;align-items:center;gap:10px;
  padding:9px 14px;
  min-width:0;
}
.spec-label{
  font-size:11px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.03em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.spec-value{font-family:'Poppins',sans-serif;font-weight:700;color:var(--text);font-size:13.5px;white-space:nowrap;flex-shrink:0;}
.spec-unit{font-size:.72em;font-weight:600;margin-left:2px;}

/* faixa de specs dos CARDS — Bateria, Motor e Autonomia, uma por linha, rótulo
   à esquerda e valor à direita, separadas por um fio. A ORDEM não está aqui:
   sai do specsCard() em dados.js, que é onde se muda.
   O quadro detalhado da página de produto é outro componente, o .pd-specs com
   ícones, e não passa por aqui.

   Formato escolhido pelo Danilo em 19/08/2026, depois de ver os dois lado a lado
   na home. O anterior era horizontal (as três em colunas, rótulo em cima e valor
   embaixo) e ficava apertado no celular: com 2 cards lado a lado numa tela de
   390px cada coluna tinha ~46px e "AUTONOMIA" não cabia. Empilhada o rótulo tem
   a largura toda, então os tamanhos de fonte do @media puderam voltar ao normal.

   Fundo branco puro, igual ao do card e ao da página: a faixa se lê pela borda e
   pelas divisórias, não por um bloco de cor.

   Uma coluna só, então --specs-cols (escrito pelo specsCard() em dados.js) não é
   mais lido aqui — continua saindo no HTML porque é inofensivo e é o que permite
   voltar ao formato de colunas sem mexer no JS. */
.specs-row-h{
  display:grid;grid-template-columns:1fr;
  background:#fff;border:1px solid var(--border);border-radius:12px;overflow:hidden;
}
.specs-row-h .spec-item{
  flex-direction:row;align-items:center;justify-content:space-between;gap:10px;
  text-align:left;padding:8px 12px;
  border-bottom:1px solid var(--border);
}
.specs-row-h .spec-item:last-child{border-bottom:none;}
.specs-row-h .spec-label{font-size:10px;letter-spacing:.04em;}
/* o valor PODE quebrar em duas linhas: a bateria costuma vir com dois blocos
   ("60V 20Ah") e em card estreito não cabe numa linha só. */
.specs-row-h .spec-value{font-size:13px;white-space:normal;line-height:1.25;}
/* nome, preço e botão centralizados e empilhados — o card é o mesmo em toda
   parte (home, modelos.html e relacionados). Essas regras já foram exclusivas da
   home, com o resto do site usando preço à esquerda e "Ver detalhes ›" à
   direita; viraram o padrão único em 19/08/2026. */
.card-name{text-align:center;}
.card-footer{
  display:flex;flex-direction:column;justify-content:center;gap:10px;
  margin-top:auto;
}
/* CARD SEM A FAIXA DE SPECS — o acessório, que não tem bateria, motor nem
   autonomia. Quem marca a classe é o cardModelo() em dados.js.

   O problema que isso resolve: o .card-footer acima é margin-top:auto, e o
   grid estica todos os cards da fileira à altura do mais alto. Ao lado de uma
   scooter, o acessório ficava com um buraco branco entre o nome e o preço,
   exatamente do tamanho da faixa que ele não tem. Sumia numa tela só de
   acessórios (fileira toda da mesma altura), por isso só aparecia em "Todos".

   O align-self desliga o esticão SÓ nesse card: ele passa a ter a altura do que
   tem dentro e simplesmente acaba depois do botão, que é exatamente como ele já
   aparecia numa tela só de acessórios. Some o vão, sem inventar conteúdo pra
   tapá-lo.

   E `center`, não `start`: em start o card curto ficava colado no topo da
   fileira e o vão inteiro sobrava embaixo dele, num bloco só. Centrado, esse
   mesmo vão vira dois pela metade, um em cima e outro embaixo — o card fica
   apoiado no meio dos vizinhos em vez de pendurado neles.

   Uma regra só serve as duas larguras, sem @media. No celular o acessório cai
   sozinho na última fileira: a fileira tem a altura DELE, não sobra vão, e
   centrar não move nada. A regra só acorda quando ele divide fileira com um
   card mais alto — que hoje é o desktop, e amanhã é o celular se a loja
   publicar um segundo acessório.

   Duas saídas foram tentadas antes e recusadas pelo Kelvim (22/08/2026): a
   faixa preenchida com as specs do próprio acessório — a faixa é dos três
   números de veículo, e capacete não tem nenhum dos três — e um segundo
   margin-top:auto no nome, que dividia o vão em dois e deixava o nome
   flutuando sozinho no meio do branco. */
.card-sem-specs{align-self:center;}
.card-price{text-align:center;}
.card-price b{display:block;color:var(--accent);font-family:'Poppins',sans-serif;font-weight:700;font-size:19px;}
/* linha de parcelamento sob o preço — texto de apoio em cinza, só o valor em
   verde, pra não competir com o preço à vista logo acima */
.card-parcela{display:block;margin-top:3px;font-size:12px;line-height:1.3;color:var(--text-dim);}
.card-parcela b{display:inline;font-family:'Poppins',sans-serif;font-size:12px;font-weight:700;color:var(--accent);}
/* "Ver modelo" de largura cheia. É <span>, não <a>, porque o card inteiro já é
   um <a> e link dentro de link é HTML inválido.
   Sem sombra e sem o translateY do .btn-primary: quem levanta no hover é o
   card, e o botão subindo junto faz ele parecer descolado.
   Menor que o .btn padrão (13px 26px / 14px) e em caixa normal — o
   text-transform e o letter-spacing do .btn são pensados pra caixa alta. */
.card-cta{
  width:100%;justify-content:center;box-shadow:none;
  padding:10px 16px;font-size:13px;text-transform:none;letter-spacing:0;
}

/* botão "ver todos os modelos" */
.view-all{text-align:center;margin-top:40px;}

@media (max-width:920px){
  .nav-links,.nav-cta{display:none;}
  .burger{display:flex;}
  /* `top:100%` e nao uma altura fixa: o header cresce e encolhe com a logo e
     com o padding do .nav, e numero cravado descola do pe dele na primeira
     mudanca — foi exatamente o que aconteceu com os 64px de antes. */
  .nav-links.open{
    display:flex;position:absolute;top:100%;left:0;right:0;
    flex-direction:column;background:#000;padding:24px;
    border-bottom:1px solid rgba(255,255,255,.1);
  }
  .catalog-grid{grid-template-columns:repeat(2,1fr);}
  .footer-grid{grid-template-columns:1fr;gap:28px;}

  /* categorias dentro do menu hambúrguer — abrem o menu, acima dos links de
     navegação (o bloco entra por `afterbegin` em montaCategorias) */
  .nav-links.open .nav-cat{display:block;color:#c7cec9;}
  /* "Categorias" é o botão que abre a lista — daí o reset de <button> e a seta
     à direita, que é a única pista de que ali tem algo pra abrir.
     O tipo é o MESMO de .nav-links a (13px/500/#c7cec9): ele é um item do menu
     como Financiamento ou Contato, não um rótulo de seção. Enquanto era 11px
     bold em cinza escuro parecia legenda apagada, e a diferença de tratamento
     não queria dizer nada. */
  .nav-links.open .nav-cat-titulo{
    display:flex;align-items:center;justify-content:space-between;gap:10px;
    width:100%;padding:0;background:none;border:none;cursor:pointer;
    font-family:'Inter',sans-serif;
    font-size:13px;font-weight:500;letter-spacing:.05em;text-transform:uppercase;
    color:#c7cec9;transition:color .2s;
  }
  .nav-cat-seta{width:14px;height:14px;flex-shrink:0;transition:transform .2s;}
  .nav-links.open .nav-cat-titulo[aria-expanded="true"] .nav-cat-seta{transform:rotate(180deg);}
  /* com a lista fechada a divisória não tem onde se apoiar (ela mora no pé da
     última categoria), então passa pro próprio rótulo — sem isso "Categorias" e
     "Financiamento" ficariam colados, sem nada dizendo que são blocos diferentes */
  .nav-links.open .nav-cat-titulo[aria-expanded="false"]{
    padding-bottom:16px;border-bottom:1px solid rgba(255,255,255,.14);
  }
  /* O contêiner do desktop também existe aqui, e sem isto ele engolia o
     espaçamento: rótulo e lista deixaram de ser filhos diretos da .nav-links e
     pararam de receber o gap dela — o "Todos" nascia grudado em "Categorias"
     enquanto o resto do menu seguia espaçado. Repetir o gap devolve o ritmo. */
  .nav-links.open .nav-cat-bloco{display:flex;flex-direction:column;gap:26px;}
  /* a lista repete o gap da .nav-links pra o espaçamento não mudar ao abrir.
     A regra do [hidden] precisa vir DEPOIS do display:flex: um display de autor
     vence o display:none que o navegador aplica ao atributo, e sem ela a lista
     apareceria mesmo fechada. */
  .nav-links.open .nav-cat-lista{display:flex;flex-direction:column;gap:26px;}
  .nav-links.open .nav-cat-lista[hidden]{display:none;}
  /* a linha divisória separa os dois blocos. Com as categorias em cima, ela
     desceu do rótulo "Categorias" pro pé da última categoria (.nav-cat-fim,
     marcada em dados.js). Não dá pra usar irmão adjacente: o "Modelos" oculto
     continua no DOM logo depois das categorias e ficaria com a linha. */
  .nav-links.open .nav-cat-fim{
    padding-bottom:16px;
    border-bottom:1px solid rgba(255,255,255,.14);
  }
  /* os círculos encostam nas bordas da tela pra rolar de ponta a ponta, e
     começam alinhados à esquerda — centralizado, o primeiro nasceria cortado */
  .cat-circulos{margin-left:-24px;margin-right:-24px;padding:10px 24px 16px;justify-content:flex-start;}
}
@media (max-width:600px){
  .catalog-grid{gap:14px;}
  /* no celular o círculo encolhe só um pouco: em 390px cabem 3 na tela, que é a
     proporção da referência — bem maior que os 62px que a fileira tinha antes */
  .cat-circulos{gap:16px;}
  .cat-circulo{width:104px;}
  .cat-circulo-img{width:96px;height:96px;}
  .cat-circulo-img img{padding:11px;}
  .cat-circulo[data-cat="acessorios"] .cat-circulo-img img{padding:20px;}
  .cat-circulo-img svg{width:44px;height:44px;}
  .cat-circulo-nome{font-size:12px;}
  .card-body{padding:14px;gap:10px;}
  .brand-tag{gap:6px;}
  .brand-tag-dash{width:16px;}
  .brand-tag-text{font-size:9px;letter-spacing:.1em;}
  .card-name{font-size:16px;}
  .spec-item{padding:8px 10px;gap:6px;}
  /* com dois cards lado a lado no celular sobra pouca largura: sem essa redução
     o rótulo "VELOCIDADE" corta no meio ("VELOCID…") */
  .spec-label{font-size:9.5px;letter-spacing:0;}
  .spec-value{font-size:12.5px;}
  /* empilhada o rótulo tem a linha inteira, então não precisa mais das reduções
     que a faixa horizontal exigia aqui (rótulo a 8px, padding de 3px). Só o raio
     acompanha o resto do card no celular. */
  .specs-row-h{border-radius:10px;}
  .specs-row-h .spec-item{padding:7px 10px;gap:8px;}
  .card-footer{gap:8px;}
  .card-price b{font-size:17px;}
  /* precisa vir depois de `.card-price b` acima: mesma especificidade, e sem
     isso o valor da parcela herdaria os 17px do preço à vista */
  .card-parcela{font-size:11px;}
  .card-parcela b{font-size:11px;}
  .card-cta{padding:9px 12px;font-size:12.5px;}
}


/* ---------------------------------------------------------------------
   HOVER — só onde existe ponteiro de verdade.
   No toque o :hover GRUDA: o primeiro toque aplica a regra e o clique se
   perde, e a pessoa precisa tocar de novo. Foi o que fazia o card do modelo
   e as opções de parcela do simulador exigirem dois toques no celular.
   Regra de hover nova entra AQUI DENTRO, nunca solta.
   --------------------------------------------------------------------- */
@media (hover:hover){
  .nav-links a:hover{color:#7ed957;}
  .nav-cta:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(30,125,59,.4);}
  .btn-primary:hover{transform:translateY(-2px);box-shadow:0 10px 26px rgba(30,125,59,.4);}
  .btn-ghost:hover{border-color:var(--accent);color:var(--accent);}
  .btn-whats:hover{transform:translateY(-2px);box-shadow:0 10px 26px rgba(37,211,102,.45);}
  .footer-grid a:hover{color:#7ed957;}
  .footer-redes a:hover{background:var(--accent);border-color:var(--accent);color:#fff;}
  .card:hover{border-color:var(--border-strong);transform:translateY(-6px);box-shadow:0 14px 30px rgba(20,24,26,.14);}
  .card-cta:hover{transform:none;box-shadow:none;}
}
@media (min-width:921px) and (hover:hover){
  .nav-cat-titulo:hover{color:#7ed957;}
  .nav-cat-lista .nav-cat:hover{color:#7ed957;background:rgba(255,255,255,.06);}
}
@media (max-width:920px) and (hover:hover){
  .nav-links.open .nav-cat:hover{color:#7ed957;}
  .nav-links.open .nav-cat-titulo:hover{color:#7ed957;}
}

/* ---------------------------------------------------------------------
   TOQUE, ZOOM E CÓPIA
   --------------------------------------------------------------------- */
/* `manipulation` desliga o duplo-toque-pra-ampliar. Além de ser o que se pediu,
   é o que tira o atraso que o navegador segurava a cada toque esperando pra ver
   se vinha um segundo — com ele, o clique responde no primeiro toque. Junto com
   o hover trancado acima, é o par que conserta o "tem que clicar duas vezes". */
html{touch-action:manipulation;}

/* Texto não selecionável e sem o menu de "Copiar" do toque longo no iOS.
   Vale dizer o que isto é: ATRITO, não proteção — quem quiser o conteúdo abre o
   código-fonte da página. Resolve o caso comum (alguém arrastar o texto ou a
   foto pra fora), não o determinado. */
body{
  -webkit-user-select:none;
  user-select:none;
  -webkit-touch-callout:none;
}
/* Os campos de digitar ficam de FORA, senão não dá pra corrigir o que se digitou
   na busca de modelos nem no valor de entrada do simulador — seleção é como se
   apaga uma palavra inteira. */
input,textarea,select{
  -webkit-user-select:text;
  user-select:text;
}
/* arrastar a foto do modelo pra fora da página também sai */
img{-webkit-user-drag:none;}
