/* ==========================================================================
   Classic Texturas e Grafiatos
   Home v2. Folha unica, sem framework e sem pre-processador.

   Ordem: o 17 era a FAQ, que saiu da pagina. Os numeros seguintes ficaram como
   estavam, para nao invalidar quem procura a secao pelo numero do comentario.
   01 variaveis        08 hero e banners    15 avaliacoes google
   02 reset            09 faixa de prova    16 lojas
   03 tipografia       10 ambiente          18 cta final
   04 layout           11 produtos          19 footer
   05 botoes           12 cores             20 whatsapp flutuante
   06 header e menu    13 duas frentes      20B alvos de toque
   07 placeholder .ph  14 obras             20C aviso de cookies
                                            21 responsivo
                                            22 animacao

   Os blocos @media (max-width: ...) espalhados pelo arquivo sao os ajustes de
   celular: eles ficam junto do componente que corrigem, e nao no 21, porque a
   razao de cada um so faz sentido ao lado da regra que ele desfaz.
   ========================================================================== */

/* --------------------------------------------------------------------------
   01. VARIAVEIS
   Trocar a paleta aqui muda o site inteiro.
   -------------------------------------------------------------------------- */
:root {
  /* paleta da marca */
  --areia: #F5F2ED;
  --areia-escura: #EBE6DE;
  --tinta: #1C1A17;
  --tinta-suave: #6B655C;
  --terracota: #B8552E;
  --terracota-label: #A34A26;   /* so para o label: o da marca nao passa em 12px */
  --terracota-escuro: #93411F;
  --marinho: #16164A;
  --linha: #D9D2C7;
  --branco: #FFFFFF;

  /* derivadas, so para uso interno */
  --marinho-escuro: #0F0F35;
  --terracota-claro: #E8926A;   /* terracota so tem contraste sobre o marinho depois de clarear */
  --whatsapp: #25D366;
  --whatsapp-escuro: #1EB456;

  /* texto sobre fundo escuro */
  --sobre-escuro: #F1EEE8;
  --sobre-escuro-suave: rgba(241, 238, 232, 0.72);
  --linha-escura: rgba(241, 238, 232, 0.18);

  /* Vermelho e verde da comparacao revenda x fabrica. Vivem so na secao "Por
     que a Classic". O vermelho e mais frio e mais escuro que o terracota
     (#B8552E) de proposito: perto demais e a pessoa le a cor da marca como o
     lado ruim da comparacao. */
  --negado: #A32C22;
  --negado-fundo: #FBF1EF;
  --negado-linha: #EFDBD7;
  --negado-linha-forte: #DCBDB7;
  --aprovado: #2C6B4F;
  --aprovado-fundo: #EFF5F1;
  --aprovado-linha: #D3E4D9;

  /* tipografia. A Bitter substituiu a Fraunces, que era fonte de display sendo
     usada de 17px a 88px: nas medidas pequenas as hastes finas dela sumiam.
     A Bitter e slab, de traco quase constante e altura de x alta, feita para
     leitura em tela; ela atravessa a faixa inteira sem trocar de desenho. E
     variavel de 400 a 700, entao continua havendo peso sem virar negrito.

     A Georgia fica na fila de reserva porque e a serif que mais se aproxima
     dela entre as que ja existem em qualquer maquina. */
  --fonte-titulo: "Bitter", Georgia, "Times New Roman", serif;
  --fonte-corpo: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
  --fonte-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;

  /* medidas. Na v2 o respiro vertical cresce em relacao a v1. */
  --largura-max: 1240px;
  --raio: 3px;
  --borda: 1px solid var(--linha);
  --secao-y: 72px;
  /* Sobe junto com a altura do logo, logo abaixo em 06. O header usa isto como
     min-height, entao um logo maior que a variavel faria a barra crescer sem
     que a variavel soubesse, e o hero e as ancoras, que descontam por ela,
     ficariam desalinhados. Mexer em um dos dois pede mexer no outro. */
  --header-h: 76px;
  --gutter: 20px;

  --transicao: 220ms ease;
  /* botao responde mais rapido que o resto: 220ms num elemento que a pessoa
     esta prestes a clicar ja se sente como atraso */
  --transicao-btn: 180ms ease;
  /* Curva unica das animacoes da pagina: sai rapido e chega devagar, sem
     balanco no fim. E o que da a sensacao de peso leve em vez de "efeito". */
  --suave: cubic-bezier(0.16, 1, 0.3, 1);

  /* ------------------------------------------------------------------------
     ELEVACAO
     A empresa vende relevo, entao a pagina tem relevo. Uma unica fonte de luz,
     no canto superior esquerdo, e toda sombra cai para baixo e para a direita.
     Isso vale para a pagina inteira: nao ha sombra com deslocamento negativo em
     Y, nem sombra para a esquerda, em lugar nenhum desta folha.

     SOMBRA COLORIDA, NUNCA PRETA, sobre fundo claro. Preto sobre a areia
     #F5F2ED da cinza sujo, porque tira a saturacao do fundo em vez de escurecer
     dentro da mesma familia. Todas as sombras de fundo claro sao o marinho da
     marca, #16164A, com opacidade baixa.

     CADA NIVEL TEM DUAS SOMBRAS. Uma curta e densa, que e o contato do objeto
     com a superficie, e uma longa e difusa, que e a luz ambiente contornando
     ele. Sombra unica sempre parece adesivo: ou fica dura demais na borda ou
     vira uma mancha sem pe. Quem da o peso e a razao entre as duas.

     Onde cada nivel entra:
       1  o que so precisa descolar do fundo: botao em repouso, swatch, header
       2  cartao em repouso: produto, loja, depoimento
       3  cartao no hover, e o cartao de texto sobre a foto de ambiente
       4  so o comparador grande da secao de obras

     NENHUMA SOMBRA SOLTA NO RESTO DA FOLHA. Se um box-shadow novo nao sair
     daqui, ou ele esta errado ou falta um nivel nesta escala. */
  --sombra-1: 0 1px 2px rgba(22, 22, 74, 0.04),
              0 2px 8px rgba(22, 22, 74, 0.04);
  --sombra-2: 0 2px 4px rgba(22, 22, 74, 0.05),
              0 8px 24px rgba(22, 22, 74, 0.06);
  --sombra-3: 0 4px 8px rgba(22, 22, 74, 0.06),
              0 16px 48px rgba(22, 22, 74, 0.08);
  --sombra-4: 0 8px 16px rgba(22, 22, 74, 0.08),
              0 32px 80px rgba(22, 22, 74, 0.10);

  /* O header nao cabe em nenhum dos quatro: ele flutua menos que um cartao e
     mais que um botao em repouso, e o contato dele e um fio de 1px sem blur,
     porque a barra atravessa a tela inteira e um contato borrado nela viraria
     faixa cinza. Fica com nivel proprio, mas token, para a folha continuar sem
     sombra solta. */
  --sombra-header: 0 1px 0 rgba(22, 22, 74, 0.06),
                   0 4px 16px rgba(22, 22, 74, 0.06);

  /* Os tres controles redondos que boiam sobre conteudo que a folha nao
     controla: a seta do banner, o pegador do comparador e o botao flutuante do
     WhatsApp. Nenhum deles sabe o que tem atras: pode cair sobre ceu claro ou
     sobre parede escura na mesma foto. Por isso ficam acima do nivel 2, que
     sumiria em cima de metade das fotos. Continua marinho e continua caindo
     para baixo; so a opacidade sobe. Antes eram tres valores diferentes,
     0.18, 0.22 e 0.28, sem motivo nenhum para serem diferentes. */
  --sombra-flutuante: 0 2px 4px rgba(22, 22, 74, 0.18),
                      0 6px 18px rgba(22, 22, 74, 0.16);

  /* O anel da cor escolhida na cartela. E box-shadow por conveniencia de
     desenho, e nao elevacao: nao tem deslocamento nem borrao, e um contorno. */
  --anel-selecao: 0 0 0 2px var(--tinta);

  /* SOBRE FUNDO ESCURO A SOMBRA COLORIDA SOME. O marinho a 8% em cima do
     marinho e o proprio marinho, entao nas secoes escuras a sombra volta a ser
     preta de verdade, e mais forte, senao nao existe. A escala e a mesma, so
     que traduzida: a -escura corresponde ao nivel 2, a -escura-4 ao nivel 4 e e
     do comparador. */
  --sombra-escura: 0 4px 12px rgba(0, 0, 0, 0.3),
                   0 16px 48px rgba(0, 0, 0, 0.25);
  --sombra-escura-4: 0 8px 16px rgba(0, 0, 0, 0.3),
                     0 32px 80px rgba(0, 0, 0, 0.25);

  /* AS QUINAS. A sombra poe o objeto acima da superficie; estas tres linhas
     dizem que ele tem espessura. Todas sao inset, e por isso nao contam como
     sombra solta: sao o desenho da propria borda.

     --luz-quina  topo do objeto pegando a luz, sobre fundo claro
     --luz-quina-escura  a mesma coisa nas secoes marinho, onde 40% estouraria
     --luz-quina-btn  no terracota, que ja e escuro, 15% e o que nao vira brilho
     --base-marcada  a linha de baixo, no lado onde a luz nao chega
     --espessura  a base do swatch, que precisa parecer pastilha e nao papel
     --poco  o inverso de tudo isto: a foto rebaixada dentro do cartao */
  --luz-quina: inset 0 1px 0 rgba(255, 255, 255, 0.4);
  --luz-quina-escura: inset 0 1px 0 rgba(255, 255, 255, 0.12);
  --luz-quina-btn: inset 0 1px 0 rgba(255, 255, 255, 0.15);
  --base-marcada: inset 0 -1px 0 rgba(22, 22, 74, 0.06);
  --espessura: inset 0 -2px 4px rgba(0, 0, 0, 0.06);
  --poco: inset 0 2px 6px rgba(22, 22, 74, 0.1);

  /* As faixas escuras nao sao objetos em cima da pagina, sao cavadas nela: as
     duas sombras internas escurecem a junta de cima e a de baixo e a faixa
     afunda. O -8px de spread segura a sombra na beirada em vez de deixar ela
     subir pelo meio da faixa. */
  --faixa-cavada: inset 0 8px 16px -8px rgba(0, 0, 0, 0.25),
                  inset 0 -8px 16px -8px rgba(0, 0, 0, 0.25);

  /* A luz entrando na secao escura, no mesmo canto de onde vem toda sombra da
     pagina. Sem ela o marinho fica chapado e a faixa cavada nao tem o que
     iluminar. E background-image, entao entra empilhada antes da cor. */
  --luz-secao: radial-gradient(ellipse 80% 60% at 20% 0%,
               rgba(255, 255, 255, 0.06), transparent 60%);

  /* Ruido de fundo das secoes claras, para a areia nao ser uma chapada digital.
     E uma pastilha de 120px de turbulencia a 2%, repetida. Se der para ver a
     trama a olho nu sem aproximar, esta forte demais. */
  --grao: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23g)' opacity='0.02'/%3E%3C/svg%3E");
}

@media (min-width: 768px) {
  :root {
    --secao-y: 128px;
    --header-h: 92px;
    --gutter: 40px;
  }
}

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

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-h) + 24px);
}

body {
  margin: 0;
  background: var(--areia);
  color: var(--tinta);
  font-family: var(--fonte-corpo);
  font-size: 1rem;
  font-weight: 400;
  line-height: 1.65;
  /* tracking que a Inter pede no corpo de 16px; sem isso ela lê espacada */
  letter-spacing: -0.011em;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

body.is-locked { overflow: hidden; }

h1, h2, h3, h4, p, figure, blockquote, dl, dd { margin: 0; }

ul, ol { margin: 0; padding: 0; list-style: none; }

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

img { height: auto; border: 0; }

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

button, input, select, textarea { font: inherit; color: inherit; margin: 0; }

button { background: none; border: 0; cursor: pointer; }

address { font-style: normal; }

/* sprite de icones no topo do body, nunca visivel */
.sprite { display: none; }

:focus-visible {
  outline: 2px solid var(--terracota);
  outline-offset: 3px;
}

.pular-para-conteudo {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 200;
  padding: 12px 20px;
  background: var(--tinta);
  color: var(--areia);
  border-radius: var(--raio);
}

.pular-para-conteudo:focus { left: 8px; top: 8px; }

/* Texto que existe para o Google e para o leitor de tela, mas nao aparece na
   tela. Usado no H1 do hero, cujo texto ja esta desenhado dentro do banner. */
.so-leitor {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* --------------------------------------------------------------------------
   03. TIPOGRAFIA
   A escala da v2 e maior que a da v1. Titulo grande, corpo curto.
   -------------------------------------------------------------------------- */
/* text-wrap: balance distribui as palavras entre as linhas em vez de encher a
   primeira e jogar o resto na seguinte. E o que impede casos como "Nao e parede
   pintada. E / acabamento.", que deixava uma palavra sozinha embaixo. So vale a
   pena em texto curto: o navegador desiste depois de umas seis linhas, e por
   isso os titulos usam balance e os paragrafos usam pretty, logo abaixo.
   Navegador antigo ignora a propriedade e quebra como antes, sem prejuizo. */
h1, h2, h3, h4, .label, .fonte-titulo {
  text-wrap: balance;
}

/* O peso 600 e o que a Bitter pede em titulo: no 400 ela fica clara demais para
   o corpo grande, e acima de 700 os slabs engrossam e viram anuncio. A Bitter
   nao tem eixo optico, ao contrario da Fraunces que estava aqui antes, entao o
   font-optical-sizing abaixo nao faz nada e fica so como no-op inofensivo para
   o dia em que a fonte trocar de novo. */
h1, h2, h3, .fonte-titulo {
  font-family: var(--fonte-titulo);
  font-weight: 600;
  font-optical-sizing: auto;
}

h1 {
  font-size: clamp(2.5rem, 5.6vw, 4.5rem);
  line-height: 1.04;
  letter-spacing: -0.02em;
}

/* A Bitter desenha um pouco mais estreito que a Fraunces, mas o teto do clamp
   fica onde estava: o limite abaixo foi medido contra o titulo mais longo da
   pagina, e sobrar folga e melhor que voltar a estourar a coluna.
   Comentario antigo, mantido porque a razao continua valendo:
   A fonte de titulo desenha mais largo que a fonte antiga, entao o teto do clamp caiu
   de 3.25rem para 3rem: com o valor antigo os titulos de duas palavras longas,
   como "Mande a metragem e cuidamos do resto", passavam da coluna. */
h2 {
  font-size: clamp(1.9375rem, 4.2vw, 3rem);
  line-height: 1.08;
  letter-spacing: -0.018em;
}

h3 {
  font-size: 1.4375rem;
  line-height: 1.18;
  letter-spacing: -0.012em;
}

h4 {
  font-family: var(--fonte-corpo);
  font-size: 1.0625rem;
  font-weight: 500;
  line-height: 1.35;
}

/* pretty cuida do outro defeito, a viuva: a ultima linha do paragrafo com uma
   palavra so. Ele mexe apenas nas linhas finais, entao nao desalinha o bloco. */
p { max-width: 65ch; text-wrap: pretty; }

strong { font-weight: 500; }

/* O label usa um terracota proprio, mais escuro que o da marca. O #B8552E dos
   botoes rende 4.30:1 sobre o areia e 3.86:1 sobre o areia escura, e o minimo
   para texto normal e 4.5:1; em 12px de caixa alta com entreletra aberta isso
   se sente. O #A34A26 sobe para 5.28:1 e 4.74:1 e continua sendo o mesmo tom.
   No botao o terracota da marca fica: la o texto e branco por cima dele, e essa
   combinacao ja passa com 4.80:1. */
.label {
  display: block;
  font-size: 0.75rem;
  font-weight: 500;
  line-height: 1.2;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: var(--terracota-label);
}

.lead {
  font-size: 1.125rem;
  line-height: 1.6;
  max-width: 60ch;
  color: var(--tinta-suave);
}

.texto-suave { color: var(--tinta-suave); }

/* --------------------------------------------------------------------------
   04. LAYOUT
   -------------------------------------------------------------------------- */
.container {
  width: 100%;
  max-width: var(--largura-max);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.secao { padding-block: var(--secao-y); }

/* O grao entra nas duas secoes claras e em nenhum outro lugar. A areia sozinha
   e uma chapada perfeita, que nenhum material de obra e; a pastilha de ruido a
   2% tira essa perfeicao sem virar textura visivel. E background-image, entao
   convive com a cor sem precisar de pseudo-elemento. */
.secao--areia {
  background-color: var(--areia);
  background-image: var(--grao);
}

.secao--areia-escura {
  background-color: var(--areia-escura);
  background-image: var(--grao);
}

/* Faixa escura em marinho. Todo texto solto dentro dela passa a claro.
   O terracota tambem clareia, senao some no fundo azul. */
/* A secao escura era um retangulo de cor chapada. Ganha duas coisas.

   A LUZ, no mesmo canto de onde vem toda sombra da pagina: um oval de branco a
   6% no alto e a esquerda. Sem ele nao ha de onde a sombra dos elementos de
   dentro estar caindo, e a faixa cavada logo abaixo nao tem o que iluminar.

   A FAIXA CAVADA. As sombras internas em cima e embaixo escurecem as duas
   juntas com as secoes vizinhas, e a faixa afunda na pagina em vez de estar
   pousada nela. Isto NAO contraria a regra de nao pousar sombra em secao de
   largura total: sao inset, e o efeito e o inverso, a secao vira o buraco e nao
   o objeto. Sombra externa em faixa continua proibida.

   Aqui a sombra e preta de verdade, e nao o marinho da escala: marinho a 8% em
   cima de marinho e o proprio marinho. */
.secao--marinho {
  background-color: var(--marinho);
  background-image: var(--luz-secao);
  box-shadow: var(--faixa-cavada);
  color: var(--sobre-escuro);
  --contorno-cor: var(--terracota-claro);
  --contorno-hover-texto: var(--marinho);
}

.secao--marinho h2,
.secao--marinho h3,
.secao--marinho h4 { color: var(--sobre-escuro); }

.secao--marinho .label { color: var(--terracota-claro); }

.secao--marinho p,
.secao--marinho .lead,
.secao--marinho .texto-suave { color: var(--sobre-escuro-suave); }

/* Cabecalho de secao. Na v2 nao tem risco embaixo do titulo, o respiro resolve.

   NAO HA MAIS TETO DE LARGURA AQUI. Ele ja foi 46ch, depois 46rem, e as duas
   vezes prendia o titulo numa coluna mais estreita que a secao. Medindo os oito
   titulos da pagina na Bitter de 3rem, o mais largo, "O que dizem nossos
   clientes depois de comprar.", mede 1025px; a coluna util tem 1160px. Ou seja,
   TODOS cabiam numa linha so, e o teto de 736px era o unico motivo de eles
   quebrarem em duas. Quebra no meio da frase quando a frase inteira cabe e
   defeito, nao decisao.

   O .lead solta o proprio teto de 60ch pelo mesmo motivo. Isso da linhas longas
   para um paragrafo, o que normalmente e ruim de ler; aqui vale porque estes
   subtitulos tem uma ou duas frases e passam a caber em UMA linha, e linha
   unica nao sofre do problema que a medida longa causa, que e perder o lugar ao
   voltar para a linha seguinte. Se algum subtitulo crescer a ponto de precisar
   de tres linhas, devolva um teto para ele em vez de deixar correr.

   O text-wrap: balance dos titulos, la em cima na secao 03, continua valendo e
   nao briga com isto: ele so entra quando a frase realmente nao cabe, o que
   agora acontece no celular e em telas medias, onde duas linhas equilibradas
   sao melhores que uma linha cheia mais uma orfa. */
.secao__cabecalho {
  display: flex;
  flex-direction: column;
  gap: 16px;
  margin-bottom: 56px;
}

/* precisa vir antes do --duplo, que tem teto proprio de 36ch na coluna da
   direita e tem que continuar ganhando desta regra */
.secao__cabecalho .lead { max-width: none; }

.secao__cabecalho h2 + p,
.secao__cabecalho h1 + p { margin-top: 4px; }

/* O <h1> das paginas internas usa a escala do h2.

   POR QUE ELE EXISTE. A home tem um h1 invisivel, porque a chamada dela esta
   desenhada dentro da arte do banner. As paginas internas nao tem banner: o
   primeiro titulo que aparece na tela E o titulo da pagina, e ate 11/09/2026
   ele era um h2, o que deixava as tres paginas sem h1 nenhum.

   POR QUE NAO A ESCALA DO h1. O clamp do h1 vai ate 4.5rem, medida pensada
   para competir com uma arte de banner em volta. Numa pagina de texto corrido
   ele viraria cartaz. A escala do h2 e a que o .secao__cabecalho foi desenhado
   para receber, e e ela que o cabecalho continua recebendo: muda a tag, nao o
   desenho. */
.secao__cabecalho h1 {
  font-size: clamp(1.9375rem, 4.2vw, 3rem);
  line-height: 1.08;
  letter-spacing: -0.018em;
}

/* 56px de respiro embaixo do cabecalho sao proporcionais a um titulo de 3rem.
   No celular o titulo cai para 1.94rem e o mesmo vao passa a ler como buraco
   entre o cabecalho e o conteudo dele. */
@media (max-width: 639px) {
  .secao__cabecalho { margin-bottom: 36px; }
}

/* Cabecalho com o texto de apoio na coluna da direita, na altura do titulo. So
   dos 900px para cima: abaixo disso as duas colunas dariam 40 caracteres cada e
   a linha de apoio quebraria em cinco linhas curtas. */
.secao__cabecalho--duplo { max-width: none; }

@media (min-width: 900px) {
  .secao__cabecalho--duplo {
    flex-direction: row;
    align-items: flex-end;
    justify-content: space-between;
    gap: 48px;
  }

  .secao__cabecalho--duplo .secao__cabecalho-texto {
    display: grid;
    gap: 16px;
    max-width: 34rem;
  }

  .secao__cabecalho--duplo .lead { max-width: 36ch; margin-bottom: 6px; }
}

/* cabecalho em duas colunas: titulo a esquerda, acao a direita, mesma linha */
.secao__cabecalho--linha {
  flex-direction: row;
  align-items: flex-end;
  justify-content: space-between;
  gap: 24px;
  max-width: none;
  flex-wrap: wrap;
}

.secao__cabecalho--linha > div { display: grid; gap: 14px; }

/* --------------------------------------------------------------------------
   05. BOTOES
   Par de CTAs sempre com o mesmo peso: mesma altura, mesmo padding, mesma
   tipografia. Muda so o preenchimento.
   -------------------------------------------------------------------------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 54px;
  padding: 15px 30px;
  border: 1px solid transparent;
  border-radius: var(--raio);
  font-size: 0.9375rem;
  font-weight: 500;
  line-height: 1.2;
  text-align: center;
  cursor: pointer;
  transition: background-color var(--transicao-btn), color var(--transicao-btn),
              border-color var(--transicao-btn), transform var(--transicao-btn),
              box-shadow var(--transicao-btn);
}

/* A seta vive dentro do botao, nunca antes do texto, e anda 3px no hover. E o
   mesmo gesto do .link-seta logo abaixo: a pagina inteira aponta para a
   direita quando o link leva para fora ou para o WhatsApp. */
.btn__seta {
  width: 15px;
  height: 15px;
  flex: none;
  transition: transform var(--transicao);
}

.btn:hover .btn__seta,
.btn:focus-visible .btn__seta { transform: translateX(3px); }

/* O primario carrega o pedido de orcamento, entao ele tem massa: em repouso ja
   esta pousado acima da pagina, no hover levanta, e no clique afunda abaixo do
   proprio repouso. Os tres estados sao o mesmo objeto em alturas diferentes, e
   nao tres aparencias.

   A quina de luz no topo e o que separa "botao com sombra" de "botao com
   espessura": sem ela o terracota fica com cara de retangulo pintado. Sao 15%
   de branco, e nao os 40% das superficies claras, porque sobre o terracota
   qualquer coisa acima disso vira brilho de plastico.

   O afundar do :active e o unico lugar da folha onde a sombra encolhe em vez de
   crescer, e e de proposito: o dedo empurra o botao para dentro da pagina. */
.btn--primario {
  background: var(--terracota);
  border-color: var(--terracota);
  color: var(--branco);
  box-shadow: var(--sombra-1), var(--luz-quina-btn);
}

.btn--primario:hover,
.btn--primario:focus-visible {
  background: var(--terracota-escuro);
  border-color: var(--terracota-escuro);
  transform: translateY(-2px);
  box-shadow: var(--sombra-2), var(--luz-quina-btn);
}

.btn--primario:active {
  transform: translateY(1px);
  box-shadow: var(--sombra-1);
}

/* O contorno muda de cor conforme o fundo, via variavel. Sobre imagem e sobre
   marinho ele vira claro, no resto continua terracota. */
.btn--contorno {
  background: transparent;
  border-color: var(--contorno-cor, var(--terracota));
  color: var(--contorno-cor, var(--terracota));
}

/* Em repouso o contorno e um desenho na pagina, sem elevacao nenhuma: ele e a
   opcao secundaria e nao pode disputar altura com o primario. So no hover, ja
   preenchido, ele vira objeto e ganha o primeiro degrau. */
.btn--contorno:hover,
.btn--contorno:focus-visible {
  background: var(--contorno-cor, var(--terracota));
  color: var(--contorno-hover-texto, var(--branco));
  box-shadow: var(--sombra-1);
}

.btn--contorno:active { transform: translateY(1px); }

/* Verde do WhatsApp: so no botao do header e no flutuante. Em qualquer outro
   lugar o link do WhatsApp e texto ou contorno em terracota. */
.btn--whatsapp {
  background: var(--whatsapp);
  border-color: var(--whatsapp);
  color: #0B3D21;
}

.btn--whatsapp:hover,
.btn--whatsapp:focus-visible {
  background: var(--whatsapp-escuro);
  border-color: var(--whatsapp-escuro);
  transform: translateY(-2px);
  box-shadow: var(--sombra-2), var(--luz-quina-btn);
}

.btn--tinta {
  background: var(--tinta);
  border-color: var(--tinta);
  color: var(--areia);
}

.btn--tinta:hover,
.btn--tinta:focus-visible { background: #000; border-color: #000; }

/* Branco com contorno e texto marinho. Nasceu para o botao do banner: sobre uma
   arte clara ele precisa aparecer sem brigar com a tipografia dela. No hover
   inverte, e o marinho passa a ser o preenchimento. */
.btn--branco {
  background: var(--branco);
  border-color: var(--marinho);
  color: var(--marinho);
}

.btn--branco:hover,
.btn--branco:focus-visible {
  background: var(--marinho);
  border-color: var(--marinho);
  color: var(--branco);
}

.btn--pequeno {
  min-height: 44px;
  padding: 11px 18px;
  font-size: 0.875rem;
}

.btn--bloco { width: 100%; }

.btn-par { display: grid; gap: 12px; }

@media (min-width: 480px) {
  .btn-par {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 14px;
    justify-content: start;
  }
  /* 268px, e nao os 240px de antes: com o rotulo do CTA final nomeando o que
     vai ser orcado, mais a seta, o texto quebrava em duas linhas dentro do
     botao e as duas caixas ficavam de alturas diferentes. */
  .btn-par--auto { grid-template-columns: repeat(2, minmax(0, 268px)); }
  .btn-par--centro { grid-template-columns: repeat(2, minmax(0, 268px)); justify-content: center; }
}

/* link de texto com seta. Substitui o botao onde a caixa pesaria demais.

   A seta era um tracinho de 16px que esticava para 28px no hover, e de longe
   lia como travessao antes de ler como direcao. Virou uma ponta de seta
   desenhada com duas bordas de um quadrado girado: mesmo peso de traco, mas
   agora aponta para onde o link leva. */
.link-seta {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  font-size: 0.9375rem;
  font-weight: 500;
  color: var(--terracota);
  transition: color var(--transicao);
}

.link-seta::after {
  content: "";
  width: 7px;
  height: 7px;
  border-top: 1.6px solid currentColor;
  border-right: 1.6px solid currentColor;
  transform: rotate(45deg);
  transition: transform var(--transicao);
}

.link-seta:hover,
.link-seta:focus-visible { color: var(--terracota-escuro); }

.link-seta:hover::after,
.link-seta:focus-visible::after { transform: translateX(4px) rotate(45deg); }

.icone-wa { width: 18px; height: 18px; flex: none; fill: currentColor; }

/* --------------------------------------------------------------------------
   06. HEADER E MENU
   Solido desde o topo, em qualquer pagina e em qualquer ponto da rolagem.
   Nao existe mais o estado transparente sobre o hero nem a troca de cor no
   scroll, entao o logo aparece sempre na versao colorida original.
   -------------------------------------------------------------------------- */
.header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  background: var(--areia);
  color: var(--tinta);
  border-bottom: 1px solid var(--linha);
  transition: box-shadow 300ms var(--suave),
              background-color 300ms var(--suave),
              border-color 300ms var(--suave);
}

/* Depois dos primeiros 40px de rolagem a barra passa a pairar sobre o conteudo
   em vez de ser uma faixa colada no alto. O main.js poe a classe. A altura nao
   muda de proposito: mexer nela empurraria a pagina inteira.

   Sao tres coisas juntas, e as tres precisam uma da outra. O fundo perde 15% de
   opacidade e o blur de 12px devolve a legibilidade que essa transparencia
   custaria: sem o blur, o texto do site passando por tras da barra briga com o
   menu. A sombra e o que poe a barra acima da pagina; ela comeca com um fio de
   1px, que e a linha de contato, e continua num borrao de 16px, que e a
   ambiente. Sao os mesmos dois tempos da escala de elevacao, so que rasos,
   porque a barra flutua pouco.

   A borda de baixo sai junto: com o fio de 1px da sombra no lugar dela, as duas
   viravam uma linha de 2px, mais grossa do que qualquer outra da pagina. */
.header.is-rolado {
  background: rgba(245, 242, 237, 0.85);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  border-bottom-color: transparent;
  box-shadow: var(--sombra-header);
}

/* o header ignora a largura maxima do site e usa a tela inteira, so com
   respiro nas laterais. Logo colado na esquerda, acoes coladas na direita. */
.header .container {
  max-width: none;
  padding-inline: clamp(16px, 3vw, 48px);
}

.header__inner {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 20px;
  min-height: var(--header-h);
}

/* o menu fica centralizado no vao entre o logo e as acoes */
.header .nav { justify-self: center; min-width: 0; }

/* o botao nunca quebra em duas linhas, mesmo com o texto longo */
.header .btn--whatsapp { white-space: nowrap; }

.logo { display: inline-flex; align-items: center; flex: none; }

/* A marca nova e bem mais larga que a antiga: 471x223 contra 573x438, ou seja
   2.1:1 no lugar de 1.3:1. Cada pixel de altura custa mais que o dobro de
   largura do que custava antes, e e a largura que aperta o menu no meio. Por
   isso a altura sobe ate onde o header comporta com respiro, e nao mais. */
.logo img { display: block; width: auto; height: 48px; }

@media (min-width: 768px) {
  .logo img { height: 64px; }
}

/* O rodape e escuro, mas a marca continua colorida: em vez de achatar tudo em
   branco com filtro, ela ganha uma placa clara atras. Assim a marca e a mesma
   nos dois lugares, com as cores do anel preservadas. O inline-flex do .logo
   faz a placa envolver a imagem sem sobra. */
/* No rodape entra a versao negativa do arquivo, com a palavra em claro e o anel
   colorido intacto, e ela vai direto sobre o fundo escuro. Nao existe caixa
   nem filtro: qualquer placa clara sobre o marinho lia como remendo, e o
   filtro monocromatico jogava fora as cores da marca. O que impedia o logo de
   ir direto ao fundo era so a palavra "CLASSIC", em azul-marinho escuro sobre
   azul-marinho escuro, e e exatamente isso que o negativo resolve. */

.nav { display: none; }

.nav__lista { display: flex; align-items: center; gap: 24px; }

.nav__link {
  font-size: 0.9375rem;
  opacity: 0.82;
  transition: opacity var(--transicao);
}

.nav__link:hover { opacity: 1; }

/* O justify-self nao e enfeite. Abaixo de 1024px o .nav sai com display none e,
   com isso, deixa de ocupar a coluna do meio: as acoes escorregam para a coluna
   1fr e encostam no logo. Ancorar no fim mantem elas na borda direita tanto com
   o menu na tela quanto sem ele. */
.header__acoes { display: flex; align-items: center; gap: 12px; justify-self: end; }

.header .btn--whatsapp { display: none; }

/* redes sociais no header. Herdam a cor do header, entao ficam brancas sobre
   o hero e marinho depois que ele fica solido. */
.header__redes { display: none; align-items: center; gap: 4px; }

.header__redes a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  opacity: 0.82;
  transition: opacity var(--transicao);
}

.header__redes a:hover { opacity: 1; }

.header__redes svg { width: 19px; height: 19px; fill: currentColor; }

.menu-btn {
  display: inline-flex;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 44px;
  height: 44px;
  padding: 0 10px;
  margin-right: -10px;
}

.menu-btn span {
  display: block;
  height: 1.5px;
  background: currentColor;
}

.menu-painel {
  position: fixed;
  inset: 0;
  z-index: 99;
  display: flex;
  flex-direction: column;
  padding: calc(var(--header-h) + 32px) var(--gutter) 40px;
  background: var(--areia);
  visibility: hidden;
  opacity: 0;
  overflow-y: auto;
  transition: opacity var(--transicao), visibility var(--transicao);
}

.menu-painel.is-aberto { visibility: visible; opacity: 1; }

.menu-painel__lista { display: flex; flex-direction: column; }

/* O overflow-y e o line-height sao os dois lados do mesmo problema: com o item
   "Antes e depois" o menu passou a ter seis linhas, e o conteudo media 862px
   num painel que e a altura da janela. Em 390x844, 375x812 e 360x800 o rodape
   com os dois telefones caia fora da tela sem rolagem nenhuma, porque um
   position: fixed com overflow visible nao rola: o que sobra fica inalcancavel.

   O line-height traz o conteudo de volta para dentro nos aparelhos de hoje. Os
   itens herdavam o 1.7 do corpo, que e medida de paragrafo: em 2rem cada linha
   ganhava 22px de entrelinha que ninguem le, 96px por item. Em 1.2 o item mede
   79px, a lista inteira encolhe ~100px e o painel volta a caber. O padding de
   20px fica como esta, que e o que garante o alvo de toque.

   O overflow-y: auto e a rede embaixo, para tela curta de verdade: em 375x667 e
   320x568 o painel nao cabe nem com cinco itens, e essa parte ja estava assim
   antes deste item entrar. */
.menu-painel__lista a {
  display: block;
  padding: 20px 0;
  border-bottom: var(--borda);
  font-family: var(--fonte-titulo);
  font-size: 2rem;
  line-height: 1.2;
  letter-spacing: -0.02em;
}

.menu-painel__rodape {
  margin-top: auto;
  padding-top: 32px;
  display: grid;
  gap: 14px;
}

.menu-painel__tel { font-size: 0.9375rem; color: var(--tinta-suave); }

/* --------------------------------------------------------------------------
   07. PLACEHOLDER DE IMAGEM  (.ph)
   MODO WIREFRAME. As fotos ainda nao existem.

   Cada placeholder e um <div class="ph" data-src="caminho/arquivo.jpg">.
   O nome do arquivo aparece na tela lido do proprio data-src, entao nao ha
   texto duplicado no HTML. A dimensao recomendada vai no <span class="ph__dim">.

   Quando a foto chegar, troque a div inteira por:
     <img src="mesmo/caminho.jpg" alt="..." width="..." height="..." loading="lazy">
   Nada muda no CSS. As classes de proporcao (.ph--16x9, .ph--4x5, .ph--4x3)
   existem so para o placeholder segurar o mesmo espaco da foto final.
   -------------------------------------------------------------------------- */
.ph {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  width: 100%;
  padding: 16px;
  overflow: hidden;
  text-align: center;
  background-color: var(--areia-escura);
  background-image: repeating-linear-gradient(
    45deg,
    rgba(28, 26, 23, 0.05) 0,
    rgba(28, 26, 23, 0.05) 1px,
    transparent 1px,
    transparent 6px
  );
  border: 1px dashed var(--linha);
  color: var(--tinta-suave);
}

/* icone de moldura, SVG embutido no proprio CSS.
   A ordem na tela e icone, nome do arquivo, dimensao. Como o ::after nasce
   depois do <span> no fluxo normal, a ordem e ajustada com order. */
.ph::before {
  content: "";
  order: 1;
  display: block;
  width: 34px;
  height: 34px;
  margin-bottom: 6px;
  opacity: 0.75;
  background: center / contain no-repeat
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B655C' stroke-width='1.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4' width='19' height='16' rx='1.5'/%3E%3Cpath d='m5.5 17 3.6-4.4 2.6 3 2.4-3.4L19 17'/%3E%3Ccircle cx='8.6' cy='9' r='1.3'/%3E%3C/svg%3E");
}

/* o nome do arquivo sai do data-src, nao do texto do HTML */
.ph::after {
  content: attr(data-src);
  order: 2;
  display: block;
  max-width: 100%;
  font-family: var(--fonte-mono);
  font-size: 12px;
  line-height: 1.4;
  color: var(--tinta-suave);
  overflow-wrap: anywhere;
}

.ph__dim {
  order: 3;
  display: block;
  font-family: var(--fonte-mono);
  font-size: 10px;
  line-height: 1.4;
  letter-spacing: 0.04em;
  color: var(--tinta-suave);
  opacity: 0.7;
}

/* proporcoes finais da foto */
.ph--16x9 { aspect-ratio: 16 / 9; }
.ph--4x5  { aspect-ratio: 4 / 5; }
.ph--4x3  { aspect-ratio: 4 / 3; }

/* Dentro de caixa de altura fixa (faixa de ambiente de 70vh, comparador)
   a foto real vai entrar com object-fit: cover. O placeholder faz o mesmo:
   preenche a caixa em vez de impor a propria proporcao. */
.ph--cobrir {
  position: absolute;
  inset: 0;
  height: 100%;
  aspect-ratio: auto;
  border: 0;
}

/* Dentro do comparador as duas camadas ficam empilhadas e a alca corta o meio.
   Se o rotulo dos dois ficasse centralizado, um cobriria o outro e os dois
   sumiriam atras da alca. Por isso o "antes" vai para o alto a esquerda e o
   "depois" para o alto a direita. */
.compare .ph--cobrir { justify-content: flex-start; padding-top: 13%; }

.compare__quadro > .ph--cobrir { align-items: flex-end; padding-right: 7%; }

.compare__camada > .ph--cobrir { align-items: flex-start; padding-left: 7%; }

/* em tela estreita os dois rotulos encostam um no outro. O de baixo desce. */
@media (max-width: 639px) {
  .compare .ph--cobrir { padding-inline: 12px; }
  .compare__quadro > .ph--cobrir { padding-top: 34%; }
}

/* placeholder pequeno, dentro da tira de obras: encolhe o icone e o texto */
.ph--mini { padding: 10px; gap: 4px; }
.ph--mini::before { width: 22px; height: 22px; margin-bottom: 2px; }
.ph--mini::after { font-size: 10px; }
.ph--mini .ph__dim { display: none; }

/* --------------------------------------------------------------------------
   08. HERO, CARROSSEL DE BANNERS
   O hero nao tem mais comparador nem bloco de texto por cima. Agora e uma arte
   fechada, que ja traz a propria tipografia, com um unico botao centralizado
   embaixo. O comparador antes e depois vive so na secao 14, obras.
   -------------------------------------------------------------------------- */
.hero--banner {
  position: relative;
  background: var(--areia);
  /* O header e fixo e solido, entao o banner comeca abaixo dele para nao ficar
     com a moldura cortada. */
  padding-top: var(--header-h);
}

.banners { position: relative; overflow: hidden; }

/* Os slides ficam lado a lado numa fita e a fita anda. Com um banner so ela
   nunca sai do lugar, e o custo disso e zero. */
.banners__trilho {
  display: flex;
  transition: transform 480ms cubic-bezier(0.4, 0, 0.2, 1);
}

.banner {
  position: relative;
  flex: 0 0 100%;
  /* Item de flex nao encolhe abaixo do conteudo por padrao. A arte tem 2000px
     de largura natural, entao sem isto um slide poderia ficar mais largo que a
     janela e empurrar a pagina para o lado. */
  min-width: 0;
  /* A proporcao vem da arte, hoje 3840 x 1536, ou seja 2,5 por 1. Ela precisa
     bater com o width e o height do <img> no HTML: sempre que a arte mudou e
     este numero ficou para tras, a caixa reservou uma altura que a imagem nao
     tinha e sobrou faixa de fundo em volta dela.

     2,5 por 1 tambem e a proporcao que faz o banner encher a largura da janela
     em qualquer desktop. A conta e simples: a caixa so encolhe quando a altura
     que ela pediria, largura dividida por 2,5, passa do max-height logo abaixo.
     Numa tela de 1920 isso daria 768px contra um teto de 860px, entao nao
     encolhe. Numa arte 2 por 1, a mesma tela pedia 960px, o teto cortava, e a
     imagem recuava para o meio deixando areia nos dois lados.

     O max-height impede que num monitor largo o banner empurre a pagina inteira
     para baixo da dobra. */
  aspect-ratio: var(--banner-proporcao, 3840 / 1536);
  max-height: calc(100vh - var(--header-h));
}

/* A arte de celular e quadrada, 2000 x 2000, entao aqui a caixa deixa de ser
   2,5 por 1 e vira 1 por 1. O corte de 639px e o mesmo do <source> no HTML: e
   o navegador que escolhe o arquivo, e este numero so diz a que altura a caixa
   tem que ficar para receber o arquivo escolhido. Mexer em um sem o outro faz
   a caixa reservar altura que a arte nao tem, e sobra faixa de areia em volta.

   Num celular de 390px isso da 390px de altura de arte, mais os 76px do header:
   o hero fecha em 466px e a faixa de numeros ja aparece na primeira tela. */
@media (max-width: 639px) {
  .banner { --banner-proporcao: 1 / 1; }
}

/* O link cobre a arte inteira, e o <picture> precisa ocupar a caixa toda: sem
   isso ele fica com altura automatica, o height: 100% da imagem nao tem contra
   o que resolver e a arte para de acompanhar a caixa. */
.banner__link,
.banner picture {
  position: absolute;
  inset: 0;
  display: block;
}

/* cover, agora que a caixa tem exatamente a proporcao da arte. Nesse caso os
   dois valores dao no mesmo em tela normal, e so se separam quando o max-height
   encurta a caixa, em janela muito baixa: o contain deixava um fio de areia nas
   laterais e o cover preenche, comendo cerca de 1% da largura da arte, que ali
   e so fundo. Se um dia a arte voltar a ter proporcao diferente da caixa, volte
   para contain, senao o corte passa a pegar a tipografia de dentro dela. */
.banner img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

/* Enquanto a arte nao estiver em images/banners/, o slide mostra a mesma trama
   de placeholder do resto da pagina, em vez do icone de imagem quebrada.
   Quem poe e tira a classe e o main.js, no load e no error da imagem. */
.banner.is-faltando {
  background-color: var(--areia-escura);
  background-image: repeating-linear-gradient(
    45deg,
    rgba(28, 26, 23, 0.05) 0,
    rgba(28, 26, 23, 0.05) 1px,
    transparent 1px,
    transparent 6px
  );
}

.banner.is-faltando img { visibility: hidden; }

/* O BOTAO SOBRE A ARTE NAO EXISTE MAIS. Ate 11/09/2026 havia um
   .banner__cta: um <a> de HTML posicionado por cima da arte, com --cta-top e
   --cta-left medidos arte por arte. A regra ja tinha um display:none no
   celular, porque a arte de celular trazia o botao desenhado; nas artes novas
   as quatro trazem, desktop inclusive, e o botao de HTML virou duplicata em
   todas as larguras.

   Quem voltar a usar arte sem botao desenhado precisa do bloco de volta: ele
   esta no historico do git, com as medidas e o porque de cada uma. */


/* As setas so existem a partir do segundo banner, e foi ao entrar o segundo que
   elas viraram problema: centradas em 50% da altura, a da direita caia em cima
   do fim do subtitulo da arte 2, que corre ate 93,8% da largura. A sobreposicao
   ia de 1px em 1280 ate uns 24px em 900, o suficiente para comer a ultima
   palavra.

   Os 68% resolvem sem tirar as setas da lateral, que e onde se espera achar
   seta de carrossel. As duas artes poem o texto no terco de cima e deixam o
   piso vazio embaixo; e nessa faixa vazia que as setas passam a pousar. Se uma
   arte nova trouxer texto na parte de baixo, este numero pede revisao, do mesmo
   jeito que o --cta-top de cada banner. */
.banners__seta {
  position: absolute;
  top: 68%;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  transform: translateY(-50%);
  background: rgba(255, 255, 255, 0.86);
  border-radius: 50%;
  color: var(--tinta);
  box-shadow: var(--sombra-flutuante);
  transition: background-color var(--transicao);
}

.banners__seta:hover { background: var(--branco); }

.banners__seta svg {
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
}

.banners__seta--ant { left: 14px; }
.banners__seta--prox { right: 14px; }
.banners__seta--ant svg { transform: rotate(180deg); }

.banners__pontos {
  position: absolute;
  left: 50%;
  bottom: 16px;
  z-index: 3;
  display: flex;
  gap: 8px;
  transform: translateX(-50%);
}

.banners__ponto {
  width: 8px;
  height: 8px;
  padding: 0;
  background: rgba(28, 26, 23, 0.3);
  border-radius: 50%;
  transition: width var(--transicao), background-color var(--transicao);
}

.banners__ponto[aria-current="true"] {
  width: 22px;
  background: var(--tinta);
  border-radius: 4px;
}

/* Com um banner so nao ha para onde navegar. O main.js poe esta classe. */
.banners.is-unico .banners__seta,
.banners.is-unico .banners__pontos { display: none; }

/* --------------------------------------------------------------------------
   COMPARADOR ANTES E DEPOIS
   Duas camadas sobrepostas. A de cima e recortada por clip-path conforme a
   posicao do arrastador, guardada em --pos.
   -------------------------------------------------------------------------- */
/* O UNICO ELEMENTO DA PAGINA NO NIVEL 4. E a peca maior e a que a secao existe
   para mostrar, entao ela e a que mais se afasta do fundo.

   A sombra e preta, e nao o marinho da escala: o comparador vive dentro da
   secao marinho, e marinho a 10% em cima de marinho nao e sombra nenhuma. A
   geometria continua sendo a do nivel 4, 8px de contato e 32px de ambiente; so
   a cor mudou de contexto. Essa e a traducao que a --sombra-escura-4 faz.

   A quina de luz precisa de camada propria porque o comparador e todo feito de
   filhos absolutos cobrindo a caixa inteira, e inset box-shadow pinta abaixo do
   conteudo. Mesmo motivo do poco das fotos de produto. */
.compare {
  --pos: 50%;
  position: relative;
  overflow: hidden;
  background: var(--areia-escura);
  border-radius: var(--raio);
  box-shadow: var(--sombra-escura-4);
  touch-action: pan-y;
  user-select: none;
  -webkit-user-select: none;
}

.compare::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 3;
  pointer-events: none;
  border-radius: inherit;
  box-shadow: var(--luz-quina-escura);
}

.compare__quadro { position: absolute; inset: 0; }

/* Com <picture> o wrapper e inline e nao tem altura propria, entao a img
   perderia o height: 100%. O picture passa a ocupar a caixa inteira. */
.compare__quadro > picture,
.compare__camada > picture,
.ambiente__midia > picture {
  position: absolute;
  inset: 0;
  display: block;
}

.compare__quadro img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.compare__camada {
  position: absolute;
  inset: 0;
  clip-path: inset(0 calc(100% - var(--pos)) 0 0);
}

.compare__handle {
  position: absolute;
  top: 0;
  bottom: 0;
  left: var(--pos);
  z-index: 5;
  width: 2px;
  margin-left: -1px;
  background: var(--branco);
  cursor: ew-resize;
  touch-action: none;
}

.compare__grip {
  position: absolute;
  top: 50%;
  left: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  transform: translate(-50%, -50%);
  background: var(--branco);
  border-radius: 50%;
  color: var(--tinta);
  box-shadow: var(--sombra-flutuante);
}

.compare__grip svg { width: 24px; height: 24px; fill: currentColor; }

.compare__handle:focus-visible { outline: none; }

.compare__handle:focus-visible .compare__grip {
  outline: 2px solid var(--terracota);
  outline-offset: 3px;
}

.compare__tag {
  position: absolute;
  bottom: 16px;
  z-index: 4;
  padding: 6px 12px;
  background: rgba(15, 15, 53, 0.72);
  border-radius: var(--raio);
  color: var(--branco);
  font-size: 0.6875rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  pointer-events: none;
}

.compare__tag--antes { left: 16px; }
.compare__tag--depois { right: 16px; }

/* Enquanto as obras 02 a 05 forem placeholder, clicar numa miniatura aponta o
   comparador para um arquivo que ainda nao existe. Em vez do icone de imagem
   quebrada, a caixa volta a parecer o placeholder do resto da pagina. O
   main.js poe e tira a classe conforme a foto carrega ou falha, e a trama vai
   no pai porque uma <img> quebrada continua desenhando o icone dela. */
.compare img.is-faltando { visibility: hidden; }

.compare__quadro:has(> img.is-faltando),
.compare__camada:has(> img.is-faltando) {
  background-color: var(--areia-escura);
  background-image: repeating-linear-gradient(
    45deg,
    rgba(28, 26, 23, 0.05) 0,
    rgba(28, 26, 23, 0.05) 1px,
    transparent 1px,
    transparent 6px
  );
}

/* --------------------------------------------------------------------------
   09. FAIXA DE PROVA
   -------------------------------------------------------------------------- */
/* A faixa saiu do formato "numero grande + frase, tres colunas iguais com risco
   no meio". Aquilo e o bloco de confianca mais copiado da web, e tinha um defeito
   proprio: o "15" ficava orfao do "anos", que descia para a frase. Lido de
   relance sobrava um numeral solto sem unidade.

   Agora cada item e uma marca: o numeral e a unidade na mesma linha de base
   ("15 ANOS"), um risco curto de terracota embaixo, e so entao a frase. E a
   anatomia de uma placa de fabrica, que e o que a faixa esta dizendo.

   Os riscos verticais sairam: eram eles que faziam a faixa parecer tabela. Quem
   separa agora e o respiro entre as colunas e o risco de cada marca. */
.prova {
  /* Duas camadas. Em cima, uma estriacao vertical de 7px quase invisivel: e o
     risco de desempenadeira do grafiato, que e o produto que a faixa esta
     vendendo. De longe nao se ve listra nenhuma, so uma superficie que nao e
     chapada. Embaixo, o degrade que da profundidade ao marinho. */
  background-image:
    var(--luz-secao),
    repeating-linear-gradient(90deg, rgba(232, 146, 106, 0.05) 0 1px, transparent 1px 7px),
    linear-gradient(155deg, var(--marinho) 0%, var(--marinho-escuro) 100%);
  /* mesma faixa cavada das secoes marinho: as duas sao rebaixadas na pagina */
  box-shadow: var(--faixa-cavada);
  color: var(--sobre-escuro);
  /* fio de terracota no topo: assenta a faixa contra a arte do banner logo acima
     em vez de deixar os dois azuis se encostarem sem transicao */
  border-top: 1px solid rgba(232, 146, 106, 0.22);
  padding: 40px 0;
}

/* Tres colunas em qualquer largura, inclusive no celular. Empilhados, os tres
   numeros gastavam 343px de altura e cada um chegava sozinho na tela, sem o
   vizinho ao lado: a faixa deixava de ser uma comparacao e virava tres frases
   soltas. Lado a lado eles sao lidos de uma vez, que e a unica coisa que a
   faixa tem para fazer.

   O que muda por tamanho de tela e so o respiro e o corpo, la embaixo. */
/* O vao entre as colunas e zero: quem separa e a divisoria vertical de cada
   item, e o respiro vem do padding dele. Com gap E padding a distancia entre
   duas colunas dobrava e a divisoria ficava boiando no meio de um vazio. */
.prova__lista {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0;
}

.prova__item {
  display: grid;
  gap: 14px;
  align-content: start;
  padding-inline: 32px;
  border-left: 1px solid var(--linha-escura);
}

/* a divisoria separa, entao nao existe antes do primeiro nem depois do ultimo,
   e o padding tambem cai nas pontas para os tres alinharem com a pagina */
.prova__item:first-child { padding-left: 0; border-left: 0; }

.prova__item:last-child { padding-right: 0; }

/* A regua e o que faz a faixa ler como placa de fabrica: o numeral ancorado a
   esquerda, a unidade empurrada para a direita, e um fio ligando os dois por
   baixo. Sem o fio a unidade parece ter escorregado para longe do numero; com
   ele, os dois viram uma linha de ficha tecnica.

   Quem empurra a unidade e o margin-left: auto dela, e nao um space-between
   aqui. O item do Google tem tres filhos, numeral, estrelas e unidade, e o
   space-between distribuiria os tres pela linha: as estrelas parariam soltas no
   meio do vao, longe do numero que elas qualificam. Com o auto na unidade, o
   numeral e as estrelas ficam juntos na esquerda e so a unidade vai para a
   direita, valha o item dois ou tres filhos. */
.prova__marca {
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin: 0;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--linha-escura);
}

/* as estrelas qualificam o numeral, entao andam com ele. O center e porque
   baseline de um svg de 13px ao lado de um numeral de 56px joga a fileira la
   embaixo, na linha de base do numero. */
.prova__estrelas { align-self: center; }

.prova__estrelas svg { width: 13px; height: 13px; }

/* O numeral e o unico elemento grande da faixa: ele sozinho tem que ser lido de
   relance, na rolagem. Por isso vem no claro, e nao mais no terracota.

   O terracota claro rende 7.01:1 sobre o marinho e o claro rende 14.53:1: com o
   numeral em terracota, o elemento que precisa ser visto primeiro era o de MENOR
   contraste da faixa, com metade do contraste da propria legenda embaixo dele.
   A hierarquia estava invertida, e era isso que fazia a faixa parecer errada
   sem que desse para apontar o que era. O terracota nao sumiu: ele desceu para
   a unidade, onde um acento pequeno rende mais do que um numeral inteiro. */
.prova__num {
  font-family: var(--fonte-titulo);
  font-size: clamp(2.25rem, 5.5vw, 3.5rem);
  font-weight: 600;
  line-height: 0.85;
  letter-spacing: -0.04em;
  color: var(--sobre-escuro);
}

/* A unidade em caixa alta espacada, no sans, contra o numeral em serif: e o
   contraste que faz "15 ANOS" ler como uma coisa so em vez de dois pedacos. */
.prova__unidade {
  font-size: 0.6875rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  white-space: nowrap;
  color: var(--terracota-claro);
  /* e este auto, e nao o container, que manda a unidade para a direita */
  margin-left: auto;
}

.prova__texto {
  font-size: 0.9375rem;
  line-height: 1.45;
  color: var(--sobre-escuro-suave);
  /* a frase e um <span>, entao nao herda o text-wrap: pretty que o seletor de
     <p> da a pagina inteira. Sem isto ela cai em duas linhas com a ultima
     palavra sozinha: "dentro" embaixo de "misturando textura e grafiato aqui" */
  text-wrap: pretty;
}

/* Numa tela de 390px cada uma das tres colunas fica com uns 96px uteis. O
   numeral em 40px e o texto em 15px nao cabiam ali: a frase quebrava em palavra
   solta por linha. O corpo menor e o que compra as tres colunas, e continua
   legivel porque a frase e curta e existe so para explicar a marca que esta
   logo acima dela.

   O max-width sai porque, com a coluna ja estreita, o limite de 30ch nao tem
   mais o que segurar: quem define a largura da linha e a propria coluna. */
@media (max-width: 767px) {
  .prova { padding: 28px 0; }

  .prova__item { gap: 8px; padding-inline: 10px; }

  /* Numa coluna de 96px o numeral e a unidade nao cabem na mesma linha, e o
     space-between jogaria um em cada ponta com nada no meio. Aqui eles empilham.

     A REGUA SAI no celular. Ela existia para separar a marca da frase de apoio,
     e a frase agora esta escondida: sobrava um risco embaixo do nada, lido como
     sublinhado solto. Pior, os tres nao se alinhavam, porque o item do Google
     tem uma linha a mais, a das estrelas, e a regua dele descia junto. As
     estrelas nao tem como subir para o lado do "4,5": as cinco mais o numeral
     dao 115px numa coluna de 96.

     Quem estrutura a faixa no celular passam a ser as divisorias verticais
     entre as colunas, que continuam de pe. */
  .prova__marca {
    flex-direction: column;
    align-items: flex-start;
    gap: 5px;
    padding-bottom: 0;
    border-bottom: 0;
  }

  /* em coluna o auto empurraria a unidade para a borda direita da coluna, longe
     do numeral; aqui os tres ficam alinhados a esquerda, um sobre o outro */
  .prova__unidade { margin-left: 0; }

  .prova__estrelas { align-self: flex-start; }

  .prova__estrelas svg { width: 11px; height: 11px; }

  .prova__num { font-size: clamp(1.75rem, 7vw, 2.25rem); }

  .prova__unidade { font-size: 0.5625rem; letter-spacing: 0.14em; }

  /* A frase de apoio SAI DA TELA no celular. Numa coluna de 96px ela caia em
     tres a quatro linhas de duas palavras, e as tres juntas ocupavam mais
     altura que os proprios numeros, que sao o assunto da faixa.

     Escondida, e nao apagada: e a unica parte da faixa que diz de onde vem a
     nota ("no Google") e o que a fabrica faz. Apagar do HTML tiraria isso
     tambem de quem ouve a pagina, e no celular, que e onde o Google indexa
     primeiro. Sao as mesmas declaracoes do .so-leitor, na secao 02.

     O position: absolute tira o span do fluxo do grid, entao o .prova__item
     encolhe de verdade em vez de so ficar com um vao vazio embaixo. */
  .prova__texto {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
  }
}

/* --------------------------------------------------------------------------
   11. A ROTA DA BARRICA  +  A TABELA "NA PRATICA"
   --------------------------------------------------------------------------
   Dois paineis, um por caminho. Cada parada e um circulo com o icone dentro; o
   que liga uma parada a outra e um fio com o custo escrito em cima dele. Na
   revenda o fio e pontilhado e cada trecho cobra alguma coisa; no nosso o fio e
   inteiro e nao cobra nada, e essa e a figura toda.

   No celular a trilha desce em coluna, com o fio na vertical: sete paradas em
   linha nao cabem em 390px. Dos 640px para cima ela vira linha e os elos
   crescem para ocupar a sobra, entao os dois paineis terminam no mesmo ponto e
   o que se compara passa a ser quantas paradas existem no meio.

   Vermelho e verde vivem so aqui. O vermelho e mais frio e mais escuro que o
   terracota de proposito: perto demais e a pessoa le a cor da marca como o lado
   ruim da comparacao.
   -------------------------------------------------------------------------- */
.rota { display: grid; gap: 16px; margin-bottom: 44px; }

/* O min-width: 0 e a rede de seguranca. .rota e display: grid, entao cada via e
   item de grid e nasce com min-width: auto, que vale o min-content do que ela
   guarda. Com a trilha deitada esse min-content e a soma das paradas mais as
   pilulas de custo, que sao nowrap: 597px com paradas de 92 e 741px com paradas
   de 128. Quando isso passava da largura do container, a via crescia junto e
   empurrava a PAGINA INTEIRA, nao so o cartao. Era esse o estouro de 16px em
   640 e de 80px em 768.

   Os breakpoints la embaixo foram corrigidos para a trilha so deitar quando
   couber, e este zero garante que, se alguem acrescentar uma parada, o defeito
   volte como corte dentro do cartao em vez de como barra de rolagem no site. */
.rota__via {
  min-width: 0;
  padding: 20px 18px;
  border: 1px solid var(--negado-linha);
  /* 12px era canto de app; o site inteiro anda em 3px */
  border-radius: var(--raio);
  background: var(--negado-fundo);
  box-shadow: var(--sombra-1);
}

.rota__via--classic {
  border-color: var(--aprovado-linha);
  background: var(--aprovado-fundo);
}

.rota__cabecalho {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 20px;
}

.rota__selo {
  display: grid;
  place-items: center;
  flex: none;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  background: var(--negado);
}

.rota__via--classic .rota__selo { background: var(--aprovado); }

.rota__selo svg {
  width: 14px;
  height: 14px;
  stroke: var(--branco);
  stroke-width: 2.6;
  fill: none;
}

.rota__titulo {
  font-family: var(--fonte-corpo);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--negado);
}

.rota__via--classic .rota__titulo { color: var(--aprovado); }

/* a pilula vai para a direita sozinha; no celular ela cai para a linha de baixo
   pelo flex-wrap do cabecalho, e o margin-left: auto deixa de ter efeito */
/* O margin-left: auto empurra a pilula para a direita da linha do titulo. Isso
   so vale quando os dois cabem lado a lado; abaixo disso ela quebra para a
   linha de baixo e fica encostada na direita, sozinha, desalinhada de tudo que
   vem depois. O bloco de 560px devolve o alinhamento a esquerda. */
.rota__pilula {
  margin-left: auto;
  flex: none;
  padding: 6px 13px;
  border-radius: 999px;
  background: var(--negado);
  color: var(--branco);
  font-size: 0.75rem;
  font-weight: 600;
  line-height: 1.2;
}

.rota__via--classic .rota__pilula { background: var(--aprovado); }

@media (max-width: 559px) {
  .rota__pilula { margin-left: 0; }
}

.rota__trilha {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  list-style: none;
  margin: 0;
  padding: 0;
}

.rota__parada {
  display: flex;
  align-items: center;
  gap: 12px;
  flex: none;
}

.rota__icone {
  position: relative;
  display: grid;
  place-items: center;
  flex: none;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background: var(--branco);
  border: 1px solid var(--negado-linha);
}

.rota__via--classic .rota__icone { border-color: var(--aprovado-linha); }

.rota__icone svg {
  width: 25px;
  height: 25px;
  stroke: var(--tinta-suave);
  stroke-width: 1.5;
  fill: none;
}

/* a fabrica da nossa trilha e a unica parada com o icone em terracota: e a
   marca dizendo qual das duas pontas e ela */
.rota__via--classic .rota__parada:first-child .rota__icone svg { stroke: var(--terracota); }

/* o selinho no canto do circulo, que marca a parada que cobra a mais */
.rota__marca {
  position: absolute;
  top: -3px;
  right: -3px;
  display: grid;
  place-items: center;
  width: 19px;
  height: 19px;
  border-radius: 50%;
  border: 2px solid var(--negado-fundo);
  background: var(--negado);
}

.rota__marca svg {
  width: 10px;
  height: 10px;
  stroke: var(--branco);
  stroke-width: 3;
}

.rota__parada--fim-bom .rota__marca {
  background: var(--aprovado);
  border-color: var(--aprovado-fundo);
}

.rota__nome {
  font-size: 0.875rem;
  font-weight: 500;
  line-height: 1.25;
  color: var(--tinta);
}

.rota__parada--fim .rota__nome { color: var(--negado); font-weight: 600; }

.rota__parada--fim-bom .rota__nome { color: var(--aprovado); }

/* O elo e o fio mais o custo. No celular o fio e vertical e nasce no centro do
   circulo (26px = metade de 52), para descer alinhado com a coluna de icones. */
.rota__elo {
  position: relative;
  display: flex;
  align-items: center;
  min-height: 38px;
  padding-left: 64px;
}

.rota__elo::before {
  content: "";
  position: absolute;
  left: 26px;
  top: 0;
  bottom: 0;
  border-left: 1.5px dashed var(--negado-linha-forte);
}

.rota__via--classic .rota__elo::before {
  border-left-style: solid;
  border-left-color: var(--aprovado);
}

/* fundo proprio para o fio nao passar por tras do texto */
.rota__custo {
  position: relative;
  padding: 5px 12px;
  border-radius: 999px;
  border: 1px solid var(--negado-linha-forte);
  background: var(--branco);
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--negado);
  white-space: nowrap;
}

.rota__elo--bom .rota__custo {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border-color: var(--aprovado);
  background: var(--aprovado);
  color: var(--branco);
}

.rota__custo-ico {
  width: 13px;
  height: 13px;
  stroke: currentColor;
  stroke-width: 3;
  fill: none;
}


@media (max-width: 519px) {

  .rota__via { padding: 18px 14px; }

  .rota__elo { padding-left: 58px; }
}

/* --------------------------------------------------------------------------
   10. AMBIENTE FULL BLEED
   Faixa de imagem de largura total com um bloco de texto por cima.
   -------------------------------------------------------------------------- */
.ambiente {
  /* Os dois numeros que a banda de foto do desktop le para se medir. O cartao
     mora aqui, e nao no .ambiente__bloco, porque a largura dele e dado de
     composicao da faixa inteira: a foto termina em funcao dela. Ter o valor em
     dois lugares era garantir que um dia um deles ficasse para tras. */
  --ambiente-cartao: 480px;
  --ambiente-sobreposicao: 72px;

  position: relative;
  height: 70vh;
  min-height: 480px;
  display: flex;
  align-items: center;
  overflow: hidden;
  background: var(--marinho);
}

.ambiente__midia { position: absolute; inset: 0; }

.ambiente__midia::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to right, rgba(15, 15, 53, 0.35), rgba(15, 15, 53, 0.05));
}

.ambiente--direita .ambiente__midia::after {
  background: linear-gradient(to left, rgba(15, 15, 53, 0.35), rgba(15, 15, 53, 0.05));
}

.ambiente__midia img { width: 100%; height: 100%; object-fit: cover; }

.ambiente__container {
  position: relative;
  z-index: 2;
  width: 100%;
  display: flex;
}

.ambiente--direita .ambiente__container { justify-content: flex-end; }

.ambiente__bloco {
  /* O cartao vira container de consulta para o h2 se medir por ele. Nao ha
     descendente posicionado aqui dentro, entao a contencao de layout que o
     container-type liga nao muda nada do que ja existe. */
  container-type: inline-size;

  width: 100%;
  max-width: var(--ambiente-cartao);
  display: grid;
  gap: 16px;
  padding: 32px 28px 34px;
  background: rgba(255, 255, 255, 0.92);
  border: 1px solid rgba(255, 255, 255, 0.9);
  border-radius: var(--raio);
  /* Nivel 3, um degrau acima dos cartoes de produto e de loja, e o unico
     elemento em repouso da pagina que fica nessa altura. Ele precisa: esta em
     cima de uma foto, nao de um fundo liso, e sem a sombra longa a peca branca
     parece recortada e colada na imagem em vez de estar na frente dela. */
  box-shadow: var(--sombra-3), var(--base-marcada);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
}

/* O corpo deste h2 e medido em unidade de container, nao em vw.

   POR QUE cqi E NAO vw. O que a frase precisa caber e a coluna do cartao, e a
   relacao dela com a janela muda tres vezes descendo a pagina: ate 767px o
   cartao ocupa a largura toda, dos 768 aos 1023 ele trava em 480px, e dos 1024
   para cima em 520px, com o padding mudando junto. Fora isso, a barra de
   rolagem do desktop tira mais 15px da conta e some no celular. Em vw isso vira
   uma fila de breakpoints, cada um com um numero medido a mao e um deles
   fatalmente errado depois da proxima mexida no cartao. Em cqi o h2 mede a
   caixa em que ele esta, e nao sobra conta nenhuma para manter.

   O TETO DE 2.1rem NAO E LIMITE DE CABER, e de desenho. Entre 540px e 767px o
   cartao e a largura inteira da tela, a coluna passa dos 600px e o 8.5cqi
   pediria 56px, maior que o h2 das secoes. O teto segura o cartao no lugar dele
   na hierarquia. O piso de 1rem so entraria numa coluna de menos de 188px, que
   nao existe na pagina.

   A primeira declaracao de font-size, em vw, e o plano B de quem nao tem unidade
   de container. Ela nao acerta o corpo tao bem, mas erra para baixo.

   POR QUE text-wrap: wrap, E NAO O balance DA SECAO 03. A chamada,
   "Texturas e acabamentos que transformam superficies.", cai em tres linhas de
   320px a 1440px, e em duas na faixa dos 600px. Na quebra normal ela desce em
   escada, 404 / 295 / 194px no desktop, que e como a frase se le. O balance
   procura tres linhas do mesmo tamanho e com estas palavras nao acha: ele sobe
   em escada invertida, 157 / 269 / 389px, com "Texturas e" pendurado sozinho na
   primeira linha. Dai o wrap, que devolve este h2, e so este, para a quebra
   normal.

   AO TROCAR A CHAMADA, MECA DE NOVO: as larguras acima sao desta frase. */
.ambiente__bloco h2 {
  /* a primeira linha e o plano B de quem nao tem unidade de container; a
     segunda ganha em todo navegador que tem, e e ela que vale */
  font-size: clamp(1rem, 5.9vw, 2.1rem);
  font-size: clamp(1rem, 8.5cqi, 2.1rem);
  text-wrap: wrap;
}

.ambiente__bloco p { color: var(--tinta-suave); max-width: 42ch; }

.ambiente__bloco .link-seta { margin-top: 4px; justify-self: start; }

/* No celular o cartao de texto media 416px dentro de uma faixa de 480: a foto
   sobrava como uma moldura de dois dedos em volta dele e a secao inteira lia
   como caixa branca sobre fundo listrado. Aqui a faixa deixa de ter altura
   fixa: a foto entra como banda 3:2 e o cartao desce para baixo dela, subindo
   44px por cima da borda para os dois continuarem sendo um bloco so.

   O FUNDO E MARINHO, e ja foi areia. Enquanto a faixa do desktop era full
   bleed, o marinho que sobrava embaixo do cartao no celular era mesmo uma faixa
   escura sem funcao entre a foto e os produtos, e a areia resolvia. Isso mudou
   quando o desktop virou foto de um lado e marinho do outro: agora o marinho
   nao esta sobrando, ele e a outra metade da composicao. No celular a mesma
   divisao acontece deitada, foto em cima e marinho embaixo, com o cartao
   montado em cima da junta das duas. Os 44px de padding embaixo sao o que faz o
   marinho aparecer depois do cartao; sem eles a secao terminaria rente a ele e
   sobrariam so as duas tiras de 20px do gutter, que leem como descuido.

   O degrade sobre a foto continua desligado: ele existia para o texto ser
   legivel por cima dela, e aqui nao ha mais texto por cima. */
@media (max-width: 767px) {
  .ambiente {
    display: block;
    height: auto;
    min-height: 0;
    padding-bottom: 44px;
    background: var(--marinho);
  }

  /* A banda era 3/2 quando a foto prevista era uma sala em 16:9. A fachada que
     entrou no lugar mede 1079x895, quase 5:4, e num 3/2 o cover comia um quinto
     da altura: sumia a linha do telhado e sobrava a faixa das janelas. Em 4/3 a
     perda cai para um decimo e a fachada aparece inteira. Trocando a foto,
     confira a proporcao dela antes de confiar neste numero. */
  .ambiente__midia {
    position: relative;
    aspect-ratio: 4 / 3;
  }

  .ambiente__midia::after { display: none; }

  .ambiente__container { display: block; }

  .ambiente__bloco {
    max-width: none;
    margin-top: -44px;
    padding: 28px 24px 30px;
    background: var(--branco);
    border: 1px solid rgba(255, 255, 255, 0.9);
    box-shadow: var(--sombra-3), var(--base-marcada);
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
  }
}

/* DESKTOP, DOS 1024 PARA CIMA: a foto para de ser o fundo da faixa e vira um
   objeto dentro dela. Ocupa uma banda que sai da borda esquerda da secao e
   termina logo depois da quina esquerda do cartao; o que sobra a direita fica
   no marinho que a .ambiente ja tinha de fundo. O cartao encosta de leve na
   foto em vez de flutuar no meio dela.

   A LARGURA DA BANDA NAO E UM PALPITE. Ela e a posicao da quina esquerda do
   cartao mais a sobreposicao pedida. O cartao esta encostado a direita de um
   .container centrado, entao essa quina mede, a partir da borda esquerda da
   secao:

     (100% + min(100%, --largura-max)) / 2 - --gutter - --ambiente-cartao

   O primeiro termo e a borda direita do container: a sobra de um lado so, que e
   metade da sobra total, mais a largura dele. O min() cobre as duas situacoes
   de uma vez, porque enquanto a janela for mais estreita que o --largura-max o
   container ocupa tudo e o termo empata em 100%. Dai se tira o respiro do
   container e a largura do cartao, e o que sobra e onde ele comeca.

   Como a conta le as mesmas tres variaveis que posicionam o cartao, a
   sobreposicao fica exatamente nos 72px em qualquer largura, e continua certa
   se um dia o --largura-max, o --gutter ou o cartao mudarem de medida.

   NAO TROQUE ISTO POR UMA PORCENTAGEM FIXA. Entre 1024px e 1920px a quina
   esquerda do cartao anda de 45% para 53% da secao, e qualquer numero unico ou
   avanca por cima da foto ou perde o encosto numa das pontas do intervalo.

   As porcentagens sao do .ambiente, e nao da janela: com 100vw a barra de
   rolagem entraria na conta e a banda escorregaria uns pixels para a direita.

   Abaixo de 1024 nada disso vale. A banda so tem sentido com largura de sobra:
   em 768px ela mediria 320px contra 717px de altura numa tela de tablet em pe,
   uma tira estreita que corta a fachada em uma janela e meia. Ate os 1023 a
   faixa continua como sempre foi, foto cobrindo tudo com o cartao por cima, e
   no celular ela continua empilhada. */
@media (min-width: 1024px) {
  .ambiente--direita .ambiente__midia {
    right: auto;
    width: calc(
      (100% + min(100%, var(--largura-max))) / 2
      - var(--gutter) - var(--ambiente-cartao) + var(--ambiente-sobreposicao)
    );
  }
}

/* --------------------------------------------------------------------------
   11. PRODUTOS, GRADE DE CARTOES

   ESTA SECAO JA FOI EDITORIAL, sem card, sem borda e sem fundo, e virou cartao
   em 31/08/2026 junto com o sistema de elevacao. O que a mudanca compra e o
   contraste que da o nome a secao: a FOTO AFUNDA e o CARTAO LEVANTA. Um poco e
   uma placa na mesma peca, e e isso que se le como profundidade. Chapada, a
   grade editorial nao tinha como dizer isso, e a empresa vende exatamente isso.

   Se um dia voltar a ser editorial, tire o padding, o fundo, a borda e a sombra
   do .produto e o ::after do .produto__midia. Nada mais depende deles.
   -------------------------------------------------------------------------- */
.produtos {
  display: grid;
  grid-template-columns: 1fr;
  gap: 56px 32px;
}

/* imagem em cima, corpo ocupa o resto: mantem os cards da linha alinhados.

   A borda e branca, e nao da cor da linha do site: ela nao existe para desenhar
   o contorno do cartao, existe para ser a quina de cima pegando a luz. Sobre a
   areia ela quase nao aparece no topo, que e o certo, e o que fecha o cartao
   por baixo e o inset escuro que vem junto da sombra. Contorno desenhado e
   retangulo; quina iluminada mais base marcada e placa levantada. */
.produto {
  position: relative;
  display: grid;
  grid-template-rows: auto 1fr;
  gap: 18px;
  padding: 16px 16px 20px;
  background: var(--branco);
  border: 1px solid rgba(255, 255, 255, 0.9);
  border-radius: var(--raio);
  box-shadow: var(--sombra-2), var(--base-marcada);
  transition: transform 280ms var(--suave), box-shadow 280ms var(--suave);
}

/* O POCO. A foto fica rebaixada dentro do cartao, e nao colada em cima dele: e
   o contraste entre ela afundada e o cartao levantado que se le como
   profundidade. Uma coisa so elevada nao tem com o que ser comparada.

   A sombra interna mora num ::after, e nao no proprio .produto__midia, porque
   inset box-shadow pinta acima do fundo do elemento mas ABAIXO do conteudo
   dele: a foto, que e opaca e cobre a caixa inteira, esconderia a sombra
   inteira. O ::after passa por cima da foto. O pointer-events: none e para ele
   nao roubar o clique do link que envolve o cartao. */
.produto__midia {
  position: relative;
  overflow: hidden;
  border-radius: var(--raio);
  background: var(--areia-escura);
}

.produto__midia::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  border-radius: inherit;
  box-shadow: var(--poco);
}

.produto__midia img {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  transition: transform 280ms var(--suave);
}

/* No hover quem sobe e o CARTAO INTEIRO, 6px, passando do nivel 2 para o 3. Ja
   foi a moldura da foto subindo 16px sozinha, de volta quando a secao era
   editorial e nao havia cartao para levantar. Agora seria a foto escapando da
   propria peca.

   Sao 6px e nao mais porque a sombra e que faz o trabalho: a distancia percebida
   vem do borrao passando de 24px para 48px, e o deslocamento so confirma. Card
   que salta 16px com sombra pesada vira balao.

   A foto cresce 4% dentro do poco, no mesmo tempo e na mesma curva, e o
   overflow do poco corta a sobra. Os dois movimentos precisam terminar juntos,
   senao a foto continua andando depois que o cartao parou.

   O will-change e so em transform, nunca em box-shadow: promover a camada ajuda
   o deslocamento e nao ajuda em nada a sombra, que e repintada de qualquer
   jeito. Fica dentro do @media (hover: hover) para nao promover seis camadas em
   celular, onde nada disto roda. */
@media (hover: hover) {
  .produto { will-change: transform; }

  .produto:hover,
  .produto:focus-within {
    z-index: 2;
    transform: translateY(-6px);
    box-shadow: var(--sombra-3), var(--base-marcada);
  }

  .produto:hover .produto__midia img,
  .produto:focus-within .produto__midia img { transform: scale(1.04); }
}

/* o paragrafo estica, entao o botao fica na mesma altura em todos os cards */
.produto__corpo { display: grid; grid-template-rows: auto 1fr auto; gap: 10px; justify-items: start; }

.produto__corpo h3 { font-size: 1.5rem; }

.produto__corpo p {
  font-size: 0.9375rem;
  color: var(--tinta-suave);
  max-width: 34ch;
}

/* O pedido de preco era um link de texto e se perdia no meio do paragrafo.
   Virou botao cheio, um por acabamento, com o nome do produto dentro: quem
   chega pelo Google em "grafiato" cai no card certo e o botao ja diz do que se
   trata, sem depender do titulo logo acima. */
.produto__cta { margin-top: 6px; }

@media (max-width: 639px) {
  /* Seis fotos em 4:5 numa coluna so davam 437px de altura cada, e a secao
     sozinha levava 4506px de rolagem, quase um terco da pagina. O quadrado
     corta 87px por foto e ainda mostra parede suficiente para a textura se ler
     de perto. No desktop, onde os cards ficam lado a lado, o 4:5 continua. */
  .produtos { gap: 44px; }

  .produto__midia img { aspect-ratio: 1 / 1; }

  /* 34ch dao 255px e a coluna do celular tem 350: o paragrafo quebrava cedo e
     virava uma tira estreita com um palmo de vazio ao lado. No desktop o limite
     continua valendo, que la a coluna e mais larga que a linha confortavel. */
  .produto__corpo p { max-width: none; }
}

/* --------------------------------------------------------------------------
   12. CORES
   A cartela deixou de rolar na horizontal e virou grade fixa de sete por duas.
   O fundo da secao e fixo: quem responde ao clique e o tamanho dos quadrados,
   nao a cor da parede atras deles.
   -------------------------------------------------------------------------- */
/* Faixa de ponta a ponta, e nao mais um cartao de 54ch parado a esquerda com
   meia linha vazia ao lado. O texto encolheu para um titulo e uma frase, entao
   a faixa fica baixa e nao rouba altura da cartela, que e o que a secao tem
   para mostrar.

   O max-width: none derruba dois limites de uma vez: os 54ch daqui e os 46rem
   que o .secao__cabecalho impoe a todo cabecalho de secao. Funciona porque este
   bloco vem depois daquele na folha, e as duas regras valem uma classe cada. */
.cores-moldura {
  background: var(--areia);
  border: 1px solid var(--linha);
  border-radius: var(--raio);
  padding: 32px 28px;
  max-width: none;
}

/* A frase e curta e cabe numa linha so na largura cheia. Os 60ch do .lead
   padrao existem para paragrafo corrido; aqui eles quebrariam a frase em duas
   linhas no meio de uma faixa larga, sem ganho de leitura nenhum. */
.cores-moldura .lead { max-width: none; }

.cores-grade {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 22px 16px;
}

/* CARTELA FECHADA: a grade guarda as 76 cores e mostra so as primeiras. O corte
   nao e um numero unico, e uma fileira cheia em cada largura: com 3 colunas
   sobra fileira quebrada em 10, com 5 sobra em 14, e meia fileira orfa em cima
   do botao de abrir parece erro de montagem, nao escolha. Nove aqui, dez a
   partir de 640px e catorze a partir de 1024px; os dois ultimos moram na secao
   21, junto do numero de colunas de cada faixa, que e quem manda no corte.

   O :not(.is-expandida) vale uma classe a mais que o seletor sem ele, entao
   quando o JS liga a classe nenhuma destas regras casa e a grade abre sozinha,
   sem precisar de regra de contraponto. Nos blocos responsivos o reset e
   :nth-child(n+1), e nao o seletor cru, para empatar a especificidade com o
   corte da faixa de baixo e ganhar por vir depois na folha.

   display: none, e nao visibility, porque as escondidas precisam sair do fluxo
   do grid, da ordem de tabulacao e do leitor de tela. */
.cores-grade:not(.is-expandida) > .swatch:nth-child(n+10) { display: none; }

/* O botao de abrir. Fica fora da grade, centralizado, com folga suficiente para
   nao ser lido como mais uma amostra da ultima fileira. */
.cores-mais {
  margin-top: 36px;
  text-align: center;
}

/* A seta do sprite aponta para a direita: girada 90 graus ela vira o "abre para
   baixo" e, com a cartela aberta, -90 graus a devolve apontando para cima. O
   translateX de 3px do hover entra DEPOIS do giro, entao ele anda no sentido
   para onde a seta aponta, que e o mesmo gesto do resto da pagina.

   As quatro regras precisam do :hover/:focus-visible escritos aqui porque
   .btn:hover .btn__seta vale tres classes e apagaria o giro. */
.cores-mais__btn .btn__seta { transform: rotate(90deg); }

.cores-mais__btn:hover .btn__seta,
.cores-mais__btn:focus-visible .btn__seta { transform: rotate(90deg) translateX(3px); }

.cores-mais__btn[aria-expanded="true"] .btn__seta { transform: rotate(-90deg); }

.cores-mais__btn[aria-expanded="true"]:hover .btn__seta,
.cores-mais__btn[aria-expanded="true"]:focus-visible .btn__seta { transform: rotate(-90deg) translateX(3px); }

/* As cores que entram quando a cartela abre. Transicao nao serve aqui: elas
   saem de display: none, e o navegador nao interpola a partir dele. Dai a
   animacao, com o atraso de cada uma escrito pelo main.js.

   O fill backwards, e nao both: enquanto o atraso corre a amostra fica no
   estado inicial, mas assim que a animacao acaba o transform volta a ser o que
   o CSS mandar. Com "both" o transform: none do fim ficaria grudado no
   elemento e o clique de ampliar, que e um scale, nao teria efeito nenhum. */
@keyframes cor-entra {
  from { opacity: 0; transform: translateY(10px) scale(0.94); }
  to   { opacity: 1; transform: none; }
}

.swatch--nova {
  animation: cor-entra 380ms cubic-bezier(0.22, 0.61, 0.36, 1) backwards;
  animation-delay: var(--d, 0ms);
}

/* o swatch virou <button>, entao zera a aparencia herdada do botao nativo.
   O position relative existe para o z-index valer quando ele cresce. */
.swatch {
  position: relative;
  display: grid;
  gap: 10px;
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  text-align: left;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
  transition: transform 320ms ease;
}

/* Clicar aproxima a amostra escolhida e afasta as outras, como quem chega a
   cartela fisica perto da parede para comparar.

   Quem cresce e o swatch inteiro, quadrado mais nome, e nao so o quadrado: se
   crescesse so o quadrado, ele avancaria por cima do proprio nome, que fica
   logo abaixo. Como transform nao ocupa espaco no layout, o vizinho nao e
   empurrado; quem abre a folga e o encolhimento dos outros. Com 1.3 contra
   0.86 a conta fecha sem encostar, tanto na horizontal quanto entre as duas
   fileiras. Mexer em um dos dois numeros sem o outro faz os quadrados se
   sobreporem. */
.cores-grade.is-escolhendo .swatch { transform: scale(0.86); }

.cores-grade .swatch[aria-pressed="true"] {
  transform: scale(1.3);
  z-index: 2;
}

/* A foto do grafiato tingida pela cor: a mesma parede em 14 cores. O multiply
   multiplica canal a canal, entao onde a foto e clara sobra a cor e onde ela e
   escura sobra o vinco do relevo.

   A TEXTURA PRECISA SER CLARA. Como o multiply escurece proporcionalmente ao
   brilho da foto, e a foto que decide o quanto a amostra se afasta do hex real.
   A textura antiga tinha brilho medio 165 e rebaixava a cor em 35%; esta tem
   211 e rebaixa 17%. Numa cartela isso e a diferenca entre mostrar a cor e
   mostrar uma versao suja dela. Ao trocar a foto de novo, meca o brilho medio
   antes: abaixo de uns 200 a cartela comeca a mentir.

   background-color e background-image precisam ser propriedades separadas aqui
   e no HTML. O atalho "background" zeraria a imagem ao escrever a cor. */
/* A amostra tem que parecer pastilha, e nao retangulo de cor. Sao tres camadas
   na mesma declaracao: a sombra de fora poe ela acima da cartela, a quina de
   luz no topo diz de onde vem a luz, e a base escurecida diz que a peca tem
   espessura. Sem a terceira ela vira adesivo.

   A BASE E PRETA, E E O UNICO LUGAR DA FOLHA ONDE ISSO ESTA CERTO. A regra de
   sombra colorida existe porque preto sobre a areia da cinza sujo. Aqui a
   superficie nao e a areia, e uma das 76 cores da cartela, e um marinho a 6%
   sobre um amarelo ou um vermelho puxaria o tom da amostra para o azul. Preto
   neutro so escurece dentro da propria cor, que e o que espessura faz. Pelo
   mesmo motivo a quina de cima e branco puro. */
.swatch__cor {
  display: block;
  width: 100%;
  aspect-ratio: 1;
  border: 1px solid rgba(28, 26, 23, 0.1);
  border-radius: var(--raio);
  background-image: url("../images/texturas/grafiato-base.webp");
  background-size: cover;
  background-blend-mode: multiply;
  box-shadow: var(--sombra-1), var(--luz-quina), var(--espessura);
  transition: box-shadow var(--transicao);
}

/* O anel marca a escolhida por fora do quadrado, e nao por dentro, senao ele se
   perderia dentro da propria cor. Como o fundo da secao voltou a ser fixo e
   claro, a tinta contrasta com ele em qualquer das 14 cores, e o JS nao precisa
   mais calcular nada. */
/* o anel entra na frente e o resto continua: perder a espessura ao escolher
   faria a amostra escolhida achatar, que e o contrario do que o clique quer */
.cores-grade .swatch[aria-pressed="true"] .swatch__cor {
  box-shadow: var(--anel-selecao), var(--sombra-1), var(--luz-quina), var(--espessura);
}

/* O hover levanta a pastilha da cartela. So vale com a cartela em repouso: o
   :not(.is-escolhendo) existe porque, com uma cor escolhida, o transform do
   .swatch ja esta ocupado com o crescer da escolhida e o encolher das outras, e
   duas regras disputando a mesma propriedade fariam a amostra sob o cursor
   pular de tamanho no meio da comparacao. */
@media (hover: hover) {
  .cores-grade:not(.is-escolhendo) .swatch:hover {
    transform: translateY(-4px) scale(1.06);
    z-index: 2;
  }

  .cores-grade:not(.is-escolhendo) .swatch:hover .swatch__cor {
    box-shadow: var(--sombra-2), var(--luz-quina), var(--espessura);
  }
}

/* O NOME E O CONTEUDO DA CARTELA, e nao uma legenda de apoio. Quem chega aqui
   esta procurando um tom para pedir pelo nome no balcao; o quadrado mostra o
   tom, o nome e o que a pessoa leva embora. Estava desenhado como nota de
   rodape: 13px no --tinta-suave, que sobre a areia escura desta secao da
   4,64:1. Passa no AA por 0,14 de folga e a essa medida le como apagado, que
   foi exatamente a reclamacao.

   Agora e 14px no --tinta, 13,98:1, com peso 500. Nao e so contraste: em 76
   nomes seguidos, meio ponto de peso e o que separa uma lista que se varre de
   uma que se soletra.

   O letter-spacing volta a zero porque o -0.011em do body e o ajuste que a
   Inter pede em corpo de 16px. Herdado num rotulo de 14px ele fecha demais e
   come justamente a legibilidade que o resto desta regra esta comprando. */
.swatch__nome {
  display: block;
  font-size: 0.875rem;
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: 0;
  color: var(--tinta);
}

/* --------------------------------------------------------------------------
   12B. ABERTURA DA CARTELA
   As catorze amostras entram convergindo de um ponto no meio da grade e se
   abrindo para o lugar delas, em cascata do centro para fora. Roda uma vez, na
   primeira vez que a secao aparece na tela.

   O estado inicial mora num atributo, e nao numa classe: quem escreve o
   data-cartela-anim e o main.js, entao sem JavaScript nenhuma regra daqui casa
   com nada e as amostras aparecem normalmente. E a mesma trava do .js no
   fade-up, na secao 22.

   So opacity e transform se mexem, e o deslocamento e um translate por cima da
   posicao final: cada amostra ocupa a celula certa do grid desde o primeiro
   quadro, entao a grade nao muda de altura nem empurra a secao seguinte
   enquanto a animacao roda.

   O --dx, o --dy e o --d de cada amostra sao escritos pelo main.js, que mede a
   distancia dela ate o centro da grade. Nao ha numero de posicao aqui de
   proposito: a conta precisa continuar certa se a cartela ganhar ou perder uma
   cor, e a grade muda de tres para cinco e para sete colunas conforme a tela.

   POR QUE O CLIQUE DE AMPLIAR NAO QUEBRA: as duas regras que o clique usa,
   .cores-grade.is-escolhendo .swatch e .cores-grade .swatch[aria-pressed],
   valem tres classes cada uma; as duas daqui valem um atributo. As do clique
   ganham em qualquer momento, inclusive no meio da animacao. Se um dia alguem
   trocar os seletores daqui por algo mais especifico, o clique para de crescer
   a amostra. Alem disso o main.js apaga o atributo quando a animacao acaba,
   entao a transicao de 320ms do .swatch volta a valer inteira. */
[data-cartela-anim] > * {
  opacity: 0;
  transform: translate(var(--dx, 0px), var(--dy, 0px)) scale(0.92);
  will-change: transform, opacity;
}

[data-cartela-anim="run"] > * {
  opacity: 1;
  transform: none;
  transition: opacity 450ms cubic-bezier(0.22, 0.61, 0.36, 1),
              transform 750ms cubic-bezier(0.22, 0.61, 0.36, 1);
  transition-delay: var(--d, 0ms);
}

/* --------------------------------------------------------------------------
   13. AS DUAS FRENTES
   Duas colunas iguais, separadas por uma linha de 1px. Sem card.
   -------------------------------------------------------------------------- */
.frentes { display: grid; grid-template-columns: 1fr; gap: 0; }

.frente {
  display: grid;
  gap: 16px;
  align-content: start;
  padding-block: 44px;
  border-top: var(--borda);
}

.frente:first-child { border-top: 0; padding-top: 0; }

.frente__num {
  font-family: var(--fonte-titulo);
  font-size: clamp(3.5rem, 8vw, 5.5rem);
  line-height: 0.9;
  letter-spacing: -0.03em;
  color: var(--terracota);
}

.frente__lista { display: grid; gap: 12px; margin-top: 4px; }

.frente__lista li {
  position: relative;
  padding-left: 30px;
  font-size: 0.9375rem;
  color: var(--tinta-suave);
}

.frente__lista li::before {
  content: "";
  position: absolute;
  left: 4px;
  top: 8px;
  width: 12px;
  height: 7px;
  border-left: 1.5px solid var(--terracota);
  border-bottom: 1.5px solid var(--terracota);
  transform: rotate(-45deg);
}

/* os dois botoes tem a mesma largura e o mesmo peso */
.frente .btn {
  width: 100%;
  max-width: 320px;
  margin-top: 12px;
}

/* --------------------------------------------------------------------------
   14. OBRAS, ANTES E DEPOIS
   -------------------------------------------------------------------------- */
/* Comparador na esquerda, lista de obras numa barra a direita. Ate 900px o grid
   vira coluna unica e a lista volta a ser a tira horizontal, que gasta bem menos
   altura no celular. */
/* O minmax(0, 1fr) e o min-width: 0 dos filhos existem pelo mesmo motivo: item
   de grid nasce com min-width: auto, que vale o min-content do que ele guarda.
   A tira de miniaturas mede 2504px deitada, entao a coluna adotava essa largura
   e a pagina inteira ia a 2544px num celular de 390. O overflow-x: hidden do
   body escondia a sobra, mas o comparador, centrado por margin-inline: auto
   dentro da coluna gigante, parava em x=1118: fora da tela, e a secao ficava
   com um vao escuro no lugar dele. Com o zero a coluna volta a largura da tela
   e a tira rola por dentro, que e o que o overflow-x: auto dela sempre quis
   fazer. Nao apague nenhum dos dois: o minmax segura a trilha e o min-width
   segura o item. */
.obras-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 32px;
}

.obras-layout > * { min-width: 0; }

/* Moldura da obra em destaque: a figura inteira vira o quadro, com borda e
   respiro proprios, e a legenda fica dentro dele como a etiqueta de um quadro.
   Sem isso a foto encostava direto no fundo escuro e nada a delimitava. */
.obra-destaque {
  /* O width: 100% nao e redundante com o max-width. Com margin-inline: auto o
     item de grid deixa de esticar e passa a ser dimensionado pelo conteudo, e o
     conteudo mais largo daqui e o texto da legenda: o comparador ficava com a
     largura do nome do acabamento. No celular isso dava 338px com "Textura
     Projetada e Arenato" e encolheria para menos da metade ao clicar numa obra
     chamada so "Arenato", com a foto mudando de tamanho a cada clique. Com
     width: 100% quem manda e a coluna, e o max-width so segura o tablet. */
  width: 100%;
  max-width: 900px;
  margin-inline: auto;
  padding: 14px;
  background: rgba(241, 238, 232, 0.04);
  border: 1px solid var(--linha-escura);
  border-radius: var(--raio);
}

.obra-destaque .compare { border: 1px solid rgba(241, 238, 232, 0.14); }

.obras-lista__topo { margin-bottom: 18px; }

.obras-lista__titulo {
  font-family: var(--fonte-corpo);
  font-size: 1rem;
  font-weight: 500;
  line-height: 1.35;
  color: var(--sobre-escuro);
}

/* As duas dicas da secao, com o mesmo desenho porque fazem o mesmo trabalho:
   dizer o gesto que o elemento logo abaixo espera. A do cabecalho e do
   comparador grande, "arraste"; a da lista e da tira de miniaturas, "escolha".
   Sao gestos diferentes, entao as duas frases precisam continuar existindo.

   O .secao--marinho na frente dos dois seletores nao e enfeite. As duas dicas
   sao <p> dentro da faixa marinho, e a regra ".secao--marinho p" que pinta todo
   paragrafo de claro apagado vale uma classe MAIS um elemento; sem o prefixo
   aqui, este bloco vale so uma classe e perde a disputa. O terracota era
   declarado e nunca chegava a aparecer. */
.secao--marinho .obras-lista__dica,
.secao--marinho .obras-dica {
  margin-top: 4px;
  font-size: 0.8125rem;
  color: var(--terracota-claro);
}

/* 4:3 e nao 16:9. O acervo de obras veio de celular: sete pares em 4:3 deitado
   e quatro em 3:4 em pe. Numa caixa 16:9 o object-fit: cover cortaria 58% da
   altura de um retrato, e a fachada virava uma faixa horizontal sem pe nem
   telhado. Em 4:3 os deitados entram inteiros e os em pe perdem bem menos.
   Se um dia todas as obras forem refotografadas deitadas, da para voltar. */
.obra-destaque .compare {
  aspect-ratio: 4 / 3;
  background: rgba(241, 238, 232, 0.06);
}

/* No celular a coluna util do comparador tem 320px, e 4:3 dentro dela dava
   231px de altura: a fachada inteira virava miniatura e arrastar a alca deixava
   de mostrar coisa alguma. Em 1:1 ele sobe para 318px, e as quatro obras
   fotografadas em pe perdem menos no corte do que perderiam numa caixa
   deitada. */
@media (max-width: 639px) {
  .obra-destaque .compare { aspect-ratio: 1 / 1; }
}

/* A legenda tem um campo so: o acabamento aplicado. A cor e o bairro sairam de
   propria vontade do cliente, entao nao ha mais duas tipografias competindo na
   mesma linha nem regra de campo vazio para administrar. */
.obra-legenda { padding-top: 16px; }

.obra-legenda__produto {
  font-family: var(--fonte-titulo);
  font-size: 1.5rem;
  color: var(--sobre-escuro);
}

.obras-tira {
  display: flex;
  gap: 16px;
  /* Os 48px de antes abriam um vao entre a dica "Clique para abrir no
     comparador" e as proprias miniaturas, e a dica passava a parecer legenda do
     bloco de cima. Quem separa a lista do comparador e o gap do .obras-layout. */
  margin-top: 6px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  padding-inline: var(--gutter);
  margin-inline: calc(var(--gutter) * -1);
  /* sem isto o encaixe cola a miniatura na borda da tela, por baixo do respiro
     lateral que o padding-inline acabou de criar */
  scroll-padding-inline: var(--gutter);
  padding-bottom: 10px;
  -webkit-overflow-scrolling: touch;
  /* a barra padrao do Chrome e clara e grossa, e sobre o marinho aparecia mais
     que as proprias fotos */
  scrollbar-width: thin;
  scrollbar-color: rgba(241, 238, 232, 0.26) transparent;
}

.obras-tira::-webkit-scrollbar { width: 6px; height: 6px; }

.obras-tira::-webkit-scrollbar-track { background: transparent; }

.obras-tira::-webkit-scrollbar-thumb {
  background: rgba(241, 238, 232, 0.26);
  border-radius: 999px;
}

.obra-mini {
  flex: none;
  width: 236px;
  scroll-snap-align: start;
  display: grid;
  gap: 12px;
  padding: 0;
  text-align: left;
  color: inherit;
}

/* Antes e depois empilhados, e nao lado a lado. Na coluna de 236px cada metade
   sobrava com uns 117px, e as duas fotos viravam duas tiras estreitas cortadas
   pelo object-fit: nao dava para reconhecer casa nenhuma, nem antes nem depois.
   Agora a miniatura mostra o depois inteiro, que e o resultado e o que vende, e
   o antes aparece por baixo quando o ponteiro entra.

   Quem some no hover e a segunda foto, a de depois, que e a que pinta por cima
   por vir depois no HTML. Fazer o contrario pediria inverter a ordem das duas
   <img> nos onze botoes, sem ganho nenhum. */
/* Miniatura sobre fundo escuro: sombra preta, porque a colorida sumiria, e a
   borda clara que ja existia faz as vezes da quina de luz. Um inset aqui nao
   apareceria: as duas fotos sao absolutas e cobrem a caixa toda. */
.obra-mini__par {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border: 1px solid var(--linha-escura);
  border-radius: var(--raio);
  box-shadow: var(--sombra-escura);
  transition: border-color var(--transicao), opacity var(--transicao);
}

.obra-mini__par img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.obra-mini__par img + img { transition: opacity 420ms var(--suave); }

@media (hover: hover) {
  .obra-mini:hover .obra-mini__par img + img { opacity: 0; }
}

.obra-mini:focus-visible .obra-mini__par img + img { opacity: 0; }

/* Etiqueta do canto dizendo qual das duas fotos esta na tela. Ela troca junto
   com a foto no hover. E decorativa: quem le por leitor de tela recebe o nome
   da obra pelo rotulo logo abaixo, e o botao inteiro ja tem nome acessivel. */
.obra-mini__par::after {
  content: "Depois";
  position: absolute;
  left: 8px;
  bottom: 8px;
  z-index: 2;
  padding: 3px 8px;
  background: rgba(15, 15, 53, 0.78);
  border-radius: var(--raio);
  color: var(--branco);
  font-size: 0.625rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.12em;
}

@media (hover: hover) {
  .obra-mini:hover .obra-mini__par::after { content: "Antes"; }
}

.obra-mini__par .ph {
  position: absolute;
  inset: 0;
  border-color: rgba(241, 238, 232, 0.28);
}

.obra-mini__legenda {
  font-size: 0.8125rem;
  line-height: 1.35;
  color: var(--sobre-escuro-suave);
}

.obra-mini__legenda strong {
  display: block;
  font-family: var(--fonte-titulo);
  font-size: 1.0625rem;
  font-weight: 400;
  color: var(--sobre-escuro);
}

.obra-mini:hover .obra-mini__par { border-color: var(--terracota-claro); }

.obra-mini[aria-pressed="true"] .obra-mini__par {
  border-color: var(--terracota-claro);
  box-shadow: inset 0 0 0 1px var(--terracota-claro);
}

.obra-mini[aria-pressed="true"] { opacity: 0.55; }

@media (min-width: 900px) {
  .obras-layout {
    grid-template-columns: minmax(0, 1fr) 300px;
    gap: 48px;
  }

  /* dentro do grid o comparador ocupa a coluna inteira */
  .obras-layout .obra-destaque { max-width: none; margin-inline: 0; }

  /* O truque da altura esta aqui. A lista tem dez itens e, se ficasse no fluxo,
     esticaria a linha do grid para uns 2000px e o comparador ficaria perdido no
     topo. O inner sai do fluxo com position absolute, entao quem define a altura
     da linha passa a ser so o comparador ao lado, e o inset: 0 faz a coluna
     preencher exatamente essa altura. */
  .obras-lista { position: relative; }

  .obras-lista__inner {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
  }

  /* min-height zero e o que permite o flex item encolher abaixo do conteudo e,
     com isso, rolar por dentro em vez de estourar a coluna */
  .obras-tira {
    flex: 1;
    min-height: 0;
    flex-direction: column;
    gap: 18px;
    margin: 0;
    padding: 0 10px 0 0;
    overflow-x: hidden;
    overflow-y: auto;
    scroll-snap-type: y proximity;
    /* a lista desbota no fim, avisando que ha mais coisa abaixo */
    -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 48px), transparent);
    mask-image: linear-gradient(to bottom, #000 calc(100% - 48px), transparent);
  }

  /* barra de rolagem discreta, no lugar da nativa que aparecia crua */
  .obras-tira { scrollbar-color: rgba(241, 238, 232, 0.28) transparent; }
  .obras-tira::-webkit-scrollbar { width: 4px; }
  .obras-tira::-webkit-scrollbar-track { background: transparent; }
  .obras-tira::-webkit-scrollbar-thumb {
    background: rgba(241, 238, 232, 0.28);
    border-radius: 2px;
  }

  .obra-mini { width: auto; }
}

/* --------------------------------------------------------------------------
   15. AVALIACOES DO GOOGLE
   A cara e a do Google, de proposito: cartao branco, avatar redondo com a
   inicial, estrelas amarelas e o G no canto. So o titulo da secao continua na
   tipografia da Classic, para a faixa nao virar um widget colado de fora.
   -------------------------------------------------------------------------- */
.estrelas { display: flex; gap: 3px; }

.estrelas svg { width: 15px; height: 15px; fill: var(--terracota); }

/* Amarelo do Google. So aqui, e so nas estrelas: e o detalhe que faz a pessoa
   reconhecer de onde a avaliacao veio antes mesmo de ler. */
.estrelas--google svg { fill: #FBBC04; }

/* meia estrela da nota media, cortada ao meio com gradiente */
.estrelas--google .estrela--meia {
  fill: #FBBC04;
  -webkit-mask-image: linear-gradient(to right, #000 50%, transparent 50%);
  mask-image: linear-gradient(to right, #000 50%, transparent 50%);
}

/* nota media que fica logo abaixo do titulo da secao */
.nota-google {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-top: 4px;
}

.nota-google__valor {
  font-size: 1.375rem;
  font-weight: 500;
  line-height: 1;
}

.nota-google__total { font-size: 0.9375rem; color: var(--tinta-suave); }

/* Tira horizontal de cartoes. Sao sete avaliacoes, entao nao cabem lado a lado:
   a tira rola na horizontal, com encaixe por cartao, e as setas empurram um
   cartao por clique. Sem JavaScript ela continua rolando com o dedo e com a
   barra, so as setas e o corte por cartao e que deixam de existir. */
/* Quantos cartoes cabem por vez. E a unica coisa que muda por tamanho de tela:
   a largura de cada cartao sai desta conta. */
.avaliacoes {
  --visiveis: 1;
  --vao: 16px;
}

@media (min-width: 480px) { .avaliacoes { --visiveis: 2; } }
@media (min-width: 768px) { .avaliacoes { --visiveis: 3; --vao: 20px; } }
@media (min-width: 1024px) { .avaliacoes { --visiveis: 4; } }
@media (min-width: 1200px) { .avaliacoes { --visiveis: 5; } }

/* A janela corta o que passa da largura. E "clip", e nao "hidden", de proposito:
   hidden cria uma area rolavel, e o foco do teclado num cartao que esta fora de
   vista arrastaria a janela para o lado, desalinhando o carrossel. Clip nao rola
   de jeito nenhum. O hidden fica de reserva para navegador antigo. */
.avaliacoes__janela {
  overflow: hidden;
  overflow: clip;
  /* o cartao tem sombra e borda; sem esta folga a sombra fica cortada em cima */
  padding-block: 6px;
}

/* A fita anda de um cartao por vez. Quem move e o main.js, mudando o transform;
   ao fim de cada passada ele manda o primeiro cartao para o fim da fila e zera
   o deslocamento, e por isso o giro nunca chega ao "fim" da lista. */
.avaliacoes__tira {
  display: flex;
  gap: var(--vao);
  will-change: transform;
}

.avaliacao {
  flex: 0 0 calc((100% - (var(--visiveis) - 1) * var(--vao)) / var(--visiveis));
  display: grid;
  gap: 12px;
  align-content: start;
  padding: 20px;
  background: var(--branco);
  /* branca, e nao da cor da linha: e quina iluminada, nao contorno. O raio cai
     de 8px para os 3px do resto do site; 8px era o unico canto arredondado de
     app numa pagina que e de arquitetura. */
  border: 1px solid rgba(255, 255, 255, 0.9);
  border-radius: var(--raio);
  box-shadow: var(--sombra-2), var(--base-marcada);
}

/* Com cinco cartoes na fila o texto ficava numa coluna de 176px, quebrando em
   tres palavras por linha, e o cartao parecia uma tira. Engordar e feito com
   duas mudancas que so funcionam juntas: mais respiro dentro do cartao e mais
   largura para a secao. Uma sem a outra piora, porque padding maior na mesma
   largura come justamente o texto.

   O corte em 1280px nao e arbitrario: e onde a largura extra comeca a existir
   de verdade. Abaixo disso o container ja e limitado pela tela, entao o padding
   maior sairia do texto, e por isso nada muda ali. Em 1280 o cartao empata com
   o que era antes, e dai para cima so ganha: 241px em 1366 e 248px em 1440,
   contra os 216px de antes.

   Esta e a unica secao mais larga que o resto da pagina. O cabecalho acompanha
   o carrossel para os dois nao desalinharem entre si, mas isso deixa a secao
   fora do prumo das secoes vizinhas. Para voltar ao alinhamento da pagina,
   apague o max-width daqui: nada mais depende dele. */
@media (min-width: 1280px) {
  .avaliacao { padding: 26px 24px; gap: 14px; }

  .secao--avaliacoes > .container { max-width: 1400px; }
}

/* Alinhado pelo alto, e nao pelo centro: com nome de duas linhas o avatar tem
   que ficar junto da primeira linha, como no Google. */
.avaliacao__topo {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: start;
  gap: 10px;
}

/* circulo com a inicial, do jeito que o Google mostra quem nao tem foto.
   A cor vem do proprio HTML, uma por pessoa. */
.avaliacao__avatar {
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  background: var(--avatar, var(--tinta-suave));
  border-radius: 50%;
  color: var(--branco);
  font-size: 1rem;
  font-weight: 500;
  line-height: 1;
}

.avaliacao__quem { min-width: 0; }

/* Com quatro ou cinco cartoes na tela sobra pouca largura para o nome. Em vez de
   cortar quase todo mundo com reticencias, o nome usa ate duas linhas e so o que
   passar disso e cortado. */
.avaliacao__quem strong {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  font-size: 0.875rem;
  font-weight: 500;
  line-height: 1.25;
}

/* Daqui para cima os cartoes ficam estreitos e alguns nomes quebram em duas
   linhas. Reservar as duas linhas em todos mantem data e estrelas na mesma
   altura na fileira inteira. Abaixo disso o cartao e largo, o nome cabe numa
   linha so e a reserva sobraria como um buraco entre o nome e a data. */
@media (min-width: 1024px) {
  .avaliacao__quem strong { min-height: 2.5em; }
}

.avaliacao__quando {
  font-size: 0.8125rem;
  color: var(--tinta-suave);
}

.avaliacao__g { width: 20px; height: 20px; flex: none; }

.avaliacao__nota { display: flex; align-items: center; gap: 8px; }

.avaliacao__selo { width: 15px; height: 15px; }

.avaliacao__texto {
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--tinta-suave);
}

/* O corte so entra quando o JavaScript confirma que o texto passou de cinco
   linhas. Sem ele, o texto aparece inteiro, que e o pior caso aceitavel. */
.avaliacao__texto.is-cortado {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 5;
  overflow: hidden;
}

.avaliacao__mais {
  justify-self: start;
  padding: 0;
  font-size: 0.875rem;
  font-weight: 500;
  color: var(--terracota);
}

.avaliacao__mais:hover { color: var(--terracota-escuro); }

/* As setas ficam embaixo da fita, alinhadas a direita. Por cima dos cartoes elas
   cobririam nome e texto, e o carrossel ja anda sozinho: aqui elas sao o
   controle de quem quer adiantar ou voltar, nao o elemento principal. */
.avaliacoes__controles {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  margin-top: 20px;
}

.avaliacoes__seta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  background: var(--branco);
  border: 1px solid var(--linha);
  border-radius: 50%;
  color: var(--tinta);
  transition: background-color var(--transicao), border-color var(--transicao);
}

.avaliacoes__seta:hover {
  background: var(--areia-escura);
  border-color: var(--tinta-suave);
}

.avaliacoes__seta svg { width: 18px; height: 18px; fill: none; stroke: currentColor; }

.avaliacoes__seta--ant svg { transform: rotate(180deg); }

/* Todos os cartoes tem a altura do mais alto, inclusive no celular. Deixar cada
   um com a propria altura pareceria melhor num quadro parado, mas a fita reserva
   a altura do maior de qualquer jeito: o cartao curto ficaria com um vao de
   fundo areia embaixo, e as setas soltas longe dele. */

/* Ate 479px aparece um cartao por vez, e ai a conta acima cobra caro: a fita
   reserva a altura da avaliacao de cinco linhas, entao a de duas linhas ficava
   com quase 130px de branco embaixo, como se o texto tivesse faltado. Reservando
   as cinco linhas dentro de todos os textos, a caixa passa a ser sempre a mesma
   e o vao vira parte do desenho do cartao em vez de defeito de um deles. Os
   8em sao as cinco linhas: 5 x o line-height 1.6 do proprio paragrafo. */
@media (max-width: 479px) {
  .avaliacao__texto { min-height: 8em; }
}

/* --------------------------------------------------------------------------
   16. LOJAS
   Sem iframe de mapa. O link externo abre o Maps sem pesar a pagina.
   -------------------------------------------------------------------------- */
.lojas { display: grid; grid-template-columns: 1fr; gap: 56px; }

/* Mesma peca do cartao de produto: placa levantada com a foto rebaixada dentro.
   As duas secoes mostram foto e texto na mesma ordem, entao tratar uma como
   cartao e a outra como grade solta faria a pagina parecer montada por duas
   pessoas. */
.loja {
  position: relative;
  display: grid;
  gap: 20px;
  align-content: start;
  padding: 16px 16px 22px;
  background: var(--branco);
  border: 1px solid rgba(255, 255, 255, 0.9);
  border-radius: var(--raio);
  box-shadow: var(--sombra-2), var(--base-marcada);
  transition: transform 280ms var(--suave), box-shadow 280ms var(--suave);
}

.loja__foto {
  position: relative;
  background: var(--areia);
  border-radius: var(--raio);
  overflow: hidden;
}

/* o poco, pelo mesmo motivo do .produto__midia::after: inset nao passa por cima
   de conteudo opaco, entao ele precisa de uma camada propria */
.loja__foto::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  border-radius: inherit;
  box-shadow: var(--poco);
}

/* 4:3, e nao mais 16:9. A foto da Vila Albertina ja e 4:3 e entra sem corte
   nenhum; a da Vila Nova Mazzei veio em pe e, numa caixa 16:9, sobrava uma
   tira de 42% da altura dela, cortada no meio do showroom. */
.loja__foto img {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  transition: transform 700ms var(--suave);
}

/* foto em pe: o corte sobe e fica com o topo do ambiente em vez do centro */
.loja__foto--topo img { object-position: center 14%; }

@media (hover: hover) {
  .loja { will-change: transform; }

  .loja:hover,
  .loja:focus-within {
    z-index: 2;
    transform: translateY(-6px);
    box-shadow: var(--sombra-3), var(--base-marcada);
  }

  .loja:hover .loja__foto img { transform: scale(1.03); }
}

.loja h3 { font-size: clamp(1.75rem, 3vw, 2.25rem); }

.loja__endereco { color: var(--tinta-suave); }

.loja__tels { display: flex; flex-wrap: wrap; gap: 6px 20px; }

.loja__tels a {
  font-weight: 500;
  border-bottom: 1px solid var(--linha);
  transition: border-color var(--transicao), color var(--transicao);
}

.loja__tels a:hover { color: var(--terracota); border-color: var(--terracota); }

/* Horario de funcionamento, um dado por linha. Em bloco corrido ele vira uma
   frase que ninguem le ate o fim; empilhado, a pessoa acha a linha do dia dela
   de relance, que e o unico uso que este texto tem.

   O corpo e menor que o do endereco de proposito: a hierarquia do cartao e
   nome, endereco, telefone, e o horario entra depois deles sem disputar. */
.loja__horario {
  display: grid;
  gap: 2px;
  margin: 0;
  font-size: 0.875rem;
  line-height: 1.5;
  color: var(--tinta-suave);
}


.loja__acoes {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px 24px;
  margin-top: 4px;
}

/* --------------------------------------------------------------------------
   18. CTA FINAL
   -------------------------------------------------------------------------- */
.cta-final { padding-block: calc(var(--secao-y) * 1.25); }

.cta-final__inner {
  display: grid;
  justify-items: center;
  gap: 18px;
  text-align: center;
}

/* Sem teto. Como o bloco e uma grade com justify-items: center, o h2 encolhe
   sozinho ate a largura do proprio texto: "Diga a metragem. Devolvemos o preco."
   mede 830px numa coluna de 1160, entao ele fica numa linha so e ainda sobra
   respiro dos dois lados. Nao vai de ponta a ponta, e nao precisa: quem limita
   e a frase, nao um numero arbitrario.

   O 20ch de antes dava 611px e era o unico motivo de a frase quebrar no meio. */
.cta-final h2 { max-width: none; }

/* 72ch dao uns 634px: a frase de 148 caracteres fecha em DUAS linhas de ~70,
   e nao em tres de ~50 como no teto antigo de 52ch. Duas linhas embaixo de uma
   headline de 830px equilibram o bloco; tres linhas estreitas faziam o
   paragrafo parecer uma coluna espremida sob um titulo largo.

   Nao subi mais que isso de proposito: o texto e centralizado, e em linha
   centralizada a margem esquerda muda de lugar a cada linha; passando de umas
   75 letras o olho comeca a perder onde a proxima linha começa. */
.cta-final p { max-width: 72ch; }

.cta-final .btn-par { margin-top: 22px; }

/* Abaixo de 480px o par empilha, e o justify-items: center do bloco deixava as
   duas caixas com a largura do texto mais longo: 254px de 350, dois retangulos
   estreitos no meio de uma faixa larga. Cheios, eles viram alvo de polegar e
   fecham o prumo com o resto da pagina. */
@media (max-width: 479px) {
  .cta-final .btn-par,
  .cta-final .btn-par .btn { width: 100%; }
}

/* --------------------------------------------------------------------------
   19. FOOTER
   -------------------------------------------------------------------------- */
.footer {
  padding-block: var(--secao-y) 32px;
  background: var(--marinho-escuro);
  color: var(--sobre-escuro);
}

/* Maior que o do header, que tem 64px: aqui nao ha menu nem botao disputando a
   linha, e a primeira coluna do rodape tem folga de sobra. Com a proporcao 2.1:1
   da marca, 88px de altura dao 186px de largura, bem menos que a metade da
   coluna, entao nao aperta o paragrafo nem os icones de rede embaixo. */
.footer .logo img { height: 88px; }

.footer__grid { display: grid; gap: 40px; padding-bottom: 44px; }

/* A familia esta escrita aqui de proposito. Este titulo era <h4> e herdava a
   fonte de corpo da regra de elemento; em 11/09/2026 virou <h3>, para o rodape
   parar de pular de h2 para h4, e passou a herdar a Bitter das regras de
   titulo. O rodape e etiqueta de coluna, nao titulo: a fonte e a de corpo,
   independente da tag que ele use. */
.footer__titulo {
  font-family: var(--fonte-corpo);
  font-size: 0.75rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: var(--terracota-claro);
  margin-bottom: 16px;
}

.footer__lista { display: grid; gap: 10px; font-size: 0.9375rem; }

.footer__lista a { color: var(--sobre-escuro-suave); transition: color var(--transicao); }

.footer__lista a:hover { color: var(--terracota-claro); }

.footer address { font-size: 0.9375rem; color: var(--sobre-escuro-suave); }

.footer address strong { color: var(--sobre-escuro); }

.footer address + address { margin-top: 16px; }

.footer .texto-suave { color: var(--sobre-escuro-suave); }

.footer__redes { display: flex; gap: 10px; margin-top: 20px; }

.footer__redes a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border: 1px solid var(--linha-escura);
  border-radius: var(--raio);
  color: var(--sobre-escuro);
  transition: background-color var(--transicao), border-color var(--transicao), color var(--transicao);
}

.footer__redes a:hover {
  background: var(--terracota);
  border-color: var(--terracota);
  color: var(--branco);
}

.footer__redes svg { width: 19px; height: 19px; fill: currentColor; }

.footer__base {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding-top: 28px;
  border-top: 1px solid var(--linha-escura);
  font-size: 0.8125rem;
  color: var(--sobre-escuro-suave);
}

.footer__base p { max-width: none; }

/* Privacidade e termos, as duas unicas paginas separadas do site. Ficam na
   linha de base do rodape, herdando tamanho e cor dela: sao links de rodape,
   nao devem competir com o menu. */
.footer__legal { display: flex; flex-wrap: wrap; gap: 6px 20px; }

.footer__legal a { color: var(--sobre-escuro-suave); transition: color var(--transicao); }

.footer__legal a:hover,
.footer__legal a:focus-visible { color: var(--terracota-claro); }

/* --------------------------------------------------------------------------
   20. WHATSAPP FLUTUANTE
   Segundo e ultimo lugar do site onde o verde aparece.
   -------------------------------------------------------------------------- */
.wa-float {
  position: fixed;
  right: 18px;
  /* Sobe quando a tarja de cookies esta no ar. A variavel e escrita pelo JS com
     a altura medida da tarja, e vale 0px enquanto ela nao existe, entao para
     quem ja aceitou esta conta e a de sempre. */
  bottom: calc(18px + var(--altura-aviso, 0px));
  z-index: 90;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  background: var(--whatsapp);
  border-radius: 50%;
  color: #FFF;
  box-shadow: var(--sombra-flutuante);
  transition: background-color var(--transicao), transform var(--transicao),
              bottom var(--transicao);
}

/* Anel que sai da borda do botao e some, a cada 2,8s. E um convite discreto,
   nao um alarme: um anel so, sem piscar e sem crescer o botao junto.

   O anel e um segundo box-shadow, e nao um ::before com z-index negativo. O
   pseudo-elemento nao servia: o z-index 90 daqui de cima abre uma caixa de
   empilhamento, e dentro dela o filho negativo pinta por cima do fundo do
   proprio botao, entao o anel tingia o verde em vez de sair de tras dele. O
   box-shadow ja nasce fora da borda e atras do fundo, que e exatamente o que a
   animacao precisa.

   A primeira sombra das duas e a sombra parada do botao, repetida em todos os
   quadros: sem ela a animacao apagaria a sombra de apoio enquanto roda.

   Com o ponteiro em cima a animacao sai inteira, em vez de pausar, senao o anel
   congelaria meio aberto em volta do botao. Para quem pediu menos movimento no
   sistema, o bloco de prefers-reduced-motion no fim da folha encerra a animacao
   no primeiro quadro e sobra so a sombra parada. */
@keyframes wa-pulso {
  0% {
    box-shadow: var(--sombra-flutuante), 0 0 0 0 rgba(37, 211, 102, 0.5);
  }
  70% {
    box-shadow: var(--sombra-flutuante), 0 0 0 18px rgba(37, 211, 102, 0);
  }
  100% {
    box-shadow: var(--sombra-flutuante), 0 0 0 0 rgba(37, 211, 102, 0);
  }
}

.wa-float { animation: wa-pulso 2.8s ease-out infinite; }

.wa-float:hover,
.wa-float:focus-visible {
  background: var(--whatsapp-escuro);
  transform: scale(1.06);
  animation: none;
}

.wa-float svg { width: 30px; height: 30px; fill: currentColor; }

/* --------------------------------------------------------------------------
   20B. ALVOS DE TOQUE E RODAPE NO CELULAR
   Link de texto herda a altura da linha, que no corpo de 15px da entre 16 e
   25px de area clicavel. Para o ponteiro isso basta; para o dedo nao. As regras
   abaixo so engordam a caixa invisivel em volta do link, com padding vertical:
   nenhuma mexe em tamanho de fonte, cor ou posicao, entao o desenho na tela
   continua o mesmo. Ficam presas ao celular e ao tablet porque no desktop o
   padding extra abriria buracos entre os itens das listas do rodape.
   -------------------------------------------------------------------------- */
@media (max-width: 1023px) {
  .link-seta,
  .avaliacao__mais { padding-block: 10px; }

  .loja__tels a { padding-block: 7px; }

  .menu-painel__tel a,
  .footer address a { display: inline-block; padding-block: 7px; }

  .footer__lista { gap: 4px; }

  .footer__lista a,
  .footer__legal a { display: inline-block; padding-block: 10px; }

  .footer__legal { gap: 0 20px; }

  .footer__redes a { width: 44px; height: 44px; }
}

/* O rodape empilha quatro blocos no celular e ja passava de mil pixels de
   altura antes de os links ganharem respiro para o dedo. O logo e os vaos entre
   blocos devolvem o que o padding de toque cobrou. */
@media (max-width: 767px) {
  .footer .logo img { height: 72px; }

  .footer__grid { gap: 32px; padding-bottom: 32px; }

  .footer__titulo { margin-bottom: 10px; }
}

/* --------------------------------------------------------------------------
   20B. PAGINAS DE TEXTO
   Privacidade, termos e o 404. Sao tres paginas geradas a partir dos blocos do
   index.html, entao header, menu, rodape e o snippet do GTM chegam prontos e
   nao precisam de estilo proprio. O que falta e so o corpo de texto corrido,
   que a home nao tem em lugar nenhum.
   -------------------------------------------------------------------------- */
/* As duas linhas abaixo do gap resolvem o mesmo problema e uma nao funciona sem
   a outra.

   O PROBLEMA: o e-mail da empresa tem 39 caracteres sem hifen nem ponto de
   quebra. "atendimento.classictexturas@outlook.com" mede 314px, e num aparelho
   de 320px a coluna de texto tem 280px. A palavra saia da tela e a pagina
   inteira passava a rolar na horizontal, arrastando header e rodape junto.

   POR QUE O overflow-wrap SOZINHO NAO BASTA: ele quebra a palavra quando ela
   estoura a LINHA, mas nao muda a largura minima de conteudo da caixa. Esta
   caixa e um grid, e trilha de grid nasce em auto, que significa "nao encolha
   abaixo do conteudo". A trilha continuava com os 314px do e-mail e o
   overflow-wrap nunca chegava a ser necessario.

   O minmax(0, 1fr) e que solta a trilha para encolher. Dai o overflow-wrap
   entra e quebra o e-mail. Vale tambem para CNPJ, URL e qualquer palavra longa
   que entre neste texto depois. */
.texto-corrido {
  display: grid;
  gap: 18px;
  max-width: 68ch;
  grid-template-columns: minmax(0, 1fr);
  overflow-wrap: break-word;
}

/* Cabecalho de clausula, e nao titulo de card: menor que o das secoes e com
   respiro em cima, para separar um assunto do outro sem precisar de linha
   divisoria. O :first-child perde o respiro porque ja tem o vao do cabecalho
   da secao acima dele.

   ESTAO OS DOIS NIVEIS AQUI porque em 11/09/2026 o titulo das paginas legais
   virou <h1> e as clausulas subiram de h3 para h2. O h3 fica valendo para
   subdivisao dentro de uma clausula, que ainda nao existe mas cai no lugar
   certo no dia em que existir. */
.texto-corrido h2,
.texto-corrido h3 {
  margin-top: 14px;
  font-size: 1.25rem;
}

.texto-corrido > h2:first-child,
.texto-corrido > h3:first-child { margin-top: 0; }

/* A data de vigencia, logo abaixo do titulo. Menor e mais apagada que o corpo:
   e informacao de rodape de documento, nao abertura de leitura. */
.texto-data {
  margin: 0;
  font-size: 0.875rem;
  color: var(--tinta-suave);
}

/* A tabela de cookies da politica de privacidade. Quatro colunas de texto, sem
   nada centralizado: aqui nao ha simbolo para alinhar, so frase curta.

   QUEM ROLA E O INVOLUCRO, NAO A TABELA. Poe-se display:block com overflow na
   propria <table> e resolve-se o corte na tela estreita, mas o display:block
   apaga a semantica de tabela em parte dos leitores de tela, e a relacao entre
   celula e cabecalho vai junto. Dai o .tabela-rolagem por fora, que rola, e a
   tabela por dentro continuando tabela.

   O tabindex="0" no involucro esta no HTML e nao e enfeite: area que rola e
   inalcancavel por teclado sem ele, e quem navega sem mouse nao chega na
   coluna do prazo. O role e o aria-label vem junto porque um elemento que
   recebe foco precisa se anunciar. */
.tabela-rolagem {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  /* O min-width: 0 nao e detalhe, e o que faz a rolagem funcionar. O
     .texto-corrido e um grid, e item de grid nasce com min-width: auto, que
     significa "nao encolha abaixo do conteudo". Sem esta linha o involucro
     cresce ate a largura minima da tabela em vez de rolar, e a pagina INTEIRA
     e que passa a rolar na horizontal. Aparecia a partir de 320px, onde o
     estouro era de 18px. */
  min-width: 0;
}

.tabela-rolagem:focus-visible {
  outline: 2px solid var(--terracota);
  outline-offset: 3px;
}

.tabela-dados {
  width: 100%;
  /* Piso de largura para a coluna de descricao nao ser espremida ate a frase
     quebrar de duas em duas palavras. Abaixo disto quem rola e o involucro, que
     e para isso que ele existe: melhor arrastar a tabela de lado e ler a frase
     inteira do que ver quinze linhas de uma palavra. */
  min-width: 34rem;
  border-collapse: collapse;
  font-size: 0.9375rem;
}

.tabela-dados th,
.tabela-dados td {
  padding: 12px 14px;
  text-align: left;
  vertical-align: top;
  border-bottom: var(--borda);
}

.tabela-dados thead th {
  font-family: var(--fonte-corpo);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--tinta-suave);
  white-space: nowrap;
}

.tabela-dados tbody th {
  font-family: var(--fonte-mono);
  font-size: 0.8125rem;
  font-weight: 400;
  color: var(--tinta);
  white-space: nowrap;
}

.tabela-dados td { color: var(--tinta-suave); }

.tabela-dados tbody tr:last-child th,
.tabela-dados tbody tr:last-child td { border-bottom: 0; }

.texto-corrido p { color: var(--tinta-suave); }

/* O reset da folha zera o marcador de toda lista, porque no resto do site as
   listas sao de itens curtos com traco ou icone proprio. Aqui e texto corrido:
   sem o ponto, a enumeracao vira quatro paragrafos indentados sem motivo. */
.texto-corrido ul {
  display: grid;
  gap: 10px;
  margin: 0;
  padding-left: 22px;
  list-style: disc;
  color: var(--tinta-suave);
}

.texto-corrido li::marker { color: var(--terracota); }

.texto-corrido strong { color: var(--tinta); font-weight: 600; }

/* PENDENTE e afins ficam em italico e no tom fraco: sao recado para quem edita
   o site, nao para quem le a pagina. */
.texto-corrido em { color: var(--tinta-suave); }

.texto-corrido a {
  color: var(--terracota);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.texto-corrido a:hover { color: var(--terracota-escuro); }

/* --------------------------------------------------------------------------
   20C. AVISO DE COOKIES

   Mora aqui, junto do botao flutuante, porque os dois disputam a mesma quina da
   tela. Enquanto a tarja esta no ar, o JS mede a altura dela e escreve em
   --altura-aviso; o flutuante soma essa variavel ao proprio bottom e sobe. No
   celular a tarja quebra em duas ou tres linhas e a conta continua certa,
   porque e medida e nao chutada.

   A tarja e AVISO, e nao portao: as tags do GTM ja dispararam quando ela
   aparece. Foi decisao da empresa. O desenho reflete isso, e por isso ela nao
   tem "Recusar": um botao que nao desliga nada seria mentira na tela.

   O fundo e o marinho da marca, o mesmo do rodape. Tarja clara sobre a pagina
   areia sumia; a escura le como uma faixa a parte, que e o que ela e.
   -------------------------------------------------------------------------- */
.aviso-cookies {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 95;
  /* Marinho ESCURO, e nao o marinho da marca: a tarja cai sobre a faixa de
     prova e sobre o CTA final, que ja sao marinho, e cor igual em cima de cor
     igual apagaria a borda entre as duas. Sobre a areia a diferenca nem
     aparece, porque qualquer escuro ja separa. */
  background: var(--marinho-escuro);
  color: var(--sobre-escuro);
  border-top: 1px solid var(--linha-escura);
  box-shadow: var(--sombra-flutuante);
}

/* Precisa ser explicito: o display abaixo venceria o hidden do HTML, e a tarja
   apareceria para quem ja aceitou. */
.aviso-cookies[hidden] { display: none; }

.aviso-cookies__inner {
  max-width: var(--largura-max);
  margin: 0 auto;
  padding: 16px var(--gutter);
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.aviso-cookies__texto {
  margin: 0;
  max-width: 82ch;
  font-size: 0.875rem;
  line-height: 1.6;
  color: var(--sobre-escuro-suave);
}

.aviso-cookies__texto a {
  color: var(--sobre-escuro);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.aviso-cookies__texto a:hover,
.aviso-cookies__texto a:focus-visible { color: var(--terracota-claro); }

/* O botao nao encosta na borda da tarja no celular: ele ocupa a linha inteira,
   que e o alvo de toque mais facil de acertar com o polegar. */
.aviso-cookies .btn { align-self: stretch; }

/* Espaco para o flutuante do WhatsApp, que fica na mesma quina. Sem isto o
   botao redondo cobre o canto da tarja. */
@media (max-width: 639px) {
  .aviso-cookies__inner { padding-right: calc(var(--gutter) + 66px); }
  .aviso-cookies .btn { align-self: flex-start; }
}

@media (min-width: 640px) {
  .aviso-cookies__inner {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    gap: 28px;
    padding: 14px var(--gutter);
  }

  .aviso-cookies .btn { align-self: auto; flex: none; }
}

/* --------------------------------------------------------------------------
   21. RESPONSIVO
   -------------------------------------------------------------------------- */
@media (min-width: 640px) {
  .produtos { grid-template-columns: repeat(2, minmax(0, 1fr)); }

  .lojas { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 40px; }

  .obra-mini { width: 268px; }

  .cores-grade { grid-template-columns: repeat(5, minmax(0, 1fr)); }

  /* cinco colunas, entao a cartela fechada fecha em duas fileiras de cinco */
  .cores-grade:not(.is-expandida) > .swatch:nth-child(n+1) { display: grid; }
  .cores-grade:not(.is-expandida) > .swatch:nth-child(n+11) { display: none; }

  .cores-moldura { padding: 40px 36px; }

  /* Daqui para cima a trilha vira linha e os elos crescem sozinhos para ocupar
     a sobra: as duas terminam no mesmo ponto, no "Voce". A diferenca deixa de
     ser o comprimento e passa a ser quantas paradas existem no meio, que e o
     que se quer comparar. Sem isso a trilha da Classic tinha dois palmos e o
     painel ficava com meia largura vazia. */
}

/* A TRILHA SO DEITA QUANDO CABE. Ela estreava em 640px e nao cabia: com paradas
   de 92px e as tres pilulas de custo, que sao nowrap, a fila mede 597px, e a
   .rota__via tinha 598px de espaco interno em 640 e 742px em 768, contra os
   741px que a fila passa a medir quando a parada vai para 128px. Nos dois casos
   ela transbordava e levava a pagina junto.

   Os 700px sao o primeiro ponto onde a conta fecha com folga: 700 - 40 de
   gutter - 38 de padding da via = 622px de espaco para 597px de fila. */
@media (min-width: 700px) {
  .rota__trilha { flex-direction: row; align-items: flex-start; }

  .rota__parada {
    flex-direction: column;
    gap: 10px;
    width: 92px;
    text-align: center;
  }

  /* a partir daqui a trilha e deitada, entao a pilula volta para a direita */
  .rota__pilula { margin-left: auto; }

  /* a altura do elo e a do circulo: e isso que deixa o custo centrado na linha
     dos icones sem precisar de posicionamento absoluto */
  .rota__elo {
    flex: 1 1 auto;
    min-width: 52px;
    height: 52px;
    min-height: 0;
    padding-left: 0;
    justify-content: center;
  }

  .rota__elo::before {
    left: 0;
    right: 0;
    top: 50%;
    bottom: auto;
    border-left: 0;
    border-top: 1.5px dashed var(--negado-linha-forte);
  }

  .rota__via--classic .rota__elo::before {
    border-left: 0;
    border-top-style: solid;
    border-top-color: var(--aprovado);
  }
}

@media (min-width: 768px) {
  /* Aqui entra so o botao de orcamento. O menu e as redes esperam os 1024px,
     no bloco mais abaixo: logo, menu de cinco itens, duas redes e o botao nao
     cabem lado a lado antes disso, e o resultado era o logo cobrindo o "Inicio"
     e o "Contato" atropelando o icone do Instagram. Entre 768 e 1023 a
     navegacao fica no menu sanduiche, que ja leva os mesmos links. */
  .header .btn--whatsapp { display: inline-flex; }

  .prova { padding: 64px 0; }

  .prova__item { gap: 16px; padding-inline: 44px; }

  .prova__unidade { font-size: 0.75rem; }

  .prova__estrelas svg { width: 15px; height: 15px; }


  /* Em tela grande so cresce o respiro dos paineis; quem preenche a largura sao
     os elos, que ja esticam sozinhos desde os 640px. */
  .rota { gap: 20px; margin-bottom: 60px; }

  .rota__via { padding: 28px 32px; }

  .rota__cabecalho { margin-bottom: 26px; }

  /* 128px e a largura de "Voce paga menos" em uma linha so; em 118 ela quebrava
     e a parada final da nossa trilha ficava mais alta que a da revenda */


  .frentes { grid-template-columns: repeat(2, minmax(0, 1fr)); }

  .frente {
    padding: 0 0 0 56px;
    border-top: 0;
    border-left: var(--borda);
  }

  .frente:first-child { padding: 0 56px 0 0; border-left: 0; }

  .ambiente__bloco { padding: 44px 40px; }

  .footer__grid { grid-template-columns: 1.4fr 1fr 1fr; gap: 48px; }

  .footer__base { flex-direction: row; justify-content: space-between; align-items: center; }

  .wa-float { right: 28px; bottom: calc(28px + var(--altura-aviso, 0px)); width: 60px; height: 60px; }
  .wa-float svg { width: 32px; height: 32px; }
}

/* Em tela grande o banner ganha respiro nas laterais para os controles e para
   o botao, que em tela pequena ficam mais colados na borda. */
@media (min-width: 900px) {
  .banners__seta { width: 52px; height: 52px; }
  .banners__seta--ant { left: 28px; }
  .banners__seta--prox { right: 28px; }

  .banners__pontos { bottom: 22px; }
}

@media (min-width: 1024px) {
  /* A parada so engorda aqui. Em 768 ela ja tinha 128px e a fila passava a medir
     741px num espaco de 742: empatava no papel e estourava na tela por causa da
     borda. Dos 1024 para cima sobram 878px de espaco interno. */
  .rota__parada { width: 128px; }

  /* largura suficiente para a barra inteira: logo, menu, redes e botao */
  .nav { display: block; }

  .header__redes { display: flex; }

  .menu-btn,
  .menu-painel { display: none; }

  .nav__lista { gap: 32px; }

  .produtos { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 72px 40px; }

  /* as duas fileiras de sete que a secao foi desenhada para ter */
  .cores-grade { grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 26px 20px; }

  /* as duas fileiras de sete que a secao foi desenhada para ter viraram o corte
     da cartela fechada: catorze cores antes do botao de abrir */
  .cores-grade:not(.is-expandida) > .swatch:nth-child(n+1) { display: grid; }
  .cores-grade:not(.is-expandida) > .swatch:nth-child(n+15) { display: none; }

  /* A banda de foto le esta variavel para saber onde parar, entao a largura do
     cartao muda aqui, no .ambiente, e nao no bloco. */
  .ambiente { --ambiente-cartao: 520px; }

  .ambiente__bloco { padding: 52px 48px; }

  .footer__grid { grid-template-columns: 1.5fr 1fr 1fr 1fr; }
}

/* --------------------------------------------------------------------------
   22. ANIMACAO
   Dois efeitos, os dois na entrada da viewport: o fade-up, que sobe o bloco
   inteiro, e o fade-stagger, que sobe os filhos de uma grade um a um.

   O estado escondido so vale com o JavaScript rodando. O main.js marca
   <html class="js"> assim que carrega. Sem essa trava, se o JS falhar,
   metade da pagina ficaria invisivel para sempre.

   A curva e a --suave, que freia no fim; com o ease padrao o bloco chegava
   batendo. A duracao subiu de 500ms para 720ms pelo mesmo motivo: em 500ms o
   movimento e percebido como salto, e nao como entrada.
   -------------------------------------------------------------------------- */
.js .fade-up {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 720ms var(--suave), transform 720ms var(--suave);
}

.js .fade-up.is-visivel { opacity: 1; transform: none; }

/* Cascata. O atraso de cada filho e escrito pelo main.js na variavel --atraso,
   em vez de uma fila de nth-child aqui: a cartela tem catorze cores e a lista
   de obras muda de tamanho conforme as fotos chegam.

   O deslocamento e menor que o do fade-up, 14px contra 24px, porque sao muitos
   elementos entrando quase juntos e o movimento soma na tela. */
.js .fade-stagger > * {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 620ms var(--suave) var(--atraso, 0ms),
              transform 620ms var(--suave) var(--atraso, 0ms);
}

.js .fade-stagger.is-visivel > * { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }

  .fade-up,
  .js .fade-up,
  .js .fade-up.is-visivel,
  .js .fade-stagger > *,
  .js .fade-stagger.is-visivel > * {
    opacity: 1;
    transform: none;
    transition: none;
  }

  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }

  /* AS SOMBRAS FICAM, O MOVIMENTO SAI. Sombra e estado, nao movimento: ela nao
     anda, nao pisca e nao acompanha rolagem, entao continua dizendo o que esta
     acima do que sem incomodar ninguem. O que sai e o deslocamento e a escala
     do hover.

     Zerar a duracao da transicao, logo acima, nao bastava: sem duracao o
     translateY(-6px) continua acontecendo, so que instantaneo, que e
     justamente o tipo de salto que a preferencia pede para evitar. Estas
     regras precisam empatar em especificidade com as do hover, e ganham por
     virem depois na folha. */
  .produto:hover,
  .produto:focus-within,
  .loja:hover,
  .loja:focus-within,
  .btn--primario:hover,
  .btn--primario:focus-visible,
  .btn--primario:active,
  .btn--contorno:active,
  .btn--whatsapp:hover,
  .btn--whatsapp:focus-visible,
  .produto:hover .produto__midia img,
  .produto:focus-within .produto__midia img,
  .loja:hover .loja__foto img,
  .cores-grade:not(.is-escolhendo) .swatch:hover {
    transform: none;
  }
}
