/* ══════════════════════════════════════════════════════════════
   FRIMELO · sistema de design da home institucional
   Paleta, tipografia e grade conforme o plano aprovado.
   ══════════════════════════════════════════════════════════════ */

:root {
    --azul-frimelo: #16266E;
    --azul-noite:   #0E1A4D;
    --brasa:        #C8102E;
    --osso:         #F5F3EF;
    --grafite:      #1C1B19;
    --rose:         #E8A0A8;

    --fio-medio: rgba(232, 160, 168, 0.45);
    --fio-fraco: rgba(232, 160, 168, 0.20);

    --u: 8px;                      /* toda medida é múltiplo desta */
    --largura-max: 1280px;
    --margem: clamp(20px, 5vw, 72px);
    --altura-cabecalho: 64px;

    /* Archivo: rótulos técnicos (selos, medidas, sobrancelha, botões).
       Fraunces: só a frase-promessa. Instrument Sans: corpo. */
    --fonte-display: 'Archivo', 'Arial Narrow', Arial, sans-serif;
    --fonte-promessa: 'Fraunces', Georgia, 'Times New Roman', serif;
    --fonte-corpo: 'Instrument Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
}

*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }

body {
    margin: 0;
    background: var(--azul-noite);
    color: var(--osso);
    font-family: var(--fonte-corpo);
    font-size: 17px;
    line-height: 1.65;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

/* height:auto é obrigatório: sem ele o atributo height="" do HTML
   continua valendo e a imagem estica quando o CSS define só a largura. */
img { max-width: 100%; height: auto; display: block; }

.envelope {
    width: 100%;
    max-width: var(--largura-max);
    margin-inline: auto;
    padding-inline: var(--margem);
}

a:focus-visible, button:focus-visible {
    outline: 2px solid var(--osso);
    outline-offset: 3px;
    border-radius: 2px;
}

/* ── CABEÇALHO ───────────────────────────────────────────── */

.cabecalho {
    position: fixed;
    inset: 0 0 auto 0;
    height: var(--altura-cabecalho);
    z-index: 20;
    background: linear-gradient(to bottom, rgba(14, 26, 77, 0.92), rgba(14, 26, 77, 0.55));
    backdrop-filter: saturate(1.3) blur(10px);
    -webkit-backdrop-filter: saturate(1.3) blur(10px);
}

.cabecalho__interno {
    height: 100%;
    display: flex;
    align-items: center;
    gap: calc(var(--u) * 4);
}

/* O logo vive no hero. No cabeçalho fica só um wordmark tipográfico,
   e ele permanece oculto enquanto o hero está na tela — assim não há
   duplicação no topo, mas a marca reaparece ao rolar, que é quando o
   cabeçalho fixo precisa dizer de quem é o site.
   Sem JavaScript o wordmark simplesmente fica sempre visível. */
.marca {
    display: inline-flex;
    align-items: center;
    color: var(--osso);
    text-decoration: none;
    flex: none;
    font-family: var(--fonte-display);
    font-weight: 700;
    font-stretch: 108%;
    font-size: 18px;
    letter-spacing: -0.02em;
    line-height: 1;
    transition: opacity .25s ease;
}

.cabecalho--no-hero .marca {
    opacity: 0;
    pointer-events: none;
}

.menu {
    display: flex;
    align-items: center;
    gap: calc(var(--u) * 3.5);
    margin-inline-start: auto;
    list-style: none;
    margin-block: 0;
    padding: 0;
}

.menu a {
    font-size: 14px;
    line-height: 1;
    color: rgba(245, 243, 239, 0.76);
    text-decoration: none;
    transition: color .18s ease;
}
.menu a:hover { color: var(--osso); }

/* ── BOTÕES ──────────────────────────────────────────────── */

.botao {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: calc(var(--u) * 1);
    font-family: var(--fonte-display);
    font-weight: 600;
    font-stretch: 90%;
    font-size: 13px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    line-height: 1;
    text-decoration: none;
    padding: calc(var(--u) * 2) calc(var(--u) * 3);
    border-radius: 3px;
    border: 1px solid transparent;
    transition: background-color .18s ease, border-color .18s ease;
    white-space: nowrap;
}

.botao--contorno {
    color: var(--osso);
    border-color: rgba(245, 243, 239, 0.38);
}
.botao--contorno:hover {
    border-color: rgba(245, 243, 239, 0.8);
    background: rgba(245, 243, 239, 0.08);
}

/* A única ocorrência de brasa na tela */
.botao--brasa {
    color: var(--osso);
    background: var(--brasa);
}
.botao--brasa:hover { background: #A80D26; }

.botao--miudo {
    padding: calc(var(--u) * 1.5) calc(var(--u) * 2);
    font-size: 12px;
    font-weight: 500;
}

/* ── PLACEHOLDER DE FOTO ─────────────────────────────────── */
/* Componente reutilizável: mostra na tela o formato exato e o
   tipo de foto que entra no lugar. Trocar por <img> ao receber
   o material do Bruno. */

.foto {
    position: relative;
    margin: 0;
    background-color: #0B1540;
    background-image: repeating-linear-gradient(
        45deg,
        rgba(232, 160, 168, 0.07) 0 2px,
        transparent 2px 14px
    );
    overflow: hidden;
}

/* Variante de fundo: preenche a seção inteira (hero) */
.foto--fundo { position: absolute; inset: 0; }

/* Variante em bloco: ocupa a coluna com proporção fixa */
.foto--bloco {
    width: 100%;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: calc(var(--u) * 3);
}
.foto--paisagem { aspect-ratio: 16 / 10; }

/* A foto publicada preenche a caixa do espaço, cobrindo sem deformar.
   O recorte fino já foi feito na reamostragem, no portal; este object-fit
   só absorve a diferença entre a proporção declarada e a caixa do CSS. */
.foto__img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.foto--retrato  { aspect-ratio: 4 / 5; }
.foto--quadrada { aspect-ratio: 1 / 1; }

.foto--bloco .foto__marca {
    position: static;
    max-width: 280px;
    text-align: center;
}

.foto__marca {
    position: absolute;
    top: calc(var(--altura-cabecalho) + var(--u) * 3);
    right: var(--margem);
    max-width: 300px;
    padding: calc(var(--u) * 2);
    background: rgba(11, 21, 64, 0.86);
    border: 1px dashed var(--fio-medio);
    border-radius: 3px;
}

.foto__dim {
    display: block;
    font-family: var(--fonte-display);
    font-weight: 700;
    font-stretch: 80%;
    font-size: 13px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--rose);
    font-variant-numeric: tabular-nums;
    margin-bottom: calc(var(--u) * 1);
}

.foto__desc {
    display: block;
    font-size: 13px;
    line-height: 1.45;
    color: rgba(245, 243, 239, 0.62);
}

/* ── HERO ────────────────────────────────────────────────── */

/* ================================================================
   A FAIXA TEM ALTURA PROPRIA. NAO E CONSEQUENCIA DO CONTEUDO.
   ================================================================

   Decidido por Bruno em 09/09/2026, e a razao e a proxima fase: este espaco
   vai receber fotos e videos passando, no estilo do carrossel de produtos.
   Altura que sai do conteudo encolhe quando o conteudo encolhe, e foi o que
   aconteceu — ver abaixo.

   POR QUE 872px, E DE ONDE O NUMERO VEIO. Ele NAO e uma medida de desenho: e
   a altura que a faixa TINHA quando o grid-row estava com "1 / -1". Naquele
   estado a logo nao atravessava as linhas e SOMAVA 325px acima do texto, o
   conteudo dava 872px e transbordava o min-height. Consertado o grid-row, o
   conteudo caiu para 546px, coube dentro dos 88dvh e a faixa desabou para
   eles. Medido no navegador em 09/09: janela 1365x911, hero 802 = 88dvh,
   heroCorpo 546.
   A faixa nunca teve 872px por decisao — teve por acidente. O Bruno viu, quis
   aquela altura, e agora ela esta DECLARADA. Registrado assim para ninguem
   procurar a medicao que originou o numero: ela nao existe.

   ================================================================
   POR QUE max(88dvh, min(872px, 100dvh)) E NAO 872px CRAVADO
   ================================================================

   872 fixo passa da tela em janela baixa, e ai o visitante precisa ROLAR para
   ler o titulo. Medido antes de aplicar:

       janela 1365x800 -> transborda  72px
       janela 1365x768 -> transborda 104px
       janela 1365x720 -> transborda 152px

   O min(872px, 100dvh) e o teto que impede isso: a faixa vai ate 872px onde
   ha tela para isso, e para na altura da janela onde nao ha. O max(88dvh, ...)
   preserva o piso de antes — em tela alta (1920x1080) 88dvh da 950 e continua
   mandando, entao nada encolheu para caber no numero novo.

   Com a formula, o transbordo e ZERO em toda janela medida.

   ================================================================
   ABAIXO DE 861px ISTO NAO VALE, E E DE PROPOSITO
   ================================================================

   O @media (max-width: 860px) devolve o 88dvh. La o hero e empilhado, tem
   regra propria de padding e a logo volta ao clamp: 872px numa tela de
   celular transbordaria 205px (medido em 375x667). A faixa de midia da fase
   seguinte e do layout de duas colunas. */
.hero {
    position: relative;
    /* O par vh/dvh e o fallback de sempre: quem nao entende dvh fica no vh. */
    min-height: max(88vh, min(872px, 100vh));
    min-height: max(88dvh, min(872px, 100dvh));
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    overflow: hidden;
}

/* Véu que garante leitura do texto sobre a foto: escuro embaixo,
   quase limpo no topo, para a imagem continuar aparecendo. */
.hero__veu {
    position: absolute;
    inset: 0;
    background: linear-gradient(
        to top,
        rgba(14, 26, 77, 0.96) 0%,
        rgba(14, 26, 77, 0.86) 32%,
        rgba(14, 26, 77, 0.55) 62%,
        rgba(14, 26, 77, 0.32) 100%
    );
}

.hero__corpo {
    position: relative;
    z-index: 2;
    padding-block: calc(var(--u) * 10) calc(var(--u) * 9);

    /* DUAS COLUNAS: a logo à esquerda, o texto à direita.
       GRID e não flex, e a razão é o que ele evita: os quatro filhos são
       irmãos diretos, sem wrapper para o texto. Envolvê-los num <div>
       quebraria o .anima:nth-child(1..5) que escalona a animação de
       entrada, e obrigaria a mexer em .sobrancelha, .display e .chamada,
       que não são só do hero. */
    display: grid;
    grid-template-columns: clamp(160px, 18vw, 240px) minmax(0, 1fr);
    align-items: start;
    /* 48px, e nao 40: e o vao que estava no ar, e dele saiu a medicao
       registrada abaixo (848px de sobra para o texto a 1440px). */
    column-gap: calc(var(--u) * 6);
}

/* A colocação automática intercalaria os quatro irmãos entre as duas
   colunas — logo, sobrancelha, display, chamada viraria 2x2. Daí o
   posicionamento explícito, escrito com o filho direto para não alcançar
   as mesmas classes nas outras seções.

   ================================================================
   É "span 3", E NUNCA "1 / -1". A DIFERENÇA NÃO É DE ESTILO.
   ================================================================

   Parece que "1 / -1" atravessa o grid inteiro, e é o que ele faz num grid
   com linhas declaradas. AQUI NÃO HÁ NENHUMA: não existe grid-template-rows
   nesta folha, e todas as linhas do hero são IMPLÍCITAS.

   O -1 conta a partir do fim do grid EXPLÍCITO. Sem trilha de linha
   declarada, a linha 1 e a linha -1 são a MESMA, "1 / -1" colapsa em
   "1 / 1", e o navegador reduz isso a span 1: a logo alcança só a primeira
   linha.

   MEDIDO NO NAVEGADOR em 09/09/2026, viewport 1365, com o valor computado
   respondendo "1 / -1" e a caixa da logo em 240x394:

       linha 1   [ LOGO 240x394 ]  Frigorífico · Carne suína
       linha 2   [    VAZIO     ]  Qualidade que você confia.
       linha 3   [    VAZIO     ]  Do abate ao balcão...

   O título nascia 394px abaixo do topo — a altura da linha 1 inteira — com a
   coluna da logo vazia ao lado dele. Era o retângulo vazio do print.

   "span 3" não depende de grid explícito nenhum: ele CRIA as linhas
   implícitas que atravessa, que é o que o desenho aprovado fazia. O 3 é o
   número de irmãos de texto, e há teste contando os filhos do hero no HTML
   servido em vez de cravar o número aqui. */
.hero__corpo > .hero__logo { grid-column: 1; grid-row: 1 / span 3; }
.hero__corpo > :not(.hero__logo) { grid-column: 2; }

/* ================================================================
   A LOGO PREENCHE A COLUNA. NAO E DETALHE: E A MEDIDA QUE FOI APROVADA.
   ================================================================

   A coluna e clamp(160px, 18vw, 240px) e satura em 240px a 1440px de
   viewport. Com width em clamp(132px, 15vw, 176px) a logo satura em 176px e
   ocupa 176 de 240 -- 73% da coluna, com 64px de vazio a direita. O desenho
   aprovado no navegador e a logo ocupando a coluna inteira, e a largura de
   exibicao quem decide e a COLUNA.

   A margem inferior existe so para separar da linha de baixo quando
   empilhado. Lado a lado nao ha linha de baixo, e ela desalinharia o topo.

   O clamp e a margem voltam no @media (max-width: 860px), que e onde a
   coluna unica vale -- la a logo nao pode ocupar o envelope inteiro.

   A LARGURA SAIU DE MEDICAO. Com teto de 240px e vao de 48px sobram 848px
   para o texto a 1440px de viewport, onde o titulo de 100px ocupa ~611px na
   primeira linha ("Qualidade que"). No limite inferior das duas colunas,
   861px, sobram 567px para um titulo de 62px que ocupa ~379px. Cabe em toda a
   faixa, com folga que nao depende de a webfont ter carregado. */
.hero__logo {
    width: 100%;
    height: auto;
    margin-bottom: 0;
}

.sobrancelha {
    font-family: var(--fonte-display);
    font-weight: 500;
    font-stretch: 80%;
    font-size: 13px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--rose);
    margin: 0 0 calc(var(--u) * 3);
    display: flex;
    align-items: center;
    gap: calc(var(--u) * 1.5);
    flex-wrap: wrap;
}
.sobrancelha::after {
    content: "";
    height: 1px;
    flex: 1;
    max-width: clamp(32px, 8vw, 120px);
    background: var(--fio-medio);
}

.display {
    font-family: var(--fonte-promessa);
    font-optical-sizing: auto;
    font-variation-settings: 'SOFT' 0, 'WONK' 1;
    font-weight: 600;
    font-size: clamp(46px, 7.2vw, 100px);
    line-height: 1.02;
    letter-spacing: -0.02em;
    color: var(--osso);
    margin: 0;
    text-wrap: balance;
}

.chamada {
    font-size: clamp(17px, 1.5vw, 20px);
    line-height: 1.55;
    color: rgba(245, 243, 239, 0.82);
    max-width: 52ch;
    margin: calc(var(--u) * 4) 0 0;
}

/* ── WHATSAPP FLUTUANTE ──────────────────────────────────── */
/* Verde da própria marca WhatsApp — é sinal de canal, não acento
   do sistema, então não consome a cota de brasa da tela. */

.zap {
    position: fixed;
    right: clamp(16px, 3vw, 28px);
    bottom: clamp(16px, 3vw, 28px);
    z-index: 30;
    width: 56px;
    height: 56px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: #25D366;
    color: #FFFFFF;
    box-shadow: 0 6px 20px rgba(14, 26, 77, 0.32);
    transition: transform .18s ease, background-color .18s ease;
}

.zap:hover { background: #1FB855; transform: translateY(-2px); }
.zap svg { width: 30px; height: 30px; display: block; }

@media (prefers-reduced-motion: reduce) {
    .zap { transition: none; }
    .zap:hover { transform: none; }
    .marca { transition: none; }

    /* O TRILHO CONTINUA ROLANDO — o que sai é o deslizamento animado. O script
       também não liga o avanço automático, e as duas coisas são necessárias:
       sem esta regra, a rolagem que a própria pessoa faz ainda seria animada. */
    .produtos--trilho { scroll-behavior: auto; }
    .produtos__seta, .produtos__retomar { transition: none; }
}

/* ── ESPIA DA PRÓXIMA SEÇÃO (faixa de selos) ─────────────── */
/* Presente só para demonstrar os 88vh: a seção seguinte aparece
   sozinha e dispensa seta de "role". Não é a seção construída. */



.selos__lista li {
    font-family: var(--fonte-display);
    font-weight: 600;
    font-stretch: 84%;
    font-size: 13px;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--azul-noite);
    display: flex;
    align-items: center;
    gap: calc(var(--u) * 1.5);
}

.selos__lista li::before {
    content: "";
    width: 7px;
    height: 7px;
    flex: none;
    border: 1px solid var(--azul-frimelo);
    transform: rotate(45deg);
}

/* ── MOBILE ──────────────────────────────────────────────── */

@media (max-width: 860px) {
    .menu { display: none; }
    .cabecalho__interno { gap: calc(var(--u) * 2); }
    .cabecalho .botao { margin-inline-start: auto; }

    /* A faixa volta a 88dvh: os 872px sao do layout de duas colunas. Aqui eles
       transbordariam 205px numa tela de 375x667. */
    .hero {
        min-height: 88vh;
        min-height: 88dvh;
    }

    /* Coluna única: a logo volta a empilhar sobre o texto. */
    .hero__corpo { grid-template-columns: minmax(0, 1fr); }
    .hero__corpo > .hero__logo { grid-row: auto; }
    .hero__corpo > :not(.hero__logo) { grid-column: 1; }

    /* EMPILHADA A LARGURA E PROPRIA, e nao a da coluna: com width em 100% a
       logo ocuparia o envelope inteiro. A margem separa da linha de baixo,
       que aqui existe. */
    .hero__logo {
        width: clamp(132px, 15vw, 176px);
        margin-bottom: calc(var(--u) * 4);
    }
}

@media (max-width: 700px) {
    .quebra { display: none; }
    .display { letter-spacing: -0.025em; }
    .hero__corpo { padding-block: calc(var(--u) * 8) calc(var(--u) * 6); }
    .foto__marca {
        top: auto;
        bottom: auto;
        left: var(--margem);
        right: var(--margem);
        max-width: none;
    }
}

/* ── MOVIMENTO ───────────────────────────────────────────── */

@media (prefers-reduced-motion: no-preference) {
    .produtos--trilho { scroll-behavior: smooth; }

    .anima { animation: sobe .7s cubic-bezier(.22, .61, .36, 1) both; }
    .anima:nth-child(1) { animation-delay: .05s; }
    .anima:nth-child(2) { animation-delay: .12s; }
    .anima:nth-child(3) { animation-delay: .19s; }
    .anima:nth-child(4) { animation-delay: .26s; }
    .anima:nth-child(5) { animation-delay: .33s; }

    @keyframes sobe {
        from { opacity: 0; transform: translateY(14px); }
        to   { opacity: 1; transform: none; }
    }
}

/* ══════════════════════════════════════════════════════════════
   SEÇÕES
   Ritmo: hero escuro → selos/empresa/produtos claros →
   sustentabilidade azul → trabalhe/contato claros → rodapé escuro.
   ══════════════════════════════════════════════════════════════ */

.secao {
    padding-block: clamp(72px, 11vh, 152px);
}

.secao--clara { background: var(--osso); color: var(--grafite); }
.secao--azul  { background: var(--azul-frimelo); color: var(--osso); }
.secao--noite { background: var(--azul-noite); color: var(--osso); }

/* Rótulo de seção: sempre Archivo estreito, sempre com fio */
.rotulo {
    font-family: var(--fonte-display);
    font-weight: 600;
    font-stretch: 78%;
    font-size: 12px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    margin: 0 0 calc(var(--u) * 3);
    display: flex;
    align-items: center;
    gap: calc(var(--u) * 2);
    color: var(--azul-frimelo);
}
.rotulo::after {
    content: "";
    height: 1px;
    flex: 1;
    max-width: 88px;
    background: currentColor;
    opacity: .4;
}
.secao--azul .rotulo, .secao--noite .rotulo { color: var(--rose); }

.titulo {
    font-family: var(--fonte-promessa);
    font-optical-sizing: auto;
    font-variation-settings: 'SOFT' 0, 'WONK' 1;
    font-weight: 600;
    font-size: clamp(30px, 4vw, 50px);
    line-height: 1.1;
    letter-spacing: -0.02em;
    margin: 0;
    color: var(--azul-noite);
    text-wrap: balance;
}
.secao--azul .titulo, .secao--noite .titulo { color: var(--osso); }

.texto { font-size: 17px; line-height: 1.7; max-width: 62ch; }
.texto p { margin: 0 0 calc(var(--u) * 2); }
.texto p:last-child { margin-bottom: 0; }

/* Disposições da grade: alternam A (7/5) e B (5/7) */
.dupla {
    display: grid;
    gap: clamp(32px, 5vw, 72px);
    align-items: center;
}
.dupla--a { grid-template-columns: 7fr 5fr; }
.dupla--b { grid-template-columns: 5fr 7fr; }

/* Marcador de conteúdo ainda não fornecido */
.pendente {
    border: 1px dashed rgba(22, 38, 110, 0.42);
    border-radius: 4px;
    padding: calc(var(--u) * 3);
    background: rgba(22, 38, 110, 0.04);
}
.secao--azul .pendente {
    border-color: var(--fio-medio);
    background: rgba(14, 26, 77, 0.28);
}
.pendente__marca {
    font-family: var(--fonte-display);
    font-weight: 700;
    font-stretch: 80%;
    font-size: 12px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--azul-frimelo);
    margin: 0 0 calc(var(--u) * 1.5);
}
.secao--azul .pendente__marca { color: var(--rose); }
.pendente__nota { margin: 0; font-size: 15px; line-height: 1.6; opacity: .72; }

/* ── FAIXA DE SELOS ──────────────────────────────────────── */

.selos { background: var(--osso); color: var(--grafite); padding-block: calc(var(--u) * 5); border-top: 3px solid var(--azul-frimelo); }

.selos__lista {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: calc(var(--u) * 3);
    list-style: none;
    margin: 0;
    padding: 0;
}

.selo { display: flex; align-items: flex-start; gap: calc(var(--u) * 2); }
.selo__icone { flex: none; width: 30px; height: 30px; color: var(--azul-frimelo); }
.selo__titulo {
    display: block;
    font-family: var(--fonte-display);
    font-weight: 700;
    font-stretch: 84%;
    font-size: 13px;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    line-height: 1.25;
    color: var(--azul-noite);
}
.selo__nota { display: block; font-size: 13px; line-height: 1.45; color: rgba(28, 27, 25, 0.62); margin-top: 2px; }

/* ── PRODUTOS ────────────────────────────────────────────── */
/*
   A LISTA SUBSTITUI AS DUAS GRADES FIXAS.

   Saíram .cortes (repeat 2), .matriz (repeat 3), .tarja, .linguicas e a
   família .calibre: elas eram a TAXONOMIA do produto escrita em folha de
   estilo — dois cortes, três calibres, cada um com e sem pimenta. Com o tipo
   desaparecendo, não têm mais o que descrever, e um produto que não coubesse
   naquela grade não tinha como ser cadastrado.

   O CARROSSEL É ESTE ARQUIVO, E NÃO O SCRIPT. overflow-x mais scroll-snap
   entregam o trilho inteiro sem uma linha de JavaScript: deslize no celular,
   barra de rolagem no desktop. O script só acrescenta o avanço automático e as
   setas, e a página funciona sem ele.
*/

.produtos {
    list-style: none;
    margin: calc(var(--u) * 6) 0 0;
    padding: 0;
    /* A largura do cartão é a mesma nos dois modos: 363px é o que a fileira de
       três dá no envelope de 1136px, e é de onde os 900px da foto saíram. */
    --cartao: clamp(260px, 30vw, 363px);
    gap: calc(var(--u) * 3);
}

/* ATÉ TRÊS: fileira que não rola, centrada. Com um ou dois produtos o
   auto-fit deixaria o cartão esticar até o envelope inteiro, e uma foto
   quadrada de 1136px ocuparia a tela toda — daí a largura fixa mais o
   justify-content. */
.produtos--grade {
    display: grid;
    grid-template-columns: repeat(auto-fit, var(--cartao));
    justify-content: center;
}

/* QUATRO OU MAIS: o trilho. O quarto cartão aparece cortado na borda, e é ele
   que convida a rolar — sem isso a lista parece terminar em três. */
/*
   A CAIXA DE REFERÊNCIA DAS SETAS. Ela não rola — o trilho é que rola —, e é
   por isso que as setas ficam paradas nas laterais em vez de sair da tela com
   os produtos.
*/
.produtos__area { position: relative; }

.produtos--trilho {
    display: flex;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-padding-left: 0;
    /*
       A BARRA DE ROLAGEM SOME, A ROLAGEM FICA. Trocar overflow-x por hidden
       resolveria o visual e mataria o carrossel: sem script não haveria como
       chegar aos produtos seguintes, e essa é a camada que existe para o
       produto nunca ficar invisível. Há teste separado para cada metade.
    */
    scrollbar-width: none;
    -ms-overflow-style: none;
}
.produtos--trilho::-webkit-scrollbar { display: none; }

/* O foco do trilho é visível: ele é destino de tabulação, e destino de
   tabulação que não se vê é armadilha para quem navega por teclado. */
.produtos--trilho:focus-visible { outline: 2px solid var(--azul-frimelo); outline-offset: 4px; }
.produtos--trilho > .produto {
    flex: 0 0 var(--cartao);
    scroll-snap-align: start;
}

.produto {
    background: #FFFFFF;
    /* O fio existia no .card de antes e vale de novo: cartão branco sobre o
       osso da seção clara some sem ele. */
    border: 1px solid rgba(22, 38, 110, 0.12);
    border-radius: 4px;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    color: var(--grafite);
}
.produto__texto { padding: calc(var(--u) * 3); }
.produto__nome {
    font-family: var(--fonte-display);
    font-weight: 700;
    font-stretch: 100%;
    font-size: 19px;
    letter-spacing: -0.01em;
    line-height: 1.2;
    margin: 0 0 calc(var(--u) * 1);
    color: var(--azul-noite);
}
.produto__nota {
    margin: 0;
    font-size: 15px;
    line-height: 1.55;
    color: rgba(28, 27, 25, 0.68);
}

/* AS SETAS SÃO CRIADAS PELO SCRIPT. Sem ele o contêiner nunca é inserido, e
   não há botão morto na tela — só o trilho, que rola à mão. */
/* O contêiner dos controles não ocupa espaço: as setas são absolutas, e a
   linha de movimento reduzido é que empurra o fluxo quando aparece. */
.produtos__setas { display: contents; }
/*
   AS SETAS FICAM NAS LATERAIS, sobrepostas ao trilho e centradas na altura.

   Elas nascem escondidas e o script as revela quando o cursor se move sobre o
   trilho — o MESMO gesto que pausa. As duas coisas no mesmo gesto é deliberado:
   não há como separar as áreas, porque as setas ficam SOBRE o trilho e qualquer
   cursor que as alcance passou por ele. Quem move o mouse até a lista quer ler
   ou controlar, e nos dois casos parar é o certo.

   OS CONTROLES VIVEM SOBRE FUNDO CLARO, e é por isso que a cor é o azul e não o
   osso: a seção é .secao--clara, como as vizinhas.
*/
.produtos__seta {
    position: absolute;
    top: calc(50% - 22px);
    z-index: 2;
    font-family: var(--fonte-display);
    font-size: 18px;
    line-height: 1;
    width: 44px;
    height: 44px;
    border: 1px solid rgba(22, 38, 110, 0.20);
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.94);
    box-shadow: 0 1px 6px rgba(22, 38, 110, 0.16);
    color: var(--azul-frimelo);
    cursor: pointer;
    transition: opacity .18s ease, background-color .18s ease;
}
.produtos__seta--anterior { left: calc(var(--u) * -1); }
.produtos__seta--proxima  { right: calc(var(--u) * -1); }
.produtos__seta:hover { background: #FFFFFF; border-color: var(--azul-frimelo); }
.produtos__seta:focus-visible { outline: 2px solid var(--azul-frimelo); outline-offset: 2px; }

/*
   A LINHA DE MOVIMENTO REDUZIDO. Não é aviso de erro — é a preferência de quem
   visita sendo respeitada, e dita em voz de site.
*/
.produtos__nota {
    margin: calc(var(--u) * 2) 0 0;
    font-size: 14px;
    line-height: 1.5;
    color: rgba(28, 27, 25, 0.62);
}

/*
   RETOMAR É EXPLÍCITO, E É A ÚNICA VOLTA.

   Quem clicou num produto parou para ler, e o automático não religa sozinho —
   um temporizador desfaria a decisão de quem parou. Este botão nasce escondido
   (o script põe hidden) e só aparece depois que a pessoa assumiu o controle:
   antes disso não teria o que retomar, e controle que não faz nada ensina a
   duvidar da tela.
*/
.produtos__retomar {
    font-family: var(--fonte-display);
    font-weight: 500;
    font-stretch: 84%;
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    padding: 0 calc(var(--u) * 2);
    height: 44px;
    border: 1px solid rgba(22, 38, 110, 0.28);
    border-radius: 2px;
    background: transparent;
    color: var(--azul-frimelo);
    cursor: pointer;
    transition: background-color .18s ease;
}
.produtos__retomar:hover { background: rgba(22, 38, 110, 0.07); }
.produtos__retomar:focus-visible { outline: 2px solid var(--azul-frimelo); outline-offset: 2px; }

/* ── FORMULÁRIO ──────────────────────────────────────────── */

.form { display: grid; gap: calc(var(--u) * 3); }
.form__linha { display: grid; grid-template-columns: 1fr 1fr; gap: calc(var(--u) * 3); }
.campo { display: flex; flex-direction: column; gap: calc(var(--u) * 1); }

.campo__rotulo {
    font-family: var(--fonte-display);
    font-weight: 600;
    font-stretch: 82%;
    font-size: 12px;
    letter-spacing: 0.11em;
    text-transform: uppercase;
    color: var(--azul-frimelo);
}

.campo input[type="text"],
.campo input[type="email"],
.campo input[type="tel"],
.campo input[type="file"],
.campo select,
.campo textarea {
    font-family: inherit;
    font-size: 16px;
    line-height: 1.5;
    color: var(--grafite);
    background: #FFFFFF;
    border: 1px solid rgba(22, 38, 110, 0.28);
    border-radius: 3px;
    padding: calc(var(--u) * 1.5) calc(var(--u) * 2);
    width: 100%;
    transition: border-color .16s ease, box-shadow .16s ease;
}
.campo textarea { resize: vertical; min-height: 120px; }
.campo input:focus, .campo select:focus, .campo textarea:focus {
    outline: none;
    border-color: var(--azul-frimelo);
    box-shadow: 0 0 0 3px rgba(22, 38, 110, 0.14);
}
.campo input:focus-visible, .campo select:focus-visible, .campo textarea:focus-visible {
    outline: 2px solid var(--azul-frimelo);
    outline-offset: 1px;
}
.campo--erro input, .campo--erro select, .campo--erro textarea { border-color: var(--brasa); }

.campo__ajuda { font-size: 13px; line-height: 1.45; color: rgba(28, 27, 25, 0.58); }
.campo__erro { font-size: 14px; line-height: 1.45; color: var(--brasa); margin: 0; }

.aviso {
    border-radius: 4px;
    padding: calc(var(--u) * 2) calc(var(--u) * 3);
    font-size: 16px;
    line-height: 1.55;
    margin-bottom: calc(var(--u) * 4);
}
.aviso--ok  { background: #E7F3EC; border: 1px solid #A9CFBB; color: #145239; }
.aviso--nao { background: #FBECEE; border: 1px solid #E7B4BC; color: #8C0A1F; }

/* ── CONTATO ─────────────────────────────────────────────── */

/* ================================================================
   FLEX COM nowrap: TRÊS NUMA LINHA, SEM PONTO DE QUEBRA A CALCULAR
   ================================================================

   Decidido por Bruno em 09/09/2026, depois de cinco rodadas em que a terceira
   unidade caía para a linha de baixo e TODO cálculo dava certo. A grade era
   correta em cada medição — o que não fechava era o conteúdo.

   A CAUSA, e ela explica as cinco rodadas: o <iframe> do mapa é elemento
   SUBSTITUÍDO, e tem largura intrínseca própria. Num item de grid ou de flex,
   min-width vale 'auto', e 'auto' usa essa largura como PISO — o item se
   recusa a encolher abaixo dela por mais que a trilha diga outra coisa. O
   auto-fit calculava a trilha enquanto o conteúdo não cabia nela, e a leitura
   do CSS (auto-fit, minmax, largura útil) estava certa e era sobre a coisa
   errada.

   POR QUE nowrap RESOLVE POR CONSTRUÇÃO: não há mais número a acertar. Não se
   calcula quantas trilhas cabem, não há mínimo, não há ponto de quebra que
   dependa de zoom, de barra de rolagem ou de arredondamento. A linha não
   quebra porque quebrar está proibido.

   flex: 1 1 0 dá aos três a MESMA largura, dividindo o que houver: no envelope
   de 1136px com dois vãos de 24, cada um fica com (1136−48)/3 = 362,67px — o
   mesmo cartão de antes. O teto não precisa mais ser escrito: quem o impõe é o
   max-width do envelope.

   min-width: 0 É OBRIGATÓRIO, e é a metade que conserta o defeito. Sem ele o
   'auto' volta, o mapa impõe o piso e os cartões param de encolher — que é o
   estado dos últimos cinco dias.

   justify-content: center não é decoração: com uma ou duas unidades os
   cartões dividem tudo igual, e o centro é onde eles ficam. */
.locais {
    display: flex;
    flex-wrap: nowrap;
    justify-content: center;
    gap: calc(var(--u) * 3);
    margin-top: calc(var(--u) * 6);
}

.local {
    /* Divide a largura em partes iguais e ENCOLHE junto. O min-width: 0 é o
       que desarma o piso da largura intrínseca do <iframe> — ver a nota do
       .locais acima; sem ele os cartões param de encolher e a terceira cai. */
    flex: 1 1 0;
    min-width: 0;

    background: var(--azul-noite);
    color: var(--osso);
    border-radius: 6px;
    overflow: hidden;
    display: flex;
    flex-direction: column;
}
.local__texto { padding: calc(var(--u) * 4); display: flex; flex-direction: column; gap: calc(var(--u) * 2); flex: 1; }
.local__tipo {
    font-family: var(--fonte-display);
    font-weight: 600;
    font-stretch: 78%;
    font-size: 11px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--rose);
    margin: 0;
}
.local__nome {
    font-family: var(--fonte-display);
    font-weight: 700;
    font-stretch: 104%;
    font-size: clamp(20px, 2.2vw, 26px);
    letter-spacing: -0.01em;
    line-height: 1.15;
    margin: 0;
}
.local__endereco { margin: 0; font-size: 16px; line-height: 1.6; color: rgba(245, 243, 239, 0.82); }
.local__mapa { border: 0; width: 100%; height: 260px; display: block; filter: grayscale(.25); }

/* Lista de contato da seção Contato */
.contatos {
    display: flex;
    flex-wrap: wrap;
    gap: calc(var(--u) * 2) calc(var(--u) * 5);
    list-style: none;
    margin: calc(var(--u) * 3) 0 0;
    padding: 0;
}
.contatos li { display: flex; align-items: center; gap: calc(var(--u) * 1.5); }
.contatos svg { width: 20px; height: 20px; flex: none; color: var(--azul-frimelo); }
.contatos a, .contatos span {
    font-size: 16px;
    line-height: 1.3;
    color: var(--azul-noite);
    text-decoration: none;
}
.contatos a:hover { text-decoration: underline; }

/* CNPJ colado à unidade, em Archivo com dígitos de largura fixa */
.cnpj-unidade {
    display: block;
    font-family: var(--fonte-display);
    font-weight: 500;
    font-stretch: 80%;
    font-size: 12px;
    letter-spacing: 0.08em;
    font-variant-numeric: tabular-nums;
    color: rgba(245, 243, 239, 0.52);
    margin-top: 2px;
}

/* ── RODAPÉ ──────────────────────────────────────────────── */

.rodape { background: var(--azul-noite); color: var(--osso); padding-block: calc(var(--u) * 8) calc(var(--u) * 4); }
.rodape__grade { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: clamp(28px, 4vw, 64px); }
.rodape__logo { width: 152px; height: auto; margin-bottom: calc(var(--u) * 2); }
.rodape h3 {
    font-family: var(--fonte-display);
    font-weight: 600;
    font-stretch: 80%;
    font-size: 12px;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--rose);
    margin: 0 0 calc(var(--u) * 2);
}
.rodape ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: calc(var(--u) * 1.5); }
.rodape a { color: rgba(245, 243, 239, 0.84); text-decoration: none; }
.rodape a:hover { color: var(--osso); text-decoration: underline; }
.rodape p { margin: 0; font-size: 15px; line-height: 1.6; color: rgba(245, 243, 239, 0.72); }

.social { display: flex; gap: calc(var(--u) * 2); margin-top: calc(var(--u) * 3); }

/* Sem moldura: o ícone é o ativo definitivo, não um espaço reservado.
   O <span> vira <a> quando o @ do Instagram for informado — sem borda
   nos dois casos, só o opacity mudando no hover do link. */
.social span, .social a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    line-height: 0;
    color: var(--rose);
}
.social a { transition: opacity .18s ease; }
.social a:hover { opacity: .78; }
.social svg, .social img { width: 30px; height: 30px; display: block; }

@media (prefers-reduced-motion: reduce) {
    .social a { transition: none; }
}

.rodape__base {
    margin-top: calc(var(--u) * 6);
    padding-top: calc(var(--u) * 3);
    border-top: 1px solid rgba(245, 243, 239, 0.14);
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    gap: calc(var(--u) * 2);
    font-size: 14px;
    color: rgba(245, 243, 239, 0.6);
}
.cnpj { font-variant-numeric: tabular-nums; }

/* ── MOBILE DAS SEÇÕES ───────────────────────────────────── */

@media (max-width: 980px) {
    .selos__lista { grid-template-columns: repeat(2, 1fr); }
    .rodape__grade { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 860px) {
    .dupla--a, .dupla--b { grid-template-columns: 1fr; }
    .dupla--b > :first-child { order: 2; }
    /* Empilhado: coluna. flex 0 0 auto porque em flex-direction: column o
       'flex: 1 1 0' dos cartões passaria a dividir a ALTURA entre eles. */
    .locais { flex-direction: column; }
    .local { flex: 0 0 auto; }
}

@media (max-width: 700px) {
    .selos__lista { grid-template-columns: 1fr; gap: calc(var(--u) * 2); }

    /*
       NO CELULAR, ATÉ TRÊS PRODUTOS EMPILHAM, e a rolagem é a vertical — que é
       o gesto da página inteira. Carrossel de três itens numa tela estreita é
       movimento por movimento. O trilho de quatro ou mais continua rolando na
       horizontal, com o cartão mais estreito.
    */
    .produtos--grade { grid-template-columns: 1fr; }
    .produtos { --cartao: min(78vw, 320px); }
    .form__linha { grid-template-columns: 1fr; }
    .rodape__grade { grid-template-columns: 1fr; }
    .local__mapa { height: 220px; }
}
