/* ==========================================================================
   ESTILOS DO SITE — REICAR AUTOMÓVEIS ITU

   ---------------------------------------------------------------------------
   PALETA: tirada da logo (material/IMG_8213.PNG) e do letreiro da fachada
   (material/IMG_8216.PNG), medida pixel a pixel, não escolhida a olho.
   ---------------------------------------------------------------------------

   A marca tem DUAS cores e elas fazem papéis diferentes aqui:

   · LIMA #aee44f — a coroa, o swoosh do "R", os traços do "AUTOMÓVEIS ITU" e
     as velas do teto do salão. É a cor que PULA sobre fundo escuro, então é
     ela que vira `--brand`: texto de olho-mágico, preço, botão primário.
   · AZUL ROYAL #0302a8 — o disco do avatar, o letreiro, as placas de cortesia
     dos carros, o portão. É a cor dominante da loja, mas quase invisível como
     texto sobre preto. Ela entra por dois caminhos: `--accent-2` e a TINTA DOS
     NEUTROS (ver abaixo).

   `--on-brand` é a REGRA DE CONTRASTE, e ela é obrigatória: é a cor do texto
   quando o fundo é a cor da marca. Aqui a marca é o lima, que é CLARO, então
   `--on-brand` é PRETO. Vale para o botão primário, o chip ativo, o badge de
   categoria e as setas do slider.

   Os neutros NÃO são cinza puro como no esqueleto: levam uma tinta azul (o H
   fica em torno de 230) porque o azul é a cor que a loja usa em tudo e sem
   isso ele sumiria do site. É uma tinta baixa de propósito: o suficiente pra
   o fundo ler como "azul muito escuro" e não como "cinza".

   ESTA PALETA ESTÁ DUPLICADA em painel/assets/admin.css, porque o painel não
   carrega este arquivo. AO MEXER NUMA COR AQUI, MEXA LÁ TAMBÉM.
   ========================================================================== */

:root {
  /* neutros com tinta azul da marca */
  --bg: #06070f;
  --bg-2: #0b0d1a;
  --surface: #101426;
  --surface-2: #181d33;
  --border: #262d4a;
  --text: #f2f5fa;
  --muted: #99a1bb;
  --muted-2: #6c7493;

  /* lima da logo. --brand-2 é o tom escuro que fecha o gradiente do botão */
  --brand: #aee44f;
  --brand-2: #6fb824;
  --brand-glow: rgba(174, 228, 79, .26);
  --accent: #e8ff9c;
  --accent-2: #2b34e0;
  /* a marca é CLARA (lima), então o texto sobre ela é PRETO */
  --on-brand: #0a1002;

  --radius: 16px;
  --radius-sm: 10px;
  --maxw: 1200px;
  --shadow: 0 20px 50px rgba(0, 0, 0, .5);
  --font: "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}

* { box-sizing: border-box; }

html { scroll-behavior: smooth; }

body {
  margin: 0;
  font-family: var(--font);
  background: var(--bg);
  color: var(--text);
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
  /* >>> MATA O ZOOM POR TOQUE DUPLO, E SÓ ELE. <<<
     `manipulation` = tudo o que `auto` faz, MENOS os gestos não-padrão, sendo o
     toque duplo o principal. Rolar continua funcionando e a PINÇA CONTINUA
     AMPLIANDO, que é o que importa: num site de revenda o visitante amplia a
     foto do carro o tempo todo.

     O sintoma que isto resolve: no celular os alvos ficam perto uns dos outros
     (chips de filtro, miniaturas da galeria, cards) e dois toques seguidos em
     alvos vizinhos o navegador lê como toque duplo — a página dá zoom sozinha e
     o visitante fica preso num enquadramento torto.

     NÃO resolva isso com `user-scalable=no` ou `maximum-scale=1` na meta
     viewport: aquilo desliga a pinça, é barreira de acessibilidade, e o iOS
     ignora desde o 10 — ou seja, quebra o Android e nem conserta o iPhone.

     `touch-action` não é herdada, mas o comportamento efetivo de um toque é a
     interseção do valor do elemento com o dos ancestrais até o viewport. Por
     isso declarar aqui já vale para a página inteira, e um filho só precisa
     declarar o seu quando quiser restringir MAIS (ver `.galeria-main`). */
  touch-action: manipulation;
}

img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }

.wrap { width: min(100% - 40px, var(--maxw)); margin-inline: auto; }

/* ---------- tipografia utilitária ---------- */
.eyebrow {
  color: var(--brand);
  font-weight: 700;
  letter-spacing: .28em;
  text-transform: uppercase;
  font-size: .78rem;
  margin: 0 0 14px;
}
.display {
  font-size: clamp(2.1rem, 5.5vw, 4rem);
  line-height: 1.02;
  font-weight: 900;
  letter-spacing: -.5px;
  text-transform: uppercase;
  margin: 0;
}
.display .accent {
  background: linear-gradient(92deg, var(--brand), var(--accent));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.section { padding: clamp(64px, 9vw, 120px) 0; }
.section-head { text-align: center; max-width: 640px; margin: 0 auto 54px; }
/* `:not(.eyebrow)` é OBRIGATÓRIO aqui, e nas outras regras de "parágrafo dentro
   de container" que possam pegar um olho-mágico (ver `.cta p` lá embaixo).

   O olho-mágico é `<p class="eyebrow">` e mora dentro do `.section-head`, então
   `.section-head p` (0-1-1) ganha de `.eyebrow` (0-1-0) e sobrescreve COR,
   CORPO e MARGEM dele: o rótulo saía cinza e em 16.8px, em vez do lima da marca
   em 12.5px. O defeito é invisível enquanto a paleta é a provisória do
   esqueleto, porque lá `--brand` (#d2d6db) e `--muted` (#9aa0a6) são dois
   cinzas parecidos. Com marca colorida ele aparece na hora, e só em ALGUMAS
   seções: as que montam o olho-mágico fora do `.section-head` (destaque,
   contato) continuavam certas, o que faz parecer inconsistência de conteúdo. */
.section-head p:not(.eyebrow) { color: var(--muted); font-size: 1.05rem; margin: 16px 0 0; }

/* ---------- botões ---------- */
.btn {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 14px 26px; border-radius: 999px;
  font-weight: 700; font-size: .96rem; cursor: pointer;
  border: 1px solid transparent; transition: .2s ease;
  white-space: nowrap;
}
.btn svg { width: 18px; height: 18px; }
.btn-primary {
  background: linear-gradient(92deg, var(--brand-2), var(--brand));
  color: var(--on-brand); box-shadow: 0 10px 30px var(--brand-glow);
}
.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 16px 40px var(--brand-glow); }
.btn-ghost { background: var(--surface-2); color: var(--text); border-color: var(--border); }
.btn-ghost:hover { border-color: var(--brand); color: var(--brand); }
.btn-wa { background: #25d366; color: #ffffff; box-shadow: 0 10px 30px rgba(37,211,102,.3); }
.btn-wa:hover { transform: translateY(-2px); }
.btn-gold { background: linear-gradient(92deg, var(--accent-2), var(--accent)); color: var(--on-brand); }

/* ---------- nav ---------- */
header.nav {
  position: sticky; top: 0; z-index: 50;
  background: rgba(7, 10, 13, .82);
  backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--border);
}
.nav .wrap { display: flex; align-items: center; gap: 20px; padding: 12px 0; }
.brand { display: flex; align-items: center; }
/* Lockup da FR — monograma + "MOTORS" já na própria imagem (fundo transparente),
   no mesmo arranjo do letreiro da fachada. A arte é bem horizontal (930x276),
   então 42px de altura já deixam o "MOTORS" legível sem o lockup dominar a nav. */
.brand img { height: 42px; width: auto; object-fit: contain; display: block; }
.nav-links { display: flex; gap: 30px; margin-left: 26px; }
.nav-links a { font-weight: 600; font-size: .95rem; color: var(--muted); transition: .2s; }
.nav-links a:hover, .nav-links a.active { color: var(--text); }
.nav-cta { margin-left: auto; display: flex; gap: 12px; align-items: center; }
.nav-toggle { display: none; background: none; border: 0; color: var(--text); cursor: pointer; }
.nav-toggle svg { width: 28px; height: 28px; }

/* ---------- hero ---------- */
/* O cabeçalho flutua por cima da foto e o texto ocupa só a faixa de baixo, à
   esquerda: assim a fachada aparece inteira e nítida, e a chamada cai sobre a
   área escura do portão, com contraste de sobra. */
.hero {
  position: relative; min-height: 92vh; display: flex; align-items: flex-end;
  padding: 60px 0 96px; background: #04050c; overflow: hidden;
}
/* >>> EIXO HORIZONTAL: `center`, E ISSO É POR CLIENTE. <<<
   A armadilha nº1 traz `left` como padrão porque na maioria das fachadas o
   letreiro fica na ponta esquerda. NA REICAR NÃO FICA: em fachada-hero.jpg
   (1409x1116) o letreiro vai de x=483 a x=888, com centro em 48,7% da largura,
   ou seja, CENTRADO. Medido no arquivo, não estimado. Com `left` o celular
   mostrava só o portão e o banner de consignação, e a marca sumia do hero. Se
   um dia a foto for trocada, meça de novo o x do letreiro antes de mexer aqui.

   >>> PARADA VERTICAL: 15%. <<<
   ATENÇÃO: este número mudou de sentido quando a foto foi trocada, em
   30/07/2026, e é a pegadinha desta seção.

   A foto ANTIGA era 1672x941 (proporção 1,78). Nas janelas normais de desktop
   ela era panorâmica o bastante pra ALTURA mandar no `cover`, o corte saía só
   lateral e esta parada vertical era INERTE — só acordava em janela baixa e
   larga.

   A foto NOVA é 1409x1116 (proporção 1,26), bem mais quadrada. Agora QUALQUER
   janela de desktop é mais larga que ela, a LARGURA manda no `cover` e o corte
   é SEMPRE vertical. Este número passou de decorativo a decisivo, e o 22% que
   estava aqui ficava encostado no limite em telas largas e baixas.

     escala = largura_da_janela / 1409           (ex: 1920/1409 = 1.363)
     sobra  = 1116 - altura_do_hero / escala     (ex: 1116 - 736/1.363 = 576)
     teto   = y_do_topo_do_letreiro / sobra      (ex: 144 / 576 = 25.0%)

   Acima do teto o topo do letreiro começa a ser cortado. O teto varia com a
   janela e o pior caso realista é a tela larga e baixa:

     1440x900   sobra 306   teto 47.0%
     1920x1080  sobra 387   teto 37.2%
     1920x800   sobra 576   teto 25.0%   <- o que amarra
     2560x1080  sobra 569   teto 25.3%
     3440x1440  sobra 573   teto 25.1%

   15% fica abaixo de todos com pelo menos 58px de céu sobrando acima do
   letreiro. Descer mais que isso não ajuda: só come o pé da foto, que é onde
   está a fila de carros. */
.hero-bg {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: center 15%; z-index: 0;
}
/* véu concentrado no canto de baixo/esquerda + uma tarja curta no topo (só o
   suficiente pra o cabeçalho ler sobre o céu) — o resto da foto fica limpo */
.hero::before {
  content: ""; position: absolute; inset: 0; z-index: 1;
  background:
    linear-gradient(100deg, rgba(4,4,4,.82) 0%, rgba(4,4,4,.52) 30%, rgba(4,4,4,.16) 56%, rgba(4,4,4,0) 76%),
    linear-gradient(to top, rgba(4,4,4,.76) 0%, rgba(4,4,4,.18) 34%, rgba(4,4,4,0) 56%),
    linear-gradient(to bottom, rgba(4,4,4,.62) 0%, rgba(4,4,4,.22) 9%, rgba(4,4,4,0) 17%);
}
.hero::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 90px; z-index: 1;
  background: linear-gradient(to top, var(--bg), transparent);
}
/* o .wrap centraliza a coluna de 1200px; aqui o conteúdo fica encostado na
   esquerda dela (alinhado com o logo), e só o texto é que tem largura limitada */
.hero-inner { position: relative; z-index: 2; }
/* traço da marca + nome da loja, acima do título */
.hero-eyebrow {
  display: flex; align-items: center; gap: 15px;
  margin: 0 0 24px; color: #c8c8c4;
  font-weight: 700; font-size: .76rem; letter-spacing: .26em; text-transform: uppercase;
}
.hero-eyebrow::before {
  content: ""; flex: none; width: 42px; height: 3px; border-radius: 2px; background: var(--brand);
}
/* no hero o título é em caixa alta e baixa (não versalete), pra respirar melhor
   sobre a foto */
.hero h1 {
  margin: 0 0 24px; max-width: 700px;
  text-transform: none; letter-spacing: -1.2px; line-height: 1.05;
  font-size: clamp(2.2rem, 4.6vw, 3.6rem);
}
/* a expressão destacada não quebra no meio — ela vai inteira pra linha de baixo */
.hero h1 .accent { white-space: nowrap; }
.hero p.lead { color: #dcdcda; font-size: 1.15rem; line-height: 1.6; max-width: 600px; margin: 0 0 36px; }
.hero-actions { display: flex; gap: 14px; flex-wrap: wrap; }
/* dica de rolagem, na vertical junto à borda direita */
.hero-scroll {
  position: absolute; right: 24px; bottom: 104px; z-index: 2;
  writing-mode: vertical-rl;
  font-size: .68rem; font-weight: 600; letter-spacing: .34em; text-transform: uppercase;
  color: rgba(255,255,255,.6); user-select: none; pointer-events: none;
}

/* ---------- home: cabeçalho transparente sobre o hero ---------- */
body[data-page="home"] header.nav {
  background: transparent; border-bottom-color: transparent;
  -webkit-backdrop-filter: none; backdrop-filter: none;
  transition: background .25s ease, border-color .25s ease;
}
/* sobre a foto os links precisam de mais peso do que o cinza padrão */
body[data-page="home"]:not(.nav-solida) .nav-links a { color: rgba(255, 255, 255, .82); }
body[data-page="home"]:not(.nav-solida) .nav-links a:hover,
body[data-page="home"]:not(.nav-solida) .nav-links a.active { color: #ffffff; }
/* ao rolar, a nav recupera o fundo pra continuar legível sobre o conteúdo */
body[data-page="home"].nav-solida header.nav {
  background: rgba(6, 7, 15, .86); border-bottom-color: var(--border);
  -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
}
body[data-page="home"].nav-solida .nav-links a { color: var(--muted); }
/* o hero sobe pra ficar embaixo do cabeçalho (altura medida no app.js) */
body[data-page="home"] .hero {
  margin-top: calc(-1 * var(--header-h, 100px));
  padding-top: calc(60px + var(--header-h, 100px));
}

/* ---------- destaque (veículo em destaque) ---------- */
.destaque-grid { display: grid; grid-template-columns: 1.1fr 1fr; gap: 48px; align-items: center; }
.destaque-media { position: relative; border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); }
/* mesma regra do card: quadro 1/1 e `contain`, pra o veículo em destaque
   aparecer inteiro (versões antigas usavam 4/3 com `cover`, que cortava a frente
   e a traseira) */
.destaque-media { background: var(--surface-2); }
.destaque-media img { width: 100%; height: 100%; object-fit: contain; aspect-ratio: 1/1; }
.destaque-media .badge {
  position: absolute; top: 16px; left: 16px;
  background: rgba(0,0,0,.7); border: 1px solid var(--brand);
  color: var(--brand); padding: 6px 14px; border-radius: 999px; font-weight: 700; font-size: .8rem;
}
.destaque-info h3 { font-size: clamp(1.8rem, 4vw, 2.7rem); font-weight: 900; text-transform: uppercase; margin: 6px 0 14px; }
.destaque-info .preco { font-size: 2.1rem; font-weight: 900; color: var(--brand); margin: 4px 0 20px; }
.spec-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 22px 0; }
.spec {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-sm); padding: 14px 16px;
}
.spec span { display: block; font-size: .72rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted-2); }
.spec strong { font-size: 1.05rem; }

/* ---------- cards de carro ---------- */
.cars-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); gap: 26px; }
.car-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); overflow: hidden; transition: .22s ease;
  display: flex; flex-direction: column;
}
.car-card:hover { transform: translateY(-6px); border-color: var(--brand); box-shadow: var(--shadow); }
/* >>> O VEÍCULO NUNCA É CORTADO, E NÃO TEM ETIQUETA EM CIMA DELE. <<<
   As duas regras são de cliente, não de gosto: a foto do carro é o produto da
   revenda, e é o primeiro lugar onde o lojista olha.

   Quadro 1/1 (a mesma proporção dos arquivos, que o LEIA-ME manda gerar em
   1200x1200) + `object-fit: contain`. Versões antigas usavam `aspect-ratio: 16/11`
   com `cover`, e aquilo comia ~30% da altura de TODA foto: o carro aparecia com o
   teto e a saia cortados.

   Por que `contain` e não só trocar a proporção pra 1/1: foto quadrada preenche o
   quadro exatamente e não sobra tarja nenhuma, mas se um dia entrar uma foto fora
   do formato (upload pelo painel, por exemplo) ela aparece INTEIRA com tarja, em
   vez de aparecer cortada. Tarja é feia; carro cortado é defeito. */
.car-card .thumb {
  position: relative; aspect-ratio: 1/1; overflow: hidden;
  background: var(--surface-2);
}
/* z-index: 0 na foto. Ela é o ÚLTIMO filho da .thumb e é `position: absolute`,
   então sem isso empilha por cima do badge de situação (que vem antes no HTML
   gerado pelo app.js) e o faz desaparecer. É a mesma armadilha do véu de card,
   só que com a própria <img> no papel do pseudo-elemento — tanto que o `.sit`
   aqui embaixo já carregava um z-index: 1 avulso, de quem tropeçou nisso antes. */
.car-card .thumb img { position: absolute; inset: 0; z-index: 0; width: 100%; height: 100%; object-fit: contain; transition: .4s ease; }
/* O zoom do hover fica em `scale(1.03)`: com `contain` a foto encosta nas bordas
   do quadro, então 1.05 já começava a comer a lataria de novo. */
.car-card:hover .thumb img { transform: scale(1.03); }
/* SEM badge de ano e SEM badge de categoria sobre a foto. Etiqueta em cima da
   lataria tapa justamente o que o visitante veio ver, e o ano já aparece na linha
   de meta do card (ver metaCurta no app.js), então o badge era informação
   repetida cobrindo o produto. Os campos `ano` e `categoria` continuam vivos nos
   filtros do estoque e no painel: o que saiu foi a etiqueta, não o dado.
   NÃO reintroduza `.car-card .tag`. */
/* badge de situação (canto superior direito) — este fica, porque não é dado
   repetido: é o único lugar onde "Modificado" e "Em preparação" aparecem no
   card, e ele cai no canto, fora do corpo do carro. */
.car-card .sit {
  position: absolute; top: 12px; right: 12px; z-index: 1;
  padding: 5px 11px; border-radius: 999px; font-size: .72rem; font-weight: 800;
  text-transform: uppercase; letter-spacing: .04em; backdrop-filter: blur(4px);
}
.car-card .sit.modificado { background: rgba(0,0,0,.72); color: var(--accent); border: 1px solid var(--accent); }
/* "em preparação" fica em neutro claro pra não competir com o azul da marca */
.car-card .sit.preparacao { background: rgba(238,238,236,.94); color: #111; }
.car-card .body { padding: 18px 18px 20px; display: flex; flex-direction: column; flex: 1; }
.car-card h4 { font-size: 1.08rem; margin: 0 0 8px; line-height: 1.25; }
.car-card .meta { color: var(--muted); font-size: .88rem; margin-bottom: 16px; }
.car-card .meta b { color: var(--muted); font-weight: 400; }
.car-card .foot { margin-top: auto; display: flex; align-items: center; justify-content: space-between; }
.car-card .price { font-size: 1.3rem; font-weight: 900; color: var(--brand); }
.car-card .foot a { color: var(--accent); font-weight: 700; font-size: .9rem; display: inline-flex; align-items: center; gap: 5px; }

/* ---------- diferenciais ---------- */
/* A cor de cada card sai de `--feat-cor`, num lugar só: o quadradinho do ícone e
   a linha que aparece no topo no hover leem daqui. Hoje todos usam o azul da
   marca; pra dar cor diferente por card, basta redefinir a variável no
   :nth-child correspondente. */
.feats { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px; }
.feat {
  --feat-cor: var(--brand);
  position: relative; overflow: hidden;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: 20px; padding: 32px 28px 34px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, .25);
}
/* a linha do topo cresce do meio pras pontas. Especificidade `.feats .feat`
   (0,2,0) de propósito: a classe `.reveal`, definida mais abaixo no arquivo,
   também é (0,1,0) e sobrescreveria o transition daqui, deixando o hover lento e
   sem sombra. O `opacity` entra na lista porque o reveal precisa dele. */
.feat::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px;
  background: var(--feat-cor);
  transform: scaleX(0); transform-origin: 50% 50%;
}
.feats .feat {
  transition: opacity .7s cubic-bezier(.2, .6, .2, 1),
              transform .34s cubic-bezier(.2, .6, .2, 1),
              box-shadow .3s ease, border-color .3s ease;
}
.feats .feat::before { transition: transform .38s cubic-bezier(.2, .6, .2, 1); }
@media (hover: hover) {
  .feat:hover {
    transform: translateY(-8px); border-color: #343434;
    box-shadow: 0 24px 52px rgba(0, 0, 0, .55);
  }
  .feat:hover::before { transform: scaleX(1); }
}
/* quadradinho de cor sólida com o ícone em cima — escuro sobre o azul, como
   manda a regra de contraste da paleta (--on-brand) */
.feat .ico {
  width: 54px; height: 54px; border-radius: 16px; display: grid; place-items: center;
  background: var(--feat-cor); color: var(--on-brand); margin-bottom: 22px;
  box-shadow: 0 8px 18px rgba(0, 0, 0, .35);
}
.feat .ico svg { width: 27px; height: 27px; stroke-width: 2.2; }
.feat h4 { margin: 0 0 10px; font-size: 1.2rem; font-weight: 700; letter-spacing: -.2px; }
.feat p { color: var(--muted); margin: 0; font-size: .95rem; line-height: 1.62; }

/* ---------- clientes (carrossel) ---------- */
.clientes { background: var(--bg-2); }
.stars { color: var(--accent); letter-spacing: 3px; }
/* carrossel automático (marquee) — anda sozinho, sem controle manual */
.carousel {
  position: relative; overflow: hidden; padding: 6px 0 10px;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 5%, #000 95%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 5%, #000 95%, transparent);
}
.carousel-track {
  display: flex; width: max-content;
  animation: marquee var(--marquee-dur, 24s) linear infinite;
}
/* SEM will-change aqui de propósito: -webkit-mask-image + will-change:transform
   deixa o carrossel em branco no Safari do iPhone. Sem will-change, máscara +
   animação funcionam (mesma receita do projeto gti, que roda liso no iOS). */
@keyframes marquee {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); } /* lista duplicada + espaço via margin = loop perfeito */
}
.cliente-card {
  flex: 0 0 auto; width: 360px; aspect-ratio: 4 / 3; margin-right: 22px;
  border-radius: var(--radius); overflow: hidden; border: 1px solid var(--border);
  background: var(--surface); position: relative;
}
.cliente-card img { width: 100%; height: 100%; object-fit: cover; object-position: center 30%; display: block; }
/* Véu forte e alto, e não um `rgba(0,0,0,.85) → transparent` curto: foto de
   entrega é quase sempre o cliente ao lado do capô, e carro BRANCO ou PRATA é a
   metade do estoque de qualquer revenda. Com o gradiente fraco, o "Sonho
   realizado" (que é `--brand`) ficava cor da marca sobre branco e sumia. Com o
   pé em .92 e o meio já em .72, as duas linhas leem em qualquer foto. */
.cliente-card .cap {
  position: absolute; left: 0; right: 0; bottom: 0; padding: 46px 18px 16px;
  background: linear-gradient(to top,
    rgba(0,0,0,.92) 0%, rgba(0,0,0,.72) 38%, rgba(0,0,0,.28) 70%, rgba(0,0,0,0) 100%);
  font-weight: 700; font-size: .95rem;
}
.cliente-card .cap small { display: block; color: var(--brand); font-weight: 600; }
.carousel-nav { display: flex; gap: 12px; justify-content: center; margin-top: 26px; }
.carousel-nav button {
  width: 48px; height: 48px; border-radius: 50%;
  background: var(--surface); border: 1px solid var(--border); color: var(--text);
  cursor: pointer; display: grid; place-items: center; transition: .2s;
}
.carousel-nav button:hover { border-color: var(--brand); color: var(--brand); }
.carousel-nav button svg { width: 20px; height: 20px; }

/* ==========================================================================
   AS DUAS SEÇÕES QUE SUBSTITUEM AS PROVAS SOCIAIS

   A REICAR não tem (ainda) foto de entrega de cliente nem avaliação no Google,
   então "Sonhos realizados" virou #equipe e "Avaliações no Google" virou
   #consignacao. O CSS das duas originais continua neste arquivo, intocado, pra
   o dia em que a loja tiver o conteúdo.

   As duas usam layout ASSIMÉTRICO de propósito. As seções vizinhas (destaque,
   estoque, diferenciais) são todas olho-mágico centralizado + título gigante +
   grade; quatro dessas seguidas é o que faz a página inteira parecer template
   (armadilha nº10). Aqui o título encosta na esquerda e divide a linha com uma
   foto, o que quebra o ritmo sem inventar componente novo.
   ========================================================================== */

/* ---------- #equipe: quem vai te atender ---------- */
.equipe-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: center; }
.equipe-txt .eyebrow { text-align: left; }
/* o .display cheio (até 4rem) não cabe em meia largura */
.equipe-txt h2 { font-size: clamp(1.9rem, 3.4vw, 2.8rem); margin: 0 0 20px; }
/* `:not(.eyebrow)` obrigatório: o olho-mágico é `<p class="eyebrow">` e também é
   filho direto daqui, então sem isto esta regra (0-2-0) ganharia de `.eyebrow`
   (0-1-0) e pintaria o rótulo de cinza em vez do lima da marca. */
.equipe-txt > p:not(.eyebrow) { color: var(--muted); font-size: 1.05rem; max-width: 520px; margin: 0 0 26px; }
.equipe-foto {
  margin: 0; position: relative; border-radius: var(--radius); overflow: hidden;
  border: 1px solid var(--border); box-shadow: var(--shadow);
}
.equipe-foto img { width: 100%; aspect-ratio: 4/3; object-fit: cover; }
/* fio nas duas cores da marca no pé da foto: amarra a foto crua (feita no
   celular, sem tratamento) ao resto da página */
.equipe-foto::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 5px;
  background: linear-gradient(90deg, var(--accent-2), var(--brand));
}
/* ---------- #consignacao: deixe seu veículo aqui ---------- */
.consig-grid { display: grid; grid-template-columns: 1.05fr .95fr; gap: 56px; align-items: center; }
.consig-txt .eyebrow { text-align: left; }
.consig-txt h2 { font-size: clamp(1.85rem, 3.4vw, 2.8rem); line-height: 1.06; margin: 0 0 20px; }
.consig-txt > p:not(.eyebrow) { color: var(--muted); font-size: 1.05rem; max-width: 540px; margin: 0 0 26px; }
/* os quatro serviços são os do letreiro da fachada, nessa ordem */
.consig-servicos { list-style: none; padding: 0; margin: 0 0 30px; display: flex; flex-wrap: wrap; gap: 10px; }
.consig-servicos li {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 9px 17px; border-radius: 999px;
  background: var(--surface); border: 1px solid var(--border);
  font-weight: 700; font-size: .88rem;
}
.consig-servicos li::before {
  content: ""; flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--brand);
}
.consig-foto {
  margin: 0; border-radius: var(--radius); overflow: hidden;
  border: 1px solid var(--border); box-shadow: var(--shadow);
}
.consig-foto img { width: 100%; display: block; }

/* fila de botões de uma seção qualquer. NÃO reusar `.hero-actions` aqui: ela já
   é compartilhada com o bloco de veículo em destaque e regra de mobile escrita
   pro hero vazaria pra cá (armadilha nº8). */
.bloco-acoes { display: flex; gap: 14px; flex-wrap: wrap; }

/* ---------- avaliações do Google ---------- */
/* Por que este layout e não uma grade de cards: os textos do Google são
   curtíssimos ("Excelente", "Fui muito bem atendido"), e card grande com texto
   miúdo dá a impressão de vazio. Então a hierarquia é invertida — a CITAÇÃO é o
   elemento principal, em corpo grande, e nome/estrelas vão no pé — e a seção
   ganha um âncora: o painel da nota, à esquerda, fora da grade. */
.reviews-layout {
  display: grid; grid-template-columns: minmax(0, 360px) minmax(0, 1fr);
  gap: 46px; align-items: start;
}
.reviews-score .eyebrow { text-align: left; }
/* o .display cheio (até 4rem) não cabe numa coluna de 360px */
.reviews-score h2 { font-size: clamp(1.9rem, 3.2vw, 2.6rem); margin: 0 0 24px; }
.rs-card {
  position: relative; overflow: hidden; text-align: center;
  border: 1px solid var(--border); border-radius: 20px; padding: 30px 26px 28px;
  background:
    radial-gradient(120% 90% at 50% -20%, rgba(174, 228, 79, .10), transparent 62%),
    linear-gradient(180deg, var(--surface), #0a0d18);
}
/* fio de luz na borda de cima */
.rs-card::before {
  content: ""; position: absolute; left: 14%; right: 14%; top: 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--brand), transparent);
}
.rs-g { width: 30px; height: 30px; display: inline-grid; place-items: center; }
.rs-g svg { width: 30px; height: 30px; }
.rs-nota {
  margin-top: 12px; font-weight: 900; line-height: 1; letter-spacing: -2px;
  font-size: clamp(3.2rem, 7vw, 4.2rem);
  background: linear-gradient(180deg, #ffffff, #c9d8a8);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.rs-stars { display: inline-flex; gap: 4px; color: #ffb703; margin: 12px 0 16px; }
.rs-stars svg { width: 20px; height: 20px; }
.rs-txt { color: var(--muted); font-size: .92rem; line-height: 1.55; margin: 0 0 24px; }

.reviews-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
.review {
  position: relative; overflow: hidden; isolation: isolate;
  border: 1px solid var(--border); border-radius: 18px; padding: 26px 24px 22px;
  background: linear-gradient(180deg, var(--surface), #0a0d18);
  display: flex; flex-direction: column; gap: 14px;
  transition: transform .25s ease, border-color .25s ease, box-shadow .25s ease;
}
/* luz que acompanha o cursor — as coordenadas --mx/--my vêm do app.js.
   z-index negativo: pinta acima do fundo do card e abaixo do texto. */
.review::after {
  content: ""; position: absolute; inset: 0; z-index: -1; opacity: 0;
  background: radial-gradient(260px circle at var(--mx, 50%) var(--my, 0%), rgba(174, 228, 79, .12), transparent 62%);
  transition: opacity .3s ease;
}
.review:hover {
  transform: translateY(-4px); border-color: rgba(174, 228, 79, .40);
  box-shadow: 0 18px 44px rgba(0, 0, 0, .45);
}
.review:hover::after { opacity: 1; }
/* marca de citação, no fluxo e acima do texto. Tentei o caractere &ldquo; solto
   e não funciona: pequeno num canto parece sujeira, e grande o suficiente pra
   virar ornamento ele é cortado pelo `overflow: hidden` do card (a tinta do
   glifo fica no topo da caixa da linha). Ícone resolve os dois. */
.review-quote { display: block; width: 26px; height: 26px; color: var(--brand); opacity: .5; }
.review-quote svg { width: 26px; height: 26px; }
.review-text {
  margin: 0; color: var(--text); font-weight: 600;
  font-size: 1.12rem; line-height: 1.45; letter-spacing: -.2px;
}
.review-foot { display: flex; align-items: center; gap: 12px; margin-top: auto; }
.review-avatar {
  flex: 0 0 auto; width: 40px; height: 40px; border-radius: 50%; display: grid; place-items: center;
  color: #fff; font-weight: 700; font-size: 1.05rem;
}
.review-id { display: flex; flex-direction: column; line-height: 1.3; margin-right: auto; min-width: 0; }
.review-id strong { font-size: .94rem; }
.review-id span { color: var(--muted-2); font-size: .74rem; letter-spacing: .04em; }
.review-stars { display: inline-flex; gap: 2px; color: #ffb703; flex: 0 0 auto; }
.review-stars svg { width: 15px; height: 15px; }

/* entrada escalonada dos depoimentos (o container não anima, só os cards) */
.reviews-grid.reveal { opacity: 1; transform: none; }
.reviews-grid.reveal .review { opacity: 0; }
.reviews-grid.reveal.visible .review {
  animation: reviewIn .6s cubic-bezier(.2, .6, .2, 1) both;
  animation-delay: calc(var(--i, 0) * .08s);
}
/* o `to` é obrigatório aqui: sem ele o valor final seria o do próprio elemento,
   que é o `opacity: 0` do estado pré-reveal acima — a animação ia de 0 a 0 e os
   cards ficavam invisíveis */
@keyframes reviewIn {
  from { opacity: 0; transform: translateY(18px); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .reviews-grid.reveal .review { opacity: 1; }
  .reviews-grid.reveal.visible .review { animation: none; }
}

/* ---------- redes ---------- */
.redes-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 22px; }
.rede {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 28px; transition: .2s;
}
.rede:hover { border-color: var(--brand); transform: translateY(-4px); }
.rede .ico { color: var(--brand); margin-bottom: 16px; }
.rede .ico svg { width: 30px; height: 30px; }
.rede strong { display: block; font-size: 1.15rem; margin-bottom: 4px; }
.rede span { color: var(--muted); font-size: .9rem; }

/* ---------- localização ---------- */
.loc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: center; }
.loc-item { display: flex; gap: 16px; margin-bottom: 22px; }
.loc-item > div:last-child { flex: 1 1 auto; min-width: 0; }
.loc-item .ico {
  width: 46px; height: 46px; flex: none; border-radius: 12px; display: grid; place-items: center;
  background: rgba(174, 228, 79, .13); color: var(--brand);
}
.loc-item .ico svg { width: 22px; height: 22px; }
.loc-item strong { display: block; margin-bottom: 2px; }
.loc-item span { color: var(--muted); }
.loc-media { border-radius: var(--radius); overflow: hidden; border: 1px solid var(--border); box-shadow: var(--shadow); }
/* o vídeo da loja ocupa exatamente o mesmo quadro que a foto ocupava */
.loc-media img,
.loc-media video { width: 100%; height: 100%; object-fit: cover; aspect-ratio: 4/3; display: block; background: #000; }
.horario { list-style: none; padding: 0; margin: 8px 0 24px; max-width: 420px; }
.horario li { display: flex; justify-content: space-between; gap: 24px; padding: 10px 0; border-bottom: 1px solid var(--border); }
.horario li span:first-child { color: var(--text); }
.horario li span:last-child { color: var(--brand); font-weight: 600; }

/* ---------- CTA final ---------- */
.cta {
  text-align: center;
  background:
    radial-gradient(60% 120% at 50% 0%, rgba(174, 228, 79, .13), transparent 70%),
    var(--bg-2);
  border-top: 1px solid var(--border);
}
.cta h2 { font-size: clamp(2rem, 5vw, 3.4rem); font-weight: 900; text-transform: uppercase; margin: 0 0 16px; }
/* `:not(.eyebrow)` pelo mesmo motivo do `.section-head p` (ver o comentário lá):
   o olho-mágico do CTA também é um `<p>` filho deste bloco. */
.cta p:not(.eyebrow) { color: var(--muted); font-size: 1.1rem; max-width: 520px; margin: 0 auto 30px; }
.cta-actions { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; }

/* ---------- footer ---------- */
footer.foot { background: #04050c; border-top: 1px solid var(--border); padding: 56px 0 30px; }
.foot-grid { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 36px; }
.foot-brand img { height: 58px; width: auto; object-fit: contain; margin-bottom: 18px; }
.foot-brand p { color: var(--muted); font-size: .92rem; max-width: 260px; }
.foot h5 { text-transform: uppercase; letter-spacing: .15em; font-size: .8rem; color: var(--muted-2); margin: 0 0 18px; }
.foot ul { list-style: none; padding: 0; margin: 0; }
.foot ul li { margin-bottom: 11px; }
.foot ul li a, .foot ul li span { color: var(--muted); font-size: .92rem; transition: .2s; }
.foot ul li a:hover { color: var(--brand); }
.foot-social { display: flex; gap: 12px; margin-top: 6px; }
.foot-social a {
  width: 42px; height: 42px; border-radius: 12px; display: grid; place-items: center;
  background: var(--surface); border: 1px solid var(--border); color: var(--text); transition: .2s;
}
.foot-social a:hover { border-color: var(--brand); color: var(--brand); }
.foot-social svg { width: 20px; height: 20px; }
.foot-bottom {
  border-top: 1px solid var(--border); margin-top: 40px; padding-top: 22px;
  display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap;
  color: var(--muted-2); font-size: .85rem;
}

/* ---------- botão flutuante WhatsApp ---------- */
.wa-float {
  position: fixed; right: 22px; bottom: 22px; z-index: 60;
  width: 60px; height: 60px; border-radius: 50%; background: #25d366;
  display: grid; place-items: center; box-shadow: 0 10px 30px rgba(37,211,102,.45);
  transition: .2s;
}
.wa-float:hover { transform: scale(1.08); }
.wa-float svg { width: 32px; height: 32px; color: #fff; }

/* ==========================================================================
   PÁGINA ESTOQUE
   ========================================================================== */
.page-head { padding: 56px 0 10px; }
.page-head .eyebrow { text-align: left; }
.estoque-layout { display: grid; grid-template-columns: 280px 1fr; gap: 34px; align-items: start; padding-bottom: 100px; }
.filtros {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 24px; position: sticky; top: 90px;
}
.filtros-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 18px; }
.filtros h3 { margin: 0; font-size: 1.1rem; }
/* X pra fechar o painel de filtros — só no mobile (no desktop ele fica sempre aberto) */
.filtros-close { display: none; background: none; border: 0; color: var(--text); cursor: pointer; padding: 4px; margin: -4px -4px -4px 0; }
.filtros-close svg { width: 24px; height: 24px; }
.filtro-group { margin-bottom: 20px; }
.filtro-group > label { display: block; font-size: .78rem; text-transform: uppercase; letter-spacing: .1em; color: var(--muted-2); margin-bottom: 10px; }
.chip-row { display: flex; flex-wrap: wrap; gap: 8px; }
.chip {
  padding: 7px 14px; border-radius: 999px; font-size: .84rem; cursor: pointer;
  background: var(--surface-2); border: 1px solid var(--border); color: var(--muted); transition: .18s;
}
.chip:hover { color: var(--text); }
.chip.active { background: linear-gradient(92deg, var(--brand-2), var(--brand)); color: var(--on-brand); border-color: transparent; font-weight: 700; }

/* abas de situação do estoque (Disponíveis / Modificados / Em preparação) */
.sit-tabs { display: flex; gap: 10px; overflow-x: auto; padding-bottom: 4px; margin-bottom: 6px; -webkit-overflow-scrolling: touch; }
.sit-tab {
  flex: 0 0 auto; display: inline-flex; align-items: center; gap: 7px; white-space: nowrap;
  padding: 10px 20px; border-radius: 999px; font-size: .95rem; font-weight: 700; cursor: pointer;
  background: var(--surface); border: 1px solid var(--border); color: var(--muted); transition: .18s;
}
.sit-tab:hover { color: var(--text); border-color: var(--muted-2); }
.sit-tab.active { background: linear-gradient(92deg, var(--brand-2), var(--brand)); color: var(--on-brand); border-color: transparent; }
.sit-tab .n { font-size: .8em; font-weight: 600; opacity: .7; }
.sit-tab.active .n { opacity: .85; }
.filtros select, .filtros input[type="search"] {
  width: 100%; padding: 11px 14px; border-radius: var(--radius-sm);
  background: var(--surface-2); border: 1px solid var(--border); color: var(--text); font-size: .92rem;
}
.filtros input[type="range"] { width: 100%; accent-color: var(--brand); margin: 6px 0 4px; }
.range-val { color: var(--brand); font-weight: 700; font-size: .9rem; }
.limpar { background: none; border: 0; color: var(--muted); cursor: pointer; text-decoration: underline; font-size: .86rem; width: 100%; text-align: center; margin-top: 12px; }

/* grupos colapsáveis (details/summary) */
.fgroup { border-top: 1px solid var(--border); padding: 16px 0; }
.fgroup summary {
  list-style: none; cursor: pointer; display: flex; align-items: center; justify-content: space-between;
  font-size: .78rem; text-transform: uppercase; letter-spacing: .1em; color: var(--muted-2); font-weight: 700;
}
.fgroup summary::-webkit-details-marker { display: none; }
.fgroup summary::after {
  content: ""; width: 9px; height: 9px; border-right: 2px solid var(--muted); border-bottom: 2px solid var(--muted);
  transform: rotate(45deg); transition: transform .2s; margin-right: 3px;
}
.fgroup[open] summary::after { transform: rotate(-135deg); }
.fgroup summary + * { margin-top: 14px; }

/* linhas de checkbox com contagem */
.check-list { display: flex; flex-direction: column; gap: 4px; }
.check-row {
  display: flex; align-items: center; gap: 10px; cursor: pointer;
  font-size: .92rem; color: var(--text); padding: 4px 0;
}
.check-row input { width: 17px; height: 17px; accent-color: var(--brand); cursor: pointer; }
.check-row span { flex: 1; }
.check-row em { color: var(--muted-2); font-style: normal; font-size: .82rem; }
.check-row:hover span { color: var(--brand); }

.ver-btn { width: 100%; justify-content: center; margin-top: 20px; }
/* select "Ordenar por" — estilizado */
.ordenar-sel {
  width: auto; min-width: 170px;
  appearance: none; -webkit-appearance: none; -moz-appearance: none;
  background-color: var(--surface); color: var(--text);
  border: 1px solid var(--border); border-radius: 999px;
  padding: 12px 44px 12px 20px; font-size: .9rem; font-weight: 600;
  font-family: inherit; cursor: pointer; transition: .2s;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23d2d6db' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><path d='M6 9l6 6 6-6'/></svg>");
  background-repeat: no-repeat; background-position: right 18px center;
}
.ordenar-sel:hover { border-color: var(--brand); }
.ordenar-sel:focus { outline: none; border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-glow); }
.ordenar-sel option { background: var(--surface); color: var(--text); }

/* ícone inline do WhatsApp (telefones que abrem o WhatsApp) */
.wa-inline { display: inline-flex; width: 14px; height: 14px; margin-right: 6px; color: #25d366; vertical-align: -2px; }
.wa-inline svg { width: 100%; height: 100%; }
/* ícone inline de telefone — o FIXO da loja, que abre `tel:` e não o WhatsApp
   (é o `wa: false` no LOJA.telefones; ver shared.js). Mesma caixa do
   .wa-inline pra os dois ficarem alinhados na mesma linha. */
.tel-inline { display: inline-flex; width: 14px; height: 14px; margin-right: 6px; color: var(--brand); vertical-align: -2px; }
.tel-inline svg { width: 100%; height: 100%; }

.estoque-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 22px; gap: 14px; flex-wrap: wrap; }
.estoque-top .count { color: var(--muted); margin-left: auto; }
.estoque-top .count b { color: var(--text); }
.busca-wrap { position: relative; flex: 1; min-width: 220px; max-width: 420px; }
.busca-wrap input { width: 100%; padding: 12px 16px 12px 42px; border-radius: 999px; background: var(--surface); border: 1px solid var(--border); color: var(--text); }
.busca-wrap svg { position: absolute; left: 15px; top: 50%; transform: translateY(-50%); width: 18px; height: 18px; color: var(--muted); }
.no-results { text-align: center; color: var(--muted); padding: 60px 0; }
.mobile-filtros-btn { display: none; }

/* ==========================================================================
   PÁGINA DETALHE
   ========================================================================== */
.crumbs { color: var(--muted-2); font-size: .88rem; padding: 26px 0 8px; }
.crumbs a:hover { color: var(--brand); }
.detalhe-grid { display: grid; grid-template-columns: 1.15fr .85fr; gap: 40px; align-items: start; padding-bottom: 40px; }
.galeria-main {
  position: relative; border-radius: var(--radius); overflow: hidden;
  border: 1px solid var(--border); background: #000; cursor: zoom-in;
  /* entrega o eixo HORIZONTAL pro initArrastar (app.js) e deixa o resto com o
     navegador: `pan-y` mantém a rolagem da página e `pinch-zoom` mantém a pinça
     ampliando a foto. Sem esta linha o navegador consome o gesto lateral e o
     `pointerup` chega com dx≈0 — o arrasto simplesmente não funciona, sem erro
     nenhum no console. */
  touch-action: pan-y pinch-zoom;
}
/* a foto grande da página do veículo também é 1/1 + `contain`: a galeria é
   justamente onde quem está decidindo comprar quer ver o carro todo. O lightbox
   já usava `contain`, então os dois batem. */
.galeria-main img { width: 100%; aspect-ratio: 1/1; object-fit: contain; }
.galeria-main .zoom-ico {
  position: absolute; right: 14px; bottom: 14px; width: 40px; height: 40px;
  border-radius: 10px; background: rgba(0,0,0,.6); display: grid; place-items: center; color: #fff;
}
.galeria-main .counter {
  position: absolute; left: 14px; bottom: 14px; background: rgba(0,0,0,.6);
  padding: 5px 12px; border-radius: 999px; font-size: .82rem;
}
.galeria-main .nav-arrow {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 44px; height: 44px; border-radius: 50%; background: rgba(0,0,0,.55);
  border: 0; color: #fff; cursor: pointer; display: grid; place-items: center;
}
.galeria-main .nav-arrow:hover { background: var(--brand); color: var(--on-brand); }
.galeria-main .prev { left: 12px; } .galeria-main .next { right: 12px; }
.galeria-main .nav-arrow svg { width: 22px; height: 22px; }
.thumbs { display: flex; gap: 12px; margin-top: 14px; flex-wrap: wrap; }
/* miniaturas quadradas e `contain`, como o quadro grande: em 92x68 com `cover`
   o visitante escolhia a foto por um pedaço dela, e duas fotos do mesmo ângulo
   ficavam indistinguíveis */
.thumbs img {
  width: 76px; height: 76px; object-fit: contain; border-radius: 10px;
  background: var(--surface-2);
  border: 2px solid transparent; cursor: pointer; opacity: .6; transition: .2s;
}
.thumbs img:hover { opacity: 1; }
.thumbs img.active { border-color: var(--brand); opacity: 1; }
.detalhe-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 30px; position: sticky; top: 90px;
}
.detalhe-card .eyebrow { text-align: left; margin-bottom: 8px; }
.detalhe-card h1 { font-size: clamp(1.5rem, 3.5vw, 2.1rem); font-weight: 900; margin: 0 0 6px; }
.detalhe-card .preco { font-size: 2.3rem; font-weight: 900; color: var(--brand); margin: 10px 0 22px; }
.detalhe-specs { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 24px; }
.detalhe-card .btn { width: 100%; justify-content: center; }
.detalhe-card .check { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: .88rem; margin-top: 14px; }
.detalhe-card .check svg { width: 16px; height: 16px; color: var(--brand); }
/* selos como pílulas que fluem e quebram linha (bom mesmo com 10 selos) */
.selos-pills { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 18px; }
.selo-pill {
  display: inline-flex; align-items: center; gap: 6px; padding: 7px 13px;
  border-radius: 999px; background: rgba(255,255,255,.04); border: 1px solid var(--border);
  color: var(--text); font-size: .8rem; font-weight: 500; line-height: 1;
}
.selo-pill svg { width: 14px; height: 14px; color: var(--brand); flex: none; }
.desc-block { padding: 20px 0 70px; }
.desc-block h2 { font-size: 1.6rem; margin: 0 0 16px; }
/* `pre-line` respeita as quebras de linha que a loja digitou no painel e ainda
   deixa o texto quebrar sozinho no fim da linha. A loja escreve a descrição em
   lista ("✅ VIDRO ELÉTRICO" uma por linha), e sem isto tudo virava um parágrafo
   corrido — o `textContent` preserva o \n, mas o CSS padrão o trata como espaço.
   NÃO troque por `pre`: aquele desliga a quebra automática e estoura a largura
   no celular. */
.desc-block p { color: var(--muted); max-width: 760px; white-space: pre-line; }
.opcionais { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 10px 22px; margin-top: 22px; max-width: 820px; }
.opcionais li { list-style: none; display: flex; align-items: center; gap: 9px; color: var(--text); font-size: .94rem; }
.opcionais li svg { width: 16px; height: 16px; color: var(--brand); flex: none; }
.opcionais { padding: 0; }

/* ---------- lightbox ---------- */
.lightbox {
  position: fixed; inset: 0; z-index: 100; background: rgba(0,0,0,.94);
  display: none; align-items: center; justify-content: center; padding: 30px;
}
.lightbox.open { display: flex; }
/* mesma regra da galeria: arrasto lateral é nosso, pinça continua do navegador
   (é dentro do lightbox que o visitante mais amplia pra olhar a lataria) */
.lightbox { touch-action: pan-y pinch-zoom; }
.lightbox img { max-width: 92vw; max-height: 86vh; object-fit: contain; border-radius: 10px; }
.lightbox .lb-close { position: absolute; top: 22px; right: 26px; background: none; border: 0; color: #fff; cursor: pointer; }
.lightbox .lb-close svg { width: 34px; height: 34px; }
.lightbox .lb-arrow {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 54px; height: 54px; border-radius: 50%; background: rgba(255,255,255,.1);
  border: 0; color: #fff; cursor: pointer; display: grid; place-items: center;
}
.lightbox .lb-arrow:hover { background: var(--brand); color: var(--on-brand); }
.lightbox .lb-prev { left: 22px; } .lightbox .lb-next { right: 22px; }
.lightbox .lb-arrow svg { width: 28px; height: 28px; }

/* outros carros */
.outros-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px; }

/* ==========================================================================
   RESPONSIVO
   ========================================================================== */
@media (max-width: 940px) {
  .nav-links { display: none; }
  .nav-toggle { display: block; }
  .nav-cta .btn-ghost { display: none; }
  .destaque-grid, .loc-grid, .detalhe-grid { grid-template-columns: 1fr; }
  .equipe-grid, .consig-grid { grid-template-columns: 1fr; gap: 34px; }
  .foot-grid { grid-template-columns: 1fr 1fr; }
  .estoque-layout { grid-template-columns: 1fr; }
  .filtros { position: static; display: none; }
  .filtros.show { display: block; }
  .filtros-close { display: inline-flex; }
  .mobile-filtros-btn { display: inline-flex; }
  .detalhe-card { position: static; }
}

/* ==========================================================================
   HERO EM TELA ESTREITA (até 940px, onde a nav já virou hambúrguer)

   UMA FOTO SÓ SERVE O SITE INTEIRO, seja ela panorâmica ou vertical. Existe
   pra que a loja não precise mandar duas fotos: duas nunca batem entre si (uma
   de dia, outra de tarde, carros diferentes no pátio).

   O truque é não amarrar nada à proporção do arquivo: a foto ocupa uma FRAÇÃO
   FIXA da tela e o `cover` resolve o resto.

   >>> AQUI O EIXO HORIZONTAL É `center`, E NÃO O `left` PADRÃO. <<<
   O `left` da armadilha nº1 serve pra letreiro colado na borda esquerda da
   foto. O da REICAR é CENTRADO: em fachada-hero.jpg (1409x1116) ele vai de
   x=483 a x=888, centro em 48,7%. Com `left`, o celular mostrava só a faixa
   esquerda do arquivo — o portão e o banner de consignação — e a marca da loja
   não aparecia no hero. É o defeito que a armadilha avisa que NÃO aparece em
   captura de 1440, porque no desktop o corte é outro.

   >>> O NÚMERO ABAIXO (76svh) É O QUE MUDA DE CLIENTE PRA CLIENTE. <<<
   O que ele controla é QUANTA LARGURA da foto cabe na tela: quanto mais alta a
   foto fica, mais estreita é a fatia que sobra. O teto é

          altura_na_tela = altura_da_foto x largura_da_tela / largura_do_letreiro

   Na REICAR, com a foto de 30/07/2026: 1116 x 390 / 405 = 1074px, ou 137svh
   num 390x844 (svh ≈ 786). O teto ficou MUITO mais alto do que era com a foto
   antiga (94svh), porque a foto nova é bem mais quadrada e portanto sobra mais
   largura na tela. Em 76svh (597px) a escala é 0.535, entram 51,8% da largura
   do arquivo (fonte x 339..1068) e o letreiro cabe com 144px de folga de um
   lado e 180px do outro. Sem aperto nenhum.

   O 76 continua aqui por ENQUADRAMENTO, não por limite: mais alto que isso a
   foto empurra a chamada pra fora e o pátio de carros some. Se um dia quiser a
   marca maior no celular, dá pra subir bastante — mas as paradas do véu no
   `.hero::before` logo abaixo acompanham o fim da foto e precisam subir junto.

   A parada VERTICAL aqui é inerte: em 390x597 a escala sai da altura
   (597/1116 = 0.535) e a foto aparece inteira de cima a baixo. `top` fica só
   como valor previsível se a altura mudar.

   O pé da foto se dissolve por `mask-image` sobre o fundo escuro do .hero, então
   não existe emenda pra acertar e a cor do asfalto de cada foto deixa de
   importar. Sobre esse escuro é que a chamada lê.
   ========================================================================== */
@media (max-width: 940px) {
  .hero {
    align-items: stretch;
    background: linear-gradient(180deg, #0f1426 0, var(--bg) 60%);
    /* 30px de recuo embaixo: com o botão de 44px de altura, o centro dele cai a
       52px do fim da tela — exatamente onde está o centro do .wa-float, que é
       `bottom: 22px` + 30px de meio-raio. É isso que alinha os dois.

       ATENÇÃO à unidade: aqui é `svh`, e é de propósito. No iOS o `svh` é a
       altura visível COM as barras do Safari, que é justamente o quadro que o
       visitante vê ao abrir — e é contra ele que o `.wa-float`
       (`position: fixed`) se posiciona. Como os botões do hero devem ficar na
       mesma linha do flutuante, os dois precisam da mesma referência. Já
       `lvh`/`vh` são a altura SEM as barras: usar um deles aqui joga o fim do
       hero pra baixo da barra de baixo. */
    padding: 0 0 30px;
    min-height: 100vh;
    min-height: 100svh;
  }
  /* o cabeçalho flutua sobre a foto, como no desktop */
  body[data-page="home"] .hero { padding-top: 0; }
  .hero-bg {
    inset: 0 0 auto 0; width: 100%; transform: none;
    height: 76vh;
    height: 76svh;
    object-fit: cover; object-position: center top;
    /* o pé da foto vira escuro antes de acabar: sem borda, sem emenda de cor */
    -webkit-mask-image: linear-gradient(180deg, #000 62%, transparent 100%);
    mask-image: linear-gradient(180deg, #000 62%, transparent 100%);
  }
  /* véu: nada em cima da fachada, escurecendo de baixo pra cima, onde entra a
     chamada. As paradas acompanham o fim da foto (76%). */
  .hero::before {
    background:
      linear-gradient(180deg, rgba(4,4,4,.55) 0, rgba(4,4,4,.12) 90px, rgba(4,4,4,0) 170px),
      linear-gradient(180deg,
        rgba(7,10,13,0) 44%,
        rgba(7,10,13,.45) 60%,
        rgba(7,10,13,.85) 78%,
        rgba(7,10,13,.95) 100%);
  }
  .hero::after { display: none; } /* o véu acima já leva o pé ao escuro */
  /* a chamada ancorada no pé, como numa capa */
  .hero-inner {
    width: 100%; max-width: 100%; box-sizing: border-box; padding-inline: 20px;
    display: flex; flex-direction: column; justify-content: flex-end;
  }
}

@media (max-width: 640px) {
  .foot-grid { grid-template-columns: 1fr; gap: 26px; }
  .spec-grid, .detalhe-specs { grid-template-columns: 1fr 1fr; }

  /* nav: logo + hambúrguer */
  .nav-cta .btn { display: none; }
  .nav .wrap { gap: 12px; }
  .brand img { height: 34px; }

  /* HERO — só o ajuste fino de celular. A geometria da faixa (altura, corte,
     gradiente, posição do texto) está no bloco `max-width: 940px` acima, porque
     vale também para tablet em pé. */
  .hero .display { font-size: 1.72rem; line-height: 1.1; margin-bottom: 16px; letter-spacing: -.6px; }
  .hero-eyebrow { font-size: .58rem; letter-spacing: .12em; gap: 10px; margin-bottom: 14px; }
  .hero-eyebrow::before { width: 24px; height: 2px; }
  .hero p.lead { font-size: 1rem; margin-bottom: 0; }
  /* NÃO use `margin-top: auto` aqui. Com a foto vertical quem posiciona a
     chamada é o `justify-content: flex-end` do .hero-inner, e no flexbox margem
     automática ganha do justify-content: um `auto` solto espalharia o texto pelo
     hero inteiro e jogaria o olho-mágico pra cima da fachada.
     Os dois botões TÊM que caber em uma linha só: em duas linhas o bloco estica
     e o alinhamento com o flutuante (que conta com um botão de 44px) sai errado.
     Daí o padding e a fonte mais justos, calibrados pra caber em 360px. */
  /* ATENÇÃO: `.hero-actions` não é só do hero — o bloco do veículo em destaque
     reusa a classe (app.js). Por isso o que é específico do hero abaixo vai
     prefixado com `.hero`, senão vaza pra lá. */
  .hero-actions { gap: 10px; }
  .hero-actions .btn { padding: 11px 18px; font-size: .86rem; }

  /* Os dois botões da seção #equipe ("Falar com a equipe" e "Como chegar") têm
     que caber NA MESMA LINHA. Com o padding e o corpo de desktop a soma dá 357px
     numa faixa útil de 350 (390 de tela menos os 20 de recuo de cada lado): passa
     por 7px e o segundo cai pra baixo, o que faz o par parecer botão principal +
     sobra em vez de duas opções.

     NADA DE `flex-wrap: nowrap` AQUI. Ele até garante a linha única, mas numa
     tela de 320px (a faixa útil cai pra 280) os dois não cabem de jeito nenhum,
     e aí em vez de quebrar o botão vaza pra fora — e o `overflow-x: hidden` do
     body não corrige, só CORTA o "Como chegar" pela metade. Deixando o `wrap`
     padrão, o par fica lado a lado de 360px pra cima (que é onde está
     praticamente todo celular em uso) e desce sozinho abaixo disso.

     O que faz caber é o padding e o corpo menores. Medido em 360px, que é a
     menor largura em que o par ainda divide a linha (faixa útil de 320):
       "Falar com a equipe"  175px
       "Como chegar"         116px
       + 9 de gap            300px  →  sobram 20px

     Essa folga não é enfeite. A fonte é a do SISTEMA (Segoe UI no Windows,
     Roboto no Android, Helvetica no iOS) e a largura do mesmo texto muda de
     aparelho pra aparelho. Com o padding de desktop a soma dava 357 numa faixa
     de 350: media "certo" no Chrome do Windows e o botão descia no aparelho de
     verdade, que é defeito que captura nenhuma pega. Se mexer no rótulo destes
     botões (shared.js), meça de novo.

     Vale para as duas seções que usam `.bloco-acoes` (#equipe e #consignacao).
     Em #consignacao só existe um botão, então o efeito é ele ficar um pouco mais
     justo, o que combina com o resto do celular. */
  .bloco-acoes { gap: 9px; }
  .bloco-acoes .btn { padding: 12px 16px; font-size: .82rem; }
  .bloco-acoes .btn svg { width: 16px; height: 16px; }
  .hero .hero-actions { gap: 8px; flex-wrap: nowrap; padding-top: 26px; }
  .hero .hero-actions .btn { padding: 11px 14px; font-size: .8rem; white-space: nowrap; }
  .hero .hero-actions .btn svg { width: 16px; height: 16px; }
  /* "Falar no WhatsApp" → "WhatsApp": estando na linha do flutuante, o rótulo
     inteiro passava por baixo dele. Só no hero — o botão da seção de contato
     mantém o texto completo. */
  .hero .hero-actions .wa-label-longo { display: none; }
  /* na tela pequena a dica de rolagem só atrapalharia */
  .hero-scroll { display: none; }


  /* títulos/seções menores */
  .display { font-size: 1.95rem; }
  .section { padding: 54px 0; }
  .section-head { margin-bottom: 32px; }
  .section-head p { font-size: .95rem; }

  /* CARROS — 2 colunas, cards compactos (estilo Belloni) */
  .cars-grid { grid-template-columns: 1fr 1fr; gap: 12px; }
  .car-card { border-radius: 14px; }
  .car-card .body { padding: 11px 12px 13px; }
  .car-card h4 { font-size: .9rem; margin-bottom: 6px; }
  .car-card .meta { font-size: .73rem; margin-bottom: 10px; }
  .car-card .foot { flex-direction: column; align-items: flex-start; gap: 7px; border-top: 1px solid var(--border); padding-top: 10px; }
  .car-card .price { font-size: 1.05rem; }
  /* Em 2 colunas num 390 o card fica com ~167px e "Ver detalhes →" não cabe:
     quebrava entre a palavra e a seta, virando duas linhas no rodapé. Só o
     `nowrap` não resolve, porque aí a seta vaza e o `overflow: hidden` do card
     a corta pela metade. Então no celular o rótulo vai numa linha e a seta sai
     de cena: o link inteiro continua clicável e "Ver detalhes" já diz tudo. */
  .car-card .foot a { font-size: .82rem; white-space: nowrap; }
  .car-card .foot a svg { display: none; }
  /* nada de `.car-card .tag` aqui: o badge de ano não existe (ver o bloco
     "cards de carro" lá em cima) */
  .car-card .sit { font-size: .58rem; padding: 3px 9px; top: 10px; right: 10px; letter-spacing: .02em; }

  /* slider da home: mostra ~1 card e espia o próximo */
  .es-track { gap: 14px; }
  .es-track .car-card { flex: 0 0 80%; }

  /* destaque */
  .destaque-info h3 { font-size: 1.7rem; }
  .destaque-info .preco { font-size: 1.8rem; }
  .destaque-grid { gap: 26px; }

  /* clientes: card menor no celular (largura fixa, como no gti) */
  .cliente-card { width: 260px; margin-right: 16px; }

  /* avaliações: uma coluna. Antes eram 2 por linha com texto de .82rem, mas com
     a citação como elemento principal um card de meia tela quebraria três
     palavras em quatro linhas — uma por linha deixa cada depoimento inteiro. */
  .reviews-layout { grid-template-columns: 1fr; gap: 26px; }
  .reviews-score h2 { font-size: 1.95rem; }
  .rs-card { padding: 24px 20px 22px; }
  .rs-txt { font-size: .88rem; margin-bottom: 20px; }
  .reviews-grid { grid-template-columns: 1fr; gap: 12px; }
  .review { min-width: 0; padding: 18px 18px 16px; gap: 14px; border-radius: 14px; }
  .review-text { font-size: 1rem; }
  .review-quote, .review-quote svg { width: 22px; height: 22px; }
  .review-avatar { width: 36px; height: 36px; font-size: 1rem; }
  .review-id strong { font-size: .9rem; line-height: 1.25; }
  .review-stars svg { width: 14px; height: 14px; }

  /* detalhe */
  .detalhe-card { padding: 22px; }
  .detalhe-card h1 { font-size: 1.5rem; }
  .detalhe-card .preco { font-size: 2rem; }
  .thumbs img { width: 62px; height: 62px; }
  .opcionais { grid-template-columns: 1fr 1fr; }

  /* estoque: busca/ordenar */
  .estoque-top { gap: 10px; }
  .busca-wrap { max-width: none; }
  .ordenar-sel { flex: 1; min-width: 0; }
  .estoque-top .count { order: 3; margin-left: 0; }
}

/* menu mobile — dropdown ancorado embaixo/à direita do hambúrguer.
   É position:absolute pra NÃO empurrar o conteúdo do site pra baixo;
   fica sobreposto ao hero, alinhado ao lado direito (embaixo do botão). */
.nav .wrap:last-child { padding: 0; }            /* wrapper do menu não ocupa altura */
.mobile-menu {
  display: none; position: absolute; top: 100%; right: 20px;
  flex-direction: column; gap: 2px;
  min-width: 200px; max-width: 78vw;
  padding: 6px 18px 12px; text-align: center;
  background: rgba(6, 7, 15, .97);
  -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
  border: 1px solid var(--border);
  border-radius: 0 0 14px 14px;
  box-shadow: 0 20px 44px rgba(0, 0, 0, .55);
}
.mobile-menu.show { display: flex; }
.mobile-menu a { padding: 13px 2px; color: var(--muted); font-weight: 600; border-bottom: 1px solid var(--border); }
.mobile-menu a:last-child { border-bottom: 0; }
@media (min-width: 941px) { .mobile-menu { display: none !important; } }

/* ==========================================================================
   PRELOADER (só na página inicial — primeira entrada e ao recarregar)
   ========================================================================== */
#preloader {
  position: fixed; inset: 0; z-index: 9999; background: #04050c;
  display: flex; align-items: center; justify-content: center;
  transition: opacity .5s ease, visibility .5s ease;
}
#preloader.hidden { opacity: 0; visibility: hidden; }
.pl-inner { display: flex; flex-direction: column; align-items: center; gap: 28px; width: min(276px, 72vw); }
/* a logo fica um pouco menor que a barra de progresso — de propósito, pra a
   marca respirar em vez de ocupar a tela toda */
.pl-logo {
  width: min(242px, 62vw); height: auto; object-fit: contain;
  animation: plpulse 1.6s ease-in-out infinite;
}
@keyframes plpulse {
  0%, 100% { transform: scale(1);    filter: drop-shadow(0 0 16px var(--brand-glow)); }
  50%      { transform: scale(1.04); filter: drop-shadow(0 0 40px var(--brand-glow)); }
}
.pl-bar { width: 100%; height: 5px; border-radius: 999px; background: var(--surface-2); overflow: hidden; }
.pl-bar span { display: block; height: 100%; width: 0; background: linear-gradient(90deg, var(--brand-2), var(--brand)); border-radius: 999px; }
.pl-pct { font-weight: 900; font-size: 1.35rem; color: var(--text); letter-spacing: .04em; }
.pl-name { font-size: .72rem; letter-spacing: .28em; text-transform: uppercase; color: var(--muted-2); }
body.loading { overflow: hidden; }

/* ==========================================================================
   REVEAL AO ROLAR (aparece conforme scrolla)
   ========================================================================== */
.reveal { opacity: 0; transform: translateY(30px); transition: opacity .7s cubic-bezier(.2,.6,.2,1), transform .7s cubic-bezier(.2,.6,.2,1); }
.reveal.visible { opacity: 1; transform: none; }
/* Entrada escalonada dos diferenciais. Anima os CARDS por keyframe, não o
   container, e não usa `transition-delay`: o delay ficaria colado no elemento
   pra sempre, então o 4º card demoraria 240ms pra reagir ao hover. Mesmo padrão
   dos cards de avaliação — e o `to` do keyframe é obrigatório, senão o valor
   final vira o `opacity: 0` do estado pré-reveal. */
.feats.reveal { opacity: 1; transform: none; }
.feats.reveal .feat { opacity: 0; }
.feats.reveal.visible .feat {
  animation: featIn .6s cubic-bezier(.2, .6, .2, 1) both;
  animation-delay: calc(var(--i, 0) * .08s);
}
@keyframes featIn {
  from { opacity: 0; transform: translateY(18px); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
}

/* ==========================================================================
   SLIDER DE ESTOQUE NA HOME (uma linha + setinhas)
   ========================================================================== */
.estoque-slider { position: relative; }
.es-track {
  display: flex; gap: 22px; overflow-x: auto; scroll-behavior: smooth;
  scroll-snap-type: x proximity; padding: 6px 2px 14px; scrollbar-width: none;
}
.es-track::-webkit-scrollbar { display: none; }
.es-track .car-card { flex: 0 0 300px; scroll-snap-align: start; }
.es-arrow {
  position: absolute; top: calc(50% - 26px); transform: translateY(-50%);
  width: 52px; height: 52px; border-radius: 50%; z-index: 3;
  background: var(--brand); color: var(--on-brand); border: 0; cursor: pointer;
  display: grid; place-items: center; box-shadow: 0 8px 24px var(--brand-glow);
  transition: .2s;
}
.es-arrow:hover { transform: translateY(-50%) scale(1.08); }
.es-arrow svg { width: 24px; height: 24px; }
.es-prev { left: -16px; }
.es-next { right: -16px; }
@media (max-width: 760px) {
  .es-arrow { display: none !important; } /* no celular, arrasta pro lado */
  .es-track { scroll-snap-type: x mandatory; }
}
