/* ==========================================================================
   EVM Reboques — sistema visual compartilhado · v2.1 ("fotos reais em
   primeiro plano"; base v2 "o reboque é a interface")
   Fonte da verdade: DESIGN-SYSTEM.md (tokens §2, componentes §3, motor §4;
   §8 = v2.1, vale sobre o resto onde houver conflito).
   Marca: azul-marinho #012070, azul #004F9E, branco. Tipos: Manrope e
   IBM Plex Mono. Cantos arredondados; botões em pílula. v2.1: títulos de
   exibição em peso leve (300–400) no marinho, com destaque em .title-accent.

   Índice
   01 Tokens            09 Rodapé                17 Detalhes (hotspots)
   02 Base              10 Palco de produto      18 Etapas, recursos, checklist
   03 Tipografia        11 Foto a produzir       19 Formulário de orçamento
   04 Layout            12 Categorias            20 Trilha, depoimento, abas, selo
   05 Utilitários       13 Filtros (chips)       21 Faixa de chamada (callout)
   06 Botões e links    14 Cartão de modelo      22 FAQ (details/summary)
   07 Contato e         15 Dados-chave           26 Componentes 3D (vidro, cena,
      WhatsApp (v2.4)   16 Ficha técnica            herói 3D, rolagem guiada,
   08 Cabeçalho                                     aplicações, linha, comparação,
      flutuante                                     configurador)
                                                 27 Fotos reais (v2.1: selos,
                                                    foto, galeria, lightbox,
                                                    cartão de aplicação, "Visto
                                                    nas fotos", como escolher,
                                                    cartão de modelo com foto)
                                                 23 Revelação, movimento reduzido
                                                 24 Impressão
                                                 25 Cores forçadas (alto contraste)
   As seções 26 e 27 ficam antes das 23–25 no arquivo: os ajustes globais de
   movimento reduzido, impressão e cores forçadas precisam vir por último.
   ========================================================================== */


/* --------------------------------------------------------------------------
   01 Tokens
   -------------------------------------------------------------------------- */
:root {
  /* Marca oficial EVM Reboques (amostrada do logotipo) */
  --brand-navy: #012070;         /* azul-marinho: E, M e fundo da marca — 14,6:1 sobre branco */
  --brand-blue: #004F9E;         /* azul do V — 8,0:1 sobre branco */
  --brand-white: #FFFFFF;

  /* Superfícies claras e tinta (estrutura do conceito C, nas cores da marca) */
  --paper: #FFFFFF;
  --paper-2: #F1F4F9;
  --paper-3: #E3E9F2;
  --paper-0: #FFFFFF;            /* campos e superfícies elevadas */
  --ink: #0F1A33;                /* 17,3:1 sobre branco */
  --ink-2: #3D4860;              /* 9,2:1 sobre branco · 8,3:1 sobre --paper-2 */
  --ink-3: #56617A;              /* 6,2:1 sobre branco · 5,6:1 sobre --paper-2 */
  --ink-3-panel: #4E5970;        /* terciário sobre --paper-2/--paper-3 (≥ 5,6:1) */
  --line: #C5CEDD;
  --line-soft: #E0E6EF;

  /* O acento: o azul da marca para ação e orientação */
  --accent: var(--brand-blue);
  --accent-hover: var(--brand-navy);
  --accent-tint: #E5EEF8;
  --accent-wash: #F2F6FC;        /* tinte leve (cartão selecionado): --ink-3 5,7:1 · --brand-blue 7,4:1 */

  /* Palco escuro (conceito A), em marinho profundo */
  --stage: #07122B;
  --stage-2: #0D1D45;
  --stage-light: #1B3366;
  --stage-ink: #F4F7FC;
  --stage-muted: #AEB9D1;        /* 9:1 sobre --stage */
  --accent-on-dark: #7FB2F0;     /* 8,5:1 sobre --stage · 6,6:1 sobre --brand-navy */
  --accent-on-dark-hover: #A9CBF5;
  --steel: #A8ADB2;

  /* Estados */
  --ok: #1E6B45;
  --error: #B42318;

  /* WhatsApp (v2.4 · docs/PRODUCAO-UX.md §2). Verde escuro atrás de texto branco:
     6,3:1 (hover 8,0:1). --wa-ink: texto/ícone verde sobre claro (6,3:1 sobre
     branco · 5,7:1 sobre --paper-2); no escuro vira #7FE0B4 (11,7:1 sobre
     --stage). O verde claro da marca WhatsApp (--wa-bright) só em ícone sobre
     fundo escuro, nunca atrás de texto. */
  --wa: #0B6E4F;
  --wa-hover: #095C42;
  --wa-ink: #0B6E4F;
  --wa-bright: #25D366;
  --contact-bar-h: 64px;         /* barra de contato do celular: 8 + 48 + 8 (+ área segura) */

  /* Estúdio 3D e vidro (v2). O vidro com texto pequeno usa as versões
     "strong": --glass a 72 % sobre o marinho deixaria --ink-3 em 3,3:1 e o
     --glass-dark a 62 % sobre branco deixaria --stage-muted em 2,7:1. */
  --studio-light-top: #FFFFFF;          /* estúdio claro: topo */
  --studio-light-floor: #E6EBF2;        /* estúdio claro: piso */
  /* v2.1 (§8.2): estúdio claro de "estudo técnico" — cinza frio muito leve no
     alto até o branco embaixo; o piso quadriculado é desenhado pelo motor 3D
     (canvas transparente sobre este fundo) */
  --study-light-top: #F3F5F9;
  --study-light-bottom: #FFFFFF;
  --glass: rgba(255, 255, 255, .72);    /* painéis flutuantes sobre o 3D (com backdrop-filter) */
  --glass-strong: rgba(255, 255, 255, .92);   /* cabeçalho rolado, menu, barras com texto pequeno */
  --glass-dark: rgba(7, 18, 43, .62);   /* vidro escuro sem texto pequeno / sobre estúdio escuro */
  --glass-dark-strong: rgba(7, 18, 43, .84);  /* vidro escuro com texto: AA mesmo sobre branco */
  --glass-border: rgba(1, 32, 112, .10);
  --glass-border-dark: rgba(244, 247, 252, .14);

  /* Forma (v2: cantos arredondados, botões em pílula) */
  --radius: 12px;                /* campos, chips, abas, cartões pequenos */
  --radius-lg: 24px;             /* painéis, palcos, cartões, faixa de chamada */
  --radius-pill: 999px;          /* botões, menu flutuante, abas em pílula */
  --shadow: 0 1px 0 rgba(1, 32, 112, .06), 0 12px 32px -18px rgba(1, 32, 112, .32);
  --shadow-float: 0 1px 2px rgba(1, 32, 112, .06), 0 16px 40px -18px rgba(1, 32, 112, .34);

  /* Grade */
  --container: 1320px;
  --gutter: 16px;
  --header-top: 12px;            /* folga do cabeçalho flutuante até o topo da janela */
  --header-h: 60px;              /* altura da pílula do cabeçalho: 60 · 64 (≥ 600) · 68 (≥ 900) */
  --proto-h: 0px;                /* v2.4: a faixa de protótipo saiu do HTML; só conta com data-prototype="true" */
  --section-space: clamp(64px, 9vw, 128px);
  --section-space-tight: clamp(40px, 5vw, 72px);

  /* Tipos (v2: só Manrope e IBM Plex Mono; a Cormorant saiu do site) */
  --font-sans: "Manrope", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --font-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
  --font-serif: var(--font-sans);      /* obsoleto (v1): apelido mantido para CSS antigo */
  --fs-hero: clamp(2.75rem, 8vw + .5rem, 8rem);
  --fs-display: clamp(2.4rem, 5.6vw + .5rem, 5.25rem);
  --fs-h2: clamp(1.75rem, 3vw + .6rem, 3.25rem);
  --fs-lead: clamp(1.1rem, .6vw + 1rem, 1.35rem);

  /* Movimento (câmera 3D: 900 ms; troca de modelo: 700 ms; introdução: 1600 ms — no motor) */
  --ease-out: cubic-bezier(.16, 1, .3, 1);
  --ease-in-out: cubic-bezier(.65, 0, .35, 1);
  --dur-1: 160ms;                /* hover */
  --dur-2: 320ms;                /* UI */
  --dur-3: 640ms;                /* painéis, troca de estúdio */
  --ease: var(--ease-out);       /* apelidos v1 */
  --dur: var(--dur-2);

  /* Tokens de contexto (claro). Redefinidos em .section--dark, .stage, .callout.
     --fg-title / --fg-title-accent (v2.1): cor dos títulos de exibição (h1, h2,
     .display, .hero-title) e do trecho .title-accent. Claro: marinho 14,6:1 e
     azul 8,0:1 sobre branco. Todo contexto escuro novo precisa redefini-los
     (ou usar a classe .on-dark), senão o título fica marinho sobre marinho. */
  --fg: var(--ink);
  --fg-2: var(--ink-2);
  --fg-3: var(--ink-3);
  --fg-title: var(--brand-navy);
  --fg-title-accent: var(--brand-blue);
  --bg: var(--paper);
  --rule: var(--line-soft);
  --rule-strong: var(--line);
  --accent-fg: var(--accent);
  --accent-fg-hover: var(--accent-hover);
  --focus: var(--accent);
  --hover: rgba(1, 32, 112, .045);
  --field-bg: var(--paper-0);
}

@media (min-width: 600px) {
  :root { --gutter: 24px; --header-h: 64px; }
}
@media (min-width: 900px) {
  :root { --header-h: 68px; }
}
@media (min-width: 1200px) {
  :root { --gutter: 40px; }
}

/* Legado: altura aproximada da faixa de protótipo, só no modo protótipo
   (config.prototype = true). Em produção vale o 0 de :root desde o primeiro
   paint (sem salto do herói quando o script marca a página). */
html[data-prototype="true"] { --proto-h: 62px; }
@media (min-width: 600px) {
  html[data-prototype="true"] { --proto-h: 46px; }
}
@media (min-width: 900px) {
  html[data-prototype="true"] { --proto-h: 30px; }
}

/* Contextos escuros: palco, seção escura, faixa de chamada */
.section--dark,
.stage,
.callout,
.on-dark {
  --fg: var(--stage-ink);
  --fg-2: var(--stage-muted);
  --fg-3: var(--stage-muted);
  --fg-title: var(--stage-ink);
  --fg-title-accent: var(--accent-on-dark);
  --bg: var(--stage);
  --rule: rgba(244, 247, 252, .14);
  --rule-strong: rgba(244, 247, 252, .26);
  --accent-fg: var(--accent-on-dark);
  --accent-fg-hover: var(--accent-on-dark-hover);
  --focus: var(--accent-on-dark);
  --hover: rgba(244, 247, 252, .06);
  --wa-ink: #7FE0B4;                       /* v2.4: link de WhatsApp no escuro */
  --sob-bg: rgba(244, 247, 252, .06);      /* v2.4: aviso "sob consulta" no escuro */
  --sob-border: rgba(244, 247, 252, .26);
}

/* Contextos de painel claro */
.section--panel,
.stage--light,
.site-footer {
  --fg: var(--ink);
  --fg-2: var(--ink-2);
  --fg-3: var(--ink-3-panel);
  --fg-title: var(--brand-navy);         /* 13,3:1 sobre --paper-2 */
  --fg-title-accent: var(--brand-blue);  /* 7,3:1 sobre --paper-2 */
  --bg: var(--paper-2);
  --rule: var(--line);
  --rule-strong: #AFBACD;
  --accent-fg: var(--accent);
  --accent-fg-hover: var(--accent-hover);
  --focus: var(--accent);
  --hover: rgba(1, 32, 112, .05);
  --wa-ink: #0B6E4F;                       /* v2.4: os valores claros voltam dentro de um escuro */
  --sob-bg: var(--accent-wash);
  --sob-border: var(--line);
}


/* --------------------------------------------------------------------------
   02 Base
   -------------------------------------------------------------------------- */
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  /* Âncoras param abaixo da pílula flutuante: 12 + altura + 12 = altura + 24 px */
  scroll-padding-top: calc(var(--header-top) + var(--header-h) + 12px);
}

/* v2.6 (docs/UX-2.6.md §6): página do modelo com a sub-navegação presa sob o
   cabeçalho — âncoras e foco por teclado param abaixo dela também (WCAG 2.2
   2.4.11). O modelo.js liga html.has-model-subnav e grava a altura real em
   --subnav-h no <html>; o nav leva [data-sticky-offset], que o
   EVMSite.headerOffset() também conta. 8 px = vão entre a pílula e a sub-nav. */
html.has-model-subnav {
  scroll-padding-top: calc(var(--header-top) + var(--header-h) + 8px + var(--subnav-h, 52px) + 12px);
}

body {
  margin: 0;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  background-color: var(--paper);
  color: var(--ink);
  font-family: var(--font-sans);
  font-size: 1rem;
  font-weight: 400;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  overflow-x: clip;
}

main {
  display: block;
  flex: 1 0 auto;
}

main:focus {
  outline: none;
}

img,
picture,
video,
canvas,
svg {
  display: block;
  max-width: 100%;
}

img {
  height: auto;
}

h1, h2, h3, h4, h5, h6 {
  margin: 0;
  color: var(--fg);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.015em;
  text-wrap: balance;
}

/* v2.1 (§8.2): títulos de página e de seção no marinho (no escuro, --stage-ink
   pelo token de contexto). Componentes com classe própria definem a cor. */
h1, h2 {
  color: var(--fg-title);
}

p, ul, ol, dl, dd, figure, blockquote, pre {
  margin: 0;
}

p {
  text-wrap: pretty;
}

ul[class],
ol[class] {
  list-style: none;
  padding: 0;
}

strong, b {
  font-weight: 700;
}

button,
input,
select,
textarea {
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
}

button {
  cursor: pointer;
}

fieldset {
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}

legend {
  padding: 0;
}

table {
  border-collapse: collapse;
  border-spacing: 0;
}

abbr[title] {
  text-decoration: underline dotted;
  text-underline-offset: .2em;
  cursor: help;
}

[hidden] {
  display: none !important;
}

/* Seleção: tinta sobre o azul-claro da marca (14,7:1), igual em qualquer contexto */
::selection {
  background-color: var(--accent-tint);
  color: var(--ink);
}

/* Links: acento, sublinhado afastado da linha de base */
a {
  color: var(--accent-fg);
  text-decoration-line: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: .22em;
}

a:hover {
  color: var(--accent-fg-hover);
  text-decoration-thickness: 2px;
}

/* Foco visível: 2px no acento (no escuro, acento claro) */
:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 3px;
}

:focus:not(:focus-visible) {
  outline: none;
}


/* --------------------------------------------------------------------------
   03 Tipografia
   v2.1 (DESIGN-SYSTEM §8.2): títulos de exibição leves — .hero-title e
   .display em 300, h1/h2 em 400 —, tracking −0,02em, cor --fg-title
   (marinho; no escuro, --stage-ink). A hierarquia vem do tamanho: h3/h4,
   corpo, rótulos e números continuam como estavam (h3 e h4 em 700, tinta).
   Um trecho de destaque (segunda linha, palavra) usa .title-accent
   (--brand-blue, 8,0:1 sobre branco; no escuro, --accent-on-dark).
   -------------------------------------------------------------------------- */
.display {
  font-size: var(--fs-display);
  font-weight: 300;
  line-height: 1.04;
  letter-spacing: -0.02em;
}

h1,
.h1 {
  font-size: clamp(2rem, 4vw + .5rem, 3.75rem);
  font-weight: 400;
  line-height: 1.08;
  letter-spacing: -0.02em;
}

h2,
.h2 {
  font-size: var(--fs-h2);
  font-weight: 400;
  line-height: 1.1;
  letter-spacing: -0.02em;
}

h3,
.h3 {
  font-size: clamp(1.25rem, .55vw + 1.1rem, 1.5rem);
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -0.01em;
}

h4,
.h4 {
  font-size: 1.0625rem;
  font-weight: 700;
  line-height: 1.35;
  letter-spacing: -0.005em;
}

.display,
.h1,
.h2 {
  color: var(--fg-title);
  text-wrap: balance;
}

.h3,
.h4 {
  color: var(--fg);
  text-wrap: balance;
}

/* Trecho de destaque do título ("Mais caminhos. <span class="title-accent">Mais
   possibilidades.</span>"). Herda tamanho e peso do título. --block põe o
   trecho numa linha própria sem <br>. */
.title-accent {
  color: var(--fg-title-accent);
}

.title-accent--block {
  display: block;
}

/* Título de herói (v2.1): grande e leve (300). Entrelinha 1.02 (e não .95)
   para os acentos do português (Ã, Ç, É) não encostarem na linha de cima. */
.hero-title {
  max-width: 14ch;
  color: var(--fg-title);
  font-size: var(--fs-hero);
  font-weight: 300;
  line-height: 1.02;
  letter-spacing: -0.02em;
  text-wrap: balance;
}

/* Título de herói longo (≈ 40–50 caracteres, ex.: o h1 da home): a escala
   --fs-hero (até 8rem) daria 5–6 linhas e palavras soltas estourariam a coluna
   7/12; aqui vai até 5rem e cabe em 3–4 linhas. Use com .hero-title. */
.hero-title--long {
  max-width: 13ch;
  font-size: clamp(2.5rem, 4.6vw + .5rem, 5rem);
  line-height: 1.04;
}

.lead {
  max-width: 60ch;
  color: var(--fg-2);
  font-size: var(--fs-lead);
  line-height: 1.5;
}

.eyebrow {
  display: block;
  color: var(--accent-fg);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
}

/* Rótulo com ponto de acento à esquerda ("• EVM REBOQUES") */
.eyebrow--dot {
  display: flex;
  align-items: center;
  gap: 10px;
}

.eyebrow--dot::before {
  content: "";
  flex: none;
  width: 6px;
  height: 6px;
  background-color: var(--accent-fg);
  border-radius: 50%;
}

.muted {
  color: var(--fg-2);
}

/* Linha editorial (v2): a Cormorant itálica saiu; a classe continua, agora em
   Manrope 300, um pouco maior e com espaçamento apertado. Corpo grande (≥ 28 px),
   então o peso leve segue legível; a cor é a tinta principal do contexto. */
.serif {
  font-family: var(--font-sans);
  font-style: normal;
  font-weight: 300;
  letter-spacing: -0.03em;
}

p.serif,
div.serif,
blockquote.serif {
  max-width: 24ch;
  color: var(--fg);
  font-size: clamp(1.875rem, 2.6vw + 1rem, 3.125rem);
  line-height: 1.1;
  text-wrap: balance;
}

.mono {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
}

.num {
  color: var(--accent-fg);
  font-family: var(--font-mono);
  font-size: .8125rem;
  font-weight: 500;
  letter-spacing: .04em;
  font-variant-numeric: tabular-nums;
}

.small {
  font-size: .875rem;
  line-height: 1.55;
}


/* --------------------------------------------------------------------------
   04 Layout
   -------------------------------------------------------------------------- */
.container {
  width: 100%;
  max-width: calc(var(--container) + var(--gutter) * 2);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.section {
  padding-block: var(--section-space);
}

.section--tight {
  padding-block: var(--section-space-tight);
}

.section--flush-top {
  padding-top: 0;
}

.section--panel {
  background-color: var(--paper-2);
  color: var(--ink);
}

/* Estúdio em marinho profundo; luz lateral fria a partir de --stage-light.
   Pior caso (pico da luz, #1B3366): --stage-muted 6,2:1 · --accent-on-dark 5,6:1 */
.section--dark {
  background-color: var(--stage);
  background-image:
    radial-gradient(110% 70% at 0% 0%, var(--stage-light) 0%, rgba(27, 51, 102, 0) 60%),
    linear-gradient(180deg, var(--stage-2) 0%, var(--stage) 55%);
  color: var(--stage-ink);
}

/* Cabeça de seção: eyebrow + h2 + lead + link opcional à direita (≥ 900) */
.section__head {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 14px 40px;
  margin-bottom: clamp(32px, 5vw, 56px);
}

.section__head > * {
  flex: 1 1 100%;
  min-width: 0;
}

.section__head > :where(div:not(.btn-row)),
.section__head > .section__intro {
  display: grid;
  gap: 14px;
  flex: 1 1 32rem;
}

.section__head > .link-arrow,
.section__head > .btn,
.section__head > .btn-row,
.section__head > .section__link {
  flex: 0 0 auto;
}

.section__head h2,
.section__head .h2 {
  max-width: 22ch;
}

@media (min-width: 900px) {
  .section__head > .link-arrow,
  .section__head > .btn,
  .section__head > .btn-row,
  .section__head > .section__link {
    margin-left: auto;
  }
}

/* v2.1: cabeça dividida — título leve à esquerda (7/12), texto curto à
   direita (5/12), alinhados pela base. Ex.: <div class="section__head
   section__head--split"><div><p class="eyebrow">…</p><h2>Conheça de perto.
   <span class="title-accent title-accent--block">Imagine…</span></h2></div>
   <p class="lead">…</p></div>. Abaixo de 900 empilha como a cabeça comum. */
@media (min-width: 900px) {
  .section__head--split {
    display: grid;
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
    align-items: end;
    gap: 14px clamp(32px, 5vw, 80px);
  }

  .section__head--split > p,
  .section__head--split > .lead {
    justify-self: end;
    max-width: 40ch;
  }

  .section__head--split h2,
  .section__head--split .h2 {
    max-width: 20ch;
  }
}

/* Grades: 1 coluna (< 600), 2 (≥ 600), completa (≥ 900) */
.grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--grid-gap, clamp(24px, 3vw, 40px));
}

@media (min-width: 600px) {
  .grid--2,
  .grid--3,
  .grid--4 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (min-width: 900px) {
  .grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* Split assimétrico 5/7 */
.split {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-items: center;
  gap: clamp(32px, 5vw, 80px);
}

.split--top { align-items: start; }
.split--end { align-items: end; }

@media (min-width: 900px) {
  .split { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); }
  .split--reverse { grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); }
}

/* Fluxo vertical */
.stack { --stack-space: 1rem; }
.stack--sm { --stack-space: .5rem; }
.stack--lg { --stack-space: 2rem; }

.stack > * + * {
  margin-block-start: var(--stack-space);
}

.rule {
  height: 1px;
  margin: 0;
  border: 0;
  background-color: var(--rule-strong);
}


/* --------------------------------------------------------------------------
   05 Utilitários
   -------------------------------------------------------------------------- */
.visually-hidden {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  margin: -1px !important;
  padding: 0 !important;
  overflow: hidden !important;
  clip: rect(0 0 0 0) !important;
  clip-path: inset(50%) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

/* Rádio/checkbox acessível dentro de um bloco clicável (.choice) */
.visually-hidden-input {
  position: absolute;
  top: 0;
  left: 0;
  width: 1px;
  height: 1px;
  margin: 0;
  padding: 0;
  opacity: 0;
  pointer-events: none;
}

.skip-link {
  position: absolute;
  top: 8px;
  left: 8px;
  z-index: 100;
  padding: 12px 18px;
  background-color: var(--ink);
  color: var(--paper);
  font-weight: 600;
  text-decoration: none;
  border-radius: var(--radius-pill);
  transform: translateY(-200%);
}

.skip-link:focus,
.skip-link:focus-visible {
  transform: none;
  color: var(--paper);
  outline: 2px solid var(--accent-on-dark);
  outline-offset: 2px;
}

/* Visibilidade do protótipo: oculto somente quando data-prototype="false" */
html[data-prototype="false"] .proto-only {
  display: none !important;
}

/* v2.4: ficha técnica (site.js marca <html data-specs="sob-consulta|validado">
   a partir de config.specsStatus). .specs-only = só com a ficha validada
   (números, cotas, comparação); .consulta-only = só enquanto está sob consulta. */
html[data-specs="sob-consulta"] .specs-only,
html[data-specs="validado"] .consulta-only {
  display: none !important;
}

.empty-state {
  display: grid;
  gap: 12px;
  justify-items: start;
  padding: clamp(24px, 4vw, 48px);
  border: 1px dashed var(--rule-strong);
  border-radius: var(--radius-lg);
  color: var(--fg-2);
}

.empty-state__title {
  color: var(--fg);
  font-size: 1.25rem;
  font-weight: 700;
}

/* Contexto do pedido ("Você está pedindo orçamento do …") */
.context-chip {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px 12px;
  padding: 10px 14px 10px 17px;
  background-color: var(--accent-tint);
  border-radius: var(--radius);
  box-shadow: inset 3px 0 0 var(--accent);   /* barra de acento que acompanha o canto arredondado */
  color: var(--ink);
  font-size: .9375rem;
  line-height: 1.4;
}

.context-chip a {
  color: var(--accent);
  font-weight: 600;
}


/* --------------------------------------------------------------------------
   06 Botões e links
   -------------------------------------------------------------------------- */
/* v2: botões em pílula (--radius-pill); variantes, tamanhos e estados mantidos.
   position: relative contém o texto .visually-hidden interno (sem estourar a largura da página) */
.btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 48px;
  padding: 10px 24px;
  border: 1px solid transparent;
  border-radius: var(--radius-pill);
  background-color: transparent;
  color: var(--fg);
  font-family: var(--font-sans);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: .005em;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition:
    background-color var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out);
}

.btn:hover {
  text-decoration: none;
}

.btn:disabled,
.btn[aria-disabled="true"] {
  opacity: .55;
  cursor: not-allowed;
}

/* Cores de botão por contexto. Claro (padrão): primário marinho da marca, branco
   no texto (14,6:1); hover/ativo no azul da marca (8,0:1). Escuro (palco, seção
   escura, faixa marinho): primário invertido em branco com texto marinho (14,6:1;
   hover --paper-3, 11,9:1), para continuar visível sobre o marinho. */
.section--dark,
.stage,
.callout,
.on-dark {
  --btn-primary-bg: var(--brand-white);
  --btn-primary-fg: var(--brand-navy);
  --btn-primary-hover-bg: var(--paper-3);
  --btn-secondary-hover-bg: rgba(127, 178, 240, .16);
}

.section--panel,
.stage--light,
.site-footer {
  --btn-primary-bg: var(--brand-navy);
  --btn-primary-fg: var(--brand-white);
  --btn-primary-hover-bg: var(--brand-blue);
  --btn-secondary-hover-bg: var(--accent-tint);
}

.btn--primary {
  background-color: var(--btn-primary-bg, var(--brand-navy));
  border-color: var(--btn-primary-bg, var(--brand-navy));
  color: var(--btn-primary-fg, var(--brand-white));
}

.btn--primary:hover,
.btn--primary:active {
  background-color: var(--btn-primary-hover-bg, var(--brand-blue));
  border-color: var(--btn-primary-hover-bg, var(--brand-blue));
  color: var(--btn-primary-fg, var(--brand-white));
}

.btn--primary:disabled:hover,
.btn--primary:disabled:active {
  background-color: var(--btn-primary-bg, var(--brand-navy));
  border-color: var(--btn-primary-bg, var(--brand-navy));
}

/* v2.4: WhatsApp — verde escuro com texto branco (6,3:1; hover 8,0:1), com o
   ícone (o site.js põe o SVG quando falta). Igual em todo contexto; vem depois
   de .btn--primary, então vale também em "btn btn--primary btn--whatsapp".
   No escuro, um filete claro separa o verde do marinho. */
.btn--whatsapp {
  background-color: var(--wa);
  border-color: var(--wa);
  color: var(--brand-white);
}

.btn--whatsapp:hover,
.btn--whatsapp:active {
  background-color: var(--wa-hover);
  border-color: var(--wa-hover);
  color: var(--brand-white);
}

.btn--whatsapp:disabled:hover,
.btn--whatsapp:disabled:active {
  background-color: var(--wa);
  border-color: var(--wa);
}

.section--dark .btn--whatsapp,
.stage .btn--whatsapp,
.callout .btn--whatsapp,
.on-dark .btn--whatsapp {
  border-color: rgba(244, 247, 252, .55);
}

/* Link de WhatsApp em texto ("Perguntar no WhatsApp" nos cartões): verde
   escuro com o ícone, alvo de 44 px. */
.wa-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 44px;
  color: var(--wa-ink);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.3;
  text-decoration: none;
}

.wa-link:hover {
  color: var(--wa-ink);
  text-decoration: underline;
  text-decoration-thickness: 1px;
}

.wa-link > svg,
.wa-link > .btn__icon {
  flex: none;
  width: 18px;
  height: 18px;
}

/* Contorno em tinta; hover com fundo tingido (claro: --accent-tint, 14,7:1 com
   tinta; escuro: véu azul, 7:1 ou mais). Adapta-se ao contexto escuro. */
.btn--secondary {
  background-color: transparent;
  border-color: var(--fg);
  color: var(--fg);
}

.btn--secondary:hover {
  background-color: var(--btn-secondary-hover-bg, var(--accent-tint));
  border-color: var(--fg);
  color: var(--fg);
}

.btn--ghost {
  padding-inline: 14px;
  background-color: transparent;
  border-color: transparent;
  color: var(--accent-fg);
}

.btn--ghost:hover {
  background-color: var(--hover);
  color: var(--accent-fg-hover);
}

.btn--on-dark {
  background-color: transparent;
  border-color: rgba(244, 247, 252, .6);
  color: var(--stage-ink);
  --focus: var(--accent-on-dark);
}

.btn--on-dark:hover {
  background-color: var(--stage-ink);
  border-color: var(--stage-ink);
  color: var(--stage);
}

.btn--sm {
  min-height: 44px;
  padding: 8px 18px;
  font-size: .875rem;
}

.btn--lg {
  min-height: 56px;
  padding: 14px 30px;
  font-size: 1rem;
}

.btn--block {
  display: flex;
  width: 100%;
}

.btn__icon,
.btn > svg {
  flex: none;
  width: 18px;
  height: 18px;
}

/* Botão só com ícone (ex.: girar e aproximar no 3D): círculo de 44 px (pílula
   num quadrado), fundo transparente e filete fino para ser lido como controle.
   Sobre a cena 3D prefira .scene-controls (§26.3). O nome acessível vem
   de aria-label ou de texto .visually-hidden; o SVG interno é aria-hidden.
   Foco: anel global (:focus-visible). */
.btn.icon-btn,
.icon-btn {
  flex: none;
  gap: 0;
  width: 44px;
  min-width: 44px;
  height: 44px;
  min-height: 44px;
  padding: 0;
  border-color: var(--rule-strong);
}

.icon-btn > svg {
  flex: none;
  width: 20px;
  height: 20px;
}

.btn-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
}

/* Link de ação com seta */
.link-arrow {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  color: var(--accent-fg);
  font-weight: 600;
  text-decoration: none;
}

.link-arrow::after {
  content: "";
  flex: none;
  width: 16px;
  height: 16px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M1.5 8h12M9.5 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M1.5 8h12M9.5 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
}

.link-arrow:hover {
  color: var(--accent-fg-hover);
  text-decoration: underline;
  text-decoration-thickness: 1px;
}

@media (prefers-reduced-motion: no-preference) {
  .link-arrow::after {
    transition: transform .25s var(--ease);
  }
  .link-arrow:hover::after {
    transform: translateX(4px);
  }
}


/* --------------------------------------------------------------------------
   07 Contato e WhatsApp (v2.4 · docs/PRODUCAO-UX.md)
   07.1 Botão flutuante (.wa-float)        07.4 Sob consulta (.sob-consulta)
   07.2 Barra do celular (.contact-bar)    07.5 Faixa de protótipo (legado)
   07.3 Painel de contato (.contact-panel) 07.6 Foto + 3D (.media-pair, v2.5)
   .btn--whatsapp e .wa-link ficam em §06; os tokens --wa* em §01. Movimento
   reduzido, impressão e cores forçadas: §23, §24 e §25.
   -------------------------------------------------------------------------- */

/* 07.1 Botão flutuante -------------------------------------------------------
   Injetado pelo site.js em toda página (div.contact-dock no fim do <body>):
   <a class="wa-float" href="https://wa.me/…" target="_blank" rel="noopener" data-wa
      data-contato="whatsapp" data-origem="flutuante"><svg class="btn__icon">…</svg>
      <span class="visually-hidden">Conversar no WhatsApp (abre em nova aba)</span></a>
   56 px no canto inferior direito, a partir de 600 px (no celular, a barra
   07.2). Anel branco de 2 px: separa o verde de fundos escuros (≥ 3:1). Foco:
   anéis branco, marinho e branco — o marinho aparece sobre fundo claro e o
   branco de fora sobre fundo escuro (marinho, estúdio, chamada). O fim da
   página ganha folga para o botão não cobrir o rodapé. */
.wa-float {
  position: fixed;
  right: 16px;
  right: max(16px, env(safe-area-inset-right));
  bottom: 16px;
  bottom: max(16px, env(safe-area-inset-bottom));
  z-index: 44;                    /* abaixo do cabeçalho (50) e da barra de comparação (45) */
  display: inline-grid;
  place-items: center;
  width: 56px;
  height: 56px;
  border: 0;
  border-radius: 50%;
  background-color: var(--wa);
  box-shadow: 0 0 0 2px var(--brand-white), 0 12px 28px -10px rgba(1, 32, 112, .5);
  color: var(--brand-white);
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  transition: background-color var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out);
}

.wa-float:hover,
.wa-float:active {
  background-color: var(--wa-hover);
  color: var(--brand-white);
}

.wa-float:focus-visible {
  outline: 2px solid transparent;  /* cores forçadas: o contorno do sistema aparece */
  box-shadow: 0 0 0 2px var(--brand-white), 0 0 0 5px var(--brand-navy), 0 0 0 7px var(--brand-white), 0 12px 28px -10px rgba(1, 32, 112, .5);
}

.wa-float > svg,
.wa-float > .btn__icon {
  width: 30px;
  height: 30px;
}

@media (prefers-reduced-motion: no-preference) {
  .wa-float:hover {
    transform: translateY(-2px);
  }
}

@media (max-width: 599.98px) {
  .wa-float {
    display: none;
  }
}

@media (min-width: 600px) {
  .wa-float {
    right: 24px;
    right: max(24px, env(safe-area-inset-right));
    bottom: 24px;
    bottom: max(24px, env(safe-area-inset-bottom));
  }

  /* Folga no fim da página: o botão não cobre o rodapé nem o que ganha foco */
  html.has-contact-dock .site-footer {
    padding-bottom: calc(28px + 80px);
  }

  html.has-contact-dock:not(.has-compare-bar) {
    scroll-padding-bottom: 96px;
  }
}

/* Com a barra de comparação (modelos.html), o botão sobe acima dela */
html.has-compare-bar .wa-float {
  bottom: calc(var(--compare-bar-h, 68px) + 24px);
}

/* Teclado virtual aberto (tablet): o botão sai da frente do campo */
@media (pointer: coarse) {
  html.contact-dock-typing .wa-float {
    display: none;
  }
}

/* 07.2 Barra de contato do celular ----------------------------------------------
   <div class="contact-bar">
     <a class="btn btn--whatsapp contact-bar__btn" data-wa …>…WhatsApp</a>
     <a class="btn btn--secondary contact-bar__btn" href="tel:…">…Ligar</a>
   </div>
   Só abaixo de 600 px de largura e a partir de 480 px de altura, fixa no
   rodapé da janela. Janela mais baixa (celular deitado, zoom de 400 %): sem
   a barra — com o cabeçalho, ela cobriria metade da tela; o WhatsApp do
   cabeçalho continua. Aparece depois da primeira dobra (html.contact-bar-on)
   e some com campo de texto em foco (html.contact-dock-typing), com o CTA
   principal de WhatsApp da página na tela ([data-wa-primary]:
   html.contact-dock-cta), com a barra de comparação ou o lightbox.
   Escondida, fica fora do foco e dos leitores (visibility). O rodapé e os
   cartões da rolagem guiada (§26.5, presos ao pé da tela) ganham o espaço da
   barra (html.has-contact-bar): ela nunca cobre o fim da página nem o texto
   da história. */
.contact-bar {
  display: none;
}

@media (max-width: 599.98px) and (min-height: 480px) {
  .contact-bar {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 44;
    display: grid;
    grid-auto-columns: minmax(0, 1fr);
    grid-auto-flow: column;
    gap: 8px;
    padding: 8px 12px;
    padding-bottom: calc(8px + env(safe-area-inset-bottom, 0px));
    background-color: var(--glass-strong);
    border-top: 1px solid var(--line);
    box-shadow: 0 -14px 32px -20px rgba(1, 32, 112, .5);
    -webkit-backdrop-filter: blur(14px) saturate(140%);
    backdrop-filter: blur(14px) saturate(140%);
    color: var(--ink);
    visibility: hidden;
    transform: translateY(calc(100% + 16px));
    transition: transform var(--dur-2) var(--ease-out), visibility 0s linear var(--dur-2);
  }

  html.contact-bar-on:not(.contact-dock-typing):not(.contact-dock-cta) .contact-bar,
  .contact-bar:focus-within {
    visibility: visible;
    transform: none;
    transition: transform var(--dur-2) var(--ease-out), visibility 0s;
  }

  html.has-compare-bar .contact-bar {
    display: none;
  }

  /* Espaço reservado no fim da página (rodapé) e para o foco por teclado */
  html.has-contact-bar .site-footer {
    padding-bottom: calc(28px + var(--contact-bar-h) + env(safe-area-inset-bottom, 0px));
  }

  html.has-contact-bar:not(.has-compare-bar) {
    scroll-padding-bottom: calc(var(--contact-bar-h) + 16px);
  }

  /* Cartões da rolagem guiada (.story__intro / .story__chapter, §26.5): presos
     ao pé da linha de 100svh, sobem acima da barra, que fica na tela durante a
     história (a margem é fixa: o cartão não pula quando a barra entra ou sai) */
  html.has-contact-bar:not(.has-compare-bar) .story__chapter,
  html.has-contact-bar:not(.has-compare-bar) .story__intro {
    margin-bottom: calc(var(--contact-bar-h) + 16px + env(safe-area-inset-bottom, 0px));
  }
}

@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
  .contact-bar {
    background-color: var(--paper);
  }
}

.contact-bar__btn {
  min-width: 0;
  min-height: 48px;
  padding-inline: 12px;
  gap: 8px;
  font-size: .9375rem;
}

/* A barra fica sobre o papel claro: o secundário usa a tinta, em qualquer página */
.contact-bar .btn--secondary {
  border-color: var(--ink);
  color: var(--ink);
}

.contact-bar .btn--secondary:hover {
  background-color: var(--accent-tint);
  color: var(--ink);
}

/* Lightbox aberto: o contato rápido sai da frente (vale para a sobreposição
   de reserva, sem <dialog>, também). v2.6: com a gaveta do menu aberta
   (html.nav-open, < 900 px) também — ela tem o próprio bloco WhatsApp + Ligar. */
html.lightbox-open .contact-dock,
html.nav-open .contact-dock {
  display: none;
}

/* 07.3 Painel de contato (.contact-panel) ----------------------------------------
   Bloco da página do modelo e do contato: WhatsApp grande, "Ligar", e-mail
   (só quando houver: data-config-if="email" ou a[data-contato="email"], que o
   site.js esconde sem e-mail) e uma nota. Superfície clara própria (vale
   também sobre seção escura). Estrutura sugerida (os filhos diretos também
   funcionam sem as classes __):
   <div class="contact-panel" data-origem="modelo">
     <h2 class="contact-panel__title">Fale com a EVM</h2>
     <p class="contact-panel__text">…</p>
     <div class="contact-panel__actions">
       <a class="btn btn--whatsapp btn--lg" data-wa data-wa-modelo="camping" data-wa-primary …>Conversar no WhatsApp</a>
       <a class="btn btn--secondary" href="tel:+554936740338" data-contato="telefone">Ligar (49) 3674-0338</a>
       <a class="btn btn--ghost" data-contato="email" data-config-link="email" href="#">Enviar e-mail</a>
     </div>
     <ul class="contact-panel__list">
       <li><span class="contact-panel__label">Endereço</span> <a …>Avenida Porto Feliz, 1179 — Mondaí-SC</a></li>
     </ul>
     <p class="contact-panel__note">As fotografias podem mostrar diferentes configurações…</p>
   </div>
   Botões ocupam a linha toda numa coluna estreita e dividem a linha num painel
   largo; o do WhatsApp fica sempre numa linha própria. */
.contact-panel {
  --fg: var(--ink);
  --fg-2: var(--ink-2);
  --fg-3: var(--ink-3);
  --fg-title: var(--brand-navy);
  --fg-title-accent: var(--brand-blue);
  --bg: var(--paper-0);
  --rule: var(--line-soft);
  --rule-strong: var(--line);
  --accent-fg: var(--accent);
  --accent-fg-hover: var(--accent-hover);
  --focus: var(--accent);
  --hover: rgba(1, 32, 112, .045);
  --btn-primary-bg: var(--brand-navy);
  --btn-primary-fg: var(--brand-white);
  --btn-primary-hover-bg: var(--brand-blue);
  --btn-secondary-hover-bg: var(--accent-tint);
  --wa-ink: #0B6E4F;
  --sob-bg: var(--accent-wash);
  --sob-border: var(--line);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
  min-width: 0;
  padding: clamp(20px, 3vw, 28px);
  background-color: var(--paper-0);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  color: var(--ink);
}

.contact-panel > *,
.contact-panel__actions > * {
  flex: 1 1 100%;
  min-width: 0;
  margin: 0;
}

.contact-panel > .btn,
.contact-panel__actions > .btn {
  flex: 1 1 13rem;
}

.contact-panel > .btn--whatsapp,
.contact-panel__actions > .btn--whatsapp {
  flex-basis: 100%;
  min-height: 56px;
  font-size: 1rem;
}

.contact-panel__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

/* Link de texto no painel (ex.: "Preparar os detalhes do pedido"): a área
   clicável fica do tamanho do texto (os vizinhos de linha inteira mantêm o
   link numa linha própria) */
.contact-panel > .link-arrow,
.contact-panel__plan {
  flex: 0 1 auto;
}

.contact-panel__title,
.contact-panel > :where(h2, h3, h4) {
  color: var(--fg-title);
  font-size: clamp(1.25rem, .6vw + 1.1rem, 1.5rem);
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -0.01em;
}

.contact-panel__text,
.contact-panel > p:not([class]) {
  color: var(--ink-2);
  font-size: .9375rem;
  line-height: 1.5;
}

.contact-panel__note,
.contact-panel > .note {
  margin: 0;
  color: var(--ink-3);
  font-size: .8125rem;
  line-height: 1.5;
}

.contact-panel__list {
  display: grid;
  gap: 2px;
  margin: 0;
  padding: 0;
  list-style: none;
  border-top: 1px solid var(--line-soft);
}

.contact-panel__list > li {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 2px 12px;
  padding-block: 8px;
  border-bottom: 1px solid var(--line-soft);
  color: var(--ink);
  font-size: .9375rem;
  line-height: 1.45;
}

.contact-panel__list a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  margin-block: -10px;            /* alvo de 44 px sem aumentar a linha */
  color: var(--accent);
  font-weight: 600;
}

.contact-panel__label {
  flex: 0 0 auto;
  min-width: 6.5rem;
  color: var(--ink-3);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
}

/* 07.4 Sob consulta (.sob-consulta) ----------------------------------------------
   Enquanto config.specsStatus = 'sob-consulta', no lugar de qualquer número:
   · aviso curto (EVMSite.renderKeySpecs):
     <p class="sob-consulta">Medidas, capacidade e opções sob consulta.</p>
   · bloco (EVMSite.renderSpecTables, ou escrito na página):
     <div class="sob-consulta sob-consulta--callout">
       <p class="sob-consulta__lead">Medidas, capacidade e opções sob consulta.</p>
       <p class="sob-consulta__text">A EVM confirma no orçamento: …</p>
       <div class="sob-consulta__actions"><a class="btn btn--whatsapp" data-wa …>…</a></div>
     </div>
   Cores pelos tokens de contexto (claro, painel ou escuro): tinta 15:1 sobre
   --accent-wash; ícone "i" no acento. */
.sob-consulta {
  display: inline-flex;
  align-items: flex-start;
  gap: 8px;
  max-width: 100%;
  margin: 0;
  padding: 8px 14px 8px 12px;
  background-color: var(--sob-bg, var(--accent-wash));
  border: 1px solid var(--sob-border, var(--line));
  border-radius: var(--radius);
  color: var(--fg);
  font-size: .875rem;
  font-weight: 600;
  line-height: 1.4;
  text-wrap: pretty;
}

.sob-consulta::before,
.sob-consulta__lead::before {
  content: "";
  flex: none;
  width: 16px;
  height: 16px;
  margin-top: calc((1.4em - 16px) / 2);
  background-color: var(--accent-fg);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6.6' fill='none' stroke='%23000' stroke-width='1.4'/%3E%3Cpath d='M8 7.2v4.3' stroke='%23000' stroke-width='1.6' stroke-linecap='round'/%3E%3Ccircle cx='8' cy='4.9' r='1' fill='%23000'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6.6' fill='none' stroke='%23000' stroke-width='1.4'/%3E%3Cpath d='M8 7.2v4.3' stroke='%23000' stroke-width='1.6' stroke-linecap='round'/%3E%3Ccircle cx='8' cy='4.9' r='1' fill='%23000'/%3E%3C/svg%3E") center / contain no-repeat;
}

.sob-consulta--callout {
  display: grid;
  justify-items: start;
  gap: 10px;
  padding: clamp(18px, 2.5vw, 24px);
  border-radius: var(--radius-lg);
  font-size: .9375rem;
  font-weight: 400;
  line-height: 1.5;
}

.sob-consulta--callout::before {
  content: none;
}

.sob-consulta__lead {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  margin: 0;
  color: var(--fg);
  font-size: 1.0625rem;
  font-weight: 700;
  line-height: 1.4;
}

.sob-consulta__text {
  max-width: 52ch;
  margin: 0;
  color: var(--fg-2);
}

.sob-consulta__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 4px;
}

/* Dentro da ficha (.spec-block): respiro abaixo do título do bloco */
.spec-block > .sob-consulta,
.spec-block > .seen-list,
.spec-block__seen {
  margin-top: 16px;
}

.spec-block__note {
  margin-top: 14px;
}

/* 07.5 Faixa de protótipo (legado) ------------------------------------------------
   A faixa saiu do HTML na v2.4 (produção). Fica o estilo, caso o modo
   protótipo volte. Marinho da marca: texto branco 14,6:1. */
.proto-banner {
  position: relative;
  z-index: 51;
  background-color: var(--brand-navy);
  color: var(--brand-white);
  font-family: var(--font-mono);
  font-size: .6875rem;
  line-height: 1.45;
  letter-spacing: .03em;
  --focus: var(--accent-on-dark);
  --accent-fg: var(--accent-on-dark);
  --accent-fg-hover: var(--accent-on-dark-hover);
}

.proto-banner .container {
  display: flex;
  align-items: baseline;
  gap: 10px;
  padding-block: 7px;
}

.proto-banner .container::before {
  content: "";
  flex: none;
  width: 6px;
  height: 6px;
  background-color: var(--accent-on-dark);
}

/* 07.6 Foto + 3D (.media-pair · v2.5 · docs/FOTO-3D.md §1) ---------------------
   "A foto prova, o 3D explica": a fotografia real e a representação 3D
   juntas, em imagem dentro de imagem (a mesma linguagem do herói da home).
   Marcação do EVMSite.renderMediaPair (site.js; a página do modelo monta a
   sua com as mesmas classes):
   <div class="media-pair" data-media-pair data-view="foto" data-model="camping">
     <div class="media-pair__main">
       <div class="media-pair__view" data-view="foto">
         figure.photo (+ span.media-pair__badges > .badge--photo "Fotografia real EVM")
       </div>
       <div class="media-pair__view" data-view="3d" hidden>
         <div class="media-pair__poster scene--light">…SVG…</div>
         <span class="badge badge--study media-pair__badge">Representação 3D<span
           class="visually-hidden">. Representação virtual: …</span></span>
         <a class="media-pair__spin link-arrow" href="modelo.html?id=…&amp;vista=3d">Girar em 3D</a>
       </div>
       <button type="button" class="media-pair__pip" aria-label="Ver a representação 3D do …">
         <span class="media-pair__pip-media" data-for="3d">…mini pôster…</span>
         <span class="media-pair__pip-media" data-for="foto" hidden><img class="media-pair__pip-img" alt=""></span>
         <span class="media-pair__pip-label" aria-hidden="true">3D</span>
       </button>
     </div>
   </div>
   · Moldura: as duas vistas ocupam a mesma célula da grade de __main. A vista
     da foto dá a altura (a proporção da própria foto, ou a moldura fixa do
     cartão/galeria); a vista 3D preenche a mesma caixa. A vista escondida
     ([hidden]) continua na grade — invisível, fora do foco e dos leitores
     (visibility) — para a caixa não mudar de tamanho na troca. Por isso este
     é o único lugar em que o [hidden] global (§02) é vencido.
   · Troca (site.js): dissolução de 240 ms — a vista que entra fica por cima e
     aparece; a que sai some no fim. Movimento reduzido: corte seco (§23).
   · Cantos: superior esquerdo = selo da vista (foto: .badge--photo; 3D:
     .badge--study) — um só aparece, porque cada selo pertence à sua vista;
     superior direito = livre para "Ampliar" e o contador "N fotos"; inferior
     esquerdo = a miniatura (.media-pair__pip); inferior direito = "Girar em
     3D" (vista 3D) ou a lupa da foto ampliável. Quem monta uma vista própria
     (galeria, estúdio ao vivo) mantém o canto inferior esquerdo livre: aqui a
     legenda da galeria vai para a direita e as setas ficam juntas à direita.
     Se a barra de miniaturas da galeria ficar dentro de __main, a página
     sobe a miniatura com --media-pair-pip-bottom (altura da barra + 12 px).
   · Miniatura: ~30 % da largura (88–168 px), 4:3, cartão branco com filete,
     canto e sombra suave; mostra sempre a OUTRA vista, com o rótulo "3D"
     (estilo do selo de estudo) ou "Foto" (estilo do selo de foto). Alvo ≥
     66 × 88 px; foco em anéis branco, marinho e branco (como .wa-float).
   · Estúdio ao vivo na vista 3D (modelo.html): .scene.scene--fill (ocupa a
     vista, que é posicionada). Sem JavaScript: só a foto. Impressão: só a
     foto (§24). Cores forçadas: bordas do sistema (§25).
   · v2.6 (docs/UX-2.6.md §3): renderMediaPair({live: true}) põe na vista 3D
     a .scene.scene--fill.media-pair__scene[data-live3d] (pôster, canvas,
     selo, status, nota de reserva e .media-pair__cam — girar, no canto
     superior direito, só com .is-ready); a página cria o estúdio com
     EVMSite.createLive3D. renderMediaPair({cta: {href, label}}) põe a pílula
     .media-pair__cta ("Ver o produto →") no canto inferior direito, nas duas
     vistas, no lugar de "Girar em 3D"; o par ganha .media-pair--cta e a lupa
     da foto ampliável sobe para o canto superior direito. */
.media-pair {
  --media-pair-inset: 12px;
  --media-pair-radius: var(--radius-lg);
  --media-pair-pip-w: clamp(88px, 30%, 168px);   /* % = largura da moldura (__main) */
  --media-pair-pip-bottom: var(--media-pair-inset);
  position: relative;
  display: block;
  min-width: 0;
}

.media-pair__main {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  min-width: 0;
  isolation: isolate;               /* z-index das vistas e da miniatura ficam aqui dentro */
  background-color: var(--paper-2);
  border-radius: var(--media-pair-radius);
}

.media-pair__view {
  position: relative;
  z-index: 1;
  grid-area: 1 / 1;
  min-width: 0;
  opacity: 1;
  visibility: visible;
  transition: opacity 240ms var(--ease-out), visibility 0s linear 0s;
}

/* A vista escondida fica na grade, por baixo, e só some quando a outra
   terminou de aparecer (sem "mergulho" no fundo durante a dissolução) */
.media-pair__view[hidden] {
  display: block !important;        /* vence o [hidden] global (§02): a caixa não muda */
  z-index: 0;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0s linear 240ms, visibility 0s linear 240ms;
}

/* A foto dos cartões leva à página do modelo (link duplicado e oculto) */
.media-pair__link {
  display: block;
  border-radius: var(--media-pair-radius);
  color: inherit;
  text-decoration: none;
}

/* Selo da foto (e o contador "N fotos" à direita), como no cartão de modelo */
.media-pair__badges {
  position: absolute;
  top: var(--media-pair-inset);
  left: var(--media-pair-inset);
  right: var(--media-pair-inset);
  z-index: 4;
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: 6px;
  pointer-events: none;
}

.media-pair__badges > .badge--photo {
  box-shadow: 0 0 0 1px rgba(255, 255, 255, .28), 0 6px 16px -10px rgba(1, 32, 112, .55);
}

/* Pôster do 3D: o estúdio claro de .scene--light (gradiente do estúdio
   técnico) e o SVG inteiro (contain), na caixa da foto */
.media-pair__poster {
  position: absolute;
  inset: 0;
  z-index: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  background-color: var(--study-light-bottom);
  background-image: linear-gradient(180deg, var(--study-light-top) 0%, var(--study-light-bottom) 100%);
  border-radius: var(--media-pair-radius);
}

.media-pair__poster > svg,
.media-pair__poster > img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

/* Selo do 3D ("Representação 3D"): no mesmo canto do selo da foto (cada um
   na sua vista) */
.media-pair__badge {
  position: absolute;
  top: var(--media-pair-inset);
  left: var(--media-pair-inset);
  z-index: 4;
  max-width: calc(100% - 2 * var(--media-pair-inset));
  pointer-events: none;
  box-shadow: 0 6px 16px -10px rgba(1, 32, 112, .55);
}

/* "Girar em 3D" e, v2.6, "Ver o produto" (.media-pair__cta, nas duas
   vistas): pílula branca no canto inferior direito, azul da marca (8,0:1
   sobre branco), alvo de 44 px; não encosta na miniatura */
.media-pair__spin,
.media-pair__cta {
  position: absolute;
  right: var(--media-pair-inset);
  bottom: var(--media-pair-inset);
  z-index: 4;
  gap: 8px;
  max-width: calc(100% - var(--media-pair-pip-w) - 3 * var(--media-pair-inset));
  min-height: 44px;
  padding: 6px 14px 6px 16px;
  background-color: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius-pill);
  box-shadow: 0 6px 16px -10px rgba(1, 32, 112, .55);
  color: var(--brand-blue);
  font-size: .8125rem;
  line-height: 1.2;
}

/* O "Ver o produto" fica fora das vistas, acima das duas (como a miniatura) */
.media-pair__cta {
  z-index: 5;
}

.media-pair--photo-only .media-pair__cta {
  max-width: calc(100% - 2 * var(--media-pair-inset));
}

.media-pair__spin:hover,
.media-pair__cta:hover {
  background-color: var(--accent-wash);
  border-color: var(--brand-blue);
  color: var(--brand-navy);
}

.media-pair__spin:focus-visible,
.media-pair__cta:focus-visible {
  outline: 2px solid var(--brand-blue);
  outline-offset: 2px;
  box-shadow: 0 0 0 2px var(--paper), 0 6px 16px -10px rgba(1, 32, 112, .55);
}

/* v2.6: com o "Ver o produto" no canto inferior direito, a lupa da foto
   ampliável (§27.2) sobe para o canto superior direito */
.media-pair--cta .photo__open::before {
  top: var(--media-pair-inset);
  bottom: auto;
}

.media-pair--cta .photo__open::after {
  top: calc(var(--media-pair-inset) + 10px);
  bottom: auto;
}

/* v2.6: estúdio ao vivo na vista 3D (renderMediaPair live: true). A cena
   preenche a vista com os cantos da moldura; o pôster é o do .scene (sem o
   gradiente repetido); girar fica no alto à direita (só com o 3D pronto,
   §26.3) e a nota de reserva desce para baixo do selo, longe da miniatura. */
.media-pair .media-pair__scene {
  border-radius: var(--media-pair-radius);
}

.media-pair__scene > .media-pair__poster {
  background: none;
  border-radius: 0;
}

.media-pair__scene > .scene__note {
  top: calc(var(--media-pair-inset) + 40px);
  right: auto;
  bottom: auto;
  left: var(--media-pair-inset);
  max-width: calc(100% - 2 * var(--media-pair-inset));
}

.media-pair__cam {
  top: var(--media-pair-inset);
  right: var(--media-pair-inset);
}

/* Miniatura (imagem dentro de imagem): canto inferior esquerdo, cartão
   branco com filete, sempre acima das duas vistas */
.media-pair__pip {
  position: absolute;
  left: var(--media-pair-inset);
  bottom: var(--media-pair-pip-bottom);
  z-index: 5;
  display: block;
  width: var(--media-pair-pip-w);
  height: auto;
  min-height: 66px;                 /* 88 × 3/4: reserva sem aspect-ratio; nunca abaixo de 44 px */
  aspect-ratio: 4 / 3;
  margin: 0;
  padding: 0;
  overflow: hidden;
  background-color: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: 0 12px 28px -14px rgba(1, 32, 112, .55);
  color: var(--ink);
  font: inherit;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition:
    transform var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out);
}

.media-pair__pip:hover {
  border-color: var(--brand-blue);
  box-shadow: 0 16px 32px -14px rgba(1, 32, 112, .6);
}

/* Foco: anéis branco, marinho e branco — o marinho aparece sobre o claro e o
   branco de fora sobre a foto ou o estúdio (cores forçadas: §25) */
.media-pair__pip:focus-visible {
  outline: 2px solid transparent;
  box-shadow: 0 0 0 2px var(--brand-white), 0 0 0 5px var(--brand-navy), 0 0 0 7px var(--brand-white), 0 12px 28px -14px rgba(1, 32, 112, .55);
}

@media (prefers-reduced-motion: no-preference) {
  .media-pair__pip:hover {
    transform: translateY(-2px);
  }
}

/* Conteúdo da miniatura: 3 px de cartão branco em volta */
.media-pair__pip-media {
  position: absolute;
  inset: 3px;
  display: block;
  overflow: hidden;
  background-color: var(--paper-2);
  border-radius: calc(var(--radius) - 3px);
  pointer-events: none;
}

.media-pair__pip-media[data-for="3d"] {
  background-color: var(--study-light-bottom);
  background-image: linear-gradient(180deg, var(--study-light-top) 0%, var(--study-light-bottom) 100%);
}

.media-pair__pip-media > img,
.media-pair__pip-img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.media-pair__pip-media > svg {
  display: block;
  width: 100%;
  height: 100%;
}

/* Rótulo da miniatura: "3D" no estilo do selo de estudo (branco, filete
   tracejado) e "Foto" no do selo de foto (marinho) */
.media-pair__pip-label {
  position: absolute;
  left: 7px;
  bottom: 7px;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  min-height: 20px;
  padding: 2px 7px;
  background-color: var(--brand-white);
  border: 1px dashed var(--ink-3);
  border-radius: var(--radius-pill);
  color: var(--ink-2);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  line-height: 1.2;
  letter-spacing: .08em;
  text-transform: uppercase;
  pointer-events: none;
}

.media-pair[data-view="3d"] > .media-pair__main > .media-pair__pip .media-pair__pip-label {
  background-color: var(--brand-navy);
  border: 1px solid var(--brand-navy);
  color: var(--brand-white);
}

/* Galeria como vista da foto (modelo.html, FOTO-3D §2): o canto inferior
   esquerdo é da miniatura — a legenda do tipo da foto vai para a direita e
   as setas ficam juntas à direita, no meio da foto */
.media-pair .gallery__media .photo__caption {
  left: auto;
  right: var(--media-pair-inset);
}

.media-pair .gallery__arrow--prev,
.media-pair .gallery__prev {
  left: auto;
  right: calc(var(--media-pair-inset) + 52px);
}

/* Sem JavaScript: só a foto */
html.no-js .media-pair__pip,
html.no-js .media-pair__view[data-view="3d"] {
  display: none !important;
}

html.no-js .media-pair__view[data-view="foto"] {
  opacity: 1;
  visibility: visible;
}


/* --------------------------------------------------------------------------
   08 Cabeçalho flutuante (v2.1 · DESIGN-SYSTEM §8.3, base §3.1)
   Pílula de vidro branco a 12 px do topo, centrada, sobre o conteúdo (o herói
   começa atrás dela). O logotipo fica sempre sobre o branco/vidro claro,
   nunca sobre o marinho.
   Estrutura: .site-header(--floating) > .site-header__inner > .brand +
   .site-nav (.site-nav__toggle + .site-nav__list com 5 itens, v2.6:
   Reboques (li[data-nav="reboques"]; o site.js o troca pelo botão
   .site-nav__disclosure + painel, §08.1) · Planejar meu reboque · Fabricação
   · Sobre · Contato) + .site-header__actions (um só CTA). Os seletores do
   menu são de filho direto (.site-nav__list > li > a), para não vazarem no
   painel. v2.4: o CTA é o WhatsApp (verde, com ícone; "Planejar meu
   reboque" passou para o menu):
     <a class="btn btn--whatsapp btn--sm site-header__cta" href="https://wa.me/…"
        target="_blank" rel="noopener" data-wa data-contato="whatsapp"
        data-origem="cabecalho"><svg class="btn__icon">…</svg><span
        class="cta-long">Falar no WhatsApp</span><span class="cta-short">WhatsApp</span></a>
   Abaixo de 400 px o .cta-long fica só para leitores de tela (o nome
   acessível continua "Falar no WhatsApp", que contém o rótulo visível) e
   aparece o .cta-short (o site.js põe aria-hidden="true" nele). No celular o
   CTA fica ao lado do botão de menu: ícone + "WhatsApp" (< 400) ou o rótulo
   longo (≈ 175 px; cabe a 400 px com folga).
   Estados vindos do site.js: .site-header.is-scrolled · .site-nav.is-open ·
   html.nav-open · .site-nav__toggle[aria-expanded] · html.no-js / html.js ·
   a[aria-current="page"] (página atual) e a[aria-current="true"] ("Modelos"
   na página de um modelo; link de seção da home enquanto a seção está na
   tela), com a mesma marca visual.
   Faixas: ≥ 1100 menu em linha + CTA · 900–1099 o mesmo, compacto (links e
   botão com menos recuo; v2.6: o CTA mostra o rótulo curto "WhatsApp") ·
   < 900 botão de menu + CTA compacto; v2.6: o menu abre numa gaveta opaca
   em tela cheia sob a pílula (cartões 2 × 2 das aplicações, links e o bloco
   WhatsApp + Ligar), com a rolagem do fundo travada (html.nav-open).
   .site-header__quote ("Orçamento", v2) saiu na v2.1: se ainda houver no
   HTML, fica oculto (regra de legado abaixo).
   -------------------------------------------------------------------------- */

/* A caixa do cabeçalho tem a altura da pílula. Com --floating, a margem
   inferior negativa devolve ao fluxo essa altura e a folga do topo: o conteúdo
   começa sob a pílula. O painel do menu (< 900) transborda para baixo sem
   empurrar a página. A faixa transparente ao lado da pílula não bloqueia
   cliques (pointer-events); a pílula volta a recebê-los. */
.site-header {
  position: sticky;
  top: var(--header-top);
  z-index: 50;
  height: var(--header-h);
  margin-top: var(--header-top);
  pointer-events: none;
}

.site-header--floating {
  margin-bottom: calc(-1 * (var(--header-top) + var(--header-h)));
}

/* Páginas internas: a primeira seção desce para fora da pílula */
.page-top {
  padding-top: calc(var(--header-h) + clamp(24px, 4vw, 48px));
}

.site-header__inner {
  position: relative;
  z-index: 0;                     /* contexto das camadas de vidro (::before/::after) */
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  align-content: flex-start;
  column-gap: 6px;
  width: 100%;
  max-width: calc(100% - 24px);
  max-width: min(var(--container), 100% - 24px);
  min-height: var(--header-h);
  margin-inline: auto;
  pointer-events: auto;
}

/* Pílula: vidro claro com desfoque; sem backdrop-filter, branco sólido.
   Pior caso do vidro a 72 % (sobre --stage ≈ #BABDC4): --ink 9,1:1,
   --brand-navy 7,7:1 (por isso os links usam tinta e marinho, não --accent,
   que cairia para 4,3:1). Rolado: 92 % de branco. */
.site-header__inner::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  z-index: -1;
  height: var(--header-h);
  background-color: var(--glass);
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-pill);
  box-shadow: var(--shadow-float);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  backdrop-filter: blur(14px) saturate(140%);
  pointer-events: none;
  transition:
    background-color var(--dur-2) var(--ease-out),
    box-shadow var(--dur-2) var(--ease-out);
}

@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
  .site-header__inner::before {
    background-color: var(--paper);
  }
}

.site-header.is-scrolled .site-header__inner::before {
  background-color: var(--glass-strong);
  box-shadow: 0 1px 2px rgba(1, 32, 112, .08), 0 18px 44px -18px rgba(1, 32, 112, .42);
}

/* Marca: logotipo oficial (PNG transparente — somente sobre fundo claro).
   Altura 34 px (≈ 59 px de largura) < 600; 40 px ≥ 600; 44 px ≥ 900.
   Em 360 px: 16 + 59 + 6 + ≈ 175 ("Planejar meu reboque") + 58 (menu) ≈ 314
   px dos 336 px da pílula; < 400 px, com o rótulo curto, ≈ 230 px. Abaixo
   disso a marca encolhe (min-width: 0) e o logotipo reduz na proporção
   (object-fit), sem estourar a linha nem distorcer. */
.brand {
  display: inline-flex;
  align-items: center;
  flex: 0 1 auto;
  min-width: 0;
  min-height: 44px;
  margin-right: auto;
  color: var(--ink);
  line-height: 0;
  text-decoration: none;
  vertical-align: top;
}

.brand:focus-visible {
  outline-offset: 4px;
}

.brand__logo {
  display: block;
  width: auto;
  height: 40px;
  max-width: 100%;
  object-fit: contain;
  object-position: left center;
}

/* A margem vertical faz a primeira linha medir exatamente a altura da pílula */
.site-header .brand {
  margin-block: calc((var(--header-h) - 44px) / 2);
  margin-left: 16px;              /* afasta o logotipo da curva da pílula */
}

.site-header .brand__logo {
  height: 34px;
}

.site-nav {
  display: flex;
  align-items: center;
}

/* Botão de menu redondo (o texto "Menu" fica para leitores de tela) */
.site-nav__toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 44px;
  min-width: 44px;
  height: 44px;
  min-height: 44px;
  padding: 0;
  border: 1px solid var(--line);
  border-radius: var(--radius-pill);
  background-color: var(--paper);
  color: var(--ink);
  font-size: .875rem;
  font-weight: 600;
  line-height: 1;
  -webkit-tap-highlight-color: transparent;
}

.site-nav__toggle:hover {
  border-color: var(--ink-3);
  background-color: var(--paper-2);
}

.site-nav__toggle-text {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

.site-nav__toggle-bars {
  position: relative;
  display: block;
  flex: none;
  width: 18px;
  height: 2px;
  background-color: currentColor;
}

.site-nav__toggle-bars::before,
.site-nav__toggle-bars::after {
  content: "";
  position: absolute;
  left: 0;
  width: 18px;
  height: 2px;
  background-color: currentColor;
}

.site-nav__toggle-bars::before { top: -6px; }
.site-nav__toggle-bars::after { top: 6px; }

.site-nav__toggle[aria-expanded="true"] .site-nav__toggle-bars {
  background-color: transparent;
}

.site-nav__toggle[aria-expanded="true"] .site-nav__toggle-bars::before {
  transform: translateY(6px) rotate(45deg);
}

.site-nav__toggle[aria-expanded="true"] .site-nav__toggle-bars::after {
  transform: translateY(-6px) rotate(-45deg);
}

.site-nav__list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.site-header__actions {
  display: flex;
  flex: none;
  align-items: center;
  gap: 8px;
}

.site-header__cta {
  flex: none;
  white-space: nowrap;
}

/* v2.4: CTA do WhatsApp com ícone — vão menor entre ícone e texto */
.site-header__cta.btn--sm {
  gap: 8px;
}

/* Legado (v2): o botão "Orçamento" saiu do cabeçalho na v2.1 (Contato está
   no menu). Se ainda vier no HTML, não aparece nem recebe foco. */
.site-header__quote {
  display: none !important;
}

/* Rótulo do CTA: longo por padrão; curto só < 400 px (ver o comentário da
   seção). O .cta-short leva aria-hidden="true" no HTML. */
.site-header__cta .cta-short {
  display: none;
}

@media (max-width: 399.98px) {
  .site-header__cta .cta-long {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
  }

  .site-header__cta .cta-short {
    display: inline;
  }
}

/* < 900: pílula com logotipo, CTA compacto e o botão de menu (fixo no canto
   direito). Ao abrir, a lista quebra para uma linha nova, sobre um painel de
   vidro (::after) 8 px abaixo da pílula. .site-header__actions vira
   display: contents (div sem semântica): o CTA entra na linha da pílula. */
@media (max-width: 899.98px) {
  .site-header__actions {
    display: contents;
  }

  .site-header .brand { order: 0; }

  .site-header__cta {
    order: 1;
    margin-right: 58px;           /* espaço do botão de menu: 6 + 44 + 8 */
  }

  .site-nav {
    order: 2;
    display: block;
    flex: 1 1 100%;
  }

  .site-nav__toggle {
    position: absolute;
    top: calc((var(--header-h) - 44px) / 2);
    right: 8px;
  }

  .site-header__cta.btn--sm {
    padding-inline: 14px;
    font-size: .8125rem;
  }

  /* Gaveta (v2.6): papel branco opaco (--ink 17,3:1, --accent 8,0:1), do
     fim da pílula até 12 px do pé da janela. Atrás dela, um véu opaco em
     tela cheia (.site-header::before, abaixo) cobre a página. */
  .site-header__inner::after {
    content: "";
    position: absolute;
    top: calc(var(--header-h) + 8px);
    left: 0;
    right: 0;
    bottom: 0;
    z-index: -1;
    display: none;
    background-color: var(--paper);
    border: 1px solid var(--line-soft);
    border-radius: var(--radius-lg);
    box-shadow: 0 1px 2px rgba(1, 32, 112, .08), 0 28px 48px -24px rgba(1, 32, 112, .45);
    pointer-events: none;
  }

  /* Altura da lista aberta: a janela menos a pílula, o vão de 8 px e 12 px
     no pé (a barra de contato some com a gaveta aberta). O conteúdo rola
     dentro dela. */
  .site-nav__list {
    display: none;
    max-height: calc(100vh - var(--header-top) - var(--header-h) - 20px);
    max-height: calc(100dvh - var(--header-top) - var(--header-h) - 20px);
    margin: 8px 0 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    counter-reset: navitem;
  }

  /* Folga para o anel de foco dentro da rolagem e para o canto do painel.
     Seletor com o pai para vencer o ul[class] { padding: 0 } da base. */
  .site-nav .site-nav__list {
    padding: 8px 14px 14px;
  }

  /* Aberto (estado do site.js). A regra com :has() fica separada: um seletor
     sem suporte invalidaria a lista inteira. */
  .site-nav__toggle[aria-expanded="true"] + .site-nav__list,
  .site-nav.is-open .site-nav__list {
    display: block;
    height: calc(100vh - var(--header-top) - var(--header-h) - 20px);
    height: calc(100dvh - var(--header-top) - var(--header-h) - 20px);
  }

  .nav-open .site-header__inner::after {
    display: block;
  }

  .site-header__inner:has(.site-nav.is-open)::after {
    display: block;
  }

  /* v2.6: véu opaco em tela cheia atrás da pílula e da gaveta (a página não
     aparece nem recebe toques; um toque nele fecha a gaveta, site.js) e a
     rolagem do fundo travada. */
  html.nav-open {
    overflow: hidden;
    scrollbar-gutter: stable;          /* o botão de menu não anda ao travar a rolagem */
    background-color: var(--paper-2);  /* a calha acompanha o véu da gaveta */
  }

  html.nav-open .site-header::before {
    content: "";
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background-color: var(--paper-2);
    pointer-events: auto;
  }

  .site-nav__list > li + li {
    border-top: 1px solid var(--line-soft);
  }

  .site-nav__list > li > a {
    display: flex;
    align-items: center;
    gap: 16px;
    min-height: 52px;
    padding: 6px 4px;
    color: var(--ink);
    font-size: 1.0625rem;
    font-weight: 600;
    letter-spacing: -0.01em;
    text-decoration: none;
  }

  .site-nav__list > li > a::before {
    counter-increment: navitem;
    content: counter(navitem, decimal-leading-zero);
    content: counter(navitem, decimal-leading-zero) / "";
    min-width: 1.75rem;
    color: var(--accent);
    font-family: var(--font-mono);
    font-size: .75rem;
    font-weight: 500;
    letter-spacing: .04em;
  }

  .site-nav__list > li > a:hover,
  .site-nav__list > li > a[aria-current="page"],
  .site-nav__list > li > a[aria-current="true"] {
    color: var(--accent);
  }

  /* Página atual (ou subpágina/seção atual, aria-current="true" do site.js):
     ponto à direita (forma, além da cor) */
  .site-nav__list > li > a[aria-current="page"]::after,
  .site-nav__list > li > a[aria-current="true"]::after {
    content: "";
    flex: none;
    width: 8px;
    height: 8px;
    margin-left: auto;
    margin-right: 4px;
    background-color: currentColor;
    border-radius: 50%;
  }

  /* Sem JavaScript: cabeçalho no fluxo (não sobrepõe nem gruda) e links em
     linha, visíveis no painel */
  .no-js .site-header {
    position: relative;
    top: auto;
    height: auto;
  }

  .no-js .site-header--floating {
    margin-bottom: 0;
  }

  .no-js .site-header__cta {
    margin-right: 8px;
  }

  .no-js .site-header__inner::after {
    display: block;
  }

  .no-js .site-nav__list {
    display: flex;
    flex-wrap: wrap;
    gap: 0 18px;
    max-height: none;
    overflow: visible;
  }

  .no-js .site-nav__list > li + li { border: 0; }
  .no-js .site-nav__list > li > a { min-height: 44px; padding: 0; font-size: .9375rem; }
  .no-js .site-nav__list > li > a::before { content: none; }
}

.no-js .site-nav__toggle {
  display: none;
}

@media (min-width: 600px) {
  .site-header .brand { margin-left: 20px; }
  .site-header .brand__logo { height: 40px; }
  .site-header__cta.btn--sm { padding-inline: 18px; font-size: .875rem; }
}

/* ≥ 900: grade de três colunas — marca à esquerda, menu centrado, ações à direita */
@media (min-width: 900px) {
  .site-header__inner {
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    column-gap: 16px;
  }

  .site-header .brand {
    justify-self: start;
    margin-right: 0;
    margin-left: 22px;
  }

  .site-header .brand__logo { height: 44px; }

  .site-nav { justify-self: center; }

  .site-header__actions {
    justify-self: end;
    margin-right: 11px;           /* (68 − 44) / 2 − 1 px da borda */
  }

  .site-nav__toggle { display: none; }

  .site-nav__list {
    display: flex;
    align-items: center;
    gap: clamp(2px, .6vw, 10px);
  }

  .site-nav__list > li > a {
    position: relative;
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 0 12px;
    border-radius: var(--radius-pill);
    color: var(--ink);
    font-size: .875rem;
    font-weight: 600;
    text-decoration: none;
    transition: background-color var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }

  .site-nav__list > li > a::after {
    content: "";
    position: absolute;
    left: 12px;
    right: 12px;
    bottom: 8px;
    height: 2px;
    background-color: var(--accent);
    border-radius: 1px;
    transform: scaleX(0);
    transform-origin: left center;
  }

  .site-nav__list > li > a:hover {
    background-color: var(--hover);
    color: var(--brand-navy);
  }

  .site-nav__list > li > a:hover::after,
  .site-nav__list > li > a[aria-current="page"]::after,
  .site-nav__list > li > a[aria-current="true"]::after {
    transform: scaleX(1);
  }

  /* aria-current="true" (site.js): o link estático "Reboques" em modelo.html
     (sem o menu por aplicação) — mesma marca da página atual */
  .site-nav__list > li > a[aria-current="page"],
  .site-nav__list > li > a[aria-current="true"] {
    color: var(--brand-navy);
  }
}

/* 900–1099: links e CTA mais compactos. v2.6: com 5 itens (Reboques e a seta,
   Planejar meu reboque, Fabricação, Sobre, Contato) o menu passa de ≈ 400
   para ≈ 463 px e cada coluna lateral (1fr) cai para ≈ 190 px a 900 px —
   o CTA longo (≈ 188 px) não cabe: nesta faixa vale o rótulo curto
   "WhatsApp" (o nome acessível continua "Falar no WhatsApp", que contém o
   rótulo visível). A partir de 1100 px sobram ≈ 270 px por coluna. */
@media (min-width: 900px) and (max-width: 1099.98px) {
  .site-nav__list > li > a {
    padding-inline: 8px;
  }

  .site-nav__list > li > a::after {
    left: 8px;
    right: 8px;
  }

  .site-header__actions .btn--sm {
    padding-inline: 12px;
    font-size: .8125rem;
  }

  .site-header__cta .cta-long {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
  }

  .site-header__cta .cta-short {
    display: inline;
  }
}

@media (min-width: 1200px) {
  .site-nav__list > li > a { font-size: .9375rem; }
}

@media (prefers-reduced-motion: no-preference) {
  .site-nav__toggle-bars::before,
  .site-nav__toggle-bars::after {
    transition: transform .25s var(--ease);
  }
  .site-nav__list > li > a::after,
  .site-nav__disclosure::after {
    transition: transform .3s var(--ease);
  }
}

@media (prefers-reduced-motion: no-preference) and (max-width: 899.98px) {
  .site-nav__toggle[aria-expanded="true"] + .site-nav__list,
  .site-nav.is-open .site-nav__list,
  .nav-open .site-header__inner::after {
    animation: evm-drop var(--dur-2) var(--ease-out);
  }
}

/* 08.1 Menu por aplicação (v2.6 · docs/UX-2.6.md §2) ------------------------
   Gerado pelo site.js (buildNav) no li[data-nav="reboques"]; contrato da
   marcação no topo do site.js:
   li.site-nav__item.site-nav__item--reboques[.is-current][.is-open]
     > button.site-nav__disclosure[aria-expanded][aria-controls="menu-reboques"]
       (texto + svg.site-nav__chevron)
     + div.site-nav__panel#menu-reboques
         > .nav-mega__head (p.nav-mega__title + .badge--photo.nav-mega__badge)
         + ul.nav-mega__grid > li.nav-cat > a.nav-cat__link[data-nav-cat]
             (.nav-cat__media > img.nav-cat__img · .nav-cat__body > .nav-cat__name,
             .nav-cat__prompt, .nav-cat__count) + a.nav-cat__3d ("Ver em 3D")
         + .nav-mega__foot (a.nav-mega__all · a.nav-mega__link · a.nav-mega__wa)
   li.site-nav__item--contact (gaveta): p.site-nav__contact-title +
     .site-nav__contact-actions (WhatsApp + Ligar) + p.site-nav__hours
   · ≥ 900: o botão fica na linha do menu (mesma marca dos links; .is-current
     em modelos/modelo); o painel abre sob a pílula, na largura dela, em papel
     opaco. Sem abrir no hover (padrão disclosure).
   · < 900: o botão some; o painel fica aberto no topo da gaveta, com os
     cartões em 2 × 2, sem "Ver em 3D" nem o WhatsApp do rodapé do painel (o
     bloco de contato no fim da gaveta já o traz).
   · Foto real: object-fit contain (o reboque nunca é cortado) e o selo
     "Fotografia real EVM" uma vez no topo do painel.
   · Atual: a[aria-current] no cartão (filete azul + ponto: forma, além da cor). */
.site-nav__disclosure {
  position: relative;
  display: none;
  align-items: center;
  gap: 6px;
  min-height: 44px;
  margin: 0;
  padding: 0 12px;
  background-color: transparent;
  border: 0;
  border-radius: var(--radius-pill);
  color: var(--ink);
  font: inherit;
  font-size: .875rem;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.site-nav__chevron {
  flex: none;
  width: 12px;
  height: 12px;
}

.site-nav__disclosure[aria-expanded="true"] .site-nav__chevron {
  transform: rotate(180deg);
}

.site-nav__panel {
  color: var(--ink);
  text-align: left;
}

.nav-mega__head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 8px 16px;
  margin: 0 0 12px;
}

.nav-mega__title {
  color: var(--ink-2);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.nav-mega__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.nav-cat {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.nav-cat__link {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 8px;
  min-width: 0;
  min-height: 44px;
  padding: 8px;
  background-color: var(--paper);
  border: 1px solid var(--line-soft);
  border-radius: var(--radius);
  color: var(--ink);
  text-decoration: none;
  transition: border-color var(--dur-1) var(--ease-out), background-color var(--dur-1) var(--ease-out);
}

.nav-cat__link:hover {
  background-color: var(--accent-wash);
  border-color: var(--brand-blue);
  color: var(--ink);
}

.nav-cat__media {
  position: relative;
  display: block;
  overflow: hidden;
  aspect-ratio: 2 / 1;
  background-color: var(--paper-2);
  border-radius: calc(var(--radius) - 4px);
}

.nav-cat__img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.nav-cat__media--icon {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 8%;
  color: var(--brand-navy);
}

.nav-cat__media--icon > svg {
  width: auto;
  height: 100%;
}

.nav-cat__body {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.nav-cat__name {
  color: var(--ink);
  font-size: .9375rem;
  font-weight: 700;
  line-height: 1.25;
  overflow-wrap: anywhere;
}

/* --ink-3: 6,2:1 sobre branco; 5,7:1 sobre o tinte do hover */
.nav-cat__prompt {
  display: none;
  color: var(--ink-3);
  font-size: .8125rem;
  line-height: 1.35;
}

.nav-cat__count {
  color: var(--brand-blue);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
}

/* Aplicação da página atual: filete azul por dentro + ponto ao lado do nome */
.nav-cat__link[aria-current="page"],
.nav-cat__link[aria-current="true"] {
  border-color: var(--brand-blue);
  box-shadow: inset 0 0 0 1px var(--brand-blue);
}

.nav-cat__link[aria-current="page"] .nav-cat__name::after,
.nav-cat__link[aria-current="true"] .nav-cat__name::after {
  content: "";
  display: inline-block;
  width: 8px;
  height: 8px;
  margin-left: 8px;
  vertical-align: middle;
  background-color: var(--brand-blue);
  border-radius: 50%;
}

.nav-cat__3d {
  display: none;
  align-self: flex-start;
  align-items: center;
  min-height: 44px;
  padding: 0 4px;
  color: var(--accent);
  font-size: .8125rem;
  font-weight: 600;
  text-decoration: none;
}

.nav-cat__3d:hover {
  color: var(--brand-navy);
  text-decoration: underline;
  text-decoration-thickness: 1px;
}

.nav-mega__foot {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0 24px;
  margin-top: 12px;
  padding-top: 4px;
  border-top: 1px solid var(--line-soft);
}

.nav-mega__all[aria-current="page"] {
  color: var(--brand-navy);
  text-decoration: underline;
  text-decoration-thickness: 2px;
}

.nav-mega__link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--accent);
  font-weight: 600;
  text-decoration: none;
}

.nav-mega__link:hover {
  color: var(--brand-navy);
  text-decoration: underline;
  text-decoration-thickness: 1px;
}

/* Bloco de contato da gaveta: só < 900 (§08.1, abaixo) */
.site-nav__item--contact {
  display: none;
}

@media (min-width: 600px) {
  .nav-cat__prompt {
    display: block;
  }
}

/* < 900: o painel aberto no topo da gaveta; cartões 2 × 2; bloco de contato no fim */
@media (max-width: 899.98px) {
  .site-nav__panel {
    padding: 10px 0 12px;
  }

  .nav-mega__wa {
    display: none;
  }

  .site-nav__item--contact {
    display: block;
    margin-top: 4px;
    padding: 16px 0 4px;
  }

  .site-nav__contact-title {
    margin: 0 0 10px;
    color: var(--ink-2);
    font-family: var(--font-mono);
    font-size: .75rem;
    font-weight: 500;
    letter-spacing: .08em;
    text-transform: uppercase;
  }

  .site-nav__contact-actions {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 8px;
  }

  .site-nav__contact-actions--single {
    grid-template-columns: minmax(0, 1fr);
  }

  .site-nav__contact-btn {
    min-width: 0;
    min-height: 48px;
    padding-inline: 12px;
    gap: 8px;
    font-size: .9375rem;
  }

  /* A gaveta é papel claro: o secundário usa a tinta, em qualquer página */
  .site-nav__contact-actions .btn--secondary {
    border-color: var(--ink);
    color: var(--ink);
  }

  .site-nav__contact-actions .btn--secondary:hover {
    background-color: var(--accent-tint);
    color: var(--ink);
  }

  .site-nav__hours {
    margin-top: 10px;
    color: var(--ink-3);
    font-size: .8125rem;
  }
}

/* ≥ 900: botão na linha do menu e painel sob a pílula */
@media (min-width: 900px) {
  .site-nav__disclosure {
    display: inline-flex;
    transition: background-color var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }

  .site-nav__disclosure::after {
    content: "";
    position: absolute;
    left: 12px;
    right: 12px;
    bottom: 8px;
    height: 2px;
    background-color: var(--accent);
    border-radius: 1px;
    transform: scaleX(0);
    transform-origin: left center;
  }

  .site-nav__disclosure:hover,
  .site-nav__disclosure[aria-expanded="true"] {
    background-color: var(--hover);
    color: var(--brand-navy);
  }

  .site-nav__disclosure:hover::after,
  .site-nav__item.is-current > .site-nav__disclosure::after {
    transform: scaleX(1);
  }

  .site-nav__item.is-current > .site-nav__disclosure {
    color: var(--brand-navy);
  }

  /* O bloco de contenção é a pílula (.site-header__inner, posicionada): o
     painel tem a largura dela e rola dentro de si se a janela for baixa */
  .site-nav__panel {
    position: absolute;
    top: calc(var(--header-h) + 8px);
    left: 0;
    right: 0;
    z-index: 1;
    display: none;
    max-height: calc(100vh - var(--header-top) - var(--header-h) - 24px);
    max-height: calc(100dvh - var(--header-top) - var(--header-h) - 24px);
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: clamp(20px, 2vw, 28px);
    background-color: var(--paper);
    border: 1px solid var(--line-soft);
    border-radius: var(--radius-lg);
    box-shadow: 0 1px 2px rgba(1, 32, 112, .08), 0 28px 48px -24px rgba(1, 32, 112, .45);
  }

  .site-nav__item.is-open > .site-nav__panel,
  .site-nav__disclosure[aria-expanded="true"] + .site-nav__panel {
    display: block;
  }

  .nav-mega__grid {
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 16px;
  }

  .nav-cat__link {
    padding: 10px;
    border-color: transparent;
  }

  .nav-cat__3d {
    display: inline-flex;
    margin: 2px 0 0 6px;
  }

  .nav-mega__foot {
    margin-top: 16px;
    padding-top: 8px;
  }

  .nav-mega__wa {
    margin-left: auto;
  }
}

/* Mesmas faixas dos links (§08): recuo menor em 900–1099 e fonte maior ≥ 1200
   (aqui, depois da regra base do botão, para valerem) */
@media (min-width: 900px) and (max-width: 1099.98px) {
  .site-nav__disclosure {
    padding-inline: 8px;
  }

  .site-nav__disclosure::after {
    left: 8px;
    right: 8px;
  }
}

@media (min-width: 1200px) {
  .site-nav__disclosure {
    font-size: .9375rem;
  }
}

@media (prefers-reduced-motion: no-preference) {
  .site-nav__chevron {
    transition: transform var(--dur-2) var(--ease-out);
  }
}

@media (prefers-reduced-motion: no-preference) and (min-width: 900px) {
  .site-nav__item.is-open > .site-nav__panel {
    animation: evm-drop var(--dur-2) var(--ease-out);
  }
}


/* --------------------------------------------------------------------------
   09 Rodapé
   -------------------------------------------------------------------------- */
.site-footer {
  padding-block: clamp(48px, 6vw, 72px) 28px;
  background-color: var(--paper-2);
  border-top: 1px solid var(--line-soft);
  color: var(--ink-2);
  font-size: .9375rem;
}

.site-footer__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 40px;
}

@media (min-width: 600px) {
  .site-footer__inner { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .site-footer__brand { grid-column: 1 / -1; }
}

@media (min-width: 900px) {
  .site-footer__inner { grid-template-columns: minmax(0, 5fr) minmax(0, 3fr) minmax(0, 4fr); }
  .site-footer__brand { grid-column: auto; }
}

.brand--footer {
  margin-right: 0;
}

/* Rodapé em --paper-2 (claro): o logotipo pode aparecer maior */
.brand--footer .brand__logo { height: 64px; }

.site-footer__about {
  max-width: 34ch;
  margin-top: 12px;
  color: var(--ink-2);
}

.site-footer__title {
  margin-bottom: 12px;
  color: var(--ink-2);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.site-footer ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

.site-footer__nav a,
.site-footer__contact a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--ink);
  text-decoration: none;
}

.site-footer__nav a:hover,
.site-footer__contact a:hover {
  color: var(--accent);
  text-decoration: underline;
}

/* Página atual no rodapé (aria-current="page", escrito no HTML; "true" vale
   igual): marinho, peso 600 e sublinhado grosso permanente (forma, além da
   cor). */
.site-footer__nav a[aria-current="page"],
.site-footer__nav a[aria-current="true"] {
  color: var(--brand-navy);
  font-weight: 600;
  text-decoration-line: underline;
  text-decoration-thickness: 2px;
  text-decoration-color: var(--accent);
  text-underline-offset: .32em;
}

.site-footer__nav a[aria-current="page"]:hover,
.site-footer__nav a[aria-current="true"]:hover {
  color: var(--accent);
}

.site-footer__contact li {
  padding-block: 6px;
  line-height: 1.5;
}

.site-footer__contact li:has(> a) {
  padding-block: 0;
}

.site-footer__legal {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 6px 24px;
  margin-top: clamp(40px, 5vw, 56px);
  padding-top: 20px;
  background-image: linear-gradient(var(--line), var(--line));
  background-repeat: no-repeat;
  background-position: center top;
  background-size: calc(100% - var(--gutter) * 2) 1px;
  color: var(--ink-3-panel);
  font-size: .8125rem;
}


/* --------------------------------------------------------------------------
   10 Palco de produto (conceito A)
   -------------------------------------------------------------------------- */
.stage {
  /* Horizonte acima do topo das rodas: o piso passa atrás do reboque, que fica apoiado nele
     (vale para o render 3:2 em palcos 4:3, 3:2, 16:9 e 21:9) */
  --stage-horizon: 62%;
  position: relative;
  display: block;
  overflow: hidden;
  isolation: isolate;
  aspect-ratio: 4 / 3;
  background-color: var(--stage);
  /* Luz lateral fria (marinho → --stage-light → azul frio). Pico da luz
     ≈ #244079: --stage-muted 5,1:1 · --accent-on-dark 4,5:1 */
  background-image:
    radial-gradient(85% 120% at -8% 38%, rgba(46, 78, 140, .5) 0%, rgba(27, 51, 102, .45) 28%, rgba(7, 18, 43, 0) 68%),
    radial-gradient(70% 55% at 0% 30%, var(--stage-light) 0%, rgba(27, 51, 102, 0) 70%),
    linear-gradient(180deg, var(--stage-2) 0%, var(--stage) 60%, #040A1C 100%);
  border-radius: var(--radius-lg);
  color: var(--stage-ink);
}

/* Piso: plano levemente refletivo a partir da linha do horizonte */
.stage::before {
  content: "";
  position: absolute;
  inset: var(--stage-horizon) 0 0 0;
  z-index: 0;
  background:
    radial-gradient(60% 90% at 22% 0%, rgba(127, 178, 240, .06), rgba(127, 178, 240, 0) 70%),
    linear-gradient(180deg, rgba(244, 247, 252, .045) 0%, rgba(0, 0, 0, .24) 100%);
  pointer-events: none;
}

/* Linha do horizonte do estúdio */
.stage::after {
  content: "";
  position: absolute;
  top: var(--stage-horizon);
  left: 0;
  right: 0;
  z-index: 0;
  height: 1px;
  background: linear-gradient(90deg, rgba(244, 247, 252, .16) 0%, rgba(244, 247, 252, .07) 45%, rgba(244, 247, 252, 0) 100%);
  pointer-events: none;
}

/* Variante clara para desenho técnico (papel com grade fina em --line-soft) */
.stage--light {
  background-color: var(--paper-2);
  background-image:
    linear-gradient(var(--line-soft) 1px, transparent 1px),
    linear-gradient(90deg, var(--line-soft) 1px, transparent 1px);
  background-size: 24px 24px;
  background-position: -1px -1px;
  color: var(--ink);
}

.stage--light::before,
.stage--light::after {
  display: none;
}

/* Palco sobre seção escura: filete interno claro separa o palco do fundo */
.section--dark .stage {
  box-shadow: inset 0 0 0 1px var(--rule);
}

.stage__media {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
}

.stage__media > svg,
.stage__media > img,
.stage > svg,
.stage > img {
  width: 100%;
  height: 100%;
}

.stage > svg,
.stage > img {
  position: absolute;
  inset: 0;
  z-index: 1;
}

.stage__media > img,
.stage > img {
  object-fit: contain;
}

.stage__media--cover > img {
  object-fit: cover;
}

.stage canvas {
  display: block;
  width: 100%;
  height: 100%;
}

/* Etiqueta do pôster 3D no palco (modelo sem foto): v2.6 "Representação 3D"
   (EVMSite.copy3d.badge), com o aviso em texto oculto */
.stage__tag {
  position: absolute;
  left: 12px;
  bottom: 12px;
  z-index: 3;
  max-width: calc(100% - 24px);
  padding: 4px 10px;
  background-color: rgba(7, 18, 43, .74);
  border: 1px solid rgba(244, 247, 252, .14);
  border-radius: var(--radius-pill);
  color: var(--stage-muted);
  font-family: var(--font-mono);
  font-size: .6875rem;
  line-height: 1.35;
  letter-spacing: .03em;
  pointer-events: none;
}

.stage--light .stage__tag {
  background-color: rgba(244, 247, 252, .92);
  border-color: var(--line);
  color: var(--ink-2);
}

/* Legenda técnica (abaixo do palco, ou sobre ele quando filha do .stage) */
.stage__caption {
  margin-top: 12px;
  color: var(--fg-3);
  font-family: var(--font-mono);
  font-size: .75rem;
  line-height: 1.5;
  letter-spacing: .02em;
}

.stage > .stage__caption {
  position: absolute;
  top: 14px;
  left: 16px;
  right: 16px;
  z-index: 3;
  margin: 0;
  color: var(--stage-muted);
}

.stage--light > .stage__caption {
  color: var(--ink-2);
}


/* --------------------------------------------------------------------------
   11 Foto a produzir (legado: os quadros .shot saíram das páginas na v2.4;
   o estilo fica para compatibilidade)
   Sem min-height fixo: assim vale o mínimo automático do aspect-ratio e a
   caixa cresce com o texto (zoom de texto, espaçamento do usuário).
   -------------------------------------------------------------------------- */
.shot {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: 6px;
  aspect-ratio: 4 / 3;
  margin: 0;
  padding: 64px clamp(18px, 2.5vw, 26px) clamp(18px, 2.5vw, 26px);
  background-color: var(--paper-2);
  background-image: repeating-linear-gradient(135deg, rgba(1, 32, 112, .055) 0 1px, transparent 1px 12px);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  color: var(--ink-2);
  --focus: var(--accent);
}

/* Câmera (traço em --ink-2 #3D4860; data URI não aceita var()) */
.shot::before {
  content: "";
  position: absolute;
  top: clamp(20px, 2.5vw, 28px);
  left: clamp(20px, 2.5vw, 28px);
  width: 30px;
  height: 30px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='none' stroke='%233D4860' stroke-width='1.4'%3E%3Cpath d='M4 10.5h6l2.2-3h7.6l2.2 3h6v15H4z'/%3E%3Ccircle cx='16' cy='17.5' r='5'/%3E%3Ccircle cx='24.5' cy='13.5' r='.8' fill='%233D4860' stroke='none'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* Marcas de enquadramento nos cantos (recuadas para dentro do canto arredondado) */
.shot::after {
  content: "";
  position: absolute;
  inset: 14px;
  background:
    linear-gradient(var(--ink-3), var(--ink-3)) left top / 14px 1px no-repeat,
    linear-gradient(var(--ink-3), var(--ink-3)) left top / 1px 14px no-repeat,
    linear-gradient(var(--ink-3), var(--ink-3)) right top / 14px 1px no-repeat,
    linear-gradient(var(--ink-3), var(--ink-3)) right top / 1px 14px no-repeat,
    linear-gradient(var(--ink-3), var(--ink-3)) left bottom / 14px 1px no-repeat,
    linear-gradient(var(--ink-3), var(--ink-3)) left bottom / 1px 14px no-repeat,
    linear-gradient(var(--ink-3), var(--ink-3)) right bottom / 14px 1px no-repeat,
    linear-gradient(var(--ink-3), var(--ink-3)) right bottom / 1px 14px no-repeat;
  opacity: .55;
  pointer-events: none;
}

.shot__label {
  position: relative;
  z-index: 1;
  color: var(--accent);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.shot__desc {
  position: relative;
  z-index: 1;
  max-width: 40ch;
  color: var(--ink-2);
  font-size: .875rem;
  line-height: 1.5;
}


/* --------------------------------------------------------------------------
   12 Categorias ("O que você precisa transportar?")
   -------------------------------------------------------------------------- */
.cat-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (min-width: 600px) {
  .cat-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 16px;
  }
}

@media (min-width: 900px) {
  .cat-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.cat-tile {
  position: relative;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  grid-template-areas:
    "icon name"
    "icon prompt"
    "icon count";
  align-items: start;
  gap: 4px 16px;
  height: 100%;
  min-height: 44px;
  padding: 18px 16px;
  background-color: var(--paper-0);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  color: var(--ink);
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  transition: border-color .2s var(--ease), background-color .2s var(--ease), box-shadow .2s var(--ease);
}

.cat-tile__icon {
  grid-area: icon;
  display: block;
  width: 44px;
  height: 44px;
  color: var(--ink-2);
  transition: color .2s var(--ease);
}

.cat-tile__icon svg {
  width: 100%;
  height: 100%;
}

.cat-tile__name {
  grid-area: name;
  color: var(--ink);
  font-size: 1.0625rem;
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: -0.01em;
}

.cat-tile__prompt {
  grid-area: prompt;
  color: var(--ink-2);
  font-size: .9375rem;
  line-height: 1.45;
}

.cat-tile__count {
  grid-area: count;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-top: 6px;
  color: var(--ink-3);
  font-family: var(--font-mono);
  font-size: .75rem;
  line-height: 1.4;
  letter-spacing: .04em;
}

.cat-tile__count::after {
  content: "";
  flex: none;
  width: 16px;
  height: 16px;
  background-color: var(--accent);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M1.5 8h12M9.5 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M1.5 8h12M9.5 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
}

.cat-tile:hover {
  border-color: var(--accent);
  color: var(--ink);
  text-decoration: none;
}

.cat-tile:hover .cat-tile__icon {
  color: var(--accent);
}

.cat-tile[aria-current="true"] {
  background-color: var(--accent-tint);
  border-color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--accent);
}

.cat-tile[aria-current="true"] .cat-tile__icon { color: var(--accent); }
.cat-tile[aria-current="true"] .cat-tile__count { color: var(--ink-2); }

@media (min-width: 600px) {
  .cat-tile {
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: auto auto 1fr auto;
    grid-template-areas:
      "icon"
      "name"
      "prompt"
      "count";
    gap: 8px;
    min-height: 13.5rem;
    padding: 24px;
  }

  .cat-tile__icon {
    width: 56px;
    height: 56px;
    margin-bottom: 14px;
  }

  .cat-tile__name { font-size: 1.1875rem; }

  .cat-tile__count {
    margin-top: 14px;
    padding-top: 12px;
    border-top: 1px solid var(--line-soft);
  }
}

@media (prefers-reduced-motion: no-preference) {
  .cat-tile__count::after {
    transition: transform .25s var(--ease);
  }
  .cat-tile:hover .cat-tile__count::after {
    transform: translateX(4px);
  }
}


/* --------------------------------------------------------------------------
   13 Filtros (chips)
   -------------------------------------------------------------------------- */
.chips {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0;
  padding: 4px 0;
  list-style: none;
}

/* Rolagem horizontal no celular. Folga de 6 px no topo e 8 px na base: o anel de
   foco (2 px + 3 px de afastamento) não é cortado e a altura total continua 58 px. */
@media (max-width: 599.98px) {
  .chips {
    flex-wrap: nowrap;
    margin-inline: calc(var(--gutter) * -1);
    padding: 6px var(--gutter) 8px;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-padding-inline: var(--gutter);
    scrollbar-width: thin;
    -webkit-overflow-scrolling: touch;
  }

  .chips > * {
    flex: 0 0 auto;
  }
}

/* position: relative mantém o texto .visually-hidden dentro do chip (e da faixa rolável) */
.chip {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 44px;
  padding: 8px 16px;
  background-color: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  color: var(--ink);
  font-size: .875rem;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
  transition: background-color .18s var(--ease), border-color .18s var(--ease);
}

.chip:hover {
  background-color: var(--paper-3);
  border-color: var(--ink-3);
}

/* Sobre painel (paper-2) o chip sobe para o papel claro */
.section--panel .chip:not([aria-pressed="true"]) {
  background-color: var(--paper-0);
}

.section--panel .chip:not([aria-pressed="true"]):hover {
  background-color: var(--paper);
}

.chip[aria-pressed="true"] {
  background-color: var(--accent-tint);
  border-color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--accent);
  color: var(--ink);
}

/* Marca de forma (não só cor) para o estado ativo */
.chip[aria-pressed="true"]::before {
  content: "";
  flex: none;
  width: 7px;
  height: 7px;
  background-color: var(--accent);
  border-radius: 50%;
}

.chip__count {
  color: var(--ink-3-panel);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
}

.chip[aria-pressed="true"] .chip__count {
  color: var(--ink-2);
}

.results-meta {
  margin-top: 12px;
  color: var(--fg-3);
  font-family: var(--font-mono);
  font-size: .8125rem;
  line-height: 1.5;
  letter-spacing: .02em;
}


/* --------------------------------------------------------------------------
   14 Cartão de modelo
   -------------------------------------------------------------------------- */
.model-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(40px, 5vw, 56px) clamp(16px, 2.4vw, 32px);
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (min-width: 600px) {
  .model-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 900px) {
  .model-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.model-card {
  position: relative;
  display: flex;
  flex-direction: column;
  min-width: 0;
  height: 100%;
}

.model-card__media {
  display: block;
  border-radius: var(--radius-lg);
  color: inherit;
  text-decoration: none;
}

.model-card__media .stage {
  border-radius: var(--radius-lg);
}

/* Etiqueta da ilustração numa linha só no cartão (reticências se faltar espaço) */
.model-card .stage__tag {
  overflow: hidden;
  max-width: calc(100% - 24px);
  text-overflow: ellipsis;
  white-space: nowrap;
}

.model-card__body {
  container-type: inline-size;
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 10px;
  padding-top: 18px;
}

.model-card__cat {
  margin: 0;
}

.model-card__title {
  font-size: clamp(1.25rem, .6vw + 1.1rem, 1.5rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.015em;
}

.model-card__title a {
  color: var(--fg);
  text-decoration: none;
}

.model-card__title a:hover {
  color: var(--accent-fg);
  text-decoration: underline;
  text-decoration-thickness: 2px;
}

.model-card__tagline {
  color: var(--fg-2);
  font-size: .9375rem;
  line-height: 1.5;
}

.model-card .keyspecs {
  margin-top: 6px;
}

.model-card .keyspec__value {
  font-size: 1rem;
}

.model-card__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 8px 16px;
  margin-top: auto;
  padding-top: 10px;
}

/* v2.4: "Perguntar no WhatsApp" (EVMSite.renderModelCard), logo abaixo das ações */
.model-card__wa {
  align-self: flex-start;
  margin-top: -4px;
  font-size: .875rem;
}

/* 600–899: com número ímpar de cartões visíveis, o último ocupa as duas colunas
   em formato horizontal (imagem na 1ª coluna, texto na 2ª), sem cartão órfão.
   Itens ocultos pelo filtro ([hidden]) não contam. Especificidade baixa (:where)
   para que ajustes de página prevaleçam. */
@media (min-width: 600px) and (max-width: 899.98px) {
  :where(.model-grid) > :where(:nth-child(odd of :not([hidden])):nth-last-child(1 of :not([hidden]))) {
    grid-column: 1 / -1;
  }

  :where(.model-grid > :nth-child(odd of :not([hidden])):nth-last-child(1 of :not([hidden]))) > .model-card {
    flex-direction: row;
    align-items: flex-start;
    gap: clamp(16px, 2.4vw, 32px);
  }

  :where(.model-grid > :nth-child(odd of :not([hidden])):nth-last-child(1 of :not([hidden])) > .model-card) > .model-card__media {
    flex: 0 0 calc((100% - clamp(16px, 2.4vw, 32px)) / 2);
    min-width: 0;
  }

  :where(.model-grid > :nth-child(odd of :not([hidden])):nth-last-child(1 of :not([hidden])) > .model-card) > .model-card__body {
    flex: 1 1 0;
    min-width: 0;
    padding-top: 0;
  }
}

@media (prefers-reduced-motion: no-preference) {
  .model-card__media .stage__media > svg,
  .model-card__media .stage__media > img {
    transition: transform .6s var(--ease);
  }
  .model-card__media:hover .stage__media > svg,
  .model-card__media:hover .stage__media > img {
    transform: scale(1.03);
  }
}


/* --------------------------------------------------------------------------
   15 Dados-chave (<dl class="keyspecs">)
   -------------------------------------------------------------------------- */
.keyspecs {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: minmax(0, 1fr);
  margin: 0;
  border-top: 1px solid var(--rule-strong);
  border-bottom: 1px solid var(--rule);
}

/* Rótulo no topo, valor na base: se um rótulo quebra em duas linhas, os valores
   da mesma fileira continuam alinhados. (Variantes em linha usam display: flex.) */
.keyspec {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-content: space-between;
  min-width: 0;
  padding: 14px 12px 14px 0;
}

.keyspec + .keyspec {
  padding-left: 14px;
  border-left: 1px solid var(--rule);
}

.keyspec__label {
  color: var(--fg-3);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  line-height: 1.35;
  letter-spacing: .04em;
  text-transform: uppercase;
}

.keyspec__value {
  margin: 4px 0 0;
  color: var(--fg);
  font-family: var(--font-mono);
  font-size: 1.125rem;
  font-weight: 500;
  line-height: 1.25;
  font-variant-numeric: tabular-nums;
  overflow-wrap: break-word;
}

/* Quatro ou mais dados: grade 2 × 2 em qualquer largura (quatro colunas não
   cabem rótulos como "COMPRIMENTO ÚTIL" nem valores como "2.500 mm") */
.keyspecs:has(> .keyspec:nth-child(4)) {
  grid-auto-flow: row;
  grid-template-columns: repeat(2, minmax(0, 1fr));
}
.keyspecs:has(> .keyspec:nth-child(4)) > .keyspec:nth-child(odd) {
  padding-left: 0;
  border-left: 0;
}
.keyspecs:has(> .keyspec:nth-child(4)) > .keyspec:nth-child(n+3) {
  border-top: 1px solid var(--rule);
}

/* Cartões estreitos: dados em linhas (rótulo à esquerda, valor à direita).
   Vale dentro do contêiner mais próximo com container-type: inline-size
   (.model-card__body, .lineup__body, .config-summary; nas páginas, os painéis
   que mostram .keyspecs). Não ponha container-type no .glass em geral: a
   contenção de largura zera caixas de vidro que se ajustam ao conteúdo. */
@container (max-width: 20rem) {
  .keyspecs {
    grid-auto-flow: row;
    grid-template-columns: minmax(0, 1fr);
  }
  .keyspecs:has(> .keyspec:nth-child(4)) {
    grid-template-columns: minmax(0, 1fr);
  }
  .keyspec,
  .keyspec + .keyspec {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    padding: 9px 0;
    border-left: 0;
  }
  .keyspec + .keyspec {
    border-top: 1px solid var(--rule);
  }
  .keyspec__value {
    margin: 0;
    text-align: right;
  }
}


/* --------------------------------------------------------------------------
   16 Ficha técnica
   -------------------------------------------------------------------------- */
.spec-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(32px, 4vw, 48px) clamp(32px, 5vw, 72px);
  align-items: start;
}

@media (min-width: 900px) {
  .spec-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.spec-block {
  min-width: 0;
}

.spec-grid > .spec-block + .spec-block {
  margin-top: 0;
}

.spec-grid > .note,
.spec-grid > p {
  grid-column: 1 / -1;
  margin-top: 0;
}

.spec-block + .spec-block {
  margin-top: clamp(32px, 4vw, 48px);
}

.spec-block__title {
  padding-bottom: 12px;
  border-bottom: 1px solid var(--fg);
  color: var(--fg);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.spec-table {
  width: 100%;
  border-collapse: collapse;
  font-size: .9375rem;
}

.spec-table th,
.spec-table td {
  padding: 14px 0;
  border-bottom: 1px solid var(--rule);
  text-align: left;
  vertical-align: top;
}

.spec-table th {
  width: 52%;
  padding-right: 16px;
  color: var(--fg);
  font-weight: 600;
  line-height: 1.4;
}

.spec-table td {
  color: var(--fg);
  line-height: 1.45;
  overflow-wrap: anywhere;
}

.spec-table td.mono,
.spec-table .mono {
  font-size: .9375rem;
}

.spec-table__def {
  display: block;
  max-width: 46ch;
  margin-top: 4px;
  color: var(--fg-3);
  font-size: .8125rem;
  font-weight: 400;
  line-height: 1.45;
}

@media (min-width: 600px) {
  .spec-table th { width: 58%; }
}

/* Nota curta com barra de acento */
.note {
  max-width: 64ch;
  margin-top: 16px;
  padding-left: 12px;
  border-left: 2px solid var(--accent-fg);
  color: var(--fg-3);
  font-size: .8125rem;
  line-height: 1.5;
}


/* --------------------------------------------------------------------------
   17 Detalhes de engenharia: hotspots + lista equivalente (conceito B)
   -------------------------------------------------------------------------- */
.hotspot-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(28px, 4vw, 56px);
  align-items: start;
}

@media (min-width: 900px) {
  .hotspot-layout { grid-template-columns: minmax(0, 8fr) minmax(0, 4fr); }
}

.hotspot-figure {
  position: relative;
  margin: 0;
}

/* O palco do figure segue o viewBox 3:2 para que as âncoras (%) coincidam */
:where(.hotspot-figure) > .stage {
  aspect-ratio: 3 / 2;
}

.hotspot-layer {
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
}

.hotspot-layer .hotspot {
  pointer-events: auto;
}

/* Área de toque 44 × 44 centrada no ponto (defina apenas left/top, em % ou px).
   Cores por variáveis --hs-*: o padrão é o escuro (palco, estúdio escuro); a
   variante clara vale em .stage--light, .hotspot-figure--light e nas cenas
   claras (§26.2, onde as --hs-* seguem o data-look da cena ao vivo). */
.hotspot {
  --hs-color: var(--accent-on-dark);
  --hs-halo: rgba(127, 178, 240, .28);
  --hs-halo-hover: rgba(127, 178, 240, .34);
  --hs-sep: rgba(7, 18, 43, .55);
  --hs-active-fill: var(--stage-ink);
  --hs-focus-sep: var(--stage);
  --hs-index-bg: rgba(7, 18, 43, .78);
  --hs-index-fg: var(--stage-ink);
  position: absolute;
  z-index: 2;
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  margin: -22px 0 0 -22px;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 50%;
  color: var(--hs-color);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  --focus: var(--hs-color);
}

.hotspot::before {
  content: "";
  width: 14px;
  height: 14px;
  background-color: currentColor;
  border-radius: 50%;
  box-shadow:
    0 0 0 4px var(--hs-halo),
    0 0 0 5px var(--hs-sep);
}

/* O motor 3D (studio3d.js) põe um span.hotspot__dot vazio dentro do botão:
   ponto desenhado e span dividem a única célula da grade, sem deslocar o
   ponto da âncora nem do alvo de 44 px */
.hotspot::before,
.hotspot > .hotspot__dot {
  grid-area: 1 / 1;
}

.hotspot::after {
  content: "";
  position: absolute;
  inset: 8px;
  border: 1.5px solid currentColor;
  border-radius: 50%;
  opacity: 0;
  pointer-events: none;
}

.hotspot:hover::before {
  box-shadow:
    0 0 0 6px var(--hs-halo-hover),
    0 0 0 7px var(--hs-sep);
}

.hotspot.is-active::before,
.hotspot[aria-pressed="true"]::before,
.hotspot[aria-expanded="true"]::before {
  background-color: var(--hs-active-fill);
  box-shadow:
    0 0 0 3px var(--hs-color),
    0 0 0 9px var(--hs-halo);
}

/* Anel de foco em dois tons sobre a imagem: acento por dentro, faixa do fundo
   por fora. Um dos dois tem contraste ≥ 3:1 tanto no metal claro quanto no fundo. */
.hotspot:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 0;
  box-shadow: 0 0 0 4px var(--hs-focus-sep);
}

.hotspot__index {
  position: absolute;
  top: -4px;
  left: calc(100% - 8px);
  padding: 1px 6px;
  background-color: var(--hs-index-bg);
  border-radius: var(--radius-pill);
  color: var(--hs-index-fg);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .02em;
  pointer-events: none;
}

/* Rótulo opcional ao lado do ponto: aparece no hover, no foco e no ativo (o
   texto continua no nome acessível mesmo invisível). Escuro: --stage-ink sobre
   o marinho a 78 % ≥ 8,8:1 mesmo sobre branco; claro: papel sobre tinta. */
.hotspot__label {
  position: absolute;
  top: 50%;
  left: calc(100% + 2px);
  padding: 4px 10px;
  background-color: var(--hs-index-bg);
  border-radius: var(--radius-pill);
  color: var(--hs-index-fg);
  font-size: .75rem;
  font-weight: 600;
  line-height: 1.3;
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
  transform: translate(-4px, -50%);
}

.hotspot:hover .hotspot__label,
.hotspot:focus-visible .hotspot__label,
.hotspot.is-active .hotspot__label,
.hotspot[aria-pressed="true"] .hotspot__label,
.hotspot[aria-expanded="true"] .hotspot__label {
  opacity: 1;
  transform: translate(0, -50%);
}

/* Ponto perto da borda direita: número e rótulo à esquerda, sem corte */
.hotspot--flip .hotspot__index {
  left: auto;
  right: calc(100% - 8px);
}

.hotspot--flip .hotspot__label {
  left: auto;
  right: calc(100% + 2px);
  transform: translate(4px, -50%);
}

.hotspot--flip:hover .hotspot__label,
.hotspot--flip:focus-visible .hotspot__label,
.hotspot--flip.is-active .hotspot__label,
.hotspot--flip[aria-pressed="true"] .hotspot__label,
.hotspot--flip[aria-expanded="true"] .hotspot__label {
  transform: translate(0, -50%);
}

/* Hotspots sobre fundo claro: anel --brand-blue (8,0:1 no branco) */
.stage--light .hotspot,
.hotspot-figure--light .hotspot {
  --hs-color: var(--accent);
  --hs-halo: rgba(0, 79, 158, .2);
  --hs-halo-hover: rgba(0, 79, 158, .28);
  --hs-sep: rgba(244, 247, 252, .9);
  --hs-active-fill: var(--paper);
  --hs-focus-sep: var(--paper);
  --hs-index-bg: var(--ink);
  --hs-index-fg: var(--paper);
}

@media (prefers-reduced-motion: no-preference) {
  .hotspot::before {
    transition: box-shadow .25s var(--ease), background-color .25s var(--ease);
  }
  .hotspot__label {
    transition: opacity var(--dur-1) var(--ease-out), transform var(--dur-2) var(--ease-out);
  }
  .hotspot::after {
    animation: evm-pulse 2.6s var(--ease) .8s 3;
  }
  .hotspot.is-active::after {
    animation: none;
  }
}

/* Lista equivalente: sempre visível, para teclado e leitores de tela */
.detail-list {
  margin: 0;
  padding: 0;
  list-style: none;
  border-top: 1px solid var(--rule-strong);
}

.detail-item {
  position: relative;
  border-bottom: 1px solid var(--rule);
}

.detail-item::before {
  content: "";
  position: absolute;
  top: -1px;
  bottom: -1px;
  left: 0;
  width: 2px;
  background-color: var(--accent-fg);
  opacity: 0;
}

.detail-item.is-active::before {
  opacity: 1;
}

.detail-item__btn {
  display: flex;
  align-items: baseline;
  gap: 14px;
  width: 100%;
  min-height: 52px;
  margin: 0;
  padding: 14px 12px 6px 16px;
  background: transparent;
  border: 0;
  border-radius: 0;
  color: var(--fg);
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.35;
  text-align: left;
  -webkit-tap-highlight-color: transparent;
}

.detail-item__btn:hover {
  background-color: var(--hover);
}

.detail-item__btn:focus-visible {
  outline-offset: -2px;
}

.detail-item__num {
  flex: none;
  min-width: 1.75rem;
  color: var(--accent-fg);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  letter-spacing: .04em;
}

.detail-item__title {
  min-width: 0;
}

.detail-item__text {
  padding: 0 12px 16px calc(16px + 1.75rem + 14px);
  color: var(--fg-2);
  font-size: .9375rem;
  line-height: 1.55;
}

.detail-item.is-active .detail-item__btn {
  color: var(--fg);
}

.detail-item.is-active .detail-item__text {
  color: var(--fg);
}

@media (prefers-reduced-motion: no-preference) {
  .detail-item::before {
    transform: scaleY(0);
    transform-origin: top center;
    transition: transform .3s var(--ease), opacity .2s var(--ease);
  }
  .detail-item.is-active::before {
    transform: scaleY(1);
  }
}


/* --------------------------------------------------------------------------
   18 Etapas, recursos e checklist
   -------------------------------------------------------------------------- */
.steps {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(32px, 4vw, 48px);
  margin: 0;
  padding: 0;
  list-style: none;
}

.step {
  display: grid;
  align-content: start;
  gap: 10px;
  min-width: 0;
  padding-top: 18px;
  border-top: 1px solid var(--rule-strong);
}

.step__num {
  color: var(--accent-fg);
  font-family: var(--font-mono);
  font-size: .8125rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .04em;
}

.step__title {
  color: var(--fg);
  font-size: 1.1875rem;
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: -0.01em;
}

.step__text {
  max-width: 52ch;
  color: var(--fg-2);
}

.step__media {
  min-width: 0;
  margin-top: 8px;
}

/* Etapas em linha (≥ 900): todas lado a lado */
@media (min-width: 900px) {
  .steps--row {
    grid-auto-columns: minmax(0, 1fr);
    grid-auto-flow: column;
  }
}

/* Etapas em grade: 2 colunas (≥ 600), 4 colunas (≥ 1200) */
@media (min-width: 600px) {
  .steps--grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1200px) {
  .steps--grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* Linha do tempo (≥ 900): texto e foto alternando de lado */
@media (min-width: 900px) {
  .steps--timeline {
    gap: clamp(48px, 6vw, 88px);
  }

  .steps--timeline .step {
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    grid-template-rows: 1fr auto auto auto 1fr;
    column-gap: clamp(32px, 5vw, 72px);
    row-gap: 10px;
    padding-top: 28px;
  }

  .steps--timeline .step > * { grid-column: 1; }
  .steps--timeline .step__num { grid-row: 2; }
  .steps--timeline .step__title { grid-row: 3; }
  .steps--timeline .step__text { grid-row: 4; }

  .steps--timeline .step > .step__media {
    grid-column: 2;
    grid-row: 1 / 6;
    margin-top: 0;
  }

  .steps--timeline .step:nth-child(even) {
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  }

  .steps--timeline .step:nth-child(even) > * { grid-column: 2; }
  .steps--timeline .step:nth-child(even) > .step__media { grid-column: 1; }
}

/* Recursos: título + texto com filete superior */
.feature-list {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(24px, 3vw, 40px);
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (min-width: 600px) {
  .feature-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .feature-list--1 { grid-template-columns: minmax(0, 1fr); }
}

@media (min-width: 900px) {
  .feature-list--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .feature-list--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

.feature {
  display: grid;
  align-content: start;
  gap: 8px;
  min-width: 0;
  padding-top: 16px;
  border-top: 1px solid var(--rule-strong);
}

.feature__title,
.feature > h3,
.feature > h4 {
  color: var(--fg);
  font-size: 1.125rem;
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: -0.01em;
}

.feature__text,
.feature > p {
  color: var(--fg-2);
}

/* Checklist com marcadores quadrados de acento */
.checklist {
  display: grid;
  gap: 12px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.checklist > li {
  position: relative;
  padding-left: 22px;
  color: var(--fg);
}

.checklist > li::before {
  content: "";
  position: absolute;
  top: .62em;
  left: 0;
  width: 8px;
  height: 8px;
  background-color: var(--accent-fg);
}

.checklist > li strong {
  display: block;
  color: var(--fg);
}

.checklist > li span,
.checklist > li p {
  color: var(--fg-2);
}

@media (min-width: 600px) {
  .checklist--cols { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 32px; row-gap: 20px; }
}
@media (min-width: 900px) {
  .checklist--cols { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}


/* --------------------------------------------------------------------------
   19 Formulário de orçamento
   -------------------------------------------------------------------------- */
.quote {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(32px, 4vw, 56px);
  align-items: start;
}

@media (min-width: 900px) {
  .quote { grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); }
}

/* ≥ 900 (tela): resumo fixo ao rolar, mas nunca mais alto que a janela. Se não
   couber, a coluna rola por dentro (o foco de teclado a rola até o botão), e o
   resumo tem altura máxima para os botões de envio ficarem à vista. O recuo
   lateral de 6 px (compensado pela margem negativa) evita cortar o anel de foco. */
@media screen and (min-width: 900px) {
  .quote__aside {
    position: sticky;
    top: calc(var(--header-h) + 24px);
    max-height: calc(100vh - var(--header-h) - 48px);
    max-height: calc(100dvh - var(--header-h) - 48px);
    margin-inline: -6px;
    padding-inline: 6px;
    padding-bottom: 6px;
    overflow-y: auto;
    scroll-padding-block: 8px;
  }

  .quote__aside .summary {
    max-height: min(22rem, 40vh);
    max-height: min(22rem, 40dvh);
    overflow-y: auto;
  }
}

.quote__aside {
  display: grid;
  gap: 16px;
  min-width: 0;
}

.quote-form {
  display: grid;
  gap: 24px;
  min-width: 0;
}

.field {
  display: grid;
  align-content: start;
  gap: 8px;
  min-width: 0;
}

.field-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 24px;
}

@media (min-width: 600px) {
  .field-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.field__label {
  color: var(--fg);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.35;
}

legend.field__label {
  margin-bottom: 10px;
}

.field__optional {
  color: var(--fg-3);
  font-size: .875rem;
  font-weight: 400;
}

.field__req {
  color: var(--accent-fg);
}

.field__hint {
  color: var(--fg-3);
  font-size: .8125rem;
  line-height: 1.45;
}

.field__error {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  color: var(--error);
  font-size: .875rem;
  font-weight: 600;
  line-height: 1.4;
}

.field__error::before {
  content: "";
  flex: none;
  width: 16px;
  height: 16px;
  margin-top: 1px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='7' fill='%23B42318'/%3E%3Cpath d='M8 4.2v4.8' stroke='%23fff' stroke-width='1.6'/%3E%3Ccircle cx='8' cy='11.4' r='1' fill='%23fff'/%3E%3C/svg%3E") center / contain no-repeat;
}

.field__error:empty {
  display: none;
}

.input,
.select,
.textarea {
  display: block;
  width: 100%;
  min-height: 48px;
  padding: 11px 14px;
  background-color: var(--field-bg);
  border: 1px solid var(--ink-3);
  border-radius: var(--radius);
  color: var(--ink);
  font-size: 1rem;
  line-height: 1.4;
  transition: border-color .18s var(--ease), box-shadow .18s var(--ease);
}

.input::placeholder,
.textarea::placeholder {
  color: var(--ink-3);
  opacity: 1;
}

.input:hover,
.select:hover,
.textarea:hover {
  border-color: var(--ink-2);
}

.input:focus-visible,
.select:focus-visible,
.textarea:focus-visible,
.input:focus,
.select:focus,
.textarea:focus {
  border-color: var(--accent);
  outline: 2px solid var(--accent);
  outline-offset: 1px;
}

.input[aria-invalid="true"],
.select[aria-invalid="true"],
.textarea[aria-invalid="true"] {
  border-color: var(--error);
  box-shadow: inset 0 0 0 1px var(--error);
}

.select {
  padding-right: 44px;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 6l4.5 4.5L12.5 6' fill='none' stroke='%233D4860' stroke-width='1.6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  background-size: 16px 16px;
  cursor: pointer;
}

.select::-ms-expand {
  display: none;
}

.textarea {
  min-height: 7.5rem;
  line-height: 1.5;
  resize: vertical;
}

/* Blocos de escolha (rádios de aplicação) */
.choice-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}

@media (min-width: 600px) {
  .choice-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 10px;
  }
}

/* 900–1099: a coluna do formulário divide espaço com o resumo; 3 blocos por linha ficariam estreitos */
@media (min-width: 900px) and (max-width: 1099.98px) {
  .quote .choice-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

.choice {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 8px;
  min-width: 0;
  min-height: 56px;
  padding: 14px 38px 14px 14px;
  background-color: var(--field-bg);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  color: var(--ink);
  line-height: 1.3;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: border-color .18s var(--ease), background-color .18s var(--ease), box-shadow .18s var(--ease);
}

/* Indicador de rádio (forma, além da cor) */
.choice::after {
  content: "";
  position: absolute;
  top: 14px;
  right: 12px;
  width: 16px;
  height: 16px;
  background-color: var(--field-bg);
  border: 1.5px solid var(--ink-3);
  border-radius: 50%;
}

.choice:hover {
  border-color: var(--ink-3);
}

.choice__body {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 8px;
  min-width: 0;
}

.choice__icon {
  display: block;
  width: 36px;
  height: 36px;
  color: var(--ink-2);
}

.choice__icon svg {
  width: 100%;
  height: 100%;
}

.choice__name {
  color: var(--ink);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.3;
}

.choice__hint {
  color: var(--ink-3);
  font-size: .8125rem;
  line-height: 1.4;
}

/* Estado marcado: classe aplicada pelo site.js e :has() como reforço */
.choice.is-checked {
  background-color: var(--accent-tint);
  border-color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--accent);
}

.choice:has(input:checked) {
  background-color: var(--accent-tint);
  border-color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--accent);
}

.choice.is-checked::after {
  background-color: var(--paper);
  border: 5px solid var(--accent);
}

.choice:has(input:checked)::after {
  background-color: var(--paper);
  border: 5px solid var(--accent);
}

.choice.is-checked .choice__icon { color: var(--accent); }
.choice:has(input:checked) .choice__icon { color: var(--accent); }
.choice.is-checked .choice__hint { color: var(--ink-2); }
.choice:has(input:checked) .choice__hint { color: var(--ink-2); }

/* Foco de teclado visível no bloco inteiro */
.choice.has-focus {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}

.choice:has(input:focus-visible) {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}

.form-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
}

/* Resumo legível do pedido (texto do WhatsApp/e-mail) */
.summary__title {
  color: var(--fg);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.summary {
  min-height: 10rem;
  margin: 0;
  padding: 18px 20px 20px;
  background-color: var(--paper-0);
  border: 1px solid var(--line);
  border-top: 2px solid var(--ink);
  border-radius: var(--radius);
  color: var(--ink);
  font-family: var(--font-mono);
  font-size: .8125rem;
  line-height: 1.7;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}

.form-status {
  min-height: 1.5em;
  color: var(--fg-2);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.5;
}

.form-status:empty {
  min-height: 0;
}

.form-status.is-ok { color: var(--ok); }
.form-status.is-error { color: var(--error); }
.form-status.is-info { color: var(--ink-2); }


/* --------------------------------------------------------------------------
   20 Trilha, depoimento, abas de vista, selo
   -------------------------------------------------------------------------- */
.breadcrumb {
  color: var(--fg-2);
  font-size: .8125rem;
  line-height: 1.4;
}

/* Links com 44 px de altura; a margem negativa mantém a trilha com a altura visual de antes */
.breadcrumb ol {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  margin: -4px 0;
  padding: 0;
  list-style: none;
}

.breadcrumb li {
  display: inline-flex;
  align-items: center;
  min-width: 0;
}

.breadcrumb li + li::before {
  content: "";
  flex: none;
  width: 6px;
  height: 6px;
  margin: 0 12px 0 8px;
  border-top: 1px solid currentColor;
  border-right: 1px solid currentColor;
  color: var(--fg-3);
  transform: rotate(45deg);
}

.breadcrumb a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--fg-2);
  text-decoration: none;
}

.breadcrumb a:hover {
  color: var(--accent-fg);
  text-decoration: underline;
}

.breadcrumb [aria-current="page"] {
  color: var(--fg);
  font-weight: 600;
}

/* Depoimento (placeholder honesto até haver autorização) */
.testimonial {
  position: relative;
  display: grid;
  gap: 16px;
  margin: 0;
  padding: clamp(24px, 4vw, 40px);
  background-color: var(--paper-0);
  border: 1px dashed var(--line);
  border-radius: var(--radius-lg);
  color: var(--ink);
  --fg: var(--ink);
  --fg-2: var(--ink-2);
  --fg-3: var(--ink-3);
  --fg-title: var(--brand-navy);
  --fg-title-accent: var(--brand-blue);
}

.testimonial::before {
  content: "\201C";
  display: block;
  height: .42em;
  color: var(--accent);
  font-family: var(--font-sans);
  font-size: 4.5rem;
  font-weight: 300;
  line-height: .9;
}

.testimonial__quote,
.testimonial blockquote {
  margin: 0;
  color: var(--ink);
  font-size: clamp(1.125rem, .8vw + 1rem, 1.375rem);
  font-weight: 500;
  line-height: 1.45;
}

.testimonial__meta,
.testimonial figcaption {
  color: var(--ink-3);
  font-family: var(--font-mono);
  font-size: .75rem;
  line-height: 1.5;
  letter-spacing: .04em;
}

.testimonial__tag {
  justify-self: start;
}

/* Abas de vista (segmentado) */
.view-switch {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  max-width: 100%;
  padding: 4px;
  background-color: var(--paper-2);
  border: 1px solid var(--line-soft);
  border-radius: calc(var(--radius) + 4px);   /* abas com --radius + 4 px de folga */
}

/* ≥ 600: largura do conteúdo. Continua em bloco (não inline-flex) para não somar
   o vão da linha de texto sob as abas. */
@media (min-width: 600px) {
  .view-switch {
    width: -moz-fit-content;
    width: fit-content;
  }
}

.view-switch [role="tab"],
.view-switch__btn {
  position: relative;
  display: inline-flex;
  flex: 1 1 auto;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 6px clamp(10px, 2vw, 16px);
  background: transparent;
  border: 0;
  border-radius: var(--radius);
  color: var(--ink-2);
  font-size: .8125rem;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
}

/* Telas estreitas (360–399): três abas cabem numa linha */
@media (max-width: 399.98px) {
  .view-switch [role="tab"],
  .view-switch__btn {
    padding-inline: 8px;
    font-size: .78125rem;
  }
}

.view-switch [role="tab"]:hover,
.view-switch__btn:hover {
  background-color: var(--paper-3);
  color: var(--ink);
}

/* Aba ativa preenchida em tinta (≈ 14:1): legível sem depender de matiz */
.view-switch [role="tab"][aria-selected="true"],
.view-switch__btn[aria-selected="true"] {
  background-color: var(--ink);
  box-shadow: none;
  color: var(--paper);
}

/* Marca inferior de acento na aba ativa */
.view-switch [role="tab"][aria-selected="true"]::after,
.view-switch__btn[aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 12px;
  right: 12px;
  bottom: 5px;
  height: 2px;
  background-color: var(--accent-on-dark);
}

/* Anel de foco por cima das abas vizinhas (também na aba ativa preenchida) */
.view-switch [role="tab"]:focus-visible,
.view-switch__btn:focus-visible {
  z-index: 1;
  outline-offset: 1px;
}

/* Selo */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  border: 1px solid var(--rule-strong);
  border-radius: var(--radius-pill);
  color: var(--fg-2);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: .08em;
  text-transform: uppercase;
  white-space: nowrap;
}

.badge--accent {
  border-color: currentColor;
  color: var(--accent-fg);
}

.badge--solid {
  background-color: var(--ink);
  border-color: var(--ink);
  color: var(--paper);
}

/* Selos de origem v2.1 (.badge--photo "Fotografia real EVM" e .badge--study,
   v2.6 "Representação 3D" / desenhos "Desenho ilustrativo · sem escala"):
   ver §27.1. */


/* --------------------------------------------------------------------------
   21 Faixa de chamada (callout) — faixa da marca (marinho) com título e botões
   -------------------------------------------------------------------------- */
/* Fundo oficial da marca com brilho lateral discreto no azul da marca (45 %).
   Pior caso (pico do brilho ≈ #013585): --stage-ink 10,6:1 · --stage-muted 5,8:1 ·
   --accent-on-dark 5,1:1 · contorno de .btn--on-dark 4,8:1. Mantém os tokens
   escuros de contexto; --bg passa a ser o marinho. */
/* v2: painel arredondado (--radius-lg) recuado 12 px das bordas da janela,
   como a pílula do cabeçalho; o conteúdo continua no .container interno. */
.callout {
  --callout-pad: clamp(56px, 8vw, 104px);
  --bg: var(--brand-navy);
  position: relative;
  overflow: hidden;
  isolation: isolate;
  margin-inline: 12px;
  padding-block: var(--callout-pad);
  background-color: var(--brand-navy);
  background-image: radial-gradient(90% 140% at 0% 50%, rgba(0, 79, 158, .45) 0%, rgba(0, 79, 158, 0) 62%);
  border-radius: var(--radius-lg);
  color: var(--stage-ink);
}

/* Último bloco antes do rodapé: folga para os cantos arredondados */
.callout:last-child {
  margin-bottom: 12px;
}

/* Linha de piso no meio do respiro inferior: sempre abaixo do conteúdo e dos
   botões (o .btn--on-dark é transparente), em qualquer largura */
.callout::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: calc(var(--callout-pad) / 2);
  z-index: -1;
  height: 1px;
  background: linear-gradient(90deg, rgba(244, 247, 252, .14) 0%, rgba(244, 247, 252, .05) 50%, rgba(244, 247, 252, 0) 100%);
  pointer-events: none;
}

.callout__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-items: end;
  gap: 28px;
}

@media (min-width: 900px) {
  .callout__inner {
    grid-template-columns: minmax(0, 1.5fr) auto;
    gap: 48px;
  }
}

.callout__content {
  display: grid;
  gap: 14px;
}

/* Cores pelos tokens de contexto (.callout já os define no escuro; a impressão os troca) */
.callout__title {
  max-width: 20ch;
  color: var(--fg);
}

.callout__text {
  max-width: 52ch;
  color: var(--fg-2);
  font-size: 1.0625rem;
}

.callout .btn-row {
  gap: 12px;
}

/* < 900: botões com a mesma largura — empilhados de ponta a ponta no celular,
   lado a lado em 600–899. (≥ 900 a coluna é auto e os botões ficam no tamanho natural.) */
@media (max-width: 899.98px) {
  .callout .btn-row .btn {
    flex: 1 1 14rem;
  }
}


/* --------------------------------------------------------------------------
   22 FAQ (details/summary)
   -------------------------------------------------------------------------- */
.faq {
  border-top: 1px solid var(--rule-strong);
}

details {
  border-bottom: 1px solid var(--rule);
}

details > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  min-height: 44px;
  padding: 18px 0;
  color: var(--fg);
  font-size: 1.0625rem;
  font-weight: 600;
  line-height: 1.4;
  list-style: none;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

details > summary::-webkit-details-marker {
  display: none;
}

details > summary::marker {
  content: "";
}

/* Sinal de + / − desenhado */
details > summary::after {
  content: "";
  flex: none;
  width: 14px;
  height: 14px;
  background:
    linear-gradient(var(--accent-fg), var(--accent-fg)) center / 14px 1.5px no-repeat,
    linear-gradient(var(--accent-fg), var(--accent-fg)) center / 1.5px 14px no-repeat;
}

details[open] > summary::after {
  background:
    linear-gradient(var(--accent-fg), var(--accent-fg)) center / 14px 1.5px no-repeat;
}

details > summary:hover {
  color: var(--accent-fg);
}

details > summary:focus-visible {
  outline-offset: 2px;
}

details > :not(summary) {
  max-width: 68ch;
  padding-bottom: 20px;
  color: var(--fg-2);
}


/* --------------------------------------------------------------------------
   26 Componentes 3D (v2 · DESIGN-SYSTEM §3)
   26.1 Vidro (.glass)                   26.6 Aplicações (.usecase)
   26.2 Cena (.scene)                    26.7 Linha de modelos (.lineup)
   26.3 Controles da cena                26.8 Barra de comparação (.compare-bar)
   26.4 Herói 3D (.hero3d)               26.9 Tabela comparativa (.compare-table)
   26.5 Rolagem guiada (.story)          26.10 Configurador (.configurator)
   Fica antes das seções 23–25 no arquivo: movimento reduzido, impressão e
   cores forçadas continuam valendo por cima destes componentes.
   -------------------------------------------------------------------------- */

/* 26.1 Vidro ---------------------------------------------------------------
   Painéis flutuantes sobre o 3D. Os tokens de contexto são remapeados para
   manter AA no pior fundo possível atrás do vidro.
   .glass (--glass, 72 %): pior caso sobre --stage ≈ #BABDC4 → --ink 9,1:1 ·
   --ink-2 4,8:1 · --brand-navy 7,7:1 (o --accent cairia para 4,3:1 e o
   --ink-3 para 3,3:1, por isso --fg-3 → --ink-2 e --accent-fg → --brand-navy).
   .glass--dark (--glass-dark-strong, 84 %): pior caso sobre branco ≈ #2F384D →
   --stage-ink 10,9:1 · --stage-muted 5,9:1 · --accent-on-dark 5,3:1.
   (--glass-dark, 62 %, fica para superfícies sem texto: sobre branco o
   --stage-muted cairia para 2,7:1.) */
.glass,
.story__chapter,
.story__intro {
  --fg: var(--ink);
  --fg-2: var(--ink-2);
  --fg-3: var(--ink-2);
  --fg-title: var(--brand-navy);          /* 7,7:1 no pior caso do vidro */
  --fg-title-accent: var(--brand-blue);   /* 4,3:1 no pior caso: só em título grande (≥ 24 px) */
  --accent-fg: var(--brand-navy);
  --accent-fg-hover: var(--ink);
  --rule: var(--glass-border);
  --rule-strong: rgba(1, 32, 112, .18);
  --focus: var(--accent);
  --hover: rgba(1, 32, 112, .06);
  background-color: var(--glass);
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-float);
  color: var(--ink);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  backdrop-filter: blur(14px) saturate(140%);
}

.glass--dark,
.story__chapter,
.story__intro {
  --fg: var(--stage-ink);
  --fg-2: var(--stage-muted);
  --fg-3: var(--stage-muted);
  --fg-title: var(--stage-ink);
  --fg-title-accent: var(--accent-on-dark);
  --bg: var(--stage);
  --rule: var(--glass-border-dark);
  --rule-strong: rgba(244, 247, 252, .26);
  --accent-fg: var(--accent-on-dark);
  --accent-fg-hover: var(--accent-on-dark-hover);
  --focus: var(--accent-on-dark);
  --hover: rgba(244, 247, 252, .08);
  --btn-primary-bg: var(--brand-white);
  --btn-primary-fg: var(--brand-navy);
  --btn-primary-hover-bg: var(--paper-3);
  --btn-secondary-hover-bg: rgba(127, 178, 240, .16);
  background-color: var(--glass-dark-strong);
  border-color: var(--glass-border-dark);
  box-shadow: 0 24px 48px -24px rgba(4, 10, 28, .6);
  color: var(--stage-ink);
}

@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
  .glass {
    background-color: var(--paper);
  }

  .glass--dark,
  .story__chapter,
  .story__intro {
    background-color: var(--stage);
  }
}


/* 26.2 Cena (.scene) ---------------------------------------------------------
   Contêiner do canvas 3D com pôster SVG imediato (DESIGN-SYSTEM §3.2).
   Camadas: estúdio claro (no próprio .scene) · estúdio escuro (::before, entra
   por opacidade em 640 ms) · 1 pôster · 2 canvas e, logo depois dele no
   código, a superfície de arraste do motor (.scene__surface, só nas cenas
   interativas) · 3 hotspots · 4 controles e nota · 5 barra de carregamento
   (::after).
   Estados (o motor troca): sem classe = pôster · .is-poster · .is-loading ·
   .is-ready (canvas entra em 400 ms; o pôster sai quando .is-poster é removido)
   · .is-fallback (WebGL/CDN indisponível: pôster fica).
   Visual: .scene--light (padrão) · .scene--dark · [data-look="light|dark"]
   (setLook do motor; vale mais que as classes).
   Forma: padrão 3:2 arredondado · .scene--card 4:3 · .scene--fill ocupa o pai
   posicionado (herói, palco fixo da rolagem).
   O canvas deve ser transparente (alpha) para o gradiente do estúdio aparecer.
   v2.1 (§8.2): o estúdio claro é o de "estudo técnico" — gradiente vertical
   --study-light-top (#F3F5F9) → --study-light-bottom (#FFFFFF); o piso
   quadriculado é do motor. Selo obrigatório: .badge--study (§27.1) como filho
   do .scene (ex.: .badge--study.badge--overlay), visível em todos os estados.
   As cores dependentes do estúdio ficam em --scene-* e são herdadas por
   hotspots, controles e nota. */
.scene {
  --scene-ink: var(--ink);
  --scene-muted: var(--ink-2);
  --scene-accent: var(--accent);
  --scene-glass: var(--glass-strong);
  --scene-glass-border: var(--glass-border);
  --scene-hover: rgba(1, 32, 112, .07);
  --scene-on-bg: var(--brand-navy);
  --scene-on-fg: var(--brand-white);
  --scene-track: rgba(1, 32, 112, .10);
  --scene-halo: rgba(0, 79, 158, .2);
  --scene-halo-hover: rgba(0, 79, 158, .28);
  --scene-sep: rgba(244, 247, 252, .9);
  --scene-dot-active: var(--paper);
  --scene-focus-sep: var(--paper);
  --scene-tag-bg: var(--ink);
  --scene-tag-fg: var(--paper);
  --focus: var(--accent);
  position: relative;
  display: block;
  overflow: hidden;
  isolation: isolate;
  aspect-ratio: 3 / 2;
  background-color: var(--study-light-bottom);
  background-image: linear-gradient(180deg, var(--study-light-top) 0%, var(--study-light-bottom) 100%);
  border-radius: var(--radius-lg);
  color: var(--scene-ink);
  transition: background-color var(--dur-3) var(--ease-in-out);
}

/* Estúdio escuro: marinho profundo com luz fria à esquerda */
.scene::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background-color: var(--stage);
  background-image:
    radial-gradient(80% 70% at 12% 18%, rgba(27, 51, 102, .7) 0%, rgba(27, 51, 102, 0) 70%),
    linear-gradient(180deg, var(--stage) 0%, var(--stage-2) 100%);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--dur-3) var(--ease-in-out);
}

.scene--light,
.scene[data-look="light"] {
  --scene-ink: var(--ink);
  --scene-muted: var(--ink-2);
  --scene-accent: var(--accent);
  --scene-glass: var(--glass-strong);
  --scene-glass-border: var(--glass-border);
  --scene-hover: rgba(1, 32, 112, .07);
  --scene-on-bg: var(--brand-navy);
  --scene-on-fg: var(--brand-white);
  --scene-track: rgba(1, 32, 112, .10);
  --scene-halo: rgba(0, 79, 158, .2);
  --scene-halo-hover: rgba(0, 79, 158, .28);
  --scene-sep: rgba(244, 247, 252, .9);
  --scene-dot-active: var(--paper);
  --scene-focus-sep: var(--paper);
  --scene-tag-bg: var(--ink);
  --scene-tag-fg: var(--paper);
  --focus: var(--accent);
  background-color: var(--study-light-bottom);   /* o gradiente do estudo vem do .scene */
}

.scene--dark,
.scene[data-look="dark"] {
  --scene-ink: var(--stage-ink);
  --scene-muted: var(--stage-muted);
  --scene-accent: var(--accent-on-dark);
  --scene-glass: var(--glass-dark-strong);
  --scene-glass-border: var(--glass-border-dark);
  --scene-hover: rgba(244, 247, 252, .10);
  --scene-on-bg: var(--stage-ink);
  --scene-on-fg: var(--brand-navy);
  --scene-track: rgba(244, 247, 252, .14);
  --scene-halo: rgba(127, 178, 240, .28);
  --scene-halo-hover: rgba(127, 178, 240, .34);
  --scene-sep: rgba(7, 18, 43, .55);
  --scene-dot-active: var(--stage-ink);
  --scene-focus-sep: var(--stage);
  --scene-tag-bg: rgba(7, 18, 43, .78);
  --scene-tag-fg: var(--stage-ink);
  --focus: var(--accent-on-dark);
  background-color: var(--stage);
}

/* data-look (setLook do motor) prevalece sobre a classe inicial: nas listas
   acima ele casa com especificidade maior que .scene--light/.scene--dark */
.scene--dark::before,
.scene[data-look="dark"]::before {
  opacity: 1;
}

.scene[data-look="light"]::before {
  opacity: 0;
}

/* v2.2 — mistura contínua do estúdio (motor 2.2: setLookMix / setLook). Com
   o 3D montado (.is-ready), o motor escreve --look-mix (0 claro … 1 escuro) no
   style da .scene a cada quadro da transição: o fundo escuro acompanha a luz
   da cena sem a troca em degrau do data-look (que vira em 0,5). Sem transição
   CSS aqui — o motor já amortece. Sem o 3D (pôster, falha, liberado), valem as
   regras de data-look acima. */
.scene.is-ready[style*="--look-mix"]::before {
  opacity: var(--look-mix, 0);
  transition: none;
}

.scene__poster,
.scene__canvas,
.scene__hotspots {
  position: absolute;
  inset: 0;
}

.scene__poster {
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: opacity var(--dur-3) var(--ease-out), visibility 0s linear 0s;
}

.scene__poster > svg,
.scene__poster > img {
  width: 100%;
  height: 100%;
  object-fit: contain;
}

/* O canvas é decorativo (aria-hidden) e não recebe ponteiro: o arraste vai
   para a .scene__surface; sem ela, o toque segue para a página */
.scene__canvas {
  z-index: 2;
  opacity: 0;
  pointer-events: none;
  transition: opacity 400ms var(--ease-out);
}

.scene__canvas > canvas {
  display: block;
  width: 100%;
  height: 100%;
  outline: none;
}

.scene.is-ready .scene__canvas {
  opacity: 1;
}

/* O motor só remove .is-poster depois do primeiro frame desenhado */
.scene.is-ready:not(.is-poster) .scene__poster {
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--dur-3) var(--ease-out), visibility 0s linear var(--dur-3);
}

.scene.is-fallback .scene__canvas {
  display: none;
}

/* Superfície de arraste e teclado (OrbitControls) criada pelo motor nas cenas
   interativas: div.scene__surface (role="application", tabindex="0") inserida
   logo depois do .scene__canvas. Mesmo z-index do canvas e depois dele no
   código: fica por cima do canvas e abaixo dos hotspots (3), dos controles e
   da nota (4). touch-action pan-y: o gesto vertical rola a página, o
   horizontal gira e a pinça aproxima (o motor também o põe no style). */
.scene__surface {
  position: absolute;
  inset: 0;
  z-index: 2;
  cursor: grab;
  touch-action: pan-y;
  -webkit-tap-highlight-color: transparent;
}

.scene__surface:active {
  cursor: grabbing;
}

/* Anel por dentro da cena (o .scene corta o que passa da borda); a cor segue o
   estúdio pelo --focus da cena (claro: --accent; escuro: --accent-on-dark) */
.scene__surface:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: -4px;
}

/* Sem 3D não há o que girar */
.scene.is-fallback .scene__surface {
  display: none;
}

/* Hotspots: só com o 3D pronto (as âncoras vêm da câmera) */
.scene__hotspots {
  z-index: 3;
  pointer-events: none;
}

.scene__hotspots > * {
  pointer-events: auto;
}

.scene:not(.is-ready) .scene__hotspots {
  visibility: hidden;
}

/* Pontos de detalhe nas cenas: anel --brand-blue sobre branco (estúdio claro),
   --accent-on-dark (estúdio escuro); as cores seguem o data-look ao vivo */
.scene .hotspot {
  --hs-color: var(--scene-accent);
  --hs-halo: var(--scene-halo);
  --hs-halo-hover: var(--scene-halo-hover);
  --hs-sep: var(--scene-sep);
  --hs-active-fill: var(--scene-dot-active);
  --hs-focus-sep: var(--scene-focus-sep);
  --hs-index-bg: var(--scene-tag-bg);
  --hs-index-fg: var(--scene-tag-fg);
}

/* Barra fina de carregamento no rodapé do palco (nunca tela cheia). Parada,
   com o trecho no meio; sem movimento reduzido varre três vezes (4,2 s) e
   volta a ficar parada no meio, mesmo que o carregamento demore: nada se move
   por mais de 5 s sem poder ser pausado. */
.scene::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 5;
  height: 3px;
  background-color: var(--scene-track);
  background-image: linear-gradient(90deg, var(--scene-accent), var(--scene-accent));
  background-repeat: no-repeat;
  background-position: 50% 0;
  background-size: 34% 100%;
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--dur-2) var(--ease-out);
}

.scene.is-loading::after {
  opacity: 1;
}

@media (prefers-reduced-motion: no-preference) {
  .scene.is-loading::after {
    animation: evm-scene-load 1.4s var(--ease-in-out) 3;
  }
}

/* Nota discreta (ex.: "3D indisponível — mostrando a imagem fixa", copy3d.fallback).
   --fallback: só aparece em .is-fallback. Luz: --ink-2 sobre vidro 92 % ≥ 7,7:1;
   escuro: --stage-muted sobre vidro escuro 84 % ≥ 5,9:1. */
.scene__note {
  position: absolute;
  left: 12px;
  bottom: 12px;
  z-index: 4;
  max-width: calc(100% - 24px);
  padding: 4px 10px;
  background-color: var(--scene-glass);
  border: 1px solid var(--scene-glass-border);
  border-radius: var(--radius-pill);
  color: var(--scene-muted);
  font-family: var(--font-mono);
  font-size: .6875rem;
  line-height: 1.4;
  letter-spacing: .03em;
  pointer-events: none;
}

.scene:not(.is-fallback) .scene__note--fallback {
  display: none;
}

/* Variantes de forma */
.scene--card {
  aspect-ratio: 4 / 3;
  border-radius: var(--radius-lg);
}

.scene--fill {
  position: absolute;
  inset: 0;
  aspect-ratio: auto;
  border-radius: 0;
}


/* 26.3 Controles da cena ------------------------------------------------------
   Barra de botões redondos sobre a cena: girar, aproximar, vistas rápidas.
   Filha do .scene: canto inferior direito (padrão); --start à esquerda; --top
   no alto; --static fora da cena, no fluxo. Botões com ícone: aria-label (ou
   texto .visually-hidden) e SVG aria-hidden. Vistas: --text + aria-pressed.
   Só aparecem com o 3D pronto (sem 3D não há o que girar). */
.scene-controls {
  position: absolute;
  right: 12px;
  bottom: 12px;
  z-index: 4;
  display: flex;
  align-items: center;
  gap: 2px;
  max-width: calc(100% - 24px);
  margin: 0;
  padding: 4px;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scrollbar-width: none;
  background-color: var(--scene-glass, var(--glass-strong));
  border: 1px solid var(--scene-glass-border, var(--glass-border));
  border-radius: var(--radius-pill);
  box-shadow: var(--shadow-float);
  color: var(--scene-ink, var(--ink));
  list-style: none;
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  backdrop-filter: blur(14px) saturate(140%);
}

.scene-controls::-webkit-scrollbar {
  display: none;
}

.scene-controls--start {
  right: auto;
  left: 12px;
}

.scene-controls--top {
  top: 12px;
  bottom: auto;
}

.scene-controls--static {
  position: relative;
  top: auto;
  right: auto;
  bottom: auto;
  left: auto;
  width: -moz-fit-content;
  width: fit-content;
  max-width: 100%;
}

.scene:not(.is-ready) > .scene-controls {
  display: none;
}

.scene-controls__btn {
  position: relative;
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-width: 44px;
  min-height: 44px;
  margin: 0;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: var(--radius-pill);
  color: inherit;
  font-size: .8125rem;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
  transition: background-color var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
}

.scene-controls__btn > svg {
  flex: none;
  width: 20px;
  height: 20px;
}

.scene-controls__btn--text {
  padding-inline: 14px;
}

.scene-controls__btn:hover {
  background-color: var(--scene-hover, var(--hover));
}

.scene-controls__btn[aria-pressed="true"] {
  background-color: var(--scene-on-bg, var(--brand-navy));
  color: var(--scene-on-fg, var(--brand-white));
}

.scene-controls__btn:disabled {
  opacity: .45;
  cursor: not-allowed;
}

/* Anel por dentro da barra (que rola e cortaria o anel por fora) */
.scene-controls__btn:focus-visible {
  z-index: 1;
  outline-offset: -2px;
  box-shadow: inset 0 0 0 4px var(--scene-glass, var(--glass-strong));
}

.scene-controls__sep {
  flex: none;
  align-self: center;
  width: 1px;
  height: 24px;
  margin-inline: 4px;
  background-color: var(--scene-glass-border, var(--glass-border));
}


/* 26.4 Herói 3D (.hero3d) ------------------------------------------------------
   Tela cheia (100svh menos a faixa de protótipo), cena clara ao fundo, título
   --fs-hero no canto inferior esquerdo (7 de 12 colunas), "Role para
   explorar". < 900: cena no alto (ocupa o espaço livre) e texto abaixo, sem
   sobreposição. ≥ 900: cena atrás de tudo; o motor deve enquadrar o reboque
   à direita/acima do bloco de texto (o véu claro do canto só ajuda). Todo o
   texto usa --ink (inclusive rótulo e links): sobre o estúdio 14,4:1 e, com o
   véu a 50 % sobre a pintura marinho, ainda 5,0:1 (--ink-2 cairia a 2,7:1).
   v2.1: fundo de estudo (--study-light-*); o título (.hero-title, texto
   grande) usa --fg-title (marinho, 13:1 sobre o estudo) e o destaque
   .title-accent o azul (7,3:1); o acabamento padrão passa a galvanizado. */
.hero3d {
  --fg: var(--ink);
  --fg-2: var(--ink);
  --accent-fg: var(--ink);
  --accent-fg-hover: var(--ink);
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: calc(100vh - var(--proto-h));
  min-height: calc(100svh - var(--proto-h));
  padding-top: calc(var(--header-top) + var(--header-h) + 8px);
  padding-bottom: 64px;           /* espaço do indicador de rolagem */
  overflow: hidden;
  isolation: isolate;
  background-color: var(--study-light-bottom);
  background-image: linear-gradient(180deg, var(--study-light-top) 0%, var(--study-light-bottom) 100%);
  color: var(--ink);
}

/* < 900: a cena entra no fluxo e ocupa a altura livre acima do texto; sem
   fundo próprio, continua o gradiente do herói */
.hero3d > .scene {
  position: relative;
  inset: auto;
  z-index: 0;
  flex: 1 1 auto;
  min-height: 240px;
  aspect-ratio: auto;
  background: none;
  border-radius: 0;
}

.hero3d__content {
  position: relative;
  z-index: 2;
  display: grid;
  justify-items: start;
  gap: clamp(14px, 2vw, 22px);
  padding-top: 16px;
}

.hero3d__content > * {
  max-width: 100%;
}

.hero3d__title {
  max-width: 14ch;
}

.hero3d__lead {
  max-width: 44ch;
  color: var(--ink);
}

.hero3d__actions {
  margin-top: 4px;
}

/* "Role para explorar" (mono, com seta). Âncora para a seção seguinte. */
.hero3d__cue {
  position: absolute;
  left: 50%;
  bottom: 8px;
  z-index: 3;
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  min-width: 44px;
  min-height: 44px;
  padding: 4px 12px;
  border-radius: var(--radius-pill);
  color: var(--ink-2);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: .08em;
  text-decoration: none;
  text-transform: uppercase;
  white-space: nowrap;
  transform: translateX(-50%);
}

.hero3d__cue::after {
  content: "";
  flex: none;
  width: 16px;
  height: 16px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 1.5v12M4 9.5l4 4 4-4' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 1.5v12M4 9.5l4 4 4-4' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
}

.hero3d__cue:hover {
  color: var(--brand-navy);
  text-decoration: none;
}

/* Duas oscilações (< 5 s) e para: nada se move indefinidamente */
@media (prefers-reduced-motion: no-preference) {
  .hero3d__cue::after {
    animation: evm-cue 2.2s var(--ease-in-out) 1.6s 2;
  }
}

@media (min-width: 900px) {
  .hero3d {
    padding-top: calc(var(--header-top) + var(--header-h) + 40px);
    padding-bottom: clamp(88px, 12vh, 136px);
  }

  .hero3d > .scene {
    position: absolute;
    inset: 0;
    min-height: 0;
  }

  /* Véu claro discreto atrás do bloco de texto (canto inferior esquerdo);
     some antes do centro do palco, onde fica o reboque */
  .hero3d::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
    background: radial-gradient(110% 95% at 0% 100%, rgba(241, 244, 249, .82) 0%, rgba(241, 244, 249, .6) 40%, rgba(241, 244, 249, 0) 72%);
    pointer-events: none;
  }

  .hero3d__content {
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
    padding-top: 0;
  }

  .hero3d__content > * {
    grid-column: 1;
  }

  .hero3d__cue {
    bottom: 20px;
  }
}


/* 26.5 Rolagem guiada (.story) — "Um olhar mais de perto" -------------------
   Seção alta: (n + 1) × 100svh (introdução + n capítulos). .story__stage fica
   grudado (sticky) ocupando a tela; .story__chapters sobe 100svh para rolar
   por cima dele, uma linha de grade de 100svh por bloco (.story__intro e cada
   .story__chapter). Progresso para o motor: t = −section.top / innerHeight
   (0 = introdução centrada; k = capítulo k centrado).
   Cartões de vidro escuro: embaixo no celular, à esquerda e centrados na
   vertical no desktop. O trilho (.story__rail) é filho do .story__stage:
   no alto e centrado no celular, à direita no desktop. */
.story {
  position: relative;
  isolation: isolate;
  background-color: var(--stage);
  color: var(--stage-ink);
}

.story__stage {
  position: sticky;
  top: 0;
  z-index: 0;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
}

.story__chapters {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-auto-rows: minmax(100vh, auto);
  grid-auto-rows: minmax(100svh, auto);
  margin-top: -100vh;
  margin-top: -100svh;
  pointer-events: none;
}

.story__chapter,
.story__intro {
  align-self: end;
  justify-self: stretch;
  display: grid;
  gap: 10px;
  width: 100%;
  max-width: 34rem;
  margin-bottom: 20px;
  margin-bottom: max(20px, calc(env(safe-area-inset-bottom) + 12px));
  padding: clamp(20px, 3vw, 32px);
  pointer-events: auto;
}

.story__num {
  display: block;
  color: var(--accent-fg);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.story__title {
  color: var(--fg);
  font-size: clamp(1.375rem, 1.2vw + 1.1rem, 2rem);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.02em;
}

/* Título de abertura da seção (v2.1): leve como os demais títulos de seção */
.story__intro .story__title {
  font-size: var(--fs-h2);
  font-weight: 400;
  line-height: 1.1;
  letter-spacing: -0.02em;
}

.story__text {
  max-width: 46ch;
  color: var(--fg-2);
}

/* Trilho de capítulos 01–05: nav com links âncora. O ativo recebe
   aria-current="step" (ou .is-active). Pior caso (vidro escuro 84 % sobre
   branco): números --stage-muted 5,9:1; ativo marinho sobre --stage-ink 13,6:1. */
.story__rail {
  position: absolute;
  top: calc(var(--header-top) + var(--header-h) + 12px);
  left: 50%;
  z-index: 3;
  max-width: calc(100% - 24px);
  transform: translateX(-50%);
}

.story__rail-list {
  display: flex;
  align-items: center;
  gap: 2px;
  margin: 0;
  padding: 4px;
  list-style: none;
  background-color: var(--glass-dark-strong);
  border: 1px solid var(--glass-border-dark);
  border-radius: var(--radius-pill);
  box-shadow: 0 16px 32px -20px rgba(4, 10, 28, .6);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  backdrop-filter: blur(14px) saturate(140%);
}

.story__rail-link {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-width: 44px;
  min-height: 44px;
  margin: 0;
  padding: 0 8px;
  background-color: transparent;  /* serve para <a> ou <button> */
  border: 0;
  border-radius: var(--radius-pill);
  color: var(--stage-muted);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  letter-spacing: .04em;
  text-decoration: none;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
  --focus: var(--accent-on-dark);
  transition: background-color var(--dur-2) var(--ease-out), color var(--dur-2) var(--ease-out);
}

.story__rail-link:hover {
  background-color: rgba(244, 247, 252, .1);
  color: var(--stage-ink);
  text-decoration: none;
}

.story__rail-link[aria-current="step"],
.story__rail-link[aria-current="true"],
.story__rail-link.is-active {
  background-color: var(--stage-ink);
  color: var(--brand-navy);
}

.story__rail-link:focus-visible {
  outline-offset: -2px;
  box-shadow: inset 0 0 0 4px var(--stage);
}

/* Nome do capítulo: oculto visualmente, mas no nome acessível do link */
.story__rail-label {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

@media (min-width: 900px) {
  .story__chapter,
  .story__intro {
    align-self: center;
    justify-self: start;
    max-width: 28rem;
    margin-bottom: 0;
  }

  .story__intro {
    max-width: 36rem;
  }

  .story__rail {
    top: 50%;
    right: var(--gutter);
    left: auto;
    max-width: none;
    transform: translateY(-50%);
  }

  /* Coluna: raio fixo (44 + 2 × 4) / 2 = 26 px, concêntrico com os links em
     pílula. Com 999 px, quando o ativo mostra o nome (≥ 1100) a lista fica
     larga e as pontas viram arcos de ~76 px: 01 e 05 sairiam do vidro. */
  .story__rail-list {
    flex-direction: column;
    align-items: flex-end;
    border-radius: 26px;
  }
}

/* ≥ 1100: o capítulo ativo mostra o nome ao lado do número */
@media (min-width: 1100px) {
  .story__rail-link[aria-current="step"] .story__rail-label,
  .story__rail-link[aria-current="true"] .story__rail-label,
  .story__rail-link.is-active .story__rail-label {
    position: static;
    width: auto;
    height: auto;
    margin: 0;
    overflow: visible;
    clip: auto;
    clip-path: none;
    font-family: var(--font-sans);
    font-size: .8125rem;
    font-weight: 600;
    letter-spacing: 0;
  }

  .story__rail-link[aria-current="step"],
  .story__rail-link[aria-current="true"],
  .story__rail-link.is-active {
    padding-inline: 16px;
  }
}


/* 26.6 Aplicações (.usecase) — "O que você precisa transportar?" -------------
   Abas em pílula (role="tablist", roving tabindex, setas) que trocam o modelo
   na mesma cena. Painel ao lado (≥ 900: cena 7/12, painel 5/12). */
.usecase__tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0 0 clamp(20px, 3vw, 32px);
  padding: 4px 0;
}

/* Celular: faixa rolável (mesma folga dos chips para o anel de foco) */
@media (max-width: 599.98px) {
  .usecase__tabs {
    flex-wrap: nowrap;
    margin-inline: calc(var(--gutter) * -1);
    padding: 6px var(--gutter) 8px;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-padding-inline: var(--gutter);
    scrollbar-width: thin;
    -webkit-overflow-scrolling: touch;
  }
}

.usecase__tab {
  position: relative;
  display: inline-flex;
  flex: none;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  margin: 0;
  padding: 8px 18px;
  background-color: var(--paper-0);
  border: 1px solid var(--line);
  border-radius: var(--radius-pill);
  color: var(--ink);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
  transition:
    background-color var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out);
}

.usecase__tab:has(.usecase__tab-icon) {
  padding-left: 12px;
}

.usecase__tab-icon {
  display: block;
  flex: none;
  width: 24px;
  height: 24px;
  color: var(--ink-2);
}

.usecase__tab-icon svg {
  width: 100%;
  height: 100%;
}

.usecase__tab:hover {
  background-color: var(--paper-2);
  border-color: var(--ink-3);
}

/* Selecionada: preenchida em marinho (branco 14,6:1; ícone --accent-on-dark 6,6:1) */
.usecase__tab[aria-selected="true"] {
  background-color: var(--brand-navy);
  border-color: var(--brand-navy);
  color: var(--brand-white);
}

.usecase__tab[aria-selected="true"] .usecase__tab-icon {
  color: var(--accent-on-dark);
}

.usecase__layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-items: center;
  gap: clamp(20px, 3vw, 40px);
}

@media (min-width: 900px) {
  .usecase__layout {
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  }
}

.usecase__stage {
  min-width: 0;
}

.usecase__panel {
  display: grid;
  align-content: start;
  gap: 18px;
  min-width: 0;
}

.usecase__panel:focus-visible {
  outline-offset: 8px;
  border-radius: var(--radius);
}

.usecase__title {
  color: var(--fg);
}

.usecase__text {
  max-width: 52ch;
  color: var(--fg-2);
}

.usecase__models {
  display: grid;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Linha de modelo: link para a página do modelo ou botão que troca o modelo
   na cena (aria-pressed). Nome + 3 dados-chave (mono). */
.usecase__model-link,
.usecase__model-btn {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: 2px 16px;
  width: 100%;
  min-height: 64px;
  margin: 0;
  padding: 12px 18px;
  background-color: var(--paper-0);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  color: var(--ink);
  font: inherit;
  text-align: left;
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  transition: border-color var(--dur-1) var(--ease-out), background-color var(--dur-1) var(--ease-out);
}

.usecase__model-link::after,
.usecase__model-btn::after {
  content: "";
  grid-column: 2;
  grid-row: 1 / span 2;
  width: 16px;
  height: 16px;
  background-color: var(--accent);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M1.5 8h12M9.5 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M1.5 8h12M9.5 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
}

.usecase__model-link:hover,
.usecase__model-btn:hover {
  border-color: var(--accent);
  color: var(--ink);
  text-decoration: none;
}

.usecase__model-link[aria-current="true"],
.usecase__model-btn[aria-pressed="true"] {
  background-color: var(--accent-tint);
  border-color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--accent);
}

.usecase__model-name {
  grid-column: 1;
  color: var(--ink);
  font-size: 1.0625rem;
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: -0.01em;
}

/* --ink-3 6,2:1 no branco; no ativo (tinta azul) passa a --ink-2 (7,8:1) */
.usecase__model-specs {
  grid-column: 1;
  color: var(--ink-3);
  font-family: var(--font-mono);
  font-size: .8125rem;
  line-height: 1.45;
  font-variant-numeric: tabular-nums;
}

.usecase__model-link[aria-current="true"] .usecase__model-specs,
.usecase__model-btn[aria-pressed="true"] .usecase__model-specs {
  color: var(--ink-2);
}

.usecase__actions {
  margin-top: 4px;
}


/* 26.7 Linha de modelos (.lineup) ---------------------------------------------
   Grade de cartões (1/2/3 colunas) ou painéis largos (.lineup--panels, estilo
   estúdio de produto). Mídia: render 3D estático (EVM3D.snapshots) em <img>;
   até ele chegar, o SVG. Checkbox "Comparar" (.compare-check.lineup__compare)
   no canto superior direito do cartão/painel. */
.lineup {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(20px, 2.4vw, 32px);
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (min-width: 600px) {
  .lineup { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 1100px) {
  .lineup { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.lineup__item {
  min-width: 0;
}

.lineup__card {
  position: relative;
  display: flex;
  flex-direction: column;
  min-width: 0;
  height: 100%;
  background-color: var(--paper-0);
  border: 1px solid var(--line-soft);
  border-radius: var(--radius-lg);
  color: var(--ink);
  --fg: var(--ink);
  --fg-2: var(--ink-2);
  --fg-3: var(--ink-3);
  --fg-title: var(--brand-navy);
  --fg-title-accent: var(--brand-blue);
  --accent-fg: var(--accent);
  --accent-fg-hover: var(--accent-hover);
  --rule: var(--line-soft);
  --rule-strong: var(--line);
  --focus: var(--accent);
  transition: border-color var(--dur-2) var(--ease-out), box-shadow var(--dur-2) var(--ease-out);
}

.lineup__card:hover {
  border-color: var(--line);
  box-shadow: var(--shadow-float);
}

/* v2.1: a mídia do cartão é a foto real (contain sobre --paper-2, como em
   .photo); selo .badge--photo.badge--overlay e contador .gallery__count
   (--overlay) podem ir dentro dela */
.lineup__media {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  margin: 8px 8px 0;
  overflow: hidden;
  background-color: var(--paper-2);
  border-radius: calc(var(--radius-lg) - 8px);
  color: inherit;
  text-decoration: none;
}

.lineup__media > img,
.lineup__media > svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.lineup__body {
  container-type: inline-size;
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 10px;
  padding: clamp(16px, 2vw, 24px);
}

.lineup__cat {
  margin: 0;
}

/* v2.1: nome do modelo em peso leve no marinho, como os títulos de seção */
.lineup__name {
  color: var(--fg-title);
  font-size: clamp(1.5rem, 1vw + 1.2rem, 2rem);
  font-weight: 400;
  line-height: 1.1;
  letter-spacing: -0.02em;
}

.lineup__name a {
  color: inherit;
  text-decoration: none;
}

.lineup__name a:hover {
  color: var(--accent-fg);
  text-decoration: underline;
  text-decoration-thickness: 2px;
}

.lineup__tagline {
  color: var(--fg-2);
  font-size: .9375rem;
  line-height: 1.5;
}

.lineup__card .keyspecs {
  margin-top: 4px;
}

.lineup__card .keyspec__value {
  font-size: 1rem;
}

.lineup__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-top: auto;
  padding-top: 12px;
}

/* "Comparar": filho direto do .lineup__card (depois do corpo, para vir por
   último no foco), no canto superior direito, em vidro claro. Não fica dentro
   do .lineup__body: o container-type dele contém o posicionamento. (Seletor
   com o pai para vencer o position: relative de .compare-check, mais abaixo.) */
.lineup__card > .lineup__compare {
  position: absolute;
  top: 16px;
  right: 16px;
  z-index: 2;
  background-color: var(--glass-strong);
  border: 1px solid var(--glass-border);
  box-shadow: 0 8px 20px -14px rgba(1, 32, 112, .5);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

/* Painéis largos: mídia 7/12 + corpo 5/12, alternando o lado. A alternância
   conta só os itens visíveis (o filtro põe [hidden] nos outros): par entre os
   :not([hidden]), ou a classe .is-flipped posta pelo script da página. O :is()
   é tolerante: num navegador sem "of S" ainda vale a .is-flipped. */
.lineup--panels {
  grid-template-columns: minmax(0, 1fr);
}

@media (min-width: 700px) {
  .lineup--panels .lineup__card {
    display: grid;
    grid-template-columns: minmax(0, 6fr) minmax(0, 5fr);
    align-items: center;
  }

  .lineup--panels .lineup__media {
    aspect-ratio: 16 / 10;
    margin: 10px;
  }

  .lineup--panels .lineup__body {
    align-self: stretch;
    justify-content: center;
    padding: clamp(20px, 3vw, 48px) clamp(20px, 3vw, 48px) clamp(20px, 3vw, 48px) clamp(8px, 1.5vw, 24px);
  }

  .lineup--panels .lineup__actions {
    margin-top: 8px;
  }

  .lineup--panels .lineup__item:is(.is-flipped, :nth-child(even of :not([hidden]))) .lineup__card {
    grid-template-columns: minmax(0, 5fr) minmax(0, 6fr);
  }

  .lineup--panels .lineup__item:is(.is-flipped, :nth-child(even of :not([hidden]))) .lineup__media {
    order: 2;
  }

  .lineup--panels .lineup__item:is(.is-flipped, :nth-child(even of :not([hidden]))) .lineup__body {
    padding-right: clamp(8px, 1.5vw, 24px);
    padding-left: clamp(20px, 3vw, 48px);
  }

  /* "Comparar" sobre a mídia (canto livre do estúdio), nunca sobre o nome:
     à esquerda nos painéis com a mídia à esquerda, à direita nos invertidos */
  .lineup--panels .lineup__card > .lineup__compare {
    left: 22px;
    right: auto;
  }

  .lineup--panels .lineup__item:is(.is-flipped, :nth-child(even of :not([hidden]))) .lineup__card > .lineup__compare {
    left: auto;
    right: 22px;
  }
}

@media (min-width: 1100px) {
  .lineup--panels .lineup__card {
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  }

  .lineup--panels .lineup__item:is(.is-flipped, :nth-child(even of :not([hidden]))) .lineup__card {
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  }

  .lineup--panels .lineup__name {
    font-size: clamp(2rem, 2.4vw + 1rem, 3.5rem);
  }
}

@media (prefers-reduced-motion: no-preference) {
  .lineup__media > img {
    animation: evm-fade var(--dur-3) var(--ease-out);
  }
}

/* Checkbox "Comparar" (até 3). O input cobre o rótulo inteiro (área de toque
   ≥ 44 px) e fica transparente; a caixa desenhada vem logo depois dele.
   Caixa: contorno --ink-3 6,2:1; marcada em marinho com visto branco. */
.compare-check {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  padding: 4px 14px 4px 10px;
  border-radius: var(--radius-pill);
  color: var(--ink);
  font-size: .875rem;
  font-weight: 600;
  line-height: 1.2;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  -webkit-user-select: none;
  user-select: none;
}

.compare-check__input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: inherit;
}

.compare-check__box,
.option-toggle__box {
  position: relative;
  display: block;
  flex: none;
  width: 20px;
  height: 20px;
  background-color: var(--paper-0);
  border: 1.5px solid var(--ink-3);
  border-radius: 6px;
  pointer-events: none;
}

.compare-check__box::after,
.option-toggle__box::after {
  content: "";
  position: absolute;
  inset: 0;
  background-color: var(--brand-white);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.2l3 3 6-6.4' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E") center / 14px 14px no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.2l3 3 6-6.4' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E") center / 14px 14px no-repeat;
  opacity: 0;
}

.compare-check:hover .compare-check__box {
  border-color: var(--ink-2);
}

.compare-check__input:checked + .compare-check__box {
  background-color: var(--brand-navy);
  border-color: var(--brand-navy);
}

.compare-check__input:checked + .compare-check__box::after {
  opacity: 1;
}

.compare-check__input:focus-visible + .compare-check__box {
  outline: 2px solid var(--focus);
  outline-offset: 3px;
}

.compare-check__input:disabled {
  cursor: not-allowed;
}

.compare-check__input:disabled ~ * {
  opacity: .55;
}

.compare-check__text {
  pointer-events: none;
}


/* 26.8 Barra de comparação (.compare-bar) --------------------------------------
   Barra fixa no rodapé da janela quando há modelos marcados: "2 modelos
   selecionados" + lista + "Comparar 2 modelos". Use [hidden] para esconder.
   < 700: texto e botões (a lista some). 700–1199: duas linhas — a lista em
   cima (vem antes dos botões no código: a ordem do foco segue a da tela),
   texto e botões embaixo. ≥ 1200: uma linha só, em pílula.
   html.has-compare-bar reserva espaço no fim da página e no foco por teclado:
   altura da barra (--compare-bar-h) + 24 px. O CSS traz uma estimativa por
   faixa; o script da página pode gravar a altura medida no style do <html>
   (document.documentElement.style.setProperty('--compare-bar-h', …)). */
.compare-bar {
  position: fixed;
  left: 50%;
  bottom: 12px;
  bottom: max(12px, env(safe-area-inset-bottom));
  z-index: 45;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 16px;
  width: calc(100% - 24px);
  max-width: 920px;
  padding: 10px 10px 10px 20px;
  background-color: var(--glass-strong);
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-lg);
  box-shadow: 0 1px 2px rgba(1, 32, 112, .08), 0 24px 48px -20px rgba(1, 32, 112, .45);
  color: var(--ink);
  transform: translateX(-50%);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  backdrop-filter: blur(14px) saturate(140%);
  --fg: var(--ink);
  --fg-2: var(--ink-2);
  --accent-fg: var(--brand-navy);
  --focus: var(--accent);
}

@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
  .compare-bar {
    background-color: var(--paper);
  }
}

.compare-bar__text {
  flex: 1 1 auto;
  min-width: 0;
  color: var(--ink-2);
  font-size: .9375rem;
  line-height: 1.4;
}

.compare-bar__text strong {
  color: var(--ink);
}

.compare-bar__list {
  display: none;
  flex-wrap: wrap;
  gap: 6px;
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Item em pílula de 44 px; o botão de remover ocupa a ponta direita */
.compare-bar__item {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  min-height: 44px;
  padding: 0 0 0 14px;
  background-color: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: var(--radius-pill);
  color: var(--ink);
  font-size: .8125rem;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
}

/* Remover: alvo de 44 × 44, concêntrico com a ponta da pílula (a margem de
   −1 px cobre a borda do item, que continua com 44 px de altura) */
.compare-bar__remove {
  display: inline-grid;
  flex: none;
  place-items: center;
  width: 44px;
  height: 44px;
  margin: -1px -1px -1px 0;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 50%;
  color: var(--ink-2);
}

.compare-bar__remove::before {
  content: "";
  width: 12px;
  height: 12px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2 2l8 8M10 2l-8 8' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2 2l8 8M10 2l-8 8' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
}

.compare-bar__remove:hover {
  background-color: var(--paper-3);
  color: var(--ink);
}

.compare-bar__actions {
  display: flex;
  flex: none;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-left: auto;
}

/* 700–1199: a lista ocupa a primeira linha inteira (order: −1); texto e
   botões dividem a segunda. Cantos --radius-lg: numa caixa de duas linhas a
   pílula viraria arcos enormes. Com três modelos e a dica "Máximo de 3…" a
   linha única precisaria de ≈ 1.110 px. */
@media (min-width: 700px) {
  .compare-bar__list {
    display: flex;
    order: -1;
    flex: 1 1 100%;
  }
}

/* ≥ 1200: uma linha só, em pílula */
@media (min-width: 1200px) {
  .compare-bar {
    flex-wrap: nowrap;
    max-width: 1160px;
    border-radius: var(--radius-pill);
  }

  .compare-bar__list {
    order: 0;
    flex: 0 1 auto;
    flex-wrap: nowrap;
  }

  .compare-bar__text {
    flex: 0 1 auto;
  }
}

@media (prefers-reduced-motion: no-preference) {
  .compare-bar {
    animation: evm-bar-rise var(--dur-3) var(--ease-out);
  }
}

/* Espaço reservado = altura da barra + 24 px (12 da folga até a borda da
   janela + 12 de respiro). Estimativas: < 700 duas linhas com a dica ·
   700–1199 lista + texto e botões · ≥ 1200 uma linha. Um valor medido no
   style do <html> prevalece sobre estas. */
html.has-compare-bar {
  --compare-bar-h: 128px;
  scroll-padding-bottom: calc(var(--compare-bar-h) + 32px);
}

html.has-compare-bar body {
  padding-bottom: calc(var(--compare-bar-h) + 24px);
}

@media (min-width: 700px) {
  html.has-compare-bar {
    --compare-bar-h: 120px;
  }
}

@media (min-width: 1200px) {
  html.has-compare-bar {
    --compare-bar-h: 68px;
  }
}


/* 26.9 Tabela comparativa (.compare-table) -------------------------------------
   Até 3 modelos lado a lado (campos de specFields). O contêiner rola na
   horizontal (tabindex="0" + role="region" + nome) com a primeira coluna fixa.
   Linhas que diferem: tr.is-diff → fundo --accent-tint e barra de acento na
   célula do rótulo (forma, além da cor). Tinta sobre o tinte: 14,7:1. */
.compare-table {
  position: relative;
  max-width: 100%;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  background-color: var(--bg);
  border: 1px solid var(--rule);
  border-radius: var(--radius-lg);
  scrollbar-width: thin;
  -webkit-overflow-scrolling: touch;
}

.compare-table:focus-visible {
  outline-offset: 4px;
}

.compare-table table {
  width: 100%;
  min-width: 40rem;
  border-collapse: separate;
  border-spacing: 0;
  font-size: .9375rem;
}

.compare-table th,
.compare-table td {
  padding: 14px 16px;
  border-bottom: 1px solid var(--rule);
  color: var(--fg);
  text-align: left;
  vertical-align: top;
}

.compare-table tbody tr:last-child > th,
.compare-table tbody tr:last-child > td {
  border-bottom: 0;
}

.compare-table td {
  min-width: 10rem;
  line-height: 1.45;
  overflow-wrap: anywhere;
}

.compare-table td.mono,
.compare-table .mono {
  font-size: .9375rem;
}

.compare-table thead th {
  vertical-align: bottom;
  border-bottom-color: var(--rule-strong);
}

/* Primeira coluna fixa ao rolar (fundo opaco do contexto) */
.compare-table th:first-child {
  position: sticky;
  left: 0;
  z-index: 1;
  width: 11rem;
  min-width: 9rem;
  background-color: var(--bg);
  box-shadow: 1px 0 0 var(--rule);
  font-weight: 600;
  line-height: 1.4;
}

.compare-table__model {
  min-width: 12rem;
}

.compare-table__media {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  margin-bottom: 12px;
  overflow: hidden;
  background-color: var(--paper-2);       /* v2.1: foto real em contain, como .photo */
  border-radius: var(--radius);
}

.compare-table__media > img,
.compare-table__media > svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.compare-table__name {
  display: block;
  color: var(--fg);
  font-size: 1.125rem;
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -0.01em;
}

a.compare-table__name {
  text-decoration: none;
}

a.compare-table__name:hover {
  color: var(--accent-fg);
  text-decoration: underline;
}

/* Linha de grupo (Dimensões, Pesos…): o rótulo fica fixo à esquerda */
.compare-table__group > th {
  padding-top: 24px;
  color: var(--fg-2);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  letter-spacing: .08em;
  text-transform: uppercase;
  border-bottom-color: var(--rule-strong);
}

.compare-table__group > th:first-child {
  position: static;
  box-shadow: none;
}

.compare-table__group > th > span {
  position: sticky;
  left: 16px;
}

.compare-table tr.is-diff > td,
.compare-table tr.is-diff > th {
  background-color: var(--accent-tint);
  color: var(--ink);
}

.compare-table tr.is-diff > th:first-child {
  box-shadow: inset 3px 0 0 var(--accent), 1px 0 0 var(--rule);
}

/* Legenda "Linhas destacadas diferem entre os modelos" */
.compare-table__legend {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 12px;
  color: var(--fg-2);
  font-size: .8125rem;
  line-height: 1.45;
}

.compare-table__legend::before {
  content: "";
  flex: none;
  width: 20px;
  height: 14px;
  background-color: var(--accent-tint);
  border-left: 3px solid var(--accent);
  border-radius: 2px;
}


/* 26.10 Configurador (.configurator) — "Monte o seu" ----------------------------
   Cena grande (esquerda/topo, fixa ao rolar) + painel de etapas (direita/
   baixo). Etapas em <fieldset class="config-step"> com <legend
   class="config-step__head"> (número + título + valor atual); o resumo é uma
   <section class="config-step config-summary">.
   · < 1024: uma coluna; cena no topo, 4:3 limitada a 42 % da altura da janela
     e a 520 px, grudada sob o cabeçalho só quando a janela tem altura
     (≥ 560 px); etapas abaixo.
   · ≥ 1024: cena ~62 % à esquerda, fixa ao rolar (altura da janela menos o
     cabeçalho); etapas à direita (~38 %), rolando com a página. */
.configurator {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-items: start;
  gap: clamp(16px, 3vw, 28px);
}

/* A faixa de fundo cobre o que passa atrás da cena quando ela gruda */
.configurator__stage {
  position: relative;
  z-index: 2;
  min-width: 0;
  background-color: var(--bg);
}

.configurator__stage > .scene {
  width: 100%;
  height: min(calc((100vw - 2 * var(--gutter)) * .75), 42vh, 520px);
  height: min(calc((100vw - 2 * var(--gutter)) * .75), 42svh, 520px);
  min-height: 200px;
  aspect-ratio: auto;
}

/* Janela com altura: a cena gruda sob o cabeçalho enquanto as etapas rolam, e
   o foco do teclado para abaixo dela (nunca escondido sob a cena grudada).
   Janela baixa (celular deitado): a cena rola junto, e vale o scroll-padding
   geral do <html>. */
@media (max-width: 1023.98px) and (min-height: 560px) {
  .configurator__stage {
    position: sticky;
    top: calc(var(--header-top) + var(--header-h) + 8px);
    margin-block: -8px;
    padding-block: 8px;
  }

  html:has(.configurator) {
    scroll-padding-top: calc(var(--header-top) + var(--header-h) + min(calc((100vw - 2 * var(--gutter)) * .75), 42vh, 520px) + 32px);
    scroll-padding-top: calc(var(--header-top) + var(--header-h) + min(calc((100vw - 2 * var(--gutter)) * .75), 42svh, 520px) + 32px);
  }
}

.configurator__panel {
  display: grid;
  min-width: 0;
}

@media (min-width: 1024px) {
  .configurator {
    grid-template-columns: minmax(0, 62fr) minmax(0, 38fr);
    gap: clamp(28px, 3vw, 48px);
  }

  .configurator__stage {
    position: sticky;
    top: calc(var(--header-top) + var(--header-h) + 16px);
    background-color: transparent;
  }

  .configurator__stage > .scene {
    height: calc(100vh - var(--header-top) - var(--header-h) - 40px);
    height: calc(100svh - var(--header-top) - var(--header-h) - 40px);
    min-height: 440px;
    max-height: 820px;
  }

  html:has(.configurator) {
    scroll-padding-top: calc(var(--header-top) + var(--header-h) + 16px);
  }
}

.config-step {
  display: grid;
  gap: 14px;
  min-width: 0;
  margin: 0;
  padding: clamp(20px, 2.5vw, 28px) 0;
  border: 0;
  border-top: 1px solid var(--rule);
}

.configurator__panel > .config-step:first-child {
  padding-top: 0;
  border-top: 0;
}

/* A <legend> não é item de grade: a distância até o conteúdo vem da margem */
.config-step__head {
  display: flex;
  align-items: center;
  gap: 12px;
  width: 100%;
  margin: 0;
  padding: 0;
  color: var(--fg);
  font-size: 1.125rem;
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: -0.01em;
}

legend.config-step__head {
  margin-bottom: 14px;
}

.config-step__num {
  display: inline-grid;
  flex: none;
  place-items: center;
  width: 32px;
  height: 32px;
  background-color: var(--brand-navy);
  border-radius: 50%;
  color: var(--brand-white);
  font-family: var(--font-mono);
  font-size: .8125rem;
  font-weight: 500;
  line-height: 1;
  font-variant-numeric: tabular-nums;
}

.config-step__title {
  min-width: 0;
}

/* Escolha atual ao lado do título ("Grafite") */
.config-step__value {
  margin-left: auto;
  color: var(--fg-2);
  font-size: .875rem;
  font-weight: 500;
  text-align: right;
}

.config-step__hint {
  max-width: 52ch;
  color: var(--fg-3);
  font-size: .875rem;
  line-height: 1.5;
}

/* Acabamentos: rádios redondos de 44 px com o nome embaixo. A cor vem de
   --swatch (style="--swatch: #3A4148"). Marcado: anel --accent-fg (8,0:1)
   afastado por uma folga do fundo + selo com visto; foco: anel externo. */
.swatches {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(4.75rem, 1fr));
  gap: 16px 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.swatch {
  --swatch: var(--paper-3);
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  min-width: 0;
  padding: 6px 2px 2px;
  color: var(--fg-2);
  font-size: .8125rem;
  font-weight: 500;
  line-height: 1.25;
  text-align: center;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.swatch__input {
  position: absolute;
  top: 6px;
  left: 50%;
  width: 44px;
  height: 44px;
  margin: 0 0 0 -22px;
  opacity: 0;
  cursor: inherit;
}

.swatch__chip {
  position: relative;
  display: block;
  flex: none;
  width: 44px;
  height: 44px;
  background-color: var(--swatch);
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(15, 26, 51, .28);
  pointer-events: none;
  transition: box-shadow var(--dur-1) var(--ease-out);
}

/* Galvanizado (finish: 'zinc'): brilho metálico */
.swatch--zinc .swatch__chip,
.swatch[data-finish="zinc"] .swatch__chip {
  background-image: linear-gradient(135deg, rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, 0) 42%, rgba(15, 26, 51, 0) 58%, rgba(15, 26, 51, .22) 100%);
}

/* Selo do visto no canto do círculo marcado */
.swatch__chip::after {
  content: "";
  position: absolute;
  top: -5px;
  right: -5px;
  width: 20px;
  height: 20px;
  background-color: var(--brand-navy);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.2l3 3 6-6.4' fill='none' stroke='%23fff' stroke-width='2'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
  background-size: 12px 12px;
  border: 2px solid var(--paper);
  border-radius: 50%;
  opacity: 0;
  transform: scale(.6);
  transition: opacity var(--dur-1) var(--ease-out), transform var(--dur-2) var(--ease-out);
}

.swatch__name {
  display: block;
  max-width: 100%;
  overflow-wrap: anywhere;
}

.swatch:hover .swatch__chip {
  box-shadow:
    inset 0 0 0 1px rgba(15, 26, 51, .28),
    0 0 0 3px var(--bg),
    0 0 0 4px var(--ink-3);
}

.swatch__input:checked + .swatch__chip {
  box-shadow:
    inset 0 0 0 1px rgba(15, 26, 51, .28),
    0 0 0 3px var(--bg),
    0 0 0 5px var(--accent-fg);
}

.swatch__input:checked + .swatch__chip::after {
  opacity: 1;
  transform: none;
}

.swatch__input:checked ~ .swatch__name {
  color: var(--fg);
  font-weight: 700;
}

.swatch__input:focus-visible + .swatch__chip {
  outline: 2px solid var(--focus);
  outline-offset: 7px;
}

.swatch__input:disabled {
  cursor: not-allowed;
}

.swatch__input:disabled ~ * {
  opacity: .5;
}

/* Opcionais: cartão com checkbox. O input cobre o cartão; a caixa desenhada
   vem logo depois dele. Marcado: classe .is-checked (script) e :has() como
   reforço — regras separadas, para o :has() sem suporte não derrubar a outra. */
.option-toggles {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (min-width: 600px) {
  .option-toggles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* 1024–1359: o painel lateral do configurador (~38 %) é estreito para duas
   colunas; abaixo de 1024 as etapas ocupam a largura toda e voltam a duas */
@media (min-width: 1024px) and (max-width: 1359.98px) {
  .configurator .option-toggles { grid-template-columns: minmax(0, 1fr); }
}

.option-toggle {
  position: relative;
  display: flex;
  align-items: flex-start;
  gap: 12px;
  min-width: 0;
  min-height: 56px;
  padding: 14px 16px;
  background-color: var(--field-bg);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  color: var(--ink);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: border-color var(--dur-1) var(--ease-out), background-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
}

.option-toggle__input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: inherit;
}

.option-toggle__box {
  margin-top: 1px;
}

.option-toggle__body {
  display: grid;
  gap: 2px;
  min-width: 0;
  pointer-events: none;
}

.option-toggle__name {
  color: var(--ink);
  font-size: .9375rem;
  font-weight: 600;
  line-height: 1.3;
}

/* --ink-3 sobre branco 6,2:1; sobre o tinte do marcado 5,3:1 */
.option-toggle__hint {
  color: var(--ink-3);
  font-size: .8125rem;
  line-height: 1.4;
}

/* Selo para opcionais com peça visual (EVM.optionVisuals). Texto sugerido:
   "Aparece no 3D" (só "No 3D", em caixa-alta, lê-se como o inglês "NO 3D") */
.option-toggle__tag {
  justify-self: start;
  margin-top: 4px;
  padding: 2px 8px;
  background-color: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: var(--radius-pill);
  color: var(--ink-2);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .04em;
  text-transform: uppercase;
}

.option-toggle:hover {
  border-color: var(--ink-3);
}

.option-toggle.is-checked {
  background-color: var(--accent-tint);
  border-color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--accent);
}

.option-toggle:has(.option-toggle__input:checked) {
  background-color: var(--accent-tint);
  border-color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--accent);
}

.option-toggle__input:checked + .option-toggle__box {
  background-color: var(--brand-navy);
  border-color: var(--brand-navy);
}

.option-toggle__input:checked + .option-toggle__box::after {
  opacity: 1;
}

.option-toggle.has-focus {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}

.option-toggle:has(.option-toggle__input:focus-visible) {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}

.option-toggle__input:focus-visible + .option-toggle__box {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}

.option-toggle:has(.option-toggle__input:disabled) {
  opacity: .55;
  cursor: not-allowed;
}

/* Resumo: modelo, acabamento, opcionais, dados-chave, "Preço sob consulta" e
   os dois envios. Sobre --paper-2: rótulos --ink-3-panel 6,4:1. Contêiner de
   largura: no painel estreito os .keyspecs passam a linhas (§15). */
.config-summary {
  container-type: inline-size;
  --fg-3: var(--ink-3-panel);
  --rule: var(--line);
  --bg: var(--paper-2);
  margin-top: 8px;
  padding: clamp(20px, 2.5vw, 28px);
  background-color: var(--paper-2);
  border: 1px solid var(--line-soft);
  border-radius: var(--radius-lg);
}

.configurator__panel > .config-summary:first-child {
  padding-top: clamp(20px, 2.5vw, 28px);
  border-top: 1px solid var(--line-soft);
}

.config-summary__list {
  display: grid;
  margin: 0;
  border-top: 1px solid var(--line);
}

.config-summary__row {
  display: grid;
  grid-template-columns: minmax(0, 8.5rem) minmax(0, 1fr);
  gap: 4px 16px;
  padding: 10px 0;
  border-bottom: 1px solid var(--line);
}

.config-summary__row > dt {
  padding-top: 2px;
  color: var(--ink-3-panel);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.5;
  letter-spacing: .06em;
  text-transform: uppercase;
}

.config-summary__row > dd {
  margin: 0;
  color: var(--ink);
  font-weight: 600;
  line-height: 1.45;
  overflow-wrap: anywhere;
}

.config-summary__price {
  display: flex;
  align-items: baseline;
  gap: 10px;
  color: var(--ink-2);
  font-size: .9375rem;
  line-height: 1.5;
}

.config-summary__price::before {
  content: "";
  flex: none;
  width: 8px;
  height: 8px;
  background-color: var(--accent);
  border-radius: 50%;
  transform: translateY(-1px);
}

.config-summary__actions {
  display: grid;
  gap: 10px;
}

.config-summary__actions > .btn {
  width: 100%;
}


/* --------------------------------------------------------------------------
   27 Fotos reais (v2.1 · DESIGN-SYSTEM §8.4)
   27.1 Selos de origem (.badge--photo, .badge--study)
   27.2 Foto (.photo)
   27.3 Galeria (.gallery)
   27.4 Lightbox (dialog.lightbox)
   27.5 Cartão de aplicação (.app-card)
   27.6 Visto nas fotos (.seen-list)
   27.7 Como escolher (.howto)
   27.8 Cartão de modelo com foto (EVMSite.renderModelCard)
   A fotografia é a verdade do produto; o 3D é estudo. Selos e controles sobre
   mídia usam fundo sólido (ou quase): AA sobre qualquer foto ou cena, sem
   depender do que está atrás. Fica antes das seções 23–25 no arquivo.
   v2.2: as classes de 27.3, 27.4 e 27.8 são as que o site.js 1.3 gera (as
   pontes das páginas — index.css §6, modelos.css §10, modelo.css §03/§04/§09
   — podem sair); trocas com transição curta, todas desligadas em movimento
   reduzido (§23).
   -------------------------------------------------------------------------- */

/* 27.1 Selos de origem -------------------------------------------------------
   <span class="badge badge--photo">Fotografia real EVM</span>
   <span class="badge badge--study">Representação 3D</span>   (v2.6, EVMSite.copy3d.badge;
     desenhos estáticos: "Desenho ilustrativo · sem escala", copy3d.drawing)
   Sempre com texto (nunca só o ícone). O ponto é desenhado (::before) e muda
   de forma, além da cor: foto = ponto cheio; 3D/desenho = anel vazado. A
   classe .badge--study é só um identificador (o texto não diz "estudo").
   · --photo: marinho sólido, texto branco 14,6:1, ponto --accent-on-dark
     (6,6:1); anel claro fino para não sumir sobre fundo escuro.
   · --study: branco sólido, filete tracejado --ink-3 (6,2:1), texto --ink-2
     (9,2:1), anel --brand-blue (8,0:1).
   Em texto ficam em linha. Sobre mídia, .badge--overlay posiciona o selo no
   canto superior esquerdo do pai posicionado (.photo, .scene, .gallery__main,
   .lineup__media, .app-card__media); com --overlay-end vai para a direita e
   com --overlay-bottom para baixo. O texto quebra em telas estreitas. */
.badge--photo,
.badge--study {
  align-items: flex-start;
  gap: 8px;
  max-width: 100%;
  min-height: 28px;
  padding: 6px 12px 6px 10px;
  font-size: .6875rem;
  line-height: 1.3;
  letter-spacing: .06em;
  white-space: normal;
  text-wrap: balance;
}

.badge--photo {
  background-color: var(--brand-navy);
  border-color: var(--brand-navy);
  box-shadow: 0 0 0 1px rgba(255, 255, 255, .28);
  color: var(--brand-white);
}

.badge--photo::before {
  content: "";
  flex: none;
  width: 7px;
  height: 7px;
  margin-top: calc((1.3em - 7px) / 2);   /* centrado na primeira linha */
  background-color: var(--accent-on-dark);
  border-radius: 50%;
}

.badge--study {
  background-color: var(--brand-white);
  border: 1px dashed var(--ink-3);
  color: var(--ink-2);
}

.badge--study::before {
  content: "";
  flex: none;
  width: 8px;
  height: 8px;
  margin-top: calc((1.3em - 8px) / 2);
  border: 1.5px solid var(--brand-blue);
  border-radius: 50%;
}

/* Sobre mídia: o selo não intercepta o ponteiro (arraste do 3D, clique na foto) */
.badge--overlay {
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 4;
  max-width: calc(100% - 24px);
  pointer-events: none;
  box-shadow: 0 6px 16px -10px rgba(1, 32, 112, .55);
}

.badge--photo.badge--overlay {
  box-shadow: 0 0 0 1px rgba(255, 255, 255, .28), 0 6px 16px -10px rgba(1, 32, 112, .55);
}

.badge--overlay-end {
  left: auto;
  right: 12px;
}

.badge--overlay-bottom {
  top: auto;
  bottom: 12px;
}


/* 27.2 Foto (.photo) -----------------------------------------------------------
   EVMSite.renderPhoto(photo, {sizes, eager}) →
   <figure class="photo">
     <img class="photo__img" src="…" width="425" height="190" alt="…" loading="lazy" decoding="async">
     <figcaption class="photo__caption">Estúdio</figcaption>        (opcional: photo.kind)
   </figure>
   Proporção: sem modificador, a das próprias width/height do <img> (o
   navegador reserva a altura antes de baixar — sem CLS). Moldura fixa
   (cartões, galeria): .photo--fixed com --photo-ratio (padrão 4 / 3) ou os
   atalhos .photo--4x3 · --3x2 · --16x10 · --16x9 · --1x1; a foto inteira
   aparece (object-fit: contain) sobre --paper-2. .photo--cover preenche a
   moldura cortando as bordas (só fotos de uso/campo em que o corte não
   esconde o produto). .photo--fill ocupa um pai posicionado (ex.:
   .lineup__media). Ampliável: o <img> dentro de <button class="photo__open"
   type="button"> com <span class="visually-hidden">Ampliar foto</span> (o
   nome do botão = alt + "Ampliar foto"). Selo: .badge--photo.badge--overlay
   como filho da figure. v2.2: EVMSite.zoomablePhoto(photo, {index, badge,
   caption, cover, className}) gera exatamente esse padrão, e
   EVMSite.bindZoomable(root, photos, {label}) liga o clique ao lightbox. */
.photo {
  --photo-radius: var(--radius-lg);
  position: relative;
  display: block;
  min-width: 0;
  margin: 0;
}

.photo__img,
.photo > img,
.photo__open > img {
  display: block;
  width: 100%;
  height: auto;
  background-color: var(--paper-2);
  border-radius: var(--photo-radius);
  object-fit: contain;
  object-position: 50% 50%;
}

.photo--4x3 { --photo-ratio: 4 / 3; }
.photo--3x2 { --photo-ratio: 3 / 2; }
.photo--16x10 { --photo-ratio: 16 / 10; }
.photo--16x9 { --photo-ratio: 16 / 9; }
.photo--1x1 { --photo-ratio: 1 / 1; }

.photo:is(.photo--fixed, .photo--4x3, .photo--3x2, .photo--16x10, .photo--16x9, .photo--1x1) :is(.photo__img, .photo__open > img),
.photo:is(.photo--fixed, .photo--4x3, .photo--3x2, .photo--16x10, .photo--16x9, .photo--1x1) > img {
  aspect-ratio: var(--photo-ratio, 4 / 3);
}

.photo--cover .photo__img,
.photo--cover > img,
.photo--cover .photo__open > img {
  object-fit: cover;
}

.photo--fill {
  --photo-radius: 0;
  position: absolute;
  inset: 0;
}

.photo--fill .photo__img,
.photo--fill > img,
.photo--fill .photo__open,
.photo--fill .photo__open > img {
  width: 100%;
  height: 100%;
}

.photo__caption {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px 10px;
  margin-top: 10px;
  color: var(--fg-3);
  font-family: var(--font-mono);
  font-size: .75rem;
  line-height: 1.45;
  letter-spacing: .04em;
}

/* Botão de ampliar: a foto inteira é o alvo; lupa num círculo de vidro no
   canto inferior direito (::before = círculo, ::after = ícone) */
.photo__open {
  position: relative;
  display: block;
  width: 100%;
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: var(--photo-radius);
  color: inherit;
  text-align: inherit;
  cursor: zoom-in;
  -webkit-tap-highlight-color: transparent;
}

.photo__open::before,
.photo__open::after {
  content: "";
  position: absolute;
  pointer-events: none;
}

.photo__open::before {
  right: 12px;
  bottom: 12px;
  width: 40px;
  height: 40px;
  background-color: var(--glass-strong);
  border: 1px solid var(--glass-border);
  border-radius: 50%;
  box-shadow: 0 6px 16px -10px rgba(1, 32, 112, .55);
  transition: background-color var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);
}

.photo__open::after {
  right: 22px;
  bottom: 22px;
  width: 20px;
  height: 20px;
  background-color: var(--ink);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23000' stroke-width='1.6'%3E%3Ccircle cx='8.5' cy='8.5' r='5.5'/%3E%3Cpath d='M12.6 12.6L17 17M8.5 6v5M6 8.5h5'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23000' stroke-width='1.6'%3E%3Ccircle cx='8.5' cy='8.5' r='5.5'/%3E%3Cpath d='M12.6 12.6L17 17M8.5 6v5M6 8.5h5'/%3E%3C/svg%3E") center / contain no-repeat;
}

.photo__open:hover::before {
  background-color: var(--paper);
  border-color: var(--line);
}

.photo__open:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 3px;
}


/* 27.3 Galeria ([data-gallery] + EVMSite.initGallery) --------------------------
   Marcação gerada pelo site.js (não escreva à mão; o root só precisa de
   data-gallery="<id do modelo>" ou "all"):
   <div class="gallery [gallery--single] [gallery--zoom]" data-gallery role="group" aria-label="Fotos reais — …">
     <div class="gallery__main">
       <div class="gallery__media">                    (moldura; durante a troca, duas figuras)
         <figure class="photo" style="--photo-ratio: W / H">
           <img class="photo__img" …>
           <figcaption class="photo__caption">Estúdio</figcaption>   (sobre a foto, canto inferior esquerdo)
         </figure>
       </div>
       <span class="badge badge--photo gallery__badge">Fotografia real EVM</span>   (superior esquerdo)
       <button class="gallery__arrow gallery__arrow--prev"><svg …/><span class="visually-hidden">Foto anterior</span></button>
       <button class="gallery__arrow gallery__arrow--next"><svg …/><span class="visually-hidden">Próxima foto</span></button>
       <button class="gallery__zoom"><svg …/><span class="gallery__zoom-text">Ampliar</span>…</button>   (superior direito)
     </div>
     <div class="gallery__bar">
       <p class="gallery__count">4 fotos</p>
       <ul class="gallery__thumbs"><li class="gallery__thumb-item"><button class="gallery__thumb" aria-current="true"><img alt=""><span class="visually-hidden">Foto 1 de 4: Estúdio</span></button></li>…</ul>
     </div>
   </div>
   Moldura da principal: --gallery-ratio no .gallery (padrão 3 / 2; a página
   pode trocar, ex.: modelo.js usa a mediana das fotos), igual para todas as
   fotos — a troca não pula; foto inteira (contain) sobre --paper-2. A legenda
   (tipo da foto) fica sobre a foto, então as setas ficam no meio da imagem.
   Troca de foto (v2.2): a nova figura (.is-entering) entra por cima da atual
   (.is-leaving) com opacidade em 220 ms — as duas ocupam a mesma célula da
   grade de .gallery__media. Uma foto só (.gallery--single): sem setas, sem
   miniaturas e sem a barra. Miniatura atual: aria-current="true" → borda
   dupla --brand-blue + barra inferior (forma, além da cor); as demais um
   pouco esmaecidas até o hover. .gallery__count também serve fora da galeria
   ("4 fotos"): em linha por padrão, ou .gallery__count--overlay sobre uma
   mídia. Nomes da v2.1 (.gallery__prev/.gallery__next, .gallery.is-single)
   continuam valendo. */
.gallery {
  display: grid;
  gap: 12px;
  min-width: 0;
}

.gallery__main {
  position: relative;
  min-width: 0;
}

/* Moldura fixa: todas as fotos com a mesma proporção (sem salto na troca) */
.gallery__main .photo :is(.photo__img, .photo__open > img),
.gallery__main .photo > img {
  aspect-ratio: var(--gallery-ratio, 3 / 2);
}

/* As figuras da troca ocupam a mesma célula: a que entra fica por cima (vem
   depois no código) e cobre a anterior (a foto tem fundo opaco). Cada figura
   é uma camada própria (z-index 0): a legenda da que sai fica dentro dela e
   não aparece por cima da que entra; selo, setas e "Ampliar" (z 3–4) ficam
   acima das duas. */
.gallery__media {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  min-width: 0;
}

.gallery__media > * {
  position: relative;
  z-index: 0;
  grid-area: 1 / 1;
  min-width: 0;
}

.gallery__media > .is-entering {
  opacity: 0;
}

.gallery__media > .is-leaving {
  pointer-events: none;
}

/* Tipo da foto ("Estúdio", "Ao ar livre") sobre a foto, em pílula de vidro */
.gallery__media .photo__caption {
  position: absolute;
  left: 12px;
  bottom: 12px;
  z-index: 2;
  max-width: calc(100% - 24px);
  margin: 0;
  padding: 4px 10px;
  background-color: var(--glass-strong);
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-pill);
  color: var(--ink-2);
  pointer-events: none;
}

.gallery--zoom .gallery__media .photo__img {
  cursor: zoom-in;
}

/* Selo sobre a foto, no canto superior esquerdo; não encosta no "Ampliar" */
.gallery__main > .gallery__badge {
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 4;
  max-width: calc(100% - 152px);
  pointer-events: none;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, .28), 0 6px 16px -10px rgba(1, 32, 112, .55);
}

.gallery:not(.gallery--zoom) .gallery__main > .gallery__badge {
  max-width: calc(100% - 24px);
}

/* O selo à esquerda não encosta no contador à direita (marcação v2.1) */
.gallery__main > .badge--overlay {
  max-width: calc(100% - 112px);
}

.gallery__count {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  width: -moz-fit-content;
  width: fit-content;
  min-height: 28px;
  margin: 0;
  padding: 4px 10px;
  background-color: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius-pill);
  color: var(--ink-2);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: .02em;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.gallery__main > .gallery__count,
.gallery__count--overlay {
  position: absolute;
  top: 12px;
  right: 12px;
  z-index: 4;
  pointer-events: none;
  box-shadow: 0 6px 16px -10px rgba(1, 32, 112, .55);
}

/* Cantos alternativos do contador sobre mídia (ex.: no .lineup__card o canto
   superior direito é do "Comparar": use --bottom) */
.gallery__count--bottom {
  top: auto;
  bottom: 12px;
}

.gallery__count--start {
  right: auto;
  left: 12px;
}

/* Setas e "Ampliar" sobre a foto: vidro branco 92 % (ícone e texto em tinta
   ≥ 14:1); o anel de foco ganha uma faixa branca por fora para aparecer
   sobre qualquer foto. Ícones: o <svg> do site.js (20 px). */
.gallery__arrow,
.gallery__prev,
.gallery__next,
.gallery__zoom {
  position: absolute;
  z-index: 3;
  margin: 0;
  background-color: var(--glass-strong);
  border: 1px solid var(--glass-border);
  box-shadow: 0 6px 16px -10px rgba(1, 32, 112, .55);
  color: var(--ink);
  -webkit-tap-highlight-color: transparent;
  transition:
    background-color var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    transform var(--dur-1) var(--ease-out);
}

.gallery__arrow,
.gallery__prev,
.gallery__next {
  top: 50%;
  display: inline-grid;
  place-items: center;
  width: 44px;
  height: 44px;
  margin-top: -22px;
  padding: 0;
  border-radius: 50%;
}

.gallery__arrow--prev,
.gallery__prev { left: 12px; }

.gallery__arrow--next,
.gallery__next { right: 12px; }

.gallery__arrow > svg,
.gallery__zoom > svg {
  flex: none;
  width: 20px;
  height: 20px;
}

/* "Ampliar": pílula no canto superior direito (ícone + texto) */
.gallery__zoom {
  top: 12px;
  right: 12px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-width: 44px;
  min-height: 44px;
  padding: 0 14px 0 12px;
  border-radius: var(--radius-pill);
  font-size: .8125rem;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
}

.gallery__zoom > svg {
  width: 18px;
  height: 18px;
}

.gallery__arrow:hover,
.gallery__prev:hover,
.gallery__next:hover,
.gallery__zoom:hover {
  background-color: var(--paper);
  border-color: var(--line);
}

.gallery__arrow:active,
.gallery__prev:active,
.gallery__next:active,
.gallery__zoom:active {
  transform: scale(.96);
}

.gallery__arrow:focus-visible,
.gallery__prev:focus-visible,
.gallery__next:focus-visible,
.gallery__zoom:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  box-shadow: 0 0 0 2px var(--paper);
}

.gallery__arrow:disabled,
.gallery__prev:disabled,
.gallery__next:disabled {
  opacity: .45;
  cursor: not-allowed;
}

/* Telas estreitas: "Ampliar" só com o ícone (o nome continua acessível) */
@media (max-width: 419.98px) {
  .gallery__zoom {
    justify-content: center;
    width: 44px;
    padding: 0;
  }

  .gallery__zoom-text {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
  }

  .gallery__main > .gallery__badge {
    max-width: calc(100% - 80px);
  }
}

/* Marcação v2.1 sem <svg> (.gallery__prev/.gallery__next e
   .lightbox__prev/.lightbox__next): ícone das setas desenhado por máscara */
.gallery__prev::before,
.gallery__next::before,
.lightbox__prev::before,
.lightbox__next::before {
  content: "";
  width: 20px;
  height: 20px;
  background-color: currentColor;
}

.gallery__prev::before,
.lightbox__prev::before {
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M12.5 4l-6 6 6 6' fill='none' stroke='%23000' stroke-width='1.8'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M12.5 4l-6 6 6 6' fill='none' stroke='%23000' stroke-width='1.8'/%3E%3C/svg%3E") center / contain no-repeat;
}

.gallery__next::before,
.lightbox__next::before {
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M7.5 4l6 6-6 6' fill='none' stroke='%23000' stroke-width='1.8'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M7.5 4l6 6-6 6' fill='none' stroke='%23000' stroke-width='1.8'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* Miniaturas: faixa rolável na horizontal. Folga de 6 px em volta (e margem
   negativa igual, para alinhar com a foto principal) para o anel de foco e a
   borda dupla não serem cortados; seletor com o pai para vencer o
   ul[class] { padding: 0 } da base. */
.gallery .gallery__thumbs {
  display: flex;
  gap: 8px;
  margin: -6px;
  padding: 6px;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scrollbar-width: thin;
  list-style: none;
  -webkit-overflow-scrolling: touch;
}

.gallery__thumbs > li {
  flex: none;
}

.gallery__thumb {
  position: relative;
  display: block;
  width: clamp(72px, 18vw, 104px);
  aspect-ratio: 4 / 3;
  margin: 0;
  padding: 0;
  overflow: hidden;
  background-color: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition:
    border-color 220ms var(--ease-out),
    box-shadow 220ms var(--ease-out);
}

/* Miniaturas fora da atual um pouco esmaecidas (a foto, não o botão: o anel
   de foco continua nítido); hover e atual em opacidade plena */
.gallery__thumb > img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  opacity: .78;
  transition: opacity 220ms var(--ease-out);
}

.gallery__thumb:hover > img,
.gallery__thumb:focus-visible > img,
.gallery__thumb[aria-current="true"] > img,
.gallery__thumb[aria-current="step"] > img {
  opacity: 1;
}

.gallery__thumb:hover {
  border-color: var(--ink-3);
}

.gallery__thumb[aria-current="true"],
.gallery__thumb[aria-current="step"] {
  border-color: var(--accent);
  box-shadow: 0 0 0 1px var(--accent);
}

/* Barra inferior da atual: existe em todas e cresce do centro na atual */
.gallery__thumb::after {
  content: "";
  position: absolute;
  left: 8px;
  right: 8px;
  bottom: 4px;
  height: 3px;
  background-color: var(--accent);
  border-radius: 2px;
  box-shadow: 0 0 0 1.5px var(--paper);
  opacity: 0;
  transform: scaleX(0);
  transition: transform 220ms var(--ease-out), opacity 220ms var(--ease-out);
}

.gallery__thumb[aria-current="true"]::after,
.gallery__thumb[aria-current="step"]::after {
  opacity: 1;
  transform: none;
}

/* Barra sob a foto: contador ("4 fotos") e miniaturas */
.gallery__bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 14px;
  min-width: 0;
}

.gallery__bar > .gallery__thumbs {
  flex: 1 1 12rem;
  min-width: 0;
}

.gallery__empty {
  padding: 24px;
  border: 1px dashed var(--rule-strong);
  border-radius: var(--radius-lg);
  color: var(--fg-2);
}

/* Uma foto só: sem setas, sem miniaturas e sem o contador "1 foto" */
.gallery--single .gallery__bar,
.gallery--single .gallery__arrow,
.gallery.is-single .gallery__arrow,
.gallery.is-single .gallery__bar,
.gallery.is-single .gallery__prev,
.gallery.is-single .gallery__next,
.gallery.is-single .gallery__thumbs {
  display: none;
}

/* Cross-fade da foto principal (v2.2): só a que entra muda de opacidade */
@media (prefers-reduced-motion: no-preference) {
  .gallery__media > .photo {
    transition: opacity 220ms var(--ease-in-out);
  }
}


/* 27.4 Lightbox — visualizador de fotos (<dialog class="lightbox">, site.js) ----------
   Marcação gerada por EVMSite.openLightbox (não escreva à mão; v2.6, docs/UX-2.6.md §5):
   <dialog class="lightbox [lightbox--single] [lightbox--3d] [is-open] [is-closing]"
           aria-labelledby="<id do título>">
     <div class="lightbox__inner" data-lightbox-dismiss>
       <div class="lightbox__bar">
         <span class="badge badge--photo lightbox__badge">Fotografia real EVM</span>  (some no 3D)
         <div class="lightbox__heading">
           <h2 class="lightbox__title">Reboque náutico<span class="lightbox__title-kind"> · Ao ar livre</span></h2>
           <p class="lightbox__count">2 de 4</p></div>
         <div class="lightbox__switch" role="group" aria-label="Ver como">      (só com modelo)
           <button class="lightbox__switch-btn" aria-pressed="true">Foto</button>
           <button class="lightbox__switch-btn" aria-pressed="false">3D</button></div>
         <button class="lightbox__close"><svg …/><span class="lightbox__close-text">Fechar</span></button>
       </div>
       <div class="lightbox__stage">
         <div class="lightbox__view lightbox__view--foto">
           <figure class="lightbox__figure">
             <div class="lightbox__media">
               <div class="lightbox__frame [can-zoom] [is-zoomed] [is-panning]">
                 <div class="lightbox__pan"><img class="lightbox__img [is-sized]" style="width: …px"></div></div>
               <div class="lightbox__zoom" role="group">(− · Ajustar · +) .lightbox__zoom-btn</div></div>
             <figcaption class="lightbox__caption"><span class="lightbox__alt">…</span>
               <span class="lightbox__zoom-note">Foto em resolução limitada…</span></figcaption>
           </figure></div>
         <div class="lightbox__view lightbox__view--3d" hidden>
           <div class="lightbox__scene-col">
             <div class="scene scene--light lightbox__scene">… <span class="badge badge--study
               badge--overlay">Representação 3D</span> … .scene-controls.lightbox__cam</div>
             <p class="lightbox__disclaimer">Representação virtual: …</p></div>
           <div class="lightbox__parts"><h3 class="lightbox__parts-title">Detalhes</h3>
             <ol class="lightbox__parts-list"><li class="lightbox__part"><button
               class="lightbox__part-btn" aria-pressed="false"><span class="lightbox__part-num">01</span>
               <span class="lightbox__part-name">…</span></button></li></ol>
             <p class="lightbox__part-text" aria-live="polite"></p><p class="lightbox__parts-hint">…</p></div>
         </div>
       </div>
       <div class="lightbox__footer">
         <div class="lightbox__nav">                                             (2+ fotos, vista Foto)
           <button class="lightbox__arrow lightbox__arrow--prev">…</button>
           <ul class="lightbox__thumbs"><li class="lightbox__thumb-item"><button
             class="lightbox__thumb" aria-current="true"><img …></button></li></ul>
           <button class="lightbox__arrow lightbox__arrow--next">…</button></div>
         <div class="lightbox__actions">
           <a class="btn btn--sm btn--on-dark lightbox__product">Ver o produto</a>
           <a class="btn btn--sm btn--whatsapp lightbox__wa" data-wa data-origem="visualizador">…</a></div>
       </div>
     </div>
   </dialog>
   Abre com showModal() (camada superior: a página fica inerte e o foco preso). Fundo
   opaco --stage (o ::backdrop com o literal #07122B): nada da página — nem o cabeçalho —
   aparece atrás. Texto --stage-ink ≥ 14:1 e --stage-muted 9:1. Grade de três linhas:
   barra, palco (o espaço que sobra) e rodapé (setas + miniaturas e as ações).
   Nitidez: o site.js desenha a foto com largura em px (style.width e sizes iguais,
   .is-sized), no máximo 1,5 px CSS por px do arquivo (as pequenas sobem até 640 px) —
   nunca width:auto com sizes em vw, que ampliava a foto de 425 px para 958 px ou mais.
   Sem o ajuste do script (foto sem medidas), o teto daqui usa --lb-nat-w. Zoom de
   layout: .is-zoomed torna a moldura rolável (centro seguro por margin:auto dentro do
   .lightbox__pan, que cresce com a foto); .can-zoom tira os gestos do navegador
   (touch-action: none — pinça, arraste e dois toques pelo site.js). Vista 3D
   (.lightbox--3d): cena clara com o selo, o aviso visível e a lista "Detalhes" (ao lado
   a partir de 900 px; embaixo, em faixa rolável, no celular). Abaixo de 600 px de altura
   a faixa de miniaturas e a descrição saem e a barra fica numa linha. Alvos ≥ 44 px;
   nada rola na horizontal a 360 px (a faixa e a lista rolam dentro de si).
   Movimento (v2.2): abre com fade do diálogo e do ::backdrop e a foto com leve
   aproximação; fecha com .is-closing (180 ms; o site.js espera e então fecha, inclusive
   no Esc); a foto nova entra com fade (.lightbox__img.is-entering). Movimento reduzido:
   tudo instantâneo (Foto | 3D em corte seco, zoom sem transição). */
.lightbox {
  --fg: var(--stage-ink);
  --fg-2: var(--stage-muted);
  --fg-3: var(--stage-muted);
  --fg-title: var(--stage-ink);
  --fg-title-accent: var(--accent-on-dark);
  --accent-fg: var(--accent-on-dark);
  --accent-fg-hover: var(--accent-on-dark-hover);
  --focus: var(--accent-on-dark);
  --wa-ink: #7FE0B4;                 /* como em .on-dark (§01): WhatsApp em texto no escuro */
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  max-height: none;
  margin: 0;
  padding: 0;
  overflow: hidden;
  background-color: var(--stage);    /* v2.6: opaco (antes 94 %: o cabeçalho aparecia atrás) */
  border: 0;
  color: var(--stage-ink);
}

.lightbox[open],
.lightbox--fallback:not([hidden]) {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr);
}

/* ::backdrop não herda as variáveis em todos os navegadores: o literal de --stage */
.lightbox::backdrop {
  background-color: #07122B;
}

/* Área útil: barra, palco (o espaço que sobra) e rodapé */
.lightbox .lightbox__inner {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: auto minmax(0, 1fr) auto;
  gap: 12px;
  width: 100%;
  height: 100%;
  min-width: 0;
  min-height: 0;
  padding:
    max(10px, env(safe-area-inset-top))
    max(12px, env(safe-area-inset-right))
    max(12px, env(safe-area-inset-bottom))
    max(12px, env(safe-area-inset-left));
}

/* Barra. Celular: selo, Foto | 3D e "Fechar" na 1ª linha; título e contador
   na 2ª. ≥ 900 px (ou tela baixa e larga): tudo numa linha (abaixo). */
.lightbox .lightbox__bar {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  grid-template-areas:
    "badge switch close"
    "head head head";
  align-items: center;
  gap: 8px 10px;
  width: 100%;
  max-width: 1280px;
  min-width: 0;
  margin-inline: auto;
  padding: 0;
}

.lightbox .lightbox__badge {
  grid-area: badge;
  justify-self: start;
  max-width: 100%;
}

.lightbox__heading {
  display: flex;
  grid-area: head;
  align-items: baseline;
  gap: 4px 12px;
  min-width: 0;
}

/* Título (nome do diálogo): nome do modelo · tipo da foto, numa linha */
.lightbox .lightbox__title {
  min-width: 0;
  margin: 0;
  overflow: hidden;
  color: var(--stage-ink);
  font-family: var(--font-sans);
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.35;
  letter-spacing: 0;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.lightbox__title-kind {
  color: var(--stage-muted);
  font-weight: 500;
}

.lightbox .lightbox__count {
  flex: none;
  margin: 0;
}

.lightbox__count {
  color: var(--stage-muted);
  font-family: var(--font-mono);
  font-size: .75rem;
  letter-spacing: .06em;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* Foto | 3D: dois botões aria-pressed num grupo em pílula; a vista atual
   invertida em branco com texto marinho (14,6:1) */
.lightbox__switch {
  display: inline-flex;
  grid-area: switch;
  gap: 2px;
  padding: 0;
  background-color: rgba(7, 18, 43, .78);
  border: 1px solid rgba(244, 247, 252, .42);
  border-radius: var(--radius-pill);
}

.lightbox__switch-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 52px;
  min-height: 44px;
  margin: 0;
  padding: 0 14px;
  background-color: transparent;
  border: 0;
  border-radius: var(--radius-pill);
  color: var(--stage-ink);
  font-size: .875rem;
  font-weight: 600;
  line-height: 1;
  -webkit-tap-highlight-color: transparent;
  transition:
    background-color var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out);
}

.lightbox__switch-btn:hover {
  background-color: rgba(244, 247, 252, .14);
}

.lightbox__switch-btn[aria-pressed="true"] {
  background-color: var(--stage-ink);
  color: var(--brand-navy);
}

.lightbox__switch-btn:focus-visible {
  outline: 2px solid var(--accent-on-dark);
  outline-offset: 2px;
}

@media (min-width: 900px), (min-width: 600px) and (max-height: 599.98px) {
  .lightbox .lightbox__bar {
    grid-template-columns: auto minmax(0, 1fr) auto auto;
    grid-template-areas: "badge head switch close";
    gap: 8px 16px;
  }
}

/* Palco: uma célula; a vista Foto ou a 3D a ocupa inteira */
.lightbox__stage {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr);
  min-width: 0;
  min-height: 0;
}

.lightbox__view {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr);
  min-width: 0;
  min-height: 0;
}

/* Vista Foto: a moldura no espaço que sobra e a legenda embaixo */
.lightbox__figure {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr) auto;
  gap: 10px;
  min-width: 0;
  min-height: 0;
  margin: 0;
}

.lightbox__media {
  position: relative;
  min-width: 0;
  min-height: 0;
}

/* A moldura tem o tamanho da célula (o JS mede clientWidth/Height); a foto
   não a empurra. Sem zoom útil, a pinça do navegador continua valendo. */
.lightbox .lightbox__frame {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: flex-start;
  overflow: hidden;
  overscroll-behavior: contain;
  border-radius: var(--radius);
  touch-action: pan-y pinch-zoom;
  -webkit-user-select: none;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
}

.lightbox .lightbox__frame.can-zoom {
  touch-action: none;
}

.lightbox .lightbox__frame.is-zoomed {
  overflow: auto;
  cursor: grab;
  scrollbar-width: thin;
}

.lightbox .lightbox__frame.is-panning {
  cursor: grabbing;
}

/* Com zoom a moldura recebe o foco (as setas movem a foto): anel por dentro */
.lightbox .lightbox__frame:focus-visible {
  outline: 2px solid var(--accent-on-dark);
  outline-offset: -2px;
}

/* Centro seguro: o .lightbox__pan cresce com a foto e a margem automática a
   centraliza só quando sobra espaço (place-items:center cortaria a esquerda e
   o alto da foto aproximada) */
.lightbox__pan {
  display: flex;
  flex: none;
  min-width: 100%;
  min-height: 100%;
}

.lightbox__img {
  display: block;
  flex: none;
  width: auto;
  height: auto;
  min-width: 0;
  max-width: min(100%, calc(var(--lb-nat-w, 99999) * 1.5px));
  max-height: 100%;
  margin: auto;
  object-fit: contain;
  background-color: var(--paper-2);
  border-radius: var(--radius);
  -webkit-user-drag: none;
}

/* Largura em px escrita pelo site.js (ajuste ou zoom): sem tetos do CSS */
.lightbox .lightbox__img.is-sized {
  max-width: none;
  max-height: none;
}

/* Troca de foto (v2.2): a anterior some na hora; a nova entra com fade quando
   o site.js tira a classe (a transição fica em §27.4, movimento) */
.lightbox__img.is-entering {
  opacity: 0;
  transition: none;
}

/* Zoom: − · Ajustar · + sobre o canto inferior direito da moldura (vidro
   escuro com texto: AA sobre qualquer foto) */
.lightbox__zoom {
  position: absolute;
  right: 8px;
  bottom: 8px;
  z-index: 2;
  display: flex;
  align-items: center;
  gap: 2px;
  padding: 2px;
  background-color: var(--glass-dark-strong);
  border: 1px solid rgba(244, 247, 252, .42);
  border-radius: var(--radius-pill);
}

.lightbox__zoom-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  margin: 0;
  padding: 0;
  background-color: transparent;
  border: 0;
  border-radius: var(--radius-pill);
  color: var(--stage-ink);
  font-size: .8125rem;
  font-weight: 600;
  line-height: 1;
  -webkit-tap-highlight-color: transparent;
  transition: background-color var(--dur-1) var(--ease-out);
}

.lightbox__zoom-btn--text {
  padding-inline: 12px;
}

.lightbox__zoom-btn > svg {
  flex: none;
  width: 20px;
  height: 20px;
}

.lightbox__zoom-btn:hover {
  background-color: rgba(244, 247, 252, .14);
}

/* aria-disabled (não disabled): o botão segue focável e o foco não se perde */
.lightbox__zoom-btn[aria-disabled="true"] {
  opacity: .45;
  cursor: not-allowed;
}

.lightbox__zoom-btn[aria-disabled="true"]:hover {
  background-color: transparent;
}

.lightbox__zoom-btn:focus-visible {
  outline: 2px solid var(--accent-on-dark);
  outline-offset: -2px;
}

/* Legenda: a descrição (o alt, oculto do leitor de tela) e, sem zoom útil,
   a nota "Foto em resolução limitada" */
.lightbox .lightbox__caption {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: baseline;
  gap: 4px 12px;
  width: 100%;
  max-width: 72ch;
  margin-inline: auto;
  padding-inline: 8px;
  color: var(--stage-muted);
  font-size: .875rem;
  line-height: 1.45;
  text-align: center;
}

.lightbox__alt {
  color: var(--stage-muted);
}

.lightbox__zoom-note {
  color: var(--stage-ink);
  font-family: var(--font-mono);
  font-size: .75rem;
  letter-spacing: .02em;
}

/* Vista 3D: a cena (clara, com o selo "Representação 3D") e o aviso visível;
   a lista "Detalhes" embaixo no celular e ao lado a partir de 900 px */
.lightbox__view--3d {
  grid-template-rows: minmax(0, 1fr) auto;
  gap: 12px;
}

.lightbox__scene-col {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr) auto;
  gap: 8px;
  min-width: 0;
  min-height: 0;
}

.lightbox .lightbox__scene {
  width: 100%;
  height: 100%;
  min-height: 160px;
  aspect-ratio: auto;
  border-radius: var(--radius-lg);
}

.lightbox__disclaimer {
  margin: 0;
  color: var(--stage-muted);
  font-size: .8125rem;
  line-height: 1.45;
}

.lightbox__parts {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-content: start;
  gap: 8px;
  min-width: 0;
  min-height: 0;
}

.lightbox .lightbox__parts-title {
  margin: 0;
  color: var(--stage-muted);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: .08em;
  text-transform: uppercase;
}

/* Celular: faixa de botões que rola dentro de si (nunca a página) */
.lightbox .lightbox__parts-list {
  display: flex;
  gap: 6px;
  min-width: 0;
  margin: -4px;
  padding: 4px;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scrollbar-width: thin;
  list-style: none;
}

.lightbox__part {
  flex: none;
}

.lightbox__part-btn {
  display: inline-flex;
  align-items: baseline;
  gap: 8px;
  min-height: 44px;
  margin: 0;
  padding: 11px 14px;
  background-color: rgba(244, 247, 252, .06);
  border: 1px solid rgba(244, 247, 252, .26);
  border-radius: var(--radius);
  color: var(--stage-ink);
  font-size: .875rem;
  font-weight: 600;
  line-height: 1.35;
  text-align: left;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
  transition:
    background-color var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out);
}

.lightbox__part-num {
  flex: none;
  color: var(--accent-on-dark);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  letter-spacing: .04em;
}

.lightbox__part-btn:hover {
  background-color: rgba(244, 247, 252, .12);
  border-color: rgba(244, 247, 252, .42);
}

/* Peça escolhida: invertida em branco (marinho 14,6:1; número em azul 8:1) */
.lightbox__part-btn[aria-pressed="true"] {
  background-color: var(--stage-ink);
  border-color: var(--stage-ink);
  color: var(--brand-navy);
}

.lightbox__part-btn[aria-pressed="true"] .lightbox__part-num {
  color: var(--brand-blue);
}

.lightbox__part-btn:focus-visible {
  outline: 2px solid var(--accent-on-dark);
  outline-offset: 1px;
}

.lightbox__part-text {
  margin: 0;
  color: var(--stage-ink);
  font-size: .9375rem;
  line-height: 1.5;
}

.lightbox__part-title {
  font-weight: 700;
}

.lightbox__parts-hint {
  margin: 0;
  color: var(--stage-muted);
  font-size: .8125rem;
  line-height: 1.45;
}

@media (min-width: 900px), (min-width: 600px) and (max-height: 599.98px) {
  .lightbox__view--3d {
    grid-template-columns: minmax(0, 1fr) minmax(14rem, 19rem);
    grid-template-rows: minmax(0, 1fr);
    gap: 16px 20px;
  }

  .lightbox__view--3d:has(> .lightbox__parts[hidden]) {
    grid-template-columns: minmax(0, 1fr);
  }

  .lightbox__parts {
    padding: 4px;
    overflow-y: auto;
    overscroll-behavior: contain;
    scrollbar-width: thin;
  }

  .lightbox .lightbox__parts-list {
    flex-direction: column;
    margin: 0;
    padding: 0;
    overflow: visible;
  }

  .lightbox__part-btn {
    display: flex;
    width: 100%;
    white-space: normal;
  }
}

/* Estreita e baixa (celular deitado, zoom de 400 %): a cena mantém a altura mínima e
   o aviso e os "Detalhes" rolam dentro da vista, em vez de ficarem sob a cena. */
@media (max-width: 599.98px) and (max-height: 479.98px) {
  .lightbox__view--3d {
    grid-template-rows: max-content max-content;
    overflow-y: auto;
    overscroll-behavior: contain;
  }
}

/* Rodapé: setas + miniaturas (vista Foto, 2+ fotos) e as ações */
.lightbox__footer {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 10px 16px;
  width: 100%;
  max-width: 1280px;
  min-width: 0;
  margin-inline: auto;
}

.lightbox__nav {
  display: flex;
  flex: 1 1 18rem;
  align-items: center;
  gap: 8px;
  min-width: 0;
}

/* Faixa de miniaturas: rola dentro de si; folga de 4 px para o anel de foco */
.lightbox .lightbox__thumbs {
  position: relative;
  display: flex;
  flex: 0 1 auto;
  gap: 8px;
  min-width: 0;
  margin: 0;
  padding: 4px;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x proximity;
  scrollbar-width: thin;
  list-style: none;
}

.lightbox__thumb-item {
  flex: none;
  scroll-snap-align: center;
}

.lightbox__thumb {
  display: block;
  width: 72px;
  height: 54px;
  margin: 0;
  padding: 0;
  overflow: hidden;
  background-color: var(--paper-2);
  border: 1px solid rgba(244, 247, 252, .26);
  border-radius: var(--radius);
  -webkit-tap-highlight-color: transparent;
  transition:
    border-color var(--dur-1) var(--ease-out),
    box-shadow var(--dur-1) var(--ease-out);
}

.lightbox__thumb > img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  opacity: .72;
  transition: opacity var(--dur-1) var(--ease-out);
}

.lightbox__thumb:hover > img,
.lightbox__thumb:focus-visible > img,
.lightbox__thumb[aria-current="true"] > img {
  opacity: 1;
}

.lightbox__thumb:hover {
  border-color: rgba(244, 247, 252, .6);
}

/* Atual: borda de 2 px --accent-on-dark com anel escuro (a foto clara não a apaga) */
.lightbox__thumb[aria-current="true"] {
  border: 2px solid var(--accent-on-dark);
  box-shadow: 0 0 0 1px var(--stage);
}

.lightbox__thumb:focus-visible {
  outline: 2px solid var(--stage-ink);
  outline-offset: 2px;
}

.lightbox__actions {
  display: flex;
  flex: 0 1 auto;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 8px;
  min-width: 0;
  margin-left: auto;
}

.lightbox__actions > .btn {
  white-space: nowrap;
}

/* No escuro, um filete claro separa o verde do marinho (como em .on-dark) */
.lightbox .btn--whatsapp {
  border-color: rgba(244, 247, 252, .55);
}

@media (max-width: 599.98px) {
  .lightbox__nav {
    flex-basis: 100%;
  }

  .lightbox__actions {
    flex: 1 1 100%;
    margin-left: 0;
  }

  .lightbox__actions > .btn {
    flex: 1 1 auto;
  }
}

/* Botões de 44 px (Fechar e setas): marinho 78 % com filete claro (≥ 3:1
   sobre o fundo do diálogo); hover invertido em branco. v2.6: no fluxo (barra
   e rodapé), não mais sobre a foto. Ícones: o <svg> do site.js (nomes
   .lightbox__prev/.lightbox__next da v2.1: ícone por máscara, §27.3) */
.lightbox__close,
.lightbox__arrow,
.lightbox__prev,
.lightbox__next {
  position: relative;
  display: inline-grid;
  flex: none;
  place-items: center;
  width: 44px;
  height: 44px;
  margin: 0;
  padding: 0;
  background-color: rgba(7, 18, 43, .78);
  border: 1px solid rgba(244, 247, 252, .42);
  border-radius: 50%;
  color: var(--stage-ink);
  -webkit-tap-highlight-color: transparent;
  transition:
    background-color var(--dur-1) var(--ease-out),
    border-color var(--dur-1) var(--ease-out),
    color var(--dur-1) var(--ease-out),
    transform var(--dur-1) var(--ease-out);
}

/* "Fechar" na barra: pílula com ícone e texto visível, no fim da linha */
.lightbox .lightbox__bar > .lightbox__close {
  display: inline-flex;
  grid-area: close;
  align-items: center;
  gap: 8px;
  width: auto;
  min-width: 44px;
  height: 44px;
  padding: 0 16px 0 12px;
  border-radius: var(--radius-pill);
  font-size: .875rem;
  font-weight: 600;
  line-height: 1;
}

.lightbox .lightbox__close::before {
  content: none;
}

.lightbox .lightbox__close > svg {
  display: block;
  flex: none;
  width: 18px;
  height: 18px;
}

.lightbox .lightbox__close-text {
  position: static;
  width: auto;
  height: auto;
  margin: 0;
  padding: 0;
  overflow: visible;
  clip: auto;
  clip-path: none;
  white-space: nowrap;
  border: 0;
}

.lightbox__arrow > svg {
  flex: none;
  width: 20px;
  height: 20px;
}

.lightbox--single .lightbox__arrow {
  display: none;
}

.lightbox__close:hover,
.lightbox__arrow:hover,
.lightbox__prev:hover,
.lightbox__next:hover {
  background-color: var(--stage-ink);
  border-color: var(--stage-ink);
  color: var(--brand-navy);
}

.lightbox__close:active,
.lightbox__arrow:active,
.lightbox__prev:active,
.lightbox__next:active {
  transform: scale(.96);
}

.lightbox__close:focus-visible,
.lightbox__arrow:focus-visible,
.lightbox__prev:focus-visible,
.lightbox__next:focus-visible {
  outline: 2px solid var(--accent-on-dark);
  outline-offset: 3px;
}

/* < 480: "Fechar" só com o ícone (o nome continua "Fechar") */
@media (max-width: 479.98px) {
  .lightbox .lightbox__bar > .lightbox__close {
    justify-content: center;
    width: 44px;
    padding: 0;
  }

  .lightbox .lightbox__close-text {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
  }
}

/* ≥ 900: mais respiro em volta */
@media (min-width: 900px) {
  .lightbox .lightbox__inner {
    gap: 16px;
    padding:
      max(16px, env(safe-area-inset-top))
      max(32px, env(safe-area-inset-right))
      max(20px, env(safe-area-inset-bottom))
      max(32px, env(safe-area-inset-left));
  }
}

/* Tela baixa (< 600 px de altura, ex.: celular deitado): a faixa de
   miniaturas, a descrição e a dica da lista saem (ficam as setas, o contador
   e o título); a barra já fica numa linha (acima) e o respiro diminui */
@media (max-height: 599.98px) {
  .lightbox .lightbox__inner {
    gap: 8px;
    padding-top: max(8px, env(safe-area-inset-top));
    padding-bottom: max(8px, env(safe-area-inset-bottom));
  }

  .lightbox .lightbox__thumbs,
  .lightbox .lightbox__alt,
  .lightbox .lightbox__parts-hint {
    display: none;
  }

  .lightbox .lightbox__nav {
    flex: 0 0 auto;
  }

  .lightbox .lightbox__figure {
    gap: 6px;
  }

  .lightbox .lightbox__title {
    font-size: .9375rem;
  }
}

/* Página travada com o visualizador aberto (o site.js põe/tira
   html.lightbox-open; :has() de reforço). v2.6: scrollbar-gutter estável — a
   página não "pula" a largura da barra de rolagem ao abrir e fechar. */
html.lightbox-open {
  overflow: hidden;
  scrollbar-gutter: stable;
  background-color: var(--stage);   /* a calha da barra de rolagem acompanha o fundo */
}

html:has(.lightbox[open]) {
  overflow: hidden;
}

/* Movimento (v2.2). Abrir: diálogo e ::backdrop com fade, a foto com leve
   aproximação. Fechar: .is-closing (o site.js espera 180 ms e fecha). No
   ::backdrop, valores literais (não herda variáveis em todo navegador). */
@media (prefers-reduced-motion: no-preference) {
  .lightbox[open],
  .lightbox.is-open {
    animation: evm-fade 220ms var(--ease-out);
  }

  .lightbox[open]::backdrop {
    animation: evm-fade 220ms cubic-bezier(.16, 1, .3, 1);
  }

  .lightbox[open] .lightbox__figure,
  .lightbox.is-open .lightbox__figure {
    animation: evm-zoom-in 280ms var(--ease-out);
  }

  .lightbox.is-closing,
  .lightbox[open].is-closing {
    animation: evm-fade-out 180ms var(--ease-in-out) forwards;
  }

  .lightbox.is-closing::backdrop {
    animation: evm-fade-out 180ms cubic-bezier(.65, 0, .35, 1) forwards;
  }

  .lightbox.is-closing .lightbox__figure,
  .lightbox[open].is-closing .lightbox__figure {
    animation: evm-zoom-out 180ms var(--ease-in-out) forwards;
  }

  .lightbox__img {
    transition: opacity 220ms var(--ease-out);
  }
}

/* Movimento reduzido (v2.6): Foto | 3D, zoom e os estados dos controles em
   corte seco (o §23 já cobre o diálogo, a foto, Fechar e as setas; o estúdio
   3D respeita a preferência sozinho) */
@media (prefers-reduced-motion: reduce) {
  .lightbox__switch-btn,
  .lightbox__zoom-btn,
  .lightbox__part-btn,
  .lightbox__thumb,
  .lightbox__thumb > img,
  .lightbox .lightbox__img,
  .lightbox .lightbox__scene {
    animation: none !important;
    transition: none !important;
  }
}

/* Cores forçadas (v2.6): os controles do visualizador viram botões do
   sistema; o estado (vista atual, peça escolhida, miniatura atual) passa a
   uma borda de 3 px em Highlight — o fundo invertido some nesse modo. O §25
   cuida do diálogo, da foto, de Fechar e das setas. */
@media (forced-colors: active) {
  .lightbox__switch,
  .lightbox__zoom {
    background-color: Canvas;
    border-color: CanvasText;
  }

  .lightbox__switch-btn,
  .lightbox__zoom-btn,
  .lightbox__part-btn,
  .lightbox__thumb {
    background-color: ButtonFace;
    border: 1px solid ButtonText;
    color: ButtonText;
  }

  .lightbox__switch-btn[aria-pressed="true"],
  .lightbox__part-btn[aria-pressed="true"],
  .lightbox__thumb[aria-current="true"] {
    border: 3px solid Highlight;
  }

  .lightbox__part-num,
  .lightbox__part-btn[aria-pressed="true"] .lightbox__part-num {
    color: ButtonText;
  }

  .lightbox__zoom-btn[aria-disabled="true"] {
    color: GrayText;
    opacity: 1;
  }

  .lightbox__thumb > img {
    opacity: 1;
  }

  .lightbox__title-kind,
  .lightbox__alt,
  .lightbox__zoom-note,
  .lightbox__disclaimer,
  .lightbox__parts-hint,
  .lightbox__part-text,
  .lightbox .lightbox__parts-title {
    color: CanvasText;
  }

  .lightbox .lightbox__frame.is-zoomed {
    border: 1px solid CanvasText;
  }
}


/* 27.5 Cartão de aplicação (.app-card) ------------------------------------------
   Botão de alternância com foto real ("O que você leva?"):
   <ul class="app-cards">
     <li><button class="app-card" type="button" aria-pressed="false">
       <span class="app-card__top">01 / Dia a dia e novos destinos</span>   (opcional)
       <span class="app-card__media"><img src="…" width="…" height="…" alt=""></span>
       <span class="app-card__name">Camping e utilidades</span>
       <span class="app-card__text">O ponto de partida para a sua rotina…</span>
       <span class="app-card__state" aria-hidden="true">
         <span class="app-card__state-off">Selecionar aplicação</span>
         <span class="app-card__state-on">Aplicação selecionada</span>
       </span>
     </button></li>
   </ul>
   Só conteúdo de frase dentro do botão (span/img; nada de figure). A foto é
   decorativa aqui (alt=""): o nome vem do texto. O estado vem do
   aria-pressed; a linha de estado é visual (aria-hidden) e o "✓" é
   desenhado pelo CSS — não escreva o caractere no HTML. Selecionado: fundo
   --accent-wash, borda dupla --brand-blue e "✓ Aplicação selecionada" em
   azul (7,4:1). < 600: foto à esquerda, texto à direita (cartão baixo). */
.app-cards {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 12px;
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (min-width: 600px) {
  .app-cards {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 16px;
  }
}

@media (min-width: 1100px) {
  .app-cards {
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 20px;
  }
}

.app-cards > li {
  display: flex;
  min-width: 0;
}

.app-card {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: auto auto auto 1fr auto;
  grid-template-areas:
    "top"
    "media"
    "name"
    "text"
    "state";
  align-content: start;
  width: 100%;
  min-width: 0;
  height: 100%;
  margin: 0;
  padding: 16px;
  background-color: var(--paper-0);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  color: var(--ink);
  font: inherit;
  text-align: left;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition:
    background-color 220ms var(--ease-out),
    border-color 220ms var(--ease-out),
    box-shadow var(--dur-2) var(--ease-out);
}

.app-card__top {
  grid-area: top;
  display: block;
  margin-bottom: 12px;
  color: var(--ink-3);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.app-card__media {
  grid-area: media;
  position: relative;
  display: block;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  background-color: var(--paper-2);
  border-radius: var(--radius);
}

.app-card__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.app-card__name {
  grid-area: name;
  display: block;
  margin-top: 16px;
  color: var(--brand-navy);
  font-size: clamp(1.125rem, .4vw + 1rem, 1.3125rem);
  font-weight: 600;
  line-height: 1.25;
  letter-spacing: -0.01em;
}

.app-card__text {
  grid-area: text;
  display: block;
  margin-top: 6px;
  color: var(--ink-2);
  font-size: .9375rem;
  line-height: 1.5;
}

/* Linha de estado com seta ↗ no fim */
.app-card__state {
  grid-area: state;
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid var(--line-soft);
  color: var(--ink);
  font-size: .875rem;
  font-weight: 600;
  line-height: 1.3;
}

.app-card__state::after {
  content: "";
  flex: none;
  width: 16px;
  height: 16px;
  margin-left: auto;
  background-color: var(--brand-navy);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 12L12 4M5.5 4H12v6.5' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 12L12 4M5.5 4H12v6.5' fill='none' stroke='%23000' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
}

.app-card__state-on {
  display: none;
  align-items: center;
  gap: 8px;
  color: var(--brand-blue);
}

.app-card__state-on::before {
  content: "";
  flex: none;
  width: 16px;
  height: 16px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.2l3 3 6-6.4' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.2l3 3 6-6.4' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E") center / contain no-repeat;
}

.app-card:hover {
  border-color: var(--accent);
  box-shadow: var(--shadow-float);
}

.app-card:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 3px;
}

.app-card[aria-pressed="true"] {
  background-color: var(--accent-wash);
  border-color: var(--brand-blue);
  box-shadow: inset 0 0 0 1px var(--brand-blue);
}

.app-card[aria-pressed="true"]:hover {
  box-shadow: inset 0 0 0 1px var(--brand-blue), var(--shadow-float);
}

.app-card[aria-pressed="true"] .app-card__state {
  border-top-color: rgba(0, 79, 158, .22);
}

.app-card[aria-pressed="true"] .app-card__state-off {
  display: none;
}

.app-card[aria-pressed="true"] .app-card__state-on {
  display: inline-flex;
}

.app-card[aria-pressed="true"] .app-card__state::after {
  background-color: var(--brand-blue);
}

/* Seleção com movimento (v2.2): fundo e borda mudam em 220 ms (acima), a foto
   aproxima de leve, a linha "Aplicação selecionada" sobe com fade e o visto
   cresce. Só sem movimento reduzido; o estado em si não depende disso. */
@media (prefers-reduced-motion: no-preference) {
  .app-card__media img {
    transition: transform 480ms var(--ease-out);
  }

  .app-card:hover .app-card__media img,
  .app-card[aria-pressed="true"] .app-card__media img {
    transform: scale(1.03);
  }

  .app-card[aria-pressed="true"] .app-card__state-on {
    animation: evm-state-in 260ms var(--ease-out);
  }

  .app-card[aria-pressed="true"] .app-card__state-on::before {
    animation: evm-check-in 320ms var(--ease-out);
  }
}

/* < 600: cartão baixo — foto à esquerda (5/12), nome e frase à direita */
@media (max-width: 599.98px) {
  .app-card {
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    grid-template-rows: auto auto 1fr auto;
    grid-template-areas:
      "top top"
      "media name"
      "media text"
      "state state";
    column-gap: 14px;
    padding: 14px;
  }

  .app-card__media {
    align-self: start;
    aspect-ratio: 4 / 3;
  }

  .app-card__name {
    margin-top: 0;
  }

  .app-card__state {
    margin-top: 14px;
    padding-top: 12px;
  }
}


/* 27.6 Visto nas fotos (.seen-list) ------------------------------------------------
   Só o que as fotos mostram (model.seen). Itens estáticos (não são botões):
   pílulas baixas com visto azul, sem hover.
   <div class="seen-list">
     <p class="seen-list__label">Visto nas fotos</p>
     <ul class="seen-list__items"><li class="seen-list__item">Laterais de madeira</li>…</ul>
   </div>
   Também vale <ul class="seen-list"> com <li> direto. Cores pelos tokens de
   contexto (claro, painel, vidro ou escuro). */
.seen-list {
  display: grid;
  gap: 10px;
  min-width: 0;
}

.seen-list__label {
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--fg-3);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
}

/* Câmera (a origem da informação é a foto) */
.seen-list__label::before {
  content: "";
  flex: none;
  width: 16px;
  height: 16px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='none' stroke='%23000' stroke-width='2.4'%3E%3Cpath d='M4 10.5h6l2.2-3h7.6l2.2 3h6v15H4z'/%3E%3Ccircle cx='16' cy='17.5' r='5'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='none' stroke='%23000' stroke-width='2.4'%3E%3Cpath d='M4 10.5h6l2.2-3h7.6l2.2 3h6v15H4z'/%3E%3Ccircle cx='16' cy='17.5' r='5'/%3E%3C/svg%3E") center / contain no-repeat;
}

.seen-list__items,
ul.seen-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.seen-list__item,
ul.seen-list > li {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 32px;
  padding: 5px 12px 5px 10px;
  background-color: var(--seen-bg, transparent);
  border: 1px solid var(--rule-strong);
  border-radius: var(--radius-pill);
  color: var(--fg);
  font-size: .875rem;
  font-weight: 500;
  line-height: 1.3;
}

.seen-list__item::before,
ul.seen-list > li::before {
  content: "";
  flex: none;
  width: 14px;
  height: 14px;
  background-color: var(--accent-fg);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.2l3 3 6-6.4' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.2l3 3 6-6.4' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E") center / contain no-repeat;
}


/* 27.7 Como escolher (.howto) -------------------------------------------------------
   Faixa logo abaixo do herói (âncora #como-escolher): título curto à
   esquerda e três passos numerados separados por filetes verticais (≥ 600);
   no celular, empilhados com filetes horizontais.
   <section class="howto" id="como-escolher" aria-labelledby="howto-titulo">
     <div class="container howto__inner">
       <h2 class="howto__title" id="howto-titulo">O que você leva <span class="title-accent">muda o caminho.</span></h2>
       <ol class="howto__steps">
         <li class="howto__step">
           <span class="howto__num" aria-hidden="true">01</span>
           <p class="howto__text"><strong class="howto__step-title">Comece pela sua necessidade.</strong> Escolha a aplicação…</p>
         </li>
       </ol>
     </div>
   </section>
   O .howto__num é visual (a <ol> já numera para leitores de tela). */
.howto {
  padding-block: clamp(28px, 4vw, 44px);
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
}

.howto__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-items: start;
  gap: 20px clamp(24px, 4vw, 56px);
}

@media (min-width: 900px) {
  .howto__inner {
    grid-template-columns: minmax(0, 3fr) minmax(0, 9fr);
  }
}

.howto__title {
  max-width: 18ch;
  color: var(--fg-title);
  font-size: clamp(1.25rem, .8vw + 1rem, 1.625rem);
  font-weight: 400;
  line-height: 1.25;
  letter-spacing: -0.015em;
}

.howto__steps {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  margin: 0;
  padding: 0;
  list-style: none;
}

.howto__step {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: baseline;
  gap: 4px 14px;
  min-width: 0;
  padding-block: 14px;
  border-top: 1px solid var(--rule);
}

.howto__step:first-child {
  padding-top: 0;
  border-top: 0;
}

.howto__step:last-child {
  padding-bottom: 0;
}

.howto__step > :not(.howto__num) {
  grid-column: 2;
}

.howto__num {
  grid-column: 1;
  grid-row: 1;
  min-width: 1.5rem;
  color: var(--accent-fg);
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 500;
  line-height: 1.4;
  letter-spacing: .04em;
  font-variant-numeric: tabular-nums;
}

.howto__step-title {
  display: block;
  color: var(--fg-title);
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.4;
}

.howto__text {
  max-width: 34ch;
  color: var(--fg-2);
  font-size: .9375rem;
  line-height: 1.5;
}

@media (min-width: 600px) {
  .howto__steps {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    column-gap: clamp(8px, 1.5vw, 20px);
  }

  .howto__step,
  .howto__step:first-child,
  .howto__step:last-child {
    padding: 2px 0 2px clamp(16px, 2vw, 28px);
    border-top: 0;
    border-left: 1px solid var(--rule-strong);
  }
}


/* 27.8 Cartão de modelo com foto (EVMSite.renderModelCard) -----------------------
   <article class="model-card model-card--photo">
     <a class="model-card__media model-card__media--photo" href="modelo.html?id=…" tabindex="-1" aria-hidden="true">
       <figure class="photo model-card__photo" style="--photo-ratio: W / H"><img class="photo__img" …></figure>
       <span class="model-card__badges">
         <span class="badge badge--photo">Fotografia real EVM</span>
         <span class="badge model-card__count">4 fotos</span>          (com mais de uma foto)
       </span>
     </a>
     <div class="model-card__body">…</div>
   </article>
   Moldura igual em todos os cartões (--card-ratio no cartão ou na grade;
   padrão 16 / 10), foto inteira (contain) sobre --paper-2; selo no canto
   superior esquerdo e contador no direito, sobre a foto, sem interceptar o
   ponteiro. Hover: a foto aproxima de leve (sem movimento reduzido). */
.model-card__media--photo {
  position: relative;
  display: block;
  overflow: hidden;
  background-color: var(--paper-2);
  border-radius: var(--radius-lg);
}

.model-card__photo {
  --photo-radius: var(--radius-lg);
}

.model-card__photo .photo__img,
.model-card__photo > img {
  aspect-ratio: var(--card-ratio, 16 / 10);
}

.model-card__badges {
  position: absolute;
  top: 12px;
  left: 12px;
  right: 12px;
  z-index: 2;
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: 6px;
  pointer-events: none;
}

.model-card__badges > .badge--photo {
  box-shadow: 0 0 0 1px rgba(255, 255, 255, .28), 0 6px 16px -10px rgba(1, 32, 112, .55);
}

/* Contador "4 fotos": a mesma pílula do .gallery__count (v2.5: também o do
   .media-pair, §07.6 — fica aqui, depois do .badge base de §20) */
.model-card__count,
.media-pair__count {
  min-height: 28px;
  padding: 4px 10px;
  background-color: var(--paper);
  border-color: var(--line);
  box-shadow: 0 6px 16px -10px rgba(1, 32, 112, .55);
  color: var(--ink-2);
  font-size: .75rem;
  letter-spacing: .02em;
  text-transform: none;
  font-variant-numeric: tabular-nums;
}

@media (prefers-reduced-motion: no-preference) {
  .model-card__media--photo .photo__img {
    transition: transform 480ms var(--ease-out);
  }

  .model-card__media--photo:hover .photo__img {
    transform: scale(1.03);
  }
}


/* --------------------------------------------------------------------------
   23 Revelação ao rolar e movimento reduzido
   -------------------------------------------------------------------------- */
.ratio-16x9 { aspect-ratio: 16 / 9; }
.ratio-3x2 { aspect-ratio: 3 / 2; }
.ratio-4x3 { aspect-ratio: 4 / 3; }
.ratio-1x1 { aspect-ratio: 1 / 1; }
.ratio-21x9 { aspect-ratio: 21 / 9; }

@keyframes evm-pulse {
  0% { opacity: .85; transform: scale(.7); }
  70% { opacity: 0; transform: scale(1.9); }
  100% { opacity: 0; transform: scale(1.9); }
}

@keyframes evm-drop {
  from { opacity: 0; transform: translateY(-6px); }
  to { opacity: 1; transform: none; }
}

/* Componentes 3D (§26) — todas usadas só sob prefers-reduced-motion: no-preference */
@keyframes evm-scene-load {
  from { background-position: -50% 0; }
  to { background-position: 150% 0; }
}

@keyframes evm-cue {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(5px); }
}

@keyframes evm-fade {
  from { opacity: 0; }
  to { opacity: 1; }
}

/* A barra de comparação é centrada com translateX(-50%): o quadro-chave o mantém */
@keyframes evm-bar-rise {
  from { opacity: 0; transform: translate(-50%, 16px); }
  to { opacity: 1; transform: translate(-50%, 0); }
}

/* Lightbox (§27.4): a foto entra com leve aproximação */
@keyframes evm-zoom-in {
  from { opacity: 0; transform: scale(.97); }
  to { opacity: 1; transform: none; }
}

/* Lightbox (§27.4, v2.2): saída — fade do diálogo e leve redução da foto */
@keyframes evm-fade-out {
  from { opacity: 1; }
  to { opacity: 0; }
}

@keyframes evm-zoom-out {
  from { opacity: 1; transform: none; }
  to { opacity: 0; transform: scale(.97); }
}

/* Cartão de aplicação (§27.5, v2.2): "Aplicação selecionada" sobe e o visto cresce */
@keyframes evm-state-in {
  from { opacity: 0; transform: translateY(4px); }
  to { opacity: 1; transform: none; }
}

@keyframes evm-check-in {
  0% { transform: scale(.4); }
  60% { transform: scale(1.15); }
  100% { transform: none; }
}

/* Conteúdo sempre visível sem JS ou com movimento reduzido */
@media (prefers-reduced-motion: no-preference) {
  html {
    scroll-behavior: smooth;
  }

  html.js .reveal {
    opacity: 0;
    transform: translate3d(0, 18px, 0);
    transition:
      opacity var(--dur) var(--ease) var(--reveal-delay, 0ms),
      transform calc(var(--dur) * 1.5) var(--ease) var(--reveal-delay, 0ms);
  }

  html.js .reveal.is-visible {
    opacity: 1;
    transform: none;
  }
}

/* v2.6 (docs/UX-2.6.md §6) — transição entre páginas do site (mesma origem):
   dissolução curta (~200 ms) da página inteira, só sem movimento reduzido
   (com ele, a troca é seca, como antes). Nenhum view-transition-name fixo
   aqui: nome repetido na página (cartões, .media-pair, .scene) faria o
   navegador pular a transição; o cabeçalho também fica sem nome (ele está no
   mesmo lugar nas duas páginas, e a dissolução não o faz piscar). O
   configurador limita o próprio :root { view-transition-name: none } à
   classe .cfg-vt (configurador.css). Navegadores sem suporte (Firefox,
   Safari < 18.2) ignoram a regra e navegam como antes. Só CSS: a CSP não muda. */
@media (prefers-reduced-motion: no-preference) {
  @view-transition {
    navigation: auto;
  }

  ::view-transition-group(root) {
    animation-duration: 200ms;
  }

  ::view-transition-old(root),
  ::view-transition-new(root) {
    animation-duration: 200ms;
    animation-timing-function: cubic-bezier(.16, 1, .3, 1);   /* --ease-out */
  }
}

/* A página nova recebe os cliques assim que aparece (a camada da transição
   não intercepta o ponteiro) */
::view-transition {
  pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }

  *,
  *::before,
  *::after {
    animation: none !important;
    transition-duration: 0s !important;
    transition-delay: 0s !important;
    scroll-behavior: auto !important;
  }

  html.js .reveal {
    opacity: 1;
    transform: none;
  }

  /* Componentes 3D: troca de estúdio (claro ↔ escuro), entrada do canvas e
     saída do pôster instantâneas; a barra de carregamento fica parada no meio;
     o indicador "Role para explorar" não oscila. (Câmera, troca de modelo e
     capítulos por corte seco ficam no motor — DESIGN-SYSTEM §2.4.) */
  .scene,
  .scene::before,
  .scene__poster,
  .scene__canvas,
  .site-header__inner::before {
    transition: none !important;
  }

  .scene.is-loading::after {
    animation: none !important;
    background-position: 50% 0;
  }

  .hero3d__cue::after,
  .compare-bar,
  .lineup__media > img {
    animation: none !important;
  }

  /* Fotos reais (§27): lightbox abre, fecha e troca de foto sem animação (o
     ::backdrop não é alcançado pelo * acima); a galeria troca a foto sem
     cross-fade (o site.js também troca direto); cartões, setas, miniaturas e
     o selo de seleção mudam de estado sem transição */
  .lightbox,
  .lightbox[open],
  .lightbox.is-closing,
  .lightbox__figure,
  .app-card__state-on,
  .app-card__state-on::before {
    animation: none !important;
  }

  .lightbox::backdrop {
    animation: none !important;
  }

  .app-card,
  .app-card__media img,
  .gallery__media > .photo,
  .gallery__thumb,
  .gallery__thumb > img,
  .gallery__thumb::after,
  .gallery__arrow,
  .gallery__zoom,
  .gallery__prev,
  .gallery__next,
  .lightbox__img,
  .lightbox__close,
  .lightbox__arrow,
  .lightbox__prev,
  .lightbox__next,
  .model-card__media--photo .photo__img,
  .photo__open::before {
    transition: none !important;
  }

  .gallery__media > .is-entering,
  .lightbox__img.is-entering {
    opacity: 1;
  }

  /* Contato rápido (§07, v2.4): a barra do celular aparece e some sem deslizar;
     o botão flutuante não sobe no hover */
  .contact-bar,
  .wa-float {
    transition: none !important;
  }

  .wa-float:hover {
    transform: none !important;
  }

  .app-card__media img,
  .model-card__media--photo .photo__img,
  .gallery__arrow:active,
  .gallery__zoom:active,
  .lightbox__close:active,
  .lightbox__arrow:active {
    transform: none !important;
  }

  /* Foto + 3D (§07.6, v2.5): a troca de vista é um corte seco (sem a
     dissolução de 240 ms) e a miniatura não sobe no hover */
  .media-pair__view,
  .media-pair__view[hidden],
  .media-pair__pip,
  .media-pair__spin,
  .media-pair__cta {
    transition: none !important;
  }

  .media-pair__pip:hover {
    transform: none !important;
  }

  /* Menu por aplicação (§08.1, v2.6): painel, gaveta e seta abrem e fecham
     sem animação; cartões mudam de estado sem transição */
  .site-nav__panel,
  .site-nav__chevron,
  .site-nav__disclosure,
  .site-nav__disclosure::after,
  .nav-cat__link {
    animation: none !important;
    transition: none !important;
  }
}


/* --------------------------------------------------------------------------
   24 Impressão
   -------------------------------------------------------------------------- */
@media print {
  @page {
    margin: 16mm;
  }

  html,
  body {
    background: #fff !important;
    color: #000 !important;
  }

  body {
    display: block;
    font-size: 11pt;
  }

  .skip-link,
  .site-nav,
  .site-header__cta,
  .site-header__actions,
  .hotspot,
  .hotspot-layer,
  .view-switch,
  .form-actions,
  .chips,
  .callout .btn-row,
  .scene__canvas,
  .scene__surface,
  .scene__hotspots,
  .scene-controls,
  .hero3d__cue,
  .story__rail,
  .usecase__tabs,
  .compare-bar,
  .compare-check,
  .config-summary__actions,
  .gallery__prev,
  .gallery__next,
  .gallery__arrow,
  .gallery__zoom,
  .gallery__thumbs,
  .gallery__media > .is-leaving,
  .lightbox,
  .photo__open::before,
  .photo__open::after,
  .contact-dock,
  .wa-float,
  .contact-bar,
  .media-pair__pip,
  .media-pair__cta,
  .media-pair__view[data-view="3d"] {
    display: none !important;
  }

  /* v2.5: foto + 3D (§07.6) imprime só a foto, mesmo com o 3D na vista grande */
  .media-pair__view[data-view="foto"] {
    display: block !important;
    opacity: 1 !important;
    visibility: visible !important;
  }

  /* v2.4: sem a barra de contato, o rodapé impresso não precisa da folga */
  html.has-contact-dock .site-footer,
  html.has-contact-bar .site-footer {
    padding-bottom: 0 !important;
  }

  .sob-consulta,
  .contact-panel {
    background: #fff !important;
    border: 1px solid #000 !important;
    box-shadow: none !important;
    color: #000 !important;
  }

  .gallery__media > .is-entering {
    opacity: 1 !important;
  }

  /* Selos e contadores (§27): o navegador não imprime fundos — o selo de foto
     (branco sobre marinho) sumiria; vira contorno preto sobre branco */
  .badge--photo,
  .badge--study,
  .gallery__count,
  .model-card__count,
  .media-pair__count,
  .gallery__media .photo__caption {
    background: #fff !important;
    border: 1px solid #000 !important;
    box-shadow: none !important;
    color: #000 !important;
  }

  .badge--photo::before {
    background: #000 !important;
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
  }

  .badge--study::before {
    border-color: #000 !important;
  }

  .app-card {
    background: #fff !important;
    border: 1px solid #999 !important;
    box-shadow: none !important;
  }

  .app-card[aria-pressed="true"] {
    border: 2px solid #000 !important;
  }

  .photo__img,
  .photo > img,
  .photo__open > img,
  .app-card__media img,
  .gallery__thumb > img {
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
  }

  .title-accent {
    color: #000 !important;
  }

  /* Cabeçalho flutuante vira faixa simples no fluxo */
  .site-header,
  .site-header--floating {
    position: static;
    height: auto;
    margin: 0 0 6mm;
    border-bottom: 1px solid #000;
    box-shadow: none !important;
  }

  .site-header__inner {
    display: flex;
    max-width: none;
    min-height: 0;
    padding-bottom: 3mm;
  }

  .site-header__inner::before,
  .site-header__inner::after,
  .site-header::before {
    display: none !important;
  }

  /* v2.6: impressão com a gaveta aberta — sem a trava de rolagem do menu */
  html.nav-open {
    overflow: visible !important;
  }

  .site-header .brand {
    margin: 0;
  }

  .page-top {
    padding-top: 0 !important;
  }

  .proto-banner {
    background: #fff !important;
    border: 1px solid #000;
    color: #000 !important;
  }

  .section,
  .callout {
    padding-block: 12mm;
  }

  .section--dark,
  .callout,
  .section--panel {
    background: #fff !important;
    color: #000 !important;
    --fg: #000;
    --fg-2: #222;
    --fg-3: #333;
    --fg-title: #000;
    --fg-title-accent: #000;
    --accent-fg: #000;
    --rule: #999;
    --rule-strong: #666;
  }

  .callout {
    margin-inline: 0;
    border: 1px solid #000;
  }

  .stage {
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
    break-inside: avoid;
  }

  /* Cenas 3D: o canvas WebGL não imprime de forma confiável; fica o pôster SVG
     sobre o estúdio claro, em proporção fixa e no fluxo */
  .scene,
  .scene--fill,
  .hero3d > .scene,
  .story__stage > .scene,
  .configurator__stage > .scene {
    position: relative !important;
    inset: auto !important;
    width: 100%;
    height: auto !important;
    min-height: 0 !important;
    aspect-ratio: 3 / 2 !important;
    background: #fff !important;
    border: 1px solid #999;
    border-radius: 0;
    break-inside: avoid;
  }

  .scene::before,
  .scene::after,
  .hero3d::after {
    display: none !important;
  }

  .scene__poster {
    opacity: 1 !important;
    visibility: visible !important;
  }

  .swatch__chip {
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
  }

  /* Herói, rolagem guiada e configurador: blocos simples, um após o outro */
  .hero3d,
  .story {
    display: block;
    min-height: 0 !important;
    padding: 0 0 8mm !important;
    background: #fff !important;
    color: #000 !important;
  }

  .story__stage,
  .configurator__stage {
    position: static !important;
    height: auto !important;
    margin: 0 !important;
    padding: 0 !important;
    background: none !important;
  }

  .story__chapters {
    display: grid;
    gap: 6mm;
    grid-auto-rows: auto !important;
    margin-top: 6mm !important;
  }

  .configurator {
    display: block;
  }

  /* Vidro e painéis sobre o 3D: papel branco com filete */
  .glass,
  .glass--dark,
  .story__chapter,
  .story__intro,
  .lineup__card,
  .config-summary,
  .compare-table {
    background: #fff !important;
    color: #000 !important;
    border: 1px solid #999 !important;
    box-shadow: none !important;
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;
    --fg: #000;
    --fg-2: #222;
    --fg-3: #333;
    --fg-title: #000;
    --fg-title-accent: #000;
    --accent-fg: #000;
    --bg: #fff;
    --rule: #999;
    --rule-strong: #666;
  }

  .story__chapter,
  .story__intro {
    max-width: none;
    margin: 0 !important;
  }

  .compare-table {
    overflow: visible;
  }

  .compare-table table {
    min-width: 0;
  }

  .compare-table th:first-child,
  .compare-table__group > th > span {
    position: static;
    box-shadow: none !important;
  }

  .compare-table tr.is-diff > td,
  .compare-table tr.is-diff > th {
    background: #eee !important;
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
  }

  .model-card,
  .lineup__card,
  .spec-block,
  .step,
  .feature,
  .testimonial,
  .shot,
  .story__chapter,
  .config-step,
  .photo,
  .gallery__main,
  .app-card,
  .howto__step,
  details {
    break-inside: avoid;
  }

  html.js .reveal,
  .reveal {
    opacity: 1 !important;
    transform: none !important;
  }

  a {
    color: #000 !important;
  }

  /* URLs externas por extenso, exceto wa.me (o ?text= vira linhas de código percentual) */
  main a[href^="http"]:not([href*="wa.me"])::after {
    content: " (" attr(href) ")";
    font-size: .85em;
    word-break: break-all;
  }

  .site-footer {
    background: #fff !important;
    border-top: 1px solid #000;
  }
}


/* --------------------------------------------------------------------------
   25 Cores forçadas (alto contraste do Windows)
   O sistema troca background-color por Canvas: marcas de estado desenhadas
   assim sumiriam. Aqui elas passam a usar cores do sistema.
   -------------------------------------------------------------------------- */
@media (forced-colors: active) {
  /* Ícone do menu (o texto "Menu" fica só para leitores de tela).
     Aberto, a barra do meio continua transparente pela regra de estado. */
  .site-nav__toggle-bars,
  .site-nav__toggle-bars::before,
  .site-nav__toggle-bars::after {
    forced-color-adjust: none;
    background-color: ButtonText;
  }

  /* Pontos de detalhe: ponto visível com anel de separação; ativo na cor de seleção */
  .hotspot::before,
  .hotspot:hover::before,
  .stage--light .hotspot::before,
  .hotspot-figure--light .hotspot::before {
    forced-color-adjust: none;
    background-color: ButtonText;
    box-shadow: 0 0 0 2px Canvas;
  }

  .hotspot.is-active::before,
  .hotspot[aria-pressed="true"]::before,
  .hotspot[aria-expanded="true"]::before,
  .stage--light .hotspot.is-active::before,
  .hotspot-figure--light .hotspot.is-active::before {
    background-color: Highlight;
    box-shadow: 0 0 0 2px Canvas, 0 0 0 4px Highlight;
  }

  /* Aba de vista ativa: cores de seleção do sistema e a marca inferior visível */
  .view-switch [role="tab"][aria-selected="true"],
  .view-switch__btn[aria-selected="true"] {
    forced-color-adjust: none;
    background-color: Highlight;
    color: HighlightText;
    outline-color: CanvasText;
  }

  .view-switch [role="tab"][aria-selected="true"]::after,
  .view-switch__btn[aria-selected="true"]::after {
    background-color: HighlightText;
  }

  /* Chip ativo e item de detalhe ativo: a marca de forma continua visível */
  .chip[aria-pressed="true"]::before,
  .detail-item::before {
    forced-color-adjust: none;
    background-color: Highlight;
  }

  .chip[aria-pressed="true"],
  .choice.is-checked,
  .cat-tile[aria-current="true"] {
    border-color: Highlight;
  }

  .choice:has(input:checked) {
    border-color: Highlight;
  }

  /* Logotipo (PNG marinho transparente): placa branca para não sumir sobre um
     Canvas escuro do tema de alto contraste */
  .brand__logo {
    forced-color-adjust: none;
    padding: 2px 4px;
    background-color: var(--brand-white);
    border-radius: 6px;
  }

  /* Componentes 3D (§26). Vidro, pílula do cabeçalho, painéis e cartões viram
     Canvas opaco (sem a transparência do vidro) com borda do sistema. Os
     estados selecionados passam às cores de seleção. */
  .site-header__inner::before,
  .site-header__inner::after,
  .glass,
  .story__chapter,
  .story__intro,
  .story__rail-list,
  .scene-controls,
  .scene__note,
  .compare-bar,
  .lineup__card > .lineup__compare {
    background-color: Canvas;
    border-color: CanvasText;
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
  }

  .usecase__tab[aria-selected="true"],
  .story__rail-link[aria-current="step"],
  .story__rail-link[aria-current="true"],
  .story__rail-link.is-active,
  .scene-controls__btn[aria-pressed="true"] {
    forced-color-adjust: none;
    background-color: Highlight;
    border-color: Highlight;
    color: HighlightText;
  }

  .usecase__tab[aria-selected="true"] .usecase__tab-icon {
    color: HighlightText;
  }

  .usecase__model-link[aria-current="true"],
  .usecase__model-btn[aria-pressed="true"],
  .option-toggle.is-checked {
    border-color: Highlight;
  }

  .option-toggle:has(.option-toggle__input:checked) {
    border-color: Highlight;
  }

  /* Caixas marcadas (comparar, opcionais): preenchidas em Highlight com o visto */
  .compare-check__input:checked + .compare-check__box,
  .option-toggle__input:checked + .option-toggle__box {
    forced-color-adjust: none;
    background-color: Highlight;
    border-color: Highlight;
  }

  .compare-check__input:checked + .compare-check__box::after,
  .option-toggle__input:checked + .option-toggle__box::after {
    background-color: HighlightText;
  }

  /* Acabamentos: a cor é o conteúdo — preservada; marcado com anel do sistema */
  .swatch__chip {
    forced-color-adjust: none;
  }

  .swatch__input:checked + .swatch__chip {
    outline: 3px solid Highlight;
    outline-offset: 3px;
  }

  .swatch__input:focus-visible + .swatch__chip {
    outline: 2px solid CanvasText;
    outline-offset: 8px;
  }

  /* Barra de carregamento da cena: faixa sólida na cor de seleção */
  .scene.is-loading::after {
    forced-color-adjust: none;
    background-color: Highlight;
    background-image: none;
  }

  /* Número das etapas do configurador: círculo com contorno */
  .config-step__num {
    border: 1px solid CanvasText;
  }

  /* Tabela comparativa: linha que difere marcada por barra (o fundo some) */
  .compare-table tr.is-diff > th:first-child {
    border-left: 4px solid Highlight;
  }

  .compare-table__legend::before {
    forced-color-adjust: none;
    background-color: Canvas;
    border-left-color: Highlight;
  }

  /* Setas e marcas desenhadas com máscara + background-color (que viraria
     Canvas e sumiria): nos links, a cor do texto do link; nos botões, a do
     botão. Inclui o sublinhado/ponto da página atual no menu. */
  .link-arrow::after,
  .cat-tile__count::after,
  .hero3d__cue::after,
  .usecase__model-link::after,
  .site-nav__list > li > a::after,
  .site-nav__disclosure::after {
    forced-color-adjust: none;
    background-color: LinkText;
  }

  /* Menu por aplicação (§08.1, v2.6): painel e véu da gaveta em Canvas com
     borda do sistema; o cartão da aplicação atual com borda e ponto em
     Highlight (a sombra interna some) */
  .site-nav__panel {
    background-color: Canvas;
    border-color: CanvasText;
  }

  html.nav-open .site-header::before {
    background-color: Canvas;
  }

  .nav-cat__link {
    border-color: CanvasText;
  }

  .nav-cat__link[aria-current="page"],
  .nav-cat__link[aria-current="true"] {
    border: 3px solid Highlight;
  }

  .nav-cat__link[aria-current="page"] .nav-cat__name::after,
  .nav-cat__link[aria-current="true"] .nav-cat__name::after {
    forced-color-adjust: none;
    background-color: Highlight;
  }

  .site-nav__disclosure[aria-expanded="true"] {
    outline: 1px solid CanvasText;
  }

  .usecase__model-btn::after,
  .compare-bar__remove::before {
    forced-color-adjust: none;
    background-color: ButtonText;
  }

  .checklist > li::before {
    forced-color-adjust: none;
    background-color: CanvasText;
  }

  /* FAQ: o + / − é feito de gradientes, que o alto contraste remove;
     sem isto aberto e fechado ficariam iguais */
  details > summary::after {
    forced-color-adjust: none;
    background:
      linear-gradient(CanvasText, CanvasText) center / 14px 1.5px no-repeat,
      linear-gradient(CanvasText, CanvasText) center / 1.5px 14px no-repeat;
  }

  details[open] > summary::after {
    background: linear-gradient(CanvasText, CanvasText) center / 14px 1.5px no-repeat;
  }

  /* Fotos reais (§27). Selos e contadores: placa Canvas com borda do sistema
     (o fundo sólido marinho/branco some); ponto cheio × anel vazado continuam
     distintos. */
  .badge--photo,
  .badge--study,
  .gallery__count,
  .model-card__count,
  .media-pair__count,
  .gallery__media .photo__caption {
    background-color: Canvas;
    border-color: CanvasText;
    color: CanvasText;
  }

  .badge--photo::before,
  .eyebrow--dot::before {
    forced-color-adjust: none;
    background-color: CanvasText;
  }

  .badge--study::before {
    forced-color-adjust: none;
    background-color: transparent;
    border-color: CanvasText;
  }

  /* Ícones desenhados por máscara (lupa, setas da v2.1, vistos, câmera). Os
     <svg> do site.js usam currentColor: seguem a cor do botão sozinhos. */
  .photo__open::after,
  .gallery__prev::before,
  .gallery__next::before,
  .lightbox__prev::before,
  .lightbox__next::before,
  .app-card__state::after,
  .app-card[aria-pressed="true"] .app-card__state::after {
    forced-color-adjust: none;
    background-color: ButtonText;
  }

  .seen-list__item::before,
  ul.seen-list > li::before,
  .seen-list__label::before,
  .app-card__state-on::before {
    forced-color-adjust: none;
    background-color: CanvasText;
  }

  /* Círculo da lupa e botões sobre a foto: placa do sistema com borda */
  .photo__open::before,
  .gallery__arrow,
  .gallery__zoom,
  .gallery__prev,
  .gallery__next,
  .lightbox__close,
  .lightbox__arrow,
  .lightbox__prev,
  .lightbox__next {
    background-color: ButtonFace;
    border-color: ButtonText;
    color: ButtonText;
  }

  /* Miniaturas: sem o esmaecimento (a atual é marcada pela borda e pela barra) */
  .gallery__thumb > img {
    opacity: 1;
  }

  /* Miniatura atual: borda e barra na cor de seleção (a sombra some) */
  .gallery__thumb[aria-current="true"],
  .gallery__thumb[aria-current="step"] {
    border: 3px solid Highlight;
  }

  .gallery__thumb[aria-current="true"]::after,
  .gallery__thumb[aria-current="step"]::after {
    forced-color-adjust: none;
    background-color: Highlight;
  }

  /* Lightbox: fundo do sistema; a foto ganha borda para separar do fundo */
  .lightbox {
    background-color: Canvas;
    color: CanvasText;
  }

  .lightbox__img {
    border: 1px solid CanvasText;
  }

  /* Cartão de aplicação selecionado: borda de 3 px em Highlight (a borda
     dupla por sombra some); o recuo compensa para o conteúdo não pular */
  .app-card[aria-pressed="true"] {
    padding: 14px;
    border: 3px solid Highlight;
  }

  .app-card__state-on {
    color: CanvasText;
  }

  /* Contato (§07, v2.4). O botão flutuante perde a sombra (o anel branco):
     vira botão do sistema com borda; o ícone segue currentColor. */
  .wa-float {
    background-color: ButtonFace;
    border: 2px solid ButtonText;
    color: ButtonText;
  }

  .wa-float:focus-visible {
    outline: 3px solid Highlight;
    outline-offset: 2px;
  }

  .contact-bar {
    background-color: Canvas;
    border-top: 2px solid CanvasText;
  }

  .sob-consulta,
  .contact-panel {
    border-color: CanvasText;
  }

  .sob-consulta::before,
  .sob-consulta__lead::before {
    forced-color-adjust: none;
    background-color: CanvasText;
  }

  /* Foto + 3D (§07.6, v2.5). A sombra some: a miniatura vira botão do
     sistema com borda de 2 px (separa da foto e do estúdio), o foco usa o
     contorno de seleção; o pôster ganha filete para a caixa não sumir. O
     rótulo "3D" / "Foto" e "Girar em 3D" ficam em placas do sistema. */
  .media-pair__pip {
    background-color: ButtonFace;
    border: 2px solid ButtonText;
    color: ButtonText;
  }

  .media-pair__pip:hover {
    border-color: Highlight;
  }

  .media-pair__pip:focus-visible {
    outline: 3px solid Highlight;
    outline-offset: 2px;
  }

  .media-pair__pip-label,
  .media-pair[data-view="3d"] > .media-pair__main > .media-pair__pip .media-pair__pip-label {
    background-color: Canvas;
    border: 1px solid CanvasText;
    color: CanvasText;
  }

  .media-pair__poster {
    border: 1px solid CanvasText;
  }

  .media-pair__spin,
  .media-pair__cta {
    background-color: Canvas;
    border-color: LinkText;
    color: LinkText;
  }
}

@media (forced-colors: active) and (max-width: 599.98px) {
  .app-card[aria-pressed="true"] {
    padding: 12px;
  }
}
