/* ==========================================================================
   Leve & Lave Chapecó — sistema visual
   Direção: "o mural da parede". A loja comunica por balão de fala — o mural da
   sala de espera, os avisos, as portas do Locker, tudo é balão azul recortado
   sobre cimento queimado. A página usa o mesmo vocabulário, para que quem
   clica no anúncio reconheça a sala quando entrar.

   O que veio da Pluma (a pedido do operador) é a ARQUITETURA do hero: campo
   claro, coluna de texto à esquerda, foto sangrando até a borda direita a
   partir de 1180px, peça de preço sobreposta à foto, faixa de preço só no
   mobile e curva fazendo a passagem para a faixa escura dos pilares.
   O vocabulário é todo outro: lá é disco de adesivo de vitrine e onda de três
   faixas; aqui é balão de fala e curva única, que é o que existe na parede.

   Paleta medida, não estimada. Todas do logo oficial e das fotos da loja:
     #0F3E72  camiseta "leve"        -> --marinho
     #03B6D0  camiseta "lave"        -> --ciano
     #0E244D  parede das máquinas    -> confirma a família do --marinho-90
     #898989  cimento queimado       -> família dos cinzas de texto
     #D8D4CB  piso                   -> --areia

   Contraste conferido. Quatro limites que o CSS respeita em todo lugar:
     branco sobre #03B6D0 = 2.44 REPROVA -> sobre ciano, texto sempre marinho
     branco sobre #25D366 = 1.98 REPROVA -> botão WhatsApp leva texto marinho
     #03B6D0 sobre claro  = 2.25 REPROVA -> ciano nunca é texto sobre claro
     #0F3E72 sobre #03B6D0 = 4.41 QUASE  -> texto sobre ciano usa --marinho-txt
   ========================================================================== */

/* ---------- Fontes auto-hospedadas ------------------------------------------
   Nunito variável: um arquivo cobre 400-900. Arredondada de terminal, que é o
   que o lettering "leve & lave" faz — a marca não é grotesca, é rounded, e uma
   grotesque neutra aqui brigaria com o logo em cima dela.
   Sem fonts.googleapis.com: medido, aquilo custa ~750ms de bloqueio de render.
--------------------------------------------------------------------------- */
@font-face {
  font-family: 'Nunito';
  font-style: normal;
  font-weight: 400 900;
  font-display: swap;
  src: url(../fonts/nunito-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Nunito';
  font-style: normal;
  font-weight: 400 900;
  font-display: swap;
  src: url(../fonts/nunito-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ---------- Tokens --------------------------------------------------------- */
:root {
  --marinho:     #0F3E72;  /* camiseta "leve" do logo: header, CTA final, balões */
  --marinho-txt: #0D3764;  /* o marinho QUANDO É TEXTO sobre ciano (4.92:1)      */
  --marinho-90:  #0B2F57;  /* um degrau abaixo: faixa de pilares e base da onda  */
  --marinho-esc: #071D34;  /* rodapé                                             */
  --ciano:       #03B6D0;  /* camiseta "lave" do logo. Campo — nunca texto claro */
  --ciano-claro: #23CAE3;  /* o ciano QUANDO É TEXTO sobre marinho (5.44:1)      */
  --ciano-txt:   #027687;  /* o ciano QUANDO É TEXTO sobre claro (4.91:1)        */

  --tinta:   #12203A;
  --grafite: #4A5470;
  --gelo:    #F2F6FB;
  --areia:   #F6F4EF;   /* o piso da loja: fundo alternativo, quebra o azulado   */
  --branco:  #FFFFFF;
  --linha:   #D9E2EE;
  --wa:      #25D366;
  --wa-hover:#1FBA5A;

  /* Hero claro — fiel ao que a pessoa encontra: cimento claro, piso bege,
     iluminado. Os tons de texto saem do mobiliário medido, não de uma escala
     de cinza: o H1 é a poltrona, o sub e o micro são degraus acima dela. */
  --hero-bg:    #F2F6FB;
  --hero-h1:    #22304A;   /* 11.9:1 — a poltrona da sala de espera */
  --hero-sub:   #44506B;   /*  7.8:1 */
  --hero-micro: #5A6480;   /*  5.6:1 */
  --hero-linha: #DAE2EE;

  --wrap: 1180px;
  --gut: clamp(1.15rem, 4vw, 2.5rem);
  --secao-y: clamp(3.6rem, 8vw, 6.5rem);
  --r: 16px;
  --r-lg: 24px;

  --sombra: 0 2px 4px rgba(18,32,58,.05), 0 12px 32px rgba(18,32,58,.09);
  --sombra-alta: 0 4px 8px rgba(18,32,58,.07), 0 24px 56px rgba(18,32,58,.16);
}

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

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }

body {
  margin: 0;
  font-family: 'Nunito', system-ui, -apple-system, 'Segoe UI', sans-serif;
  font-size: 1.0625rem;
  line-height: 1.62;
  color: var(--tinta);
  background: var(--branco);
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

img { max-width: 100%; height: auto; display: block; }
a { color: inherit; }

h1, h2, h3, h4 { margin: 0; line-height: 1.08; }
p { margin: 0 0 1em; }
p:last-child { margin-bottom: 0; }

:focus-visible {
  outline: 3px solid var(--ciano-txt);
  outline-offset: 3px;
  border-radius: 4px;
}

.wrap {
  width: 100%;
  max-width: var(--wrap);
  margin-inline: auto;
  padding-inline: var(--gut);
}

/* fixed, não absolute: com absolute o link salta para o topo do DOCUMENTO e
   some da tela quando a pessoa está no meio da página — que é quando ela
   tabula. */
.pular {
  position: fixed; left: -9999px; top: 1rem; z-index: 999;
  background: var(--marinho); color: #fff; padding: .8rem 1.2rem;
  border-radius: 8px; font-weight: 800; text-decoration: none;
}
.pular:focus { left: 1rem; }

/* ---------- Tipografia -----------------------------------------------------
   Nunito não tem eixo de largura, diferente da Archivo. Onde a Pluma usava
   font-stretch para separar display de condensado, aqui quem separa é peso +
   tracking: 900 com tracking negativo para display e número, 800 com tracking
   positivo e caixa alta para rótulo.
--------------------------------------------------------------------------- */
/* balance em vez de <br> forçado: os títulos daqui são longos ("Nunca usou uma
   lavanderia self-service?") e um <br> que fecha bem em 1440px deixa órfã em
   1024 e estoura em 380. O balance distribui as linhas em qualquer largura, e
   como só vale até ~6 linhas, serve exatamente para título. */
.display   { font-weight: 900; letter-spacing: -.021em; line-height: 1.05; text-wrap: balance; }
.numero    { font-weight: 900; letter-spacing: -.03em; font-variant-numeric: lining-nums; }
.rotulo    { font-weight: 800; text-transform: uppercase; letter-spacing: .12em; font-size: .775rem; line-height: 1.35; }

.h1     { font-size: clamp(2.15rem, 5.2vw, 3.4rem); }
.h2     { font-size: clamp(1.8rem, 4.2vw, 2.8rem); }
.h3     { font-size: clamp(1.15rem, 2.2vw, 1.33rem); font-weight: 800; letter-spacing: -.012em; }
.lead   { font-size: clamp(1.06rem, 1.9vw, 1.22rem); line-height: 1.55; }
.miudo  { font-size: .92rem; line-height: 1.5; }

/* O destaque de cor dentro do H1. O padrão é a versão escurecida, porque o
   hero é claro; sobre campo escuro ele volta a ser o ciano do logo. */
.ciano-txt { color: var(--ciano-txt); }
.secao--marinho .ciano-txt { color: var(--ciano-claro); }

/* ---------- Seções --------------------------------------------------------- */
.secao { padding-block: var(--secao-y); }
.secao--gelo    { background: var(--gelo); }
.secao--areia   { background: var(--areia); }
.secao--marinho { background: var(--marinho); color: #fff; }
.secao--ciano   { background: var(--ciano); color: var(--marinho-txt); }
.secao--branco  { background: var(--branco); }

.secao__topo { max-width: 46rem; margin-bottom: clamp(2rem, 4vw, 3rem); }
.secao__eyebrow { color: var(--ciano-txt); margin-bottom: .85rem; }
.secao--marinho .secao__eyebrow { color: var(--ciano-claro); }
.secao--ciano   .secao__eyebrow { color: var(--marinho-txt); }
.secao__sub { margin-top: 1.1rem; color: var(--grafite); }
.secao--marinho .secao__sub { color: #C3D2E8; }
.secao--ciano   .secao__sub { color: #06364A; }

/* ---------- Botões --------------------------------------------------------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .6rem;
  padding: 1.02rem 1.6rem;
  border: 0; border-radius: 999px;
  font-family: inherit; font-size: 1.02rem; font-weight: 800;
  letter-spacing: -.005em; text-decoration: none; cursor: pointer;
  transition: transform .16s ease, background-color .16s ease, box-shadow .16s ease;
}
.btn:hover { transform: translateY(-2px); }
.btn:active { transform: translateY(0); }
.btn__ico { flex: none; width: 20px; height: 20px; fill: currentColor; }

/* Texto marinho sobre o verde: branco daria 1.98:1. Marinho dá 5.42:1 e
   mantém a cor de marca do WhatsApp, que é o que faz o botão ser reconhecido
   antes de ser lido. */
.btn--wa { background: var(--wa); color: var(--marinho-txt); box-shadow: 0 6px 18px rgba(37,211,102,.30); }
.btn--wa:hover { background: var(--wa-hover); }

.btn--rota { background: transparent; color: #fff; box-shadow: inset 0 0 0 2px rgba(255,255,255,.42); }
.btn--rota:hover { background: rgba(255,255,255,.11); box-shadow: inset 0 0 0 2px #fff; }

/* O par do btn--rota para fundo claro — é o que o hero usa. */
.btn--rota-claro { background: transparent; color: var(--marinho); box-shadow: inset 0 0 0 2px rgba(15,62,114,.32); }
.btn--rota-claro:hover { background: rgba(15,62,114,.06); box-shadow: inset 0 0 0 2px var(--marinho); }

.btn--marinho { background: var(--marinho); color: #fff; }
.btn--marinho:hover { background: var(--marinho-90); }

.btn-linha { display: flex; flex-wrap: wrap; gap: .8rem; }

/* ---------- Header ---------------------------------------------------------
   Header CLARO, e não o campo escuro que a referência usa. Não é preferência:
   o logo é um selo de duas camisetas e a da esquerda é #0F3E72 — sobre campo
   marinho ela some e a palavra "LAVANDERIA" desaparece junto. A marca tem uma
   versão invertida para fundo escuro (é a que está no letreiro da fachada, com
   a camiseta esquerda clara), mas essa arte não veio no material. Enquanto não
   vier, o campo claro é o único jeito de aplicar o logo oficial sem deturpá-lo.

   O selo é quase quadrado (520x439), então ele come altura, não largura: o
   header precisa dos 80px para o logo caber em 68px e ainda respirar.
--------------------------------------------------------------------------- */
.topo {
  position: sticky; top: 0; z-index: 60;
  background: var(--branco);
  border-bottom: 1px solid var(--hero-linha);
  box-shadow: 0 1px 14px rgba(18,32,58,.055);
}
.topo__grid {
  display: flex; align-items: center; gap: 1rem;
  min-height: 72px; padding-block: .4rem;
}
.topo__logo { flex: none; display: block; }
.topo__logo img { width: 72px; height: auto; }

/* O horário é o argumento que a concorrência de Chapecó não tem à mão, e é a
   dúvida por trás de "lavanderia perto de mim". Fica no header, não escondido
   no rodapé. */
.topo__horario {
  margin: 0 0 0 auto; color: var(--hero-sub);
  font-weight: 800; font-size: .82rem; line-height: 1.25;
  text-align: right; letter-spacing: .01em;
}
.topo__horario b { display: block; color: var(--ciano-txt); font-size: .72rem; text-transform: uppercase; letter-spacing: .1em; }

.topo__wa { display: none; }

@media (max-width: 419px) {
  .topo__logo img { width: 60px; }
  .topo__grid { min-height: 64px; }
  .topo__horario { font-size: .74rem; }
  .topo__horario b { font-size: .64rem; letter-spacing: .06em; }
}

@media (min-width: 900px) {
  .topo__grid { min-height: 80px; }
  .topo__logo img { width: 80px; }
  .topo__wa {
    display: inline-flex; margin-left: 1.2rem;
    padding: .66rem 1.15rem; font-size: .93rem;
  }
}

/* ---------- Hero -----------------------------------------------------------
   Campo claro, fiel ao interior: cimento queimado, piso bege, muita luz. O
   peso que um campo escuro daria vem da tipografia (Nunito 900) e da curva na
   base, que é a mesma curva pintada na parede da sala de espera.

   A foto NÃO fica dentro do .wrap: ela sangra até a borda direita da viewport.
   Por isso a <figure> é filha direta da <section>. Abaixo de 1180px ela volta
   ao fluxo, em largura total, logo depois do texto — e a curva cruza a base
   dela.
--------------------------------------------------------------------------- */
.hero {
  position: relative;
  background: var(--hero-bg);
  color: var(--hero-sub);
  padding-top: clamp(2.4rem, 6vw, 4.2rem);
  /* zero no mobile de propósito: a foto vai até a base e a curva passa por
     cima dela. No desktop o padding volta, porque lá quem fica embaixo da
     curva é a coluna de texto. */
  padding-bottom: 0;
  overflow: hidden;
}

/* O splash de bolhas do logo, repetido na fachada e nas portas do Locker.
   Entra como marca d'água atrás do texto, em opacidade baixa: é assinatura,
   não ilustração. Só desktop — no mobile ele cairia atrás do bloco de preço e
   sujaria o número, que é o elemento que precisa estar mais limpo da página. */
.hero__bolhas {
  display: none;
  position: absolute; top: -6%; left: -7%; z-index: 0;
  width: 430px; height: auto;
  color: var(--ciano); opacity: .09;
  pointer-events: none;
}
@media (min-width: 1180px) { .hero__bolhas { display: block; } }

/* Acima da foto: entre 1180 e 1320px a coluna de texto e a foto chegam perto,
   e o texto tem de vencer a sobreposição. */
.hero__conteudo { position: relative; z-index: 3; }

.hero__eyebrow { color: var(--ciano-txt); margin-bottom: 1rem; }
.hero__h1 { color: var(--hero-h1); margin-bottom: 1.35rem; }
.hero__sub { color: var(--hero-sub); max-width: 34rem; margin-bottom: 1.35rem; }
.hero__sub b { color: var(--hero-h1); font-weight: 800; }
.hero__ctas { margin-bottom: 1.3rem; }

/* Versal só nos CTAs do hero. No .btn global isto vazaria para a barra fixa e
   para os CTAs de seção, que são frase corrida e ficam gritados em caixa alta. */
.hero__ctas .btn { text-transform: uppercase; letter-spacing: .04em; font-size: .95rem; }

/* ---------- Selo do hero ---------------------------------------------------
   Responde à objeção que mais aparece antes da primeira visita: "o que eu
   preciso levar?". O campo tem de ficar em #EAF3FA ou mais claro: com
   --ciano-txt no título este par dá 4.6:1, e escurecer o fundo derruba abaixo
   dos 4.5 exigidos.
--------------------------------------------------------------------------- */
.hero-selo {
  display: grid; grid-template-columns: 42px 1fr; gap: .95rem;
  align-items: start;
  max-width: 34rem; margin-bottom: 1.3rem;
  padding: 1rem 1.2rem;
  background: #EAF3FA;
  border: 1px solid var(--hero-linha);
  border-radius: var(--r);
}
.hero-selo__ico { width: 42px; height: 42px; color: var(--ciano-txt); }
.hero-selo__titulo { display: block; font-weight: 800; color: var(--ciano-txt); margin-bottom: .1rem; }
.hero-selo__txt { display: block; color: var(--hero-sub); font-size: .95rem; line-height: 1.45; }

/* ---------- Balão de preço -------------------------------------------------
   O disco da Pluma vira balão aqui, e não por variação gratuita: o mural
   inteiro da sala de espera é balão de fala azul recortado, as portas do
   Locker também, e é a forma que a pessoa vai reconhecer quando entrar. O
   rabicho aponta para a foto, como os balões da parede apontam para quem está
   sentado.

   Regra do briefing embutida na forma: o R$ 16 nunca aparece sem o R$ 32 na
   mesma tela. Por isso o balão carrega os dois — o combo como número grande e
   as duas metades como linha de apoio — em vez de só o menor.
--------------------------------------------------------------------------- */
.balao {
  position: relative;
  display: grid; justify-items: center; text-align: center;
  padding: 1.15rem 1.3rem 1.25rem;
  background: var(--ciano); color: var(--marinho-txt);
  border-radius: 20px;
}
/* o rabicho: quadrado girado, mesma cor do campo, sem borda — é assim que os
   balões da parede são recortados */
.balao::after {
  content: ""; position: absolute; left: 26px; bottom: -9px;
  width: 22px; height: 22px; background: inherit;
  border-radius: 0 0 5px 0;
  transform: rotate(45deg);
}
.balao__topo  { font-weight: 800; font-size: .72rem; text-transform: uppercase; letter-spacing: .11em; opacity: .9; }
.balao__valor { display: flex; align-items: flex-start; gap: .1em; line-height: .94; margin: .12rem 0 .1rem; }
.balao__cifra { font-size: .4em; font-weight: 800; letter-spacing: 0; margin-top: .42em; }
.balao__base  { font-weight: 700; font-size: .72rem; line-height: 1.3; }
.balao__base b { font-weight: 900; }

.hero__balao {
  position: absolute;
  right: var(--gut); bottom: clamp(52px, 7vw, 82px);
  z-index: 2;
  width: clamp(176px, 42vw, 208px);
  box-shadow: 0 14px 34px rgba(18,32,58,.30);
}
.hero__balao .balao__valor { font-size: clamp(2.4rem, 6vw, 2.9rem); }

/* ---------- Faixa de preço — só mobile -------------------------------------
   No desktop o balão sobre a foto já entrega os dois números na mesma dobra, a
   poucos centímetros daqui, e os ~140px desta faixa jogariam o CTA para fora
   da dobra em 1366x768. No mobile a foto só começa ~950px abaixo do topo: sem
   a faixa, o preço estrearia perto de 1.250px, quase duas telas de rolagem.
   O asterisco some junto — sem a faixa ele apontaria para um número que está
   do outro lado da tela, dentro do balão.
--------------------------------------------------------------------------- */
.faixa-preco {
  display: grid; grid-template-columns: auto 1fr; align-items: center;
  gap: .3rem 1.1rem;
  max-width: 34rem; margin-bottom: .85rem;
  padding: 1.05rem 1.25rem 1rem;
  background: var(--marinho); color: #fff;
  border-radius: var(--r);
}
.faixa-preco__rot b {
  display: block; color: var(--ciano-claro);
  font-weight: 900; font-size: .95rem;
  text-transform: uppercase; letter-spacing: .07em;
}
.faixa-preco__rot span {
  display: block; color: #BFD2EA;
  font-weight: 700; font-size: .8rem;
  text-transform: uppercase; letter-spacing: .07em;
}
.faixa-preco__valor {
  display: flex; align-items: flex-start; justify-content: flex-end; gap: .14em;
  font-size: clamp(2.5rem, 12vw, 3.1rem); line-height: .95;
}
.faixa-preco__cifra { font-size: .38em; font-weight: 800; letter-spacing: 0; margin-top: .5em; }
.faixa-preco__nota { grid-column: 1 / -1; margin: .35rem 0 0; color: #BFD2EA; font-size: .84rem; line-height: 1.4; }
.faixa-preco__nota b { color: #fff; font-weight: 800; }

.hero__asterisco { max-width: 34rem; margin-bottom: 1.3rem; color: var(--hero-micro); }

/* O corte é 1180px (= --wrap) e não 900px porque é aí que a foto passa a
   sangrar e o balão entra na mesma dobra. Entre 900 e 1180 o hero ainda é
   empilhado, a foto só começa bem abaixo, e sem esta faixa o preço sumiria da
   dobra. */
@media (min-width: 1180px) {
  .faixa-preco, .hero__asterisco { display: none; }
}

/* Em 320px o rótulo e o número não cabem lado a lado. Empilhar é mais honesto
   que encolher o número, que é o elemento que a faixa existe para dar. */
@media (max-width: 399px) {
  .faixa-preco { grid-template-columns: 1fr; justify-items: center; text-align: center; gap: .2rem; }
  .faixa-preco__valor { justify-content: center; }
}

/* ---------- Endereço do hero ----------------------------------------------- */
.hero-nap {
  display: grid; grid-template-columns: 22px 1fr; gap: .04rem .7rem;
  max-width: 30rem; color: var(--hero-micro);
  font-size: .95rem; line-height: 1.5;
  padding-bottom: 1.4rem;
}
.hero-nap__ico {
  grid-row: 1 / span 3; width: 22px; height: 22px;
  margin-top: .2rem; color: var(--ciano-txt); fill: currentColor;
}
.hero-nap b { color: var(--ciano-txt); font-weight: 800; }

/* ---------- A curva da parede (assinatura) ---------------------------------
   Uma faixa só, não três. A parede da sala de espera tem exatamente uma curva
   — o azul sobe da esquerda, faz crista no meio e desce à direita, contra o
   cimento. Repetir isso em três camadas empilhadas seria a assinatura de outra
   marca, não desta.
   A cor tem de ser exatamente a dos pilares, senão aparece um filete de outro
   tom na emenda. Entra por variável porque <use> cria shadow DOM e seletor
   externo não atravessa — variável atravessa.
--------------------------------------------------------------------------- */
.curva {
  position: absolute; left: 0; right: 0; bottom: -1px; z-index: 2;
  display: block; width: 100%; height: clamp(42px, 5.5vw, 74px);
  --f1: var(--marinho-90);
}

/* ---------- Foto do hero ---------------------------------------------------
   Abaixo de 1180px: largura total, altura fixa, e a curva cruza a base.
   De 1180px para cima: sai do fluxo e sangra até a borda direita da viewport.
   A borda esquerda é ancorada na GRADE (metade da viewport + metade do wrap,
   menos a largura que a coluna de texto precisa), não numa porcentagem da
   viewport: com % a coluna de texto encolhe quanto mais larga fica a tela e o
   H1 ganha uma quarta linha em 1920px.
--------------------------------------------------------------------------- */
.hero__figura { position: relative; z-index: 1; margin: clamp(2rem, 5vw, 3.2rem) 0 0; }
.hero__figura img {
  width: 100%; height: clamp(340px, 62vw, 480px);
  object-fit: cover; object-position: 50% 42%;
}

@media (min-width: 1180px) {
  /* De volta o espaço da curva: aqui quem fica sob ela é a coluna de texto.
     Os dois clamps têm de acompanhar o clamp de .curva. */
  .hero { padding-bottom: calc(clamp(2.2rem, 5vw, 3.4rem) + clamp(42px, 5.5vw, 74px)); }

  /* A coluna é derivada da MESMA constante que posiciona a figura (500px), e
     não estimada: acima de 1180px a conta se reduz a 640px fixos, e abaixo
     disso ela encolhe junto com a viewport. 640px é o piso para o H1 fechar em
     três linhas — abaixo disso "passada" cai sozinha numa quarta linha, órfã
     que custa ~62px e tira o CTA da dobra em 1366x768. Se o H1 mudar de texto,
     remeça a linha mais longa antes de mexer aqui. */
  .hero__txt { max-width: min(640px, calc(100vw - 500px - var(--gut))); }

  .hero__figura {
    position: absolute; top: 0; right: 0; bottom: 0; margin: 0;
    left: max(48%, calc(50% + var(--wrap) / 2 - 500px));
  }
  .hero__figura img { height: 100%; object-position: 50% 46%; clip-path: url(#recorte-hero); }

  .hero__balao { right: clamp(1.2rem, 5%, 3.4rem); bottom: 21%; width: clamp(196px, 16vw, 226px); }
  .hero__balao .balao__valor { font-size: 3rem; }
  .hero__balao .balao__base { font-size: .75rem; }
}

/* ---------- Pilares --------------------------------------------------------
   Sem border-top: quem faz a emenda com o hero é a curva, e um filete claro
   reto atravessando logo abaixo dela denuncia os dois como elementos
   separados.
--------------------------------------------------------------------------- */
.pilares { background: var(--marinho-90); color: #fff; }
.pilares__grid {
  display: grid; grid-template-columns: repeat(2, 1fr);
  border-top: 1px solid rgba(255,255,255,.14);
}
.pilar {
  padding: 1.45rem 1.05rem;
  border-bottom: 1px solid rgba(255,255,255,.14);
  border-right: 1px solid rgba(255,255,255,.14);
}
.pilar:nth-child(2n) { border-right: 0; }
.pilar__ico { width: 26px; height: 26px; margin-bottom: .55rem; color: var(--ciano-claro); }
.pilar__chave { display: block; font-weight: 900; font-size: 1.22rem; color: var(--ciano-claro); line-height: 1.15; letter-spacing: -.015em; }
.pilar__txt   { display: block; margin-top: .35rem; font-size: .92rem; line-height: 1.45; color: #C3D2E8; }

@media (min-width: 780px) {
  .pilares__grid { grid-template-columns: repeat(4, 1fr); border-bottom: 0; }
  .pilar { border-bottom: 0; padding: 1.9rem 1.35rem; }
  .pilar:nth-child(2n) { border-right: 1px solid rgba(255,255,255,.14); }
  .pilar:last-child { border-right: 0; }
}

/* ---------- Passos ---------------------------------------------------------
   Numerado porque a ordem é real: um procedimento executado em sequência. O
   filete liga os números como a régua liga os minutos.
--------------------------------------------------------------------------- */
.passos { display: grid; gap: 0; counter-reset: passo; margin: 0; padding: 0; }
.passo {
  position: relative;
  display: grid; grid-template-columns: 46px 1fr; gap: 1.15rem;
  padding-bottom: 2.1rem;
}
.passo:last-child { padding-bottom: 0; }
.passo::before {
  counter-increment: passo; content: counter(passo);
  display: grid; place-content: center;
  width: 46px; height: 46px; border-radius: 50%;
  background: var(--marinho); color: #fff;
  font-weight: 900; font-size: 1.28rem;
}
.passo::after {
  content: ""; position: absolute; left: 22px; top: 46px; bottom: 8px;
  width: 2px; background: var(--linha);
}
.passo:last-child::after { display: none; }
.passo__titulo { margin-bottom: .5rem; }

/* Lista de instruções e não parágrafo corrido: cada passo é uma sequência de
   2-3 ações em ordem, e em bloco corrido a pessoa perde o lugar no meio do
   procedimento. Sem marcador — a numeração do passo já é a ordem, e um segundo
   nível de bullet dentro de um <ol> numerado lê como sub-etapa. */
.passo__lista {
  margin: 0; padding: 0; list-style: none;
  display: grid; gap: .42rem;
  color: var(--grafite);
}
.passo__lista li { line-height: 1.5; }
.passo__lista strong { color: var(--tinta); }

.passo__selo {
  display: inline-block; margin-top: .8rem;
  padding: .3rem .72rem; border-radius: 999px;
  background: var(--ciano); color: var(--marinho-txt);
  font-weight: 900; font-size: .76rem;
  text-transform: uppercase; letter-spacing: .06em;
}

@media (min-width: 860px) {
  .passos { grid-template-columns: repeat(2, 1fr); column-gap: 3rem; }
  .passo::after { display: none; }
}

/* ---------- Soma do ciclo --------------------------------------------------
   De onde vêm os 85 minutos que a página promete: os dois números que a pessoa
   acabou de ler nos passos, somados. É a única peça que mostra a conta; sem
   ela o número fica sendo alegação.
--------------------------------------------------------------------------- */
.soma {
  display: flex; flex-wrap: wrap; align-items: center; gap: .55rem .9rem;
  margin-top: 2.2rem; padding: 1.1rem 1.3rem;
  background: var(--gelo); border-radius: var(--r);
}
.secao--gelo .soma, .secao--areia .soma { background: var(--branco); }
.soma__parcela { font-weight: 800; font-size: 1.02rem; color: var(--grafite); }
.soma__op { font-weight: 900; font-size: 1.02rem; color: var(--ciano-txt); }
.soma__total { font-weight: 900; font-size: 1.42rem; color: var(--ciano-txt); letter-spacing: -.02em; }
.soma__nota { flex: 1 1 14rem; color: var(--grafite); font-size: .92rem; line-height: 1.45; }

.rodape-cta {
  margin-top: 2.4rem; padding-top: 1.6rem;
  border-top: 1px solid var(--linha);
  display: flex; flex-wrap: wrap; align-items: center; gap: 1rem 1.4rem;
}
.rodape-cta p { color: var(--grafite); }
.secao--marinho .rodape-cta { border-top-color: rgba(255,255,255,.18); }
.secao--marinho .rodape-cta p { color: #C3D2E8; }

/* ---------- Locker ---------------------------------------------------------
   A seção estratégica: é o único serviço assim na cidade e o segundo caminho
   de conversão da página. Campo marinho para destacá-la do resto, que é claro.
--------------------------------------------------------------------------- */
.locker-passos { display: grid; gap: 1rem; margin-bottom: clamp(1.8rem, 4vw, 2.6rem); }
@media (min-width: 780px) { .locker-passos { grid-template-columns: repeat(3, 1fr); } }
.locker-passo {
  padding: 1.35rem 1.3rem;
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.15);
  border-radius: var(--r);
}
.locker-passo__n {
  display: grid; place-content: center;
  width: 34px; height: 34px; margin-bottom: .8rem; border-radius: 50%;
  background: var(--ciano); color: var(--marinho-txt);
  font-weight: 900; font-size: 1.02rem;
}
.locker-passo__titulo { display: block; font-weight: 800; font-size: 1.06rem; margin-bottom: .3rem; }
.locker-passo__txt { display: block; color: #C3D2E8; font-size: .95rem; line-height: 1.5; }

.locker-precos { display: grid; gap: 1rem; }
@media (min-width: 680px) { .locker-precos { grid-template-columns: repeat(2, 1fr); } }
.locker-preco {
  display: grid; gap: .2rem;
  padding: 1.25rem 1.35rem;
  background: #fff; color: var(--tinta); border-radius: var(--r);
}
.locker-preco__rot { font-weight: 800; font-size: .95rem; color: var(--grafite); }
.locker-preco__cesto { font-weight: 900; font-size: 1.12rem; letter-spacing: -.012em; }
.locker-preco__valor { font-weight: 900; font-size: 2.05rem; color: var(--ciano-txt); letter-spacing: -.03em; line-height: 1.1; }

.locker-nota { margin-top: 1rem; color: #C3D2E8; font-size: .95rem; }
.locker-nota b { color: #fff; }

/* ---------- Cesto claro x cesto misto --------------------------------------
   Fundo translúcido, não branco: as duas cartelas de preço logo acima já são
   brancas, e um terceiro bloco branco faria a pessoa lê-lo como uma terceira
   opção de preço em vez de explicação das duas.
   O "1 máquina / 2 máquinas" é o elemento grande e ciano porque é ele que
   fecha a conta sozinho — quem parar de ler ali já entendeu a diferença.
--------------------------------------------------------------------------- */
.cestos { display: grid; gap: 1rem; margin-top: 1.5rem; }
@media (min-width: 680px) { .cestos { grid-template-columns: repeat(2, 1fr); } }
.cesto {
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .7rem;
  padding: 1.05rem 1.2rem;
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.18);
  border-radius: var(--r);
}
.cesto__marca { width: 22px; height: 22px; border-radius: 50%; flex: none; }
.cesto__marca--claro { background: #fff; box-shadow: inset 0 0 0 1px rgba(18,32,58,.2); }
.cesto__marca--misto { background: conic-gradient(#E8574B, #F0B429, #23CAE3, #6C5CE7, #E8574B); }
.cesto__nome  { font-weight: 800; font-size: 1rem; }
.cesto__seta  { color: #93A9C8; font-weight: 800; }
.cesto__maq   { font-size: 1.32rem; color: var(--ciano-claro); line-height: 1.1; }
.cesto__valor { margin-left: auto; font-size: 1.22rem; }

.cestos__txt { margin-top: 1.4rem; max-width: 46rem; }
.cestos__txt h3 { margin-bottom: .55rem; }
.cestos__txt p { color: #C3D2E8; font-size: .96rem; }
.cestos__txt strong { color: #fff; }

/* ---------- Comparação faça x deixe ----------------------------------------
   Colada no preço do Locker, nunca em outra seção. Sem ela, o visitante vê
   R$ 59,90 ao lado de R$ 32 na mesma página e conclui que o Locker custa quase
   o dobro. Com ela, vê que R$ 27,90 compram 85 minutos e o trabalho todo — e o
   número fica óbvio. Se sair de perto do preço, perde o efeito.
--------------------------------------------------------------------------- */
.versus {
  display: grid; gap: 1px; margin-top: 1.5rem;
  background: rgba(255,255,255,.2);
  border: 1px solid rgba(255,255,255,.2);
  border-radius: var(--r); overflow: hidden;
}
@media (min-width: 680px) { .versus { grid-template-columns: 1fr 1fr; } }
.versus__lado { padding: 1.25rem 1.35rem; background: var(--marinho); }
.versus__lado--destaque { background: var(--marinho-90); }
.versus__rot { display: block; font-weight: 900; font-size: 1.04rem; color: var(--ciano-claro); margin-bottom: .25rem; }
.versus__valor { display: block; font-weight: 900; font-size: 1.55rem; letter-spacing: -.025em; margin-bottom: .3rem; }
.versus__txt { display: block; color: #C3D2E8; font-size: .93rem; line-height: 1.45; }
.versus__fecho {
  grid-column: 1 / -1; padding: .9rem 1.35rem;
  background: var(--ciano); color: var(--marinho-txt);
  font-weight: 900; font-size: 1rem; text-align: center;
}

/* ---------- Preços --------------------------------------------------------- */
.precos { display: grid; gap: clamp(1.6rem, 3vw, 2.6rem); }
@media (min-width: 900px) { .precos { grid-template-columns: 1fr 300px; align-items: start; } }

.tabela { width: 100%; border-collapse: collapse; text-align: left; }
.tabela th, .tabela td { padding: .95rem .6rem; border-bottom: 1px solid var(--linha); vertical-align: baseline; }
.tabela thead th { padding-block: .5rem; color: var(--ciano-txt); border-bottom: 2px solid var(--ciano-txt); }
.tabela th:first-child, .tabela td:first-child { padding-left: 0; }
.tabela th:last-child, .tabela td:last-child { padding-right: 0; text-align: right; white-space: nowrap; }
.tabela__serv { font-weight: 800; }
.tabela__cap  { color: var(--grafite); font-size: .92rem; }
.tabela__val  { font-weight: 900; font-size: 1.28rem; letter-spacing: -.025em; }
.tabela__nota { margin-top: 1rem; color: var(--grafite); }

/* A linha do combo é a decisão que a página quer que a pessoa tome. */
.tabela tr[data-destaque] td { background: rgba(3,182,208,.14); border-bottom-color: var(--ciano); }
.tabela tr[data-destaque] td:first-child { box-shadow: inset 4px 0 0 var(--ciano); padding-left: 1rem; }
.tabela tr[data-destaque] .tabela__val { font-size: 1.5rem; }

/* Em celular a tabela vira lista: nome e capacidade empilhados à esquerda,
   preço à direita. Três colunas em 390px espremem "Cobertor / edredom" em três
   linhas. */
@media (max-width: 619px) {
  .tabela thead th:nth-child(2) { display: none; }
  .tabela thead th:first-child  { width: 100%; }
  .tabela tbody tr { display: grid; grid-template-columns: 1fr auto; align-items: baseline; border-bottom: 1px solid var(--linha); padding-block: .45rem; }
  .tabela tbody td { border-bottom: 0; padding: .55rem 0; }
  .tabela .tabela__serv { grid-column: 1; grid-row: 1; padding-bottom: 0; }
  .tabela .tabela__cap  { grid-column: 1; grid-row: 2; padding-top: .1rem; }
  .tabela .tabela__val  { grid-column: 2; grid-row: 1 / span 2; align-self: center; padding-left: 1rem; }
  .tabela tr[data-destaque] { background: rgba(3,182,208,.14); border-bottom-color: var(--ciano); box-shadow: inset 4px 0 0 var(--ciano); }
  .tabela tr[data-destaque] td { background: none; }
  .tabela tr[data-destaque] td:first-child { box-shadow: none; }
  .tabela tr[data-destaque] .tabela__serv,
  .tabela tr[data-destaque] .tabela__cap { padding-left: .9rem; }
  .tabela tr[data-destaque] .tabela__val { padding-right: .7rem; }
}

/* Um balão só na seção de preços — a oferta central. Mais que isso vira ruído. */
.preco-destaque {
  position: sticky; top: 88px;
  display: grid; gap: 1.1rem; justify-items: center; text-align: center;
  padding: 1.8rem 1.4rem;
  background: var(--marinho); color: #fff; border-radius: var(--r-lg);
}
.preco-destaque .balao { width: 100%; }
.preco-destaque .balao__valor { font-size: 2.6rem; }
.preco-destaque__txt { color: #C3D2E8; font-size: .95rem; }

/* ---------- Bloco de destaque (cobertor / ambiente) ------------------------ */
.destaque { display: grid; gap: clamp(1.8rem, 4vw, 3rem); align-items: center; }
@media (min-width: 900px) {
  .destaque { grid-template-columns: 1.05fr .95fr; }
  .destaque--inverso .destaque__figura { order: -1; }
}
.destaque__figura { margin: 0; }
.destaque__figura img { border-radius: var(--r-lg); box-shadow: var(--sombra); width: 100%; }
.destaque__txt > p { margin-bottom: 1.1rem; }
.destaque__cta { margin-top: 1.6rem; }

/* ---------- Vaporizador ----------------------------------------------------
   A foto da estação é vertical (720x1100). Solta numa coluna de 500px ela
   ficaria com 764px de altura e empurraria o texto para fora da dobra —
   o recorte 4/5 devolve o equilíbrio sem perder a bancada.
--------------------------------------------------------------------------- */
.vapor-foto img { aspect-ratio: 4 / 5; object-fit: cover; }

/* A faixa repete o padrão dos pilares do hero, por isso reusa .pilar. O que
   muda é o contorno: aqui ela é um bloco dentro de seção clara, não uma faixa
   de largura total — daí o raio e o overflow. Três itens, então a divisória
   vira horizontal no mobile. */
.vapor-faixa {
  display: grid; grid-template-columns: 1fr;
  margin-top: clamp(2rem, 4vw, 2.8rem);
  background: var(--marinho-90); color: #fff;
  border-radius: var(--r); overflow: hidden;
}
.vapor-faixa .pilar { border-right: 0; }
.vapor-faixa .pilar:last-child { border-bottom: 0; }
@media (min-width: 760px) {
  .vapor-faixa { grid-template-columns: repeat(3, 1fr); }
  .vapor-faixa .pilar { border-bottom: 0; border-right: 1px solid rgba(255,255,255,.14); }
  .vapor-faixa .pilar:last-child { border-right: 0; }
}

/* Card no lugar de foto — quando não existe imagem que ilustre o serviço de
   verdade, o preço prova melhor que uma foto aproximada. */
.cartao {
  display: grid; gap: 1.1rem; justify-items: center; text-align: center;
  padding: clamp(1.8rem, 4vw, 2.5rem);
  background: var(--marinho); color: #fff; border-radius: var(--r-lg);
}
.cartao .balao { width: 100%; }
.cartao .balao__valor { font-size: clamp(2.2rem, 5vw, 2.7rem); }
.cartao__lista { margin: 0; padding: 0; list-style: none; display: grid; gap: .55rem; width: 100%; }
.cartao__lista li {
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
  padding-bottom: .55rem; border-bottom: 1px solid rgba(255,255,255,.16);
  font-size: .95rem; text-align: left;
}
.cartao__lista li:last-child { border-bottom: 0; padding-bottom: 0; }
.cartao__lista span { color: var(--ciano-claro); font-weight: 800; }

/* ---------- Ambiente: galeria horizontal ----------------------------------- */
/* Duas colunas, não quatro, e recorte 4/3 e não 3/4: as fotos da sala são de
   celular na horizontal — sofá, salão, bancada. Espremidas num slot vertical
   de 250px sobrava a parede e sumia o móvel, que é o que a seção promete. Em
   2x3 elas ficam com ~380px e mostram o ambiente. */
/* Duas colunas em QUALQUER largura — não há breakpoint que vire quatro. Isso
   importa para o `sizes` do HTML: dentro do wrap de 1180px cada slot tem ~539px,
   não os 270px que o markup declarava até 14/08. Com o número errado o
   navegador escolhia a variante de 480px e o CSS a esticava — as fotos da sala
   apareciam borradas no desktop. Se a grade mudar de colunas, o `sizes` de
   todas as figuras de .ambiente muda junto. */
.ambiente { display: grid; gap: 1rem; grid-template-columns: repeat(2, 1fr); margin-top: clamp(1.8rem, 4vw, 2.6rem); }
@media (min-width: 860px) { .ambiente { gap: 1.4rem; } }
/* Três fotos não fecham numa grade de dois: a terceira ficaria órfã ao lado de
   um buraco. Abaixo de 760px ela atravessa as duas colunas; acima, a grade
   inteira vira de três. */
.ambiente--tres figure:nth-child(3) { grid-column: 1 / -1; }
@media (min-width: 760px) {
  .ambiente--tres { grid-template-columns: repeat(3, 1fr); }
  .ambiente--tres figure:nth-child(3) { grid-column: auto; }
}
.ambiente figure { margin: 0; }
.ambiente img {
  width: 100%; aspect-ratio: 4 / 3; object-fit: cover;
  border-radius: var(--r); box-shadow: var(--sombra);
}
/* O par do Locker é de fotos verticais — o armário é alto e as nove portas só
   contam a história inteiras. Ali o slot inverte.
   Precisa vir DEPOIS de `.ambiente img`: as duas regras têm a mesma
   especificidade, então quem estiver por último ganha. Enquanto esta linha
   morou acima, o 4/3 vencia e o armário aparecia decapitado. */
.ambiente--alto img { aspect-ratio: 4 / 5; }
.ambiente figcaption { margin-top: .55rem; color: var(--grafite); font-size: .86rem; line-height: 1.4; }
.secao--marinho .ambiente figcaption { color: #C3D2E8; }

/* ---------- Motivos -------------------------------------------------------- */
.motivos { display: grid; gap: 1px; background: var(--linha); border-block: 1px solid var(--linha); }
@media (min-width: 760px) { .motivos { grid-template-columns: repeat(2, 1fr); } }
.motivo { background: var(--branco); padding: 1.5rem 1.3rem; }
.secao--gelo .motivo { background: var(--gelo); }
.secao--areia .motivo { background: var(--areia); }
.motivo__titulo { display: block; font-weight: 800; font-size: 1.04rem; margin-bottom: .3rem; }
.motivo__txt { color: var(--grafite); font-size: .96rem; }

/* ---------- Galeria -------------------------------------------------------- */
.galeria { display: grid; gap: 1rem; grid-template-columns: repeat(2, 1fr); }
@media (min-width: 860px) { .galeria { grid-template-columns: repeat(4, 1fr); } }
.foto { margin: 0; }
.foto img {
  width: 100%; aspect-ratio: 4 / 5; object-fit: cover;
  border-radius: var(--r); box-shadow: var(--sombra);
}
.foto figcaption { margin-top: .55rem; color: var(--grafite); font-size: .86rem; line-height: 1.4; }
.foto--larga { grid-column: span 2; }
.foto--larga img { aspect-ratio: 16 / 10; }
@media (min-width: 860px) { .foto--larga img { aspect-ratio: 8 / 5; } }

/* ---------- Empresas ------------------------------------------------------- */
.empresas {
  display: grid; gap: 1.4rem; align-items: center;
  padding: clamp(1.6rem, 4vw, 2.4rem);
  background: var(--marinho); color: #fff; border-radius: var(--r-lg);
}
@media (min-width: 860px) { .empresas { grid-template-columns: 1.4fr auto; gap: 2.4rem; } }
.empresas h2 { margin-bottom: .8rem; }
.empresas p { color: #C3D2E8; }

/* ---------- FAQ ------------------------------------------------------------ */
.faq { max-width: 52rem; }
.faq__item { border-bottom: 1px solid var(--linha); }
.faq__item summary {
  display: flex; align-items: flex-start; gap: 1rem;
  padding: 1.15rem 0; cursor: pointer; list-style: none;
  font-weight: 800; font-size: 1.05rem; line-height: 1.35;
}
.faq__item summary::-webkit-details-marker { display: none; }
.faq__item summary::after {
  content: "+"; margin-left: auto; flex: none;
  font-weight: 900; font-size: 1.5rem; line-height: 1;
  color: var(--ciano-txt); transition: transform .2s ease;
}
.faq__item[open] summary::after { transform: rotate(45deg); }
.faq__resp { padding-bottom: 1.3rem; color: var(--grafite); max-width: 46rem; }
.faq__resp strong { color: var(--tinta); }

/* ---------- Endereço ------------------------------------------------------- */
.endereco { display: grid; gap: clamp(1.6rem, 4vw, 2.8rem); }
@media (min-width: 900px) { .endereco { grid-template-columns: .9fr 1.1fr; } }
.endereco__mapa {
  border: 0; width: 100%; aspect-ratio: 4 / 3; border-radius: var(--r-lg);
  box-shadow: var(--sombra); background: var(--gelo);
}
.endereco address { font-style: normal; }
.endereco__linha { display: grid; gap: .2rem; padding-block: .95rem; border-bottom: 1px solid var(--linha); }
.endereco__linha:first-of-type { padding-top: 0; }
.endereco__chave { color: var(--ciano-txt); }
.endereco__raio { margin-top: 1.4rem; color: var(--grafite); font-size: .95rem; }

/* ---------- CTA final ------------------------------------------------------ */
.final { text-align: center; }
.final__txt { max-width: 40rem; margin-inline: auto; color: #C3D2E8; margin-top: 1.1rem; }
.final .btn-linha { justify-content: center; margin-top: 2rem; }

/* ---------- Rodapé --------------------------------------------------------- */
.footer { background: var(--marinho-esc); color: #B9C8DE; padding-block: clamp(2.6rem, 5vw, 3.6rem); font-size: .95rem; }
.footer__nap { display: grid; gap: 1.9rem; }
@media (min-width: 820px) { .footer__nap { grid-template-columns: 1.2fr 1fr 1fr 1fr; gap: 2.2rem; } }
/* Mesmo motivo do header: a camiseta esquerda do selo é marinho e sumiria no
   campo escuro do rodapé. Aqui o logo entra aplicado sobre placa clara, que é
   como ele existe na fachada — recortado, com contorno claro, sobre o painel
   escuro. Some quando chegar a versão invertida oficial. */
.footer__logo {
  display: inline-block; width: max-content;
  padding: .7rem .85rem; background: #fff; border-radius: var(--r);
}
.footer__logo img { width: 108px; height: auto; }
.footer address { font-style: normal; line-height: 1.65; }
.footer strong { color: #fff; font-weight: 800; }
.footer a { color: #fff; text-decoration-color: rgba(255,255,255,.4); text-underline-offset: 3px; }
.footer a:hover { text-decoration-color: #fff; }
.footer__bar {
  display: flex; flex-wrap: wrap; gap: .6rem 1.6rem; justify-content: space-between;
  margin-top: 2.4rem; padding-top: 1.4rem;
  border-top: 1px solid rgba(255,255,255,.14);
  font-size: .86rem;
}
.footer__bar p { margin: 0; }

/* ---------- Barra fixa mobile ---------------------------------------------- */
.barra {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 70;
  display: grid; grid-template-columns: 1fr 1fr; gap: .55rem;
  padding: .55rem .7rem calc(.55rem + env(safe-area-inset-bottom));
  background: rgba(15,62,114,.96);   /* = --marinho a 96%; token não entra em rgba() */
  backdrop-filter: blur(8px);
  border-top: 1px solid rgba(255,255,255,.16);
}
.barra .btn { padding: .82rem .9rem; font-size: .95rem; }
body { padding-bottom: 78px; }

@media (min-width: 900px) {
  .barra { display: none; }
  body { padding-bottom: 0; }
}

/* ---------- Movimento reduzido --------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
}
