/* Ofício — a pele.

   REGRA DESTA VERSÃO (25/08): o chão é plano.
   Uma única superfície Ferro do topo ao rodapé — sem alternância clara, sem
   halo, sem lâmpada, sem degradê de seção. A diferença de cor entre seções
   que se via no "Feito com ofício" contra "Primeiro entender" era isso, e
   saiu inteiro.

   Só existe um degradê no site: o pé do hero ([data-video-pe]), que emenda o
   vídeo com o Ferro da seção seguinte. Fora dele, nenhum fundo é degradê.

   A profundidade toda passou para os componentes: vidro líquido. Filme
   translúcido + desfoque do que está atrás + aro especular. O aro é
   box-shadow inset, não gradiente — é o que deixa a aresta de cima acesa e a
   de baixo na sombra sem pintar nenhuma rampa de cor.

   Tokens aqui, aplicação no HTML. */

:root, .ofc-root {
  /* superfícies */
  --ferro: #1A1610;
  --latao: #C99A4B;
  --pergaminho: #F1E8D6;

  /* ---- vidro líquido ----------------------------------------------------
     A primeira versão errou por excesso de filme: 5,5% de Pergaminho por
     cima de um fundo chapado não refrata nada, só clareia — o olho lê caixa
     opaca, não vidro. Quem tem que fazer o trabalho é o backdrop-filter.

       brightness()  levanta o que está ATRÁS, em vez de pintar por cima. É a
                     diferença entre vidro e leite: a superfície fica mais
                     clara sem ganhar uma camada de tinta.
       saturate()    puxa a cor do que passa. Sem ele o vidro lava o fundo.
       filme         cai pra 2%. Existe só pra o material não sumir onde
                     backdrop-filter não roda (ver @supports adiante).

     O relevo vem do aro, e o aro é DESIGUAL — quase branco em cima, fraco
     embaixo, com uma luz macia presa na borda por dentro. É isso que separa
     "peça de vidro" de "retângulo mais claro". Nenhum degradê de fundo:
     tudo é borda e box-shadow inset. */

  --lg-filme:       rgba(241, 232, 214, 0.02);
  --lg-filme-forte: rgba(241, 232, 214, 0.055);
  --lg-filme-fundo: rgba(26, 22, 16, 0.30);   /* vidro rebaixado, dentro de outro */
  --lg-desfoque:    blur(26px) saturate(1.9) brightness(1.22);

  --lg-aro-topo:    rgba(255, 252, 245, 0.36);
  --lg-aro:         rgba(255, 252, 245, 0.15);
  --lg-aro-base:    rgba(255, 252, 245, 0.08);
  --lg-aro-vivo:    rgba(201, 154, 75, 0.55);

  --lg-luz:
    inset 0  1px 0 rgba(255, 252, 245, 0.42),
    inset 0 -1px 0 rgba(255, 252, 245, 0.12),
    inset 0 0 22px -8px rgba(255, 252, 245, 0.30);

  --lg-sombra:
    0 2px 6px -3px rgba(0, 0, 0, 0.55),
    0 26px 56px -34px rgba(0, 0, 0, 0.92);

  --lg-raio: var(--ofc-radius-lg, 16px);

  /* nomes antigos que o HTML e o _ds ainda citam, agora apontando pro vidro
     novo — assim nada precisa ser caçado atributo por atributo */
  --vidro-fundo: var(--lg-filme);
  --vidro-fundo-forte: var(--lg-filme-forte);
  --vidro-borda: var(--lg-aro);
  --vidro-borda-viva: var(--lg-aro-vivo);
  --vidro-desfoque: var(--lg-desfoque);
  --vidro-sombra: var(--lg-sombra);

  --brilho-latao: 0 0 24px rgba(201, 154, 75, 0.35);
}

/* ---------------------------------------------------------------- superfície */

body { background: var(--ferro); }

/* Nenhuma seção pinta fundo próprio — é isso que zera a diferença de cor
   entre elas, e é o que deixa a camada viva (adiante) aparecer por baixo de
   todas sem se repartir. Quem pinta o Ferro é o body. */
[data-secao] {
  position: relative;
  overflow: hidden;
  background: transparent;
}
.ofc-footer { background: transparent; }

/* ============================ fundo vivo ==================================
   Uma camada só, fixa, atrás da página inteira. Não reinicia nem se reparte
   por seção porque não pertence a seção nenhuma: fica presa à janela.

   Portado da referência que o João escolheu (animacoes/Aurora Background.md).
   Três coisas do original NÃO vieram, e cada uma por um motivo:

   1. A biblioteca. Lá é React + Tailwind + framer-motion. Aqui é uma div e
      dois @keyframes. A regra da casa é vendorizar ou não entrar, e fundo
      decorativo não paga o preço de uma dependência.
   2. O matiz. Lá é azul, índigo e violeta. Referência aqui é tratamento, não
      cor: as faixas são Latão e Pergaminho sobre Ferro.
   3. O mecanismo. Lá a animação é em `background-position`, que repinta a
      camada inteira a cada quadro — proibido nesta casa justamente por isso.
      Aqui o gradiente é pintado UMA vez numa camada superdimensionada e o que
      anda é `transform`: fica no compositor, sem repintura.

   Duas faixas com períodos diferentes e sem divisor comum (64s e 91s) para a
   combinação não voltar ao mesmo lugar em tempo perceptível. */

[data-fundo-vivo] {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
  /* a aurora nasce no alto e se dissolve antes do pé: sem a máscara ela vira
     papel de parede, e aí não é mais luz, é textura */
  -webkit-mask-image: radial-gradient(ellipse 140% 105% at 78% -8%, #000 6%, transparent 72%);
  mask-image: radial-gradient(ellipse 140% 105% at 78% -8%, #000 6%, transparent 72%);
}

[data-fundo-vivo]::before,
[data-fundo-vivo]::after {
  content: "";
  position: absolute;
  /* superdimensionada de propósito: a faixa entra e sai de cena sem nunca
     mostrar a própria borda */
  inset: -60%;
  will-change: transform;
  filter: blur(48px);
}

/* faixa quente: o Latão em listras largas, na diagonal de 100° do original */
[data-fundo-vivo]::before {
  opacity: 0.78;
  background-image: repeating-linear-gradient(100deg,
    rgba(201, 154, 75, 0.22) 0%,
    rgba(201, 154, 75, 0.22) 7%,
    transparent 10%,
    transparent 12%,
    rgba(201, 154, 75, 0.22) 16%);
  background-size: 260% 180%;
  animation: ofc-aurora-a 64s ease-in-out infinite;
}

/* faixa fria: Pergaminho, mais rala e mais lenta, cruzando a de cima */
[data-fundo-vivo]::after {
  opacity: 0.52;
  background-image: repeating-linear-gradient(100deg,
    rgba(241, 232, 214, 0.13) 10%,
    rgba(201, 154, 75, 0.17) 15%,
    rgba(241, 232, 214, 0.06) 20%,
    rgba(201, 154, 75, 0.09) 25%,
    rgba(241, 232, 214, 0.10) 30%);
  background-size: 200% 140%;
  animation: ofc-aurora-b 91s ease-in-out infinite;
}

/* volta ao ponto de partida no 100%: laço sem emenda, sem salto */
@keyframes ofc-aurora-a {
  0%, 100% { transform: translate3d(-11%, -5%, 0) rotate(-1.5deg) scale(1.12); }
  50%      { transform: translate3d(9%, 4%, 0) rotate(1.5deg) scale(1.22); }
}
@keyframes ofc-aurora-b {
  0%, 100% { transform: translate3d(8%, 6%, 0) rotate(1.2deg) scale(1.18); }
  50%      { transform: translate3d(-10%, -4%, 0) rotate(-1.8deg) scale(1.1); }
}

@media (prefers-reduced-motion: reduce) {
  [data-fundo-vivo]::before,
  [data-fundo-vivo]::after { animation: none; }
}

/* grão: 5% sobre tudo. Com o fundo chapado ele é o que impede a superfície de
   ler como cor de preenchimento — e é ruído, não degradê. */
[data-grao]::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  opacity: 0.05;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/></filter><rect width='140' height='140' filter='url(%23n)'/></svg>");
  background-size: 140px 140px;
}

/* conteúdo sempre acima do grão */
[data-camada="conteudo"] { position: relative; z-index: 2; }

/* o conteúdo das páginas internas precisa subir acima do grão também */
[data-secao] > .ofc-container,
[data-secao] > div:not([data-camada]) { position: relative; z-index: 2; }

/* ============================ vidro líquido ===============================
   Uma receita só, aplicada a tudo que é componente: cartão, cápsula do topo,
   botão de menu, campo, moldura, caixa de modal. É o que faz o site
   ler como um material, e não como uma coleção de caixas com opacidades
   parecidas. */

[data-vidro],
[data-quadro],
[data-site-header],
[data-menu-toggle],
[data-modal-caixa],
[data-modal-fecha],
[data-foto-pendente],
.ofc-input,
.ofc-textarea,
.ofc-select {
  background-color: var(--lg-filme);
  backdrop-filter: var(--lg-desfoque);
  -webkit-backdrop-filter: var(--lg-desfoque);
  border: 1px solid var(--lg-aro);
  /* o aro não é uniforme: a luz bate em cima. Com border-radius o navegador
     interpola as três cores ao longo do arco, então isso vira um aro que
     acende e apaga em volta da peça — sem pintar gradiente nenhum. */
  border-top-color: var(--lg-aro-topo);
  border-bottom-color: var(--lg-aro-base);
  box-shadow: var(--lg-luz), var(--lg-sombra);
}

/* Onde backdrop-filter não roda (Firefox com a flag desligada, WebView
   antigo), o brightness não acontece e a peça sumiria no fundo. Aí — e só aí
   — o filme sobe para segurar o material. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  [data-vidro],
  [data-quadro],
  [data-site-header],
  [data-menu-toggle],
  [data-modal-caixa],
  [data-modal-fecha],
  [data-foto-pendente],
  .ofc-button--secondary,
  .ofc-button--ghost,
  .ofc-input,
  .ofc-textarea,
  .ofc-select { background-color: rgba(241, 232, 214, 0.075); }
}

/* isolation + z-index: sem isso o ::before da brasa passa por cima do texto */
[data-vidro],
[data-quadro] {
  position: relative;
  isolation: isolate;
  border-radius: var(--lg-raio);
  transition: border-color 320ms ease,
              background-color 320ms ease,
              transform 320ms cubic-bezier(0.22, 1.08, 0.36, 1);
}
[data-vidro] > *,
[data-quadro] > * { position: relative; z-index: 1; }

/* brasa: a luz que segue o cursor por dentro do vidro. É a única mancha de
   luz que sobrou no site, e ela não fica parada em lugar nenhum — só existe
   sob o ponteiro, dentro do componente. */
[data-brasa]::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  border-radius: inherit;
  pointer-events: none;
  opacity: var(--bo, 0);
  transition: opacity 260ms ease;
  background: radial-gradient(260px circle at var(--bx, 50%) var(--by, 50%),
              rgba(241, 232, 214, 0.10), transparent 70%);
}

@media (hover: hover) and (pointer: fine) {
  [data-vidro]:hover,
  [data-quadro]:hover {
    border-color: var(--lg-aro-vivo);
    background-color: var(--lg-filme-forte);
    transform: translateY(-3px);
  }
}
@media (hover: none) {
  [data-vidro]:active { border-color: var(--lg-aro-vivo); }
}

@media (prefers-reduced-motion: reduce) {
  [data-vidro], [data-quadro] { transition: none; }
}

/* ------------------------------------------------------------------ detalhes */

.latao { color: var(--latao); }            /* 7,04:1 sobre Ferro — pode ser texto */


/* ------------------------------------------------------------- ilustrações */
/* Desenho próprio do que a Ofício faz. Linha fina em Latão dentro do cartão.
   Vidro dentro de vidro fica leitoso: aqui o painel é rebaixado — escurece em
   vez de clarear, e o aro é só a sombra de dentro. */

[data-ilustra] {
  border-radius: var(--ofc-radius-md, 12px);
  background-color: var(--lg-filme-fundo);
  border: 1px solid rgba(241, 232, 214, 0.06);
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.45);
  padding: var(--ofc-space-3, 12px);
  overflow: hidden;
}
[data-ilustra] svg {
  display: block;
  width: 100%;
  height: auto;
  filter: drop-shadow(0 0 14px rgba(201, 154, 75, 0.16));
}

/* o Hero do _ds desenha um filete acima da sobrelinha; com a pílula em cima
   viram quatro elementos antes do título. Some o filete. */
#topo .ofc-hero__rule { display: none; }

/* pular para o conteúdo: invisível até receber foco pelo teclado */
[data-pular] {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 200;
  color: var(--pergaminho);   /* explícito: fora do provider não há token herdado */
}
[data-pular]:focus {
  left: var(--ofc-space-4, 16px);
  top: var(--ofc-space-4, 16px);
  padding: 12px 20px;
  border-radius: 999px;
  background: var(--pergaminho);
  color: var(--ferro);
  font-weight: 600;
}

/* ---- superfície raiz e formulários ----
   O provider do _ds pinta .ofc-root--fill com Pergaminho. Onde a página não
   tem <section> cobrindo, essa cor aparecia por baixo da pele escura. */
.ofc-root--fill { background: var(--ferro); }

/* campos: vidro, como todo o resto */
.ofc-input,
.ofc-textarea,
.ofc-select {
  color: var(--pergaminho);
  border-radius: var(--ofc-radius-sm, 10px);
}
.ofc-input::placeholder,
.ofc-textarea::placeholder {
  color: rgba(241, 232, 214, 0.42);
}
.ofc-input:focus,
.ofc-textarea:focus,
.ofc-select:focus {
  border-color: var(--lg-aro-vivo);
  outline: 2px solid var(--ofc-accent);
  outline-offset: 2px;
}
.ofc-select option { background: var(--ferro); color: var(--pergaminho); }

/* ============================ botões ======================================
   Pílula, não retângulo, e vidro como tudo o mais.

   Dois pesos, como na referência: o secundário é vidro escuro translúcido; o
   primário é o mesmo material em versão clara e quase fechada — é ele que
   puxa o clique. Nenhum dos dois usa degradê: o volume vem do aro interno. */

.ofc-button {
  border-radius: 999px !important;
  font-weight: 560;
  transition: transform 240ms cubic-bezier(0.22, 1.08, 0.36, 1),
              background-color 240ms ease,
              border-color 240ms ease,
              box-shadow 240ms ease;
}
.ofc-button--lg { padding-inline: 30px; }

/* secundário, ghost e accent: vidro escuro */
.ofc-button--secondary,
.ofc-button--ghost {
  background-color: var(--lg-filme);
  backdrop-filter: var(--lg-desfoque);
  -webkit-backdrop-filter: var(--lg-desfoque);
  border: 1px solid var(--lg-aro);
  border-top-color: var(--lg-aro-topo);
  border-bottom-color: var(--lg-aro-base);
  box-shadow: var(--lg-luz), 0 12px 28px -22px rgba(0, 0, 0, 0.9);
}

/* primário: o vidro claro. 0,88 de Pergaminho ainda deixa o fundo insinuar,
   e o texto continua Ferro sobre claro — contraste de cartaz. */
[data-theme="dark"] .ofc-button--primary,
.ofc-button--primary {
  background-color: rgba(241, 232, 214, 0.88);
  color: var(--ferro);
  border: 1px solid rgba(255, 253, 248, 0.6);
  border-top-color: rgba(255, 255, 255, 0.95);
  backdrop-filter: blur(18px) saturate(1.5) brightness(1.1);
  -webkit-backdrop-filter: blur(18px) saturate(1.5) brightness(1.1);
  box-shadow:
    inset 0  1px 0 rgba(255, 255, 255, 0.95),
    inset 0 -1px 0 rgba(26, 22, 16, 0.12),
    0 10px 30px -16px rgba(241, 232, 214, 0.30),
    0 2px 6px -3px rgba(0, 0, 0, 0.6);
}

.ofc-button--accent {
  border: 1px solid rgba(201, 154, 75, 0.9);
  box-shadow:
    inset 0 1px 0 rgba(255, 245, 225, 0.55),
    0 10px 30px -16px rgba(201, 154, 75, 0.5);
}

@media (hover: hover) and (pointer: fine) {
  .ofc-button:not(:disabled):hover { transform: translateY(-2px); }

  .ofc-button--secondary:not(:disabled):hover,
  .ofc-button--ghost:not(:disabled):hover {
    background-color: var(--lg-filme-forte);
    border-color: var(--lg-aro-vivo);
    box-shadow: var(--lg-luz), 0 16px 34px -20px rgba(0, 0, 0, 0.95);
  }

  .ofc-button--primary:not(:disabled):hover {
    background-color: rgba(248, 242, 230, 0.97);
    box-shadow:
      inset 0  1px 0 rgba(255, 255, 255, 0.95),
      inset 0 -1px 0 rgba(26, 22, 16, 0.14),
      0 14px 40px -14px rgba(241, 232, 214, 0.45),
      0 2px 6px -2px rgba(0, 0, 0, 0.6);
  }
}
.ofc-button:not(:disabled):active { transform: translateY(0); }

/* ====================== o canal no próprio botão =========================
   Decisão do João (25/08): o texto do CTA fica como está — convite, não
   comando — e quem diz o canal é o símbolo ao lado.

   Motivo de existir: o site promete "sem formulário, sem espera", mas nenhum
   botão dizia pra onde levava. Quem hesita não sabe se vai cair num
   formulário, e a dúvida acontece exatamente no momento do clique.

   O glifo entra por máscara, não por <img>: pintado com `currentColor`, ele
   acompanha a cor do botão sozinho — Ferro no primário claro, Pergaminho no
   secundário de vidro — sem precisar de duas versões do arquivo.

   Só nos botões. Os links de texto do rodapé já dizem "Falar no WhatsApp"
   com todas as letras; ali o símbolo seria repetição.

   Cada CTA é o próprio link com as classes do botão: um controle, um foco. */
a.ofc-button[href*="wa.me"]::before {
  content: "";
  flex: none;
  width: 1.05em;
  height: 1.05em;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z'/></svg>") center / contain no-repeat;
  mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z'/></svg>") center / contain no-repeat;
}

/* ============================ menu ========================================
   O menu pode ser recolhido em qualquer largura. No telefone nasce fechado e
   abre como painel; no desktop nasce aberto e o botão permite esconder. */

[data-menu-toggle] {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 5px;
  width: 44px;
  height: 44px;
  padding: 0;
  border-radius: 999px;
  cursor: pointer;
  transition: background-color 240ms ease, border-color 240ms ease;
}
@media (hover: hover) and (pointer: fine) {
  [data-menu-toggle]:hover {
    background-color: var(--lg-filme-forte);
    border-color: var(--lg-aro-vivo);
  }
}
[data-menu-toggle] span {
  display: block;
  width: 17px;
  height: 1.5px;
  border-radius: 2px;
  background: var(--pergaminho);
  transition: transform 280ms cubic-bezier(0.22, 1.08, 0.36, 1), opacity 200ms ease;
}

/* A CÁPSULA INTEIRA é o menu — navegação e CTA juntos, some tudo junto.

   Antes só a navegação sumia, e sobrava uma pílula de vidro de 175px
   embrulhando o botão "Falar com a Ofício": pílula dentro de pílula, no
   canto, sem função. Era o que estava esquisito no desktop.

   Vale em qualquer largura, e não só no telefone: fechado, o topo é o corvo e
   o botão de menu; aberto, é a marca e o menu. O CTA passa a ser item do
   menu, que é o que o João pediu — e some com ele. O caminho para o contato
   continua existindo fora daqui: o botão do hero e a chamada final. */
/* Fechada, a cápsula NÃO some — ela guarda o botão. O que some é o resto,
   e é isso que faz o menu parecer sair de dentro do próprio botão. */
[data-site-header][data-menu="fechado"] > nav,
[data-site-header][data-menu="fechado"] > [data-aba-sep],
[data-site-header][data-menu="fechado"] > [data-cta-topo] { display: none; }

/* dentro da cápsula o botão não pode ter vidro próprio: vidro sobre vidro
   vira mancha. Fica redondo, sem fundo, e acende no cursor como as abas. */
[data-site-header] > [data-menu-toggle] {
  background-color: transparent;
  border: 0;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  width: 36px;
  height: 36px;
  flex: none;
}
@media (hover: hover) and (pointer: fine) {
  [data-site-header] > [data-menu-toggle]:hover {
    background-color: rgba(255, 252, 245, 0.10);
    border: 0;
  }
}

@media (max-width: 900px) {
  /* No telefone a cápsula NÃO desce pra outra linha. Ela fica ao lado do
     corvo, ocupa o resto da largura e cresce pra baixo — assim o botão não
     salta de lugar quando o menu abre, e o painel continua saindo de dentro
     dele. Antes ela tinha `width: 100%` e caía pra linha de baixo, levando o
     botão junto: o dedo apertava num lugar e a coisa aparecia em outro. */
  [data-site-header][data-menu="aberto"] {
    flex: 1;
    min-width: 0;
    flex-wrap: wrap;
    align-items: center;
    padding: 6px;
  }
  /* no toque não há hover: o alvo do botão sobe pro mínimo confortável */
  [data-site-header] > [data-menu-toggle] { width: 44px; height: 44px; }

  [data-site-header][data-menu="aberto"] > [data-cta-topo] {
    width: calc(100% - 12px);
    margin: 4px 6px 6px;
  }

  [data-site-header][data-menu="aberto"] > nav {
    display: flex !important;
    flex-direction: column;
    align-items: stretch;
    order: 3;
    width: 100%;
    padding-inline: 8px;
    overflow: visible !important;
    gap: 0 !important;
    padding-top: var(--ofc-space-3);
    border-top: 1px solid var(--lg-aro);
  }
  /* No painel do telefone NADA fecha — nem as abas, nem o CTA. Ícone sozinho
     numa lista vertical é adivinhação, e no toque não existe hover pra abrir:
     quem só visse o glifo do WhatsApp num botão de largura inteira teria que
     adivinhar pra onde ele leva. */
  [data-site-header][data-menu="aberto"] > nav a {
    gap: 12px;
    min-height: 44px;
    padding: 6px 0;
    border-radius: 0;
    background: none;
    border-bottom: 1px solid rgba(241, 232, 214, 0.06);
  }
  [data-site-header][data-menu="aberto"] > [data-cta-topo] {
    gap: 10px;
    min-height: 44px;
  }
  [data-site-header][data-menu="aberto"] > [data-cta-topo] [data-rotulo] {
    grid-template-columns: 1fr;
    opacity: 1;
  }
  [data-site-header][data-menu="aberto"] > nav a:last-child { border-bottom: 0; }
  [data-site-header][data-menu="aberto"] > nav [data-rotulo] {
    grid-template-columns: 1fr;
    opacity: 1;
  }
  [data-aba-sep] { display: none; }

  /* o CTA fecha o painel, em largura cheia: dentro do menu ele é o último
     item da lista, não um botão espremido na ponta */
  [data-site-header][data-menu="aberto"] > a[data-cta-topo] {
    order: 4;
    justify-content: center;
  }
}

/* ============================== dúvidas ==================================
   `<details>` puro, sem componente do `_ds`: a conversão pra estático do
   Bloco 5 custa por componente em uso, e um acordeão que o navegador já sabe
   fazer não precisa de React pra existir. Sem JS também: abre e fecha
   nativamente, e continua funcionando com o script fora do ar.

   O sinal de "+" nasce do ::after, não de um <span>: assim ele não vira
   caractere solto no leitor de tela, que já anuncia o estado pelo próprio
   <details>. */

[data-faq] { display: flex; flex-direction: column; }

[data-faq] details { border-top: 1px solid var(--lg-aro); }
[data-faq] details:last-of-type { border-bottom: 1px solid var(--lg-aro); }

[data-faq] summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--ofc-space-5, 20px);
  /* a folga é o que garante os 44px de alvo de toque sem altura fixa */
  padding-block: var(--ofc-space-5, 20px);
  font-size: var(--ofc-size-sm);
  font-weight: 500;
  cursor: pointer;
  list-style: none;
}
[data-faq] summary::-webkit-details-marker { display: none; }

[data-faq] summary::after {
  content: "+";
  flex: none;
  color: var(--latao);
  font-size: 1.5em;
  line-height: 0.8;
  transition: transform 260ms cubic-bezier(0.22, 1.08, 0.36, 1);
}
[data-faq] details[open] summary::after { transform: rotate(45deg); }

@media (hover: hover) and (pointer: fine) {
  [data-faq] summary:hover { color: var(--ofc-accent); }
}

[data-faq] details > p {
  margin: 0 0 var(--ofc-space-5, 20px);
  max-width: 62ch;
  color: var(--ofc-text-muted);
  font-size: var(--ofc-size-body-sm);
}

@media (prefers-reduced-motion: reduce) {
  [data-faq] summary::after { transition: none; }
}

/* ================== o menu abrindo, item por item =========================
   Pedido do João: ao clicar no botão, o menu não deve simplesmente aparecer —
   deve carregar item por item.

   É `animation`, não `transition`, de propósito: o estado fechado é
   `display: none`, e transição não roda em elemento que acabou de existir.
   Animação roda. O preço é que só a ABERTURA é animada; fechar continua
   instantâneo, que é o comportamento normal de menu e não incomoda.

   `both` no fill faz o item nascer no primeiro quadro da animação em vez de
   piscar no estado final antes de começar. */

[data-site-header].abrindo[data-menu="aberto"] {
  animation: ofc-painel-entra 300ms cubic-bezier(0.22, 1, 0.36, 1) both;
}
[data-site-header].abrindo[data-menu="aberto"] > nav a,
[data-site-header].abrindo[data-menu="aberto"] > [data-aba-sep],
[data-site-header].abrindo[data-menu="aberto"] > [data-cta-topo] {
  animation: ofc-item-entra 360ms cubic-bezier(0.22, 1, 0.36, 1) both;
}
[data-site-header].abrindo[data-menu="aberto"] > nav a:nth-child(1)  { animation-delay:  80ms; }
[data-site-header].abrindo[data-menu="aberto"] > nav a:nth-child(2)  { animation-delay: 140ms; }
[data-site-header].abrindo[data-menu="aberto"] > nav a:nth-child(3)  { animation-delay: 200ms; }
[data-site-header].abrindo[data-menu="aberto"] > [data-aba-sep]      { animation-delay: 240ms; }
[data-site-header].abrindo[data-menu="aberto"] > [data-cta-topo]     { animation-delay: 270ms; }

@keyframes ofc-painel-entra {
  from { opacity: 0; transform: translateY(-10px) scale(0.97); }
  to   { opacity: 1; transform: none; }
}
@keyframes ofc-item-entra {
  from { opacity: 0; transform: translateY(-7px); }
  to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  [data-site-header].abrindo[data-menu="aberto"],
  [data-site-header].abrindo[data-menu="aberto"] > nav a,
  [data-site-header].abrindo[data-menu="aberto"] > [data-aba-sep],
  [data-site-header].abrindo[data-menu="aberto"] > [data-cta-topo] { animation: none; }
}

/* ============================ modal =======================================
   Sem uso nas cinco páginas hoje (o briefing virou WhatsApp), mas o desenho
   fica: é o destino previsto se o formulário voltar. */

[data-modal] {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: none;
  align-items: flex-start;
  justify-content: center;
  padding: var(--ofc-space-6, 24px);
  overflow-y: auto;
  overscroll-behavior: contain;
}
[data-modal][data-aberto] { display: flex; }

[data-modal-fundo] {
  position: fixed;
  inset: 0;
  background: rgba(12, 10, 7, 0.72);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  animation: ofc-fundo-entra 260ms ease both;
}
@keyframes ofc-fundo-entra { from { opacity: 0; } to { opacity: 1; } }

[data-modal-caixa] {
  position: relative;
  z-index: 1;
  /* sem border-box o padding soma por fora e o teto de 760 vira 890 */
  box-sizing: border-box;
  width: 100%;
  max-width: 760px;
  margin-block: auto;
  padding: var(--ofc-space-8, 32px);
  border-radius: var(--lg-raio);
  animation: ofc-caixa-entra 320ms cubic-bezier(0.22, 1.08, 0.36, 1) both;
}
@keyframes ofc-caixa-entra {
  from { opacity: 0; transform: translateY(14px) scale(0.985); }
  to   { opacity: 1; transform: none; }
}

[data-modal-fecha] {
  position: absolute;
  top: 14px;
  right: 14px;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  color: var(--pergaminho);
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
}

/* a página não rola atrás do modal */
html[data-travado], body[data-travado] { overflow: hidden; }

@media (prefers-reduced-motion: reduce) {
  [data-modal-fundo], [data-modal-caixa] { animation: none; }
}

@media (max-width: 760px) {
  [data-modal] { padding: var(--ofc-space-3, 12px); }
  [data-modal-caixa] { padding: var(--ofc-space-6, 24px) var(--ofc-space-4, 16px); }
}

/* o container do _ds carrega largura e padding de página; dentro do modal
   quem manda na medida é a caixa */
[data-modal-caixa] .ofc-container {
  max-width: 100% !important;
  padding-inline: 0 !important;
}
[data-modal-caixa] [data-secao],
[data-modal-caixa] .ofc-root { background: transparent !important; }

/* ============================ quadro ======================================
   O cartão da chamada final. Era uma moldura acesa por baixo pela lâmpada;
   com a lâmpada removida ele não tem mais de onde reagir, então virou o que
   já devia ser: uma placa de vidro maior que as outras. Mesmo material,
   raio maior e mais peso de sombra — hierarquia por tamanho, não por cor. */

[data-quadro] {
  border-radius: calc(var(--lg-raio) * 1.5);
  box-shadow:
    inset 0  1px 0 rgba(241, 232, 214, 0.34),
    inset 0 -1px 0 rgba(241, 232, 214, 0.08),
    inset 0 16px 32px -26px rgba(241, 232, 214, 0.6),
    0 1px 1px rgba(0, 0, 0, 0.35),
    0 40px 90px -50px rgba(0, 0, 0, 0.98);
}

/* ============================ topo ========================================
   A marca fica solta no canto; a cápsula guarda navegação, CTA e menu. */

[data-topo] {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 60;
  padding-block: var(--ofc-space-4, 16px);
  pointer-events: none;          /* o vão entre marca e cápsula não bloqueia */
}
[data-topo] > * { pointer-events: auto; }

/* Tudo à esquerda desde 26/08. Antes a marca ficava num canto e a cápsula no
   outro; agora o botão de menu é a PRIMEIRA CÉLULA da cápsula e ela cresce a
   partir dele — o menu abre de dentro do próprio botão, em vez de aparecer no
   outro lado da tela. */
[data-topo-linha] {
  display: flex;
  /* pelo topo, não pelo centro: quando o menu abre no telefone a cápsula
     cresce pra baixo, e centralizar faria o corvo afundar até o meio dela */
  align-items: flex-start;
  justify-content: flex-start;
  gap: var(--ofc-space-3, 12px);
  flex-wrap: wrap;
}
/* a marca tem 48px de caixa e a cápsula fechada também: alinhados pelo topo,
   os dois centros coincidem sem precisar de ajuste */
[data-marca] { margin-top: 0; }

/* [data-topo-esq] existiu por um dia (25/08) e saiu em 26/08: com o botão
   dentro da cápsula, não há mais grupo pra agrupar — a marca é filha direta
   da linha. */

/* A marca fica solta: sem cápsula, sem borda, sem fundo. Quem separa o corvo
   do que rola por trás é a sombra projetada — não uma segunda forma ao lado
   da cápsula da navegação. Com a pele clara removida, o corvo é sempre o
   claro: não há mais fundo de papel passando por baixo do topo. */
[data-marca] {
  display: inline-flex;
  align-items: center;
  pointer-events: auto;
  padding: 4px;
  filter: drop-shadow(0 2px 10px rgba(0, 0, 0, 0.75)) drop-shadow(0 0 24px rgba(0, 0, 0, 0.45));
  transition: transform 320ms cubic-bezier(0.22, 1.08, 0.36, 1);
}
@media (hover: hover) and (pointer: fine) {
  [data-marca]:hover { transform: translateY(-1px) scale(1.03); }
}

[data-site-header] {
  pointer-events: auto;
  display: flex;
  align-items: center;
  gap: var(--ofc-space-5, 20px);
  padding: 6px;
  border-radius: var(--ofc-radius-pill, 999px);
}

/* ====================== abas que abrem ===================================
   Portado da referência `animacoes/expandable-tabs.md`: no repouso a aba é só
   o ícone; a que está ativa — ou sob o cursor — abre e revela o nome.

   Do original vieram o comportamento e o desenho. Não veio nada do resto: lá
   são React, Tailwind, framer-motion, usehooks-ts e lucide-react; aqui são
   três SVG escritos à mão e uma transição de CSS. Regra da casa: vendoriza ou
   não entra, e cinco dependências para um menu de três itens não paga.

   O QUE MUDA NA ADAPTAÇÃO: no original o estado vem de um clique que guarda
   índice em React. Num site, clicar em item de menu **navega** — guardar
   seleção seria estado que morre no próximo carregamento. Então "selecionada"
   passa a querer dizer **a página em que você está** (`aria-current="page"`,
   posto pelo JS), e o hover abre como prévia. Ganha-se de brinde uma coisa
   que o original não tem: o menu diz onde você está.

   A abertura é `grid-template-columns: 0fr → 1fr`, não `max-width`. Largura
   automática não anima; a coluna de grade anima até o tamanho exato do texto,
   sem precisar medir nada em JavaScript. */

[data-site-header] > nav {
  display: flex;
  align-items: center;
  gap: 2px;
  font-size: var(--ofc-size-body-sm);
}

[data-site-header] > nav a {
  display: inline-flex;
  align-items: center;
  gap: 0;
  padding: 8px;
  border-radius: 999px;
  color: var(--ofc-text-muted);
  transition: background-color 260ms ease, color 260ms ease,
              gap 420ms cubic-bezier(0.22, 1, 0.36, 1),
              padding 420ms cubic-bezier(0.22, 1, 0.36, 1);
}
[data-site-header] > nav a svg { width: 20px; height: 20px; flex: none; display: block; }

[data-rotulo] {
  display: grid;
  grid-template-columns: 0fr;
  opacity: 0;
  white-space: nowrap;
  transition: grid-template-columns 420ms cubic-bezier(0.22, 1, 0.36, 1),
              opacity 240ms ease;
}
/* o filho é quem esconde o texto enquanto a coluna tem largura zero — e ele
   continua no DOM, então o leitor de tela lê o nome mesmo com a aba fechada */
[data-rotulo] > span { overflow: hidden; }

[data-site-header] > nav a[aria-current="page"],
[data-site-header] > nav a:hover,
[data-site-header] > nav a:focus-visible {
  gap: 8px;
  padding-inline: 14px;
  color: var(--pergaminho);
  background-color: rgba(255, 252, 245, 0.10);
}
[data-site-header] > nav a[aria-current="page"] [data-rotulo],
[data-site-header] > nav a:hover [data-rotulo],
[data-site-header] > nav a:focus-visible [data-rotulo] {
  grid-template-columns: 1fr;
  opacity: 1;
}

/* O CTA do topo é a quarta aba. Fechado, é só o glifo do WhatsApp; abre no
   cursor ou no foco, como as outras três.

   Ele deixou de ser componente do `_ds` pra isso: o rótulo precisa morar num
   wrapper que colapsa, e o texto passado como filho do componente é nó de
   texto puro — CSS não colapsa nó de texto. Continua com as classes
   `.ofc-button` do design system, então a aparência é a mesma; o que mudou é
   quem monta o HTML. De quebra, é um componente a menos na conta da conversão
   pra estático (Bloco 5). */
[data-cta-topo] {
  gap: 0;
  /* alinha com as abas: elas medem 36px (20 de ícone + 8+8 de folga), e o
     botão vinha 7px mais baixo por herdar o padding do tamanho `sm` */
  min-height: 36px;
  padding-inline: 9px !important;
  transition: gap 420ms cubic-bezier(0.22, 1, 0.36, 1),
              padding 420ms cubic-bezier(0.22, 1, 0.36, 1),
              background-color 240ms ease, box-shadow 240ms ease, transform 240ms ease;
}
/* 1,05em da fonte `caption` dava 14px, contra os 20px dos ícones das abas —
   ao lado deles o WhatsApp parecia outro tamanho de peça */
[data-cta-topo]::before { width: 18px !important; height: 18px !important; }

[data-cta-topo]:hover,
[data-cta-topo]:focus-visible {
  gap: 8px;
  padding-inline: 16px !important;
}
[data-cta-topo]:hover [data-rotulo],
[data-cta-topo]:focus-visible [data-rotulo] {
  grid-template-columns: 1fr;
  opacity: 1;
}

/* o filete entre a navegação e o CTA, como na referência */
[data-aba-sep] {
  flex: none;
  width: 1px;
  height: 22px;
  margin-inline: 4px;
  background: rgba(255, 252, 245, 0.28);
}

@media (prefers-reduced-motion: reduce) {
  [data-site-header] > nav a, [data-rotulo] { transition: none; }
}

/* três barrinhas: o ícone diz "menu", não "fechar". Vira X só quando existe
   um painel aberto por cima — no telefone. */
[data-menu-toggle] span:nth-child(2) { transition: opacity 200ms ease, transform 280ms ease; }

/* O X vale em QUALQUER largura desde 26/08. Antes era só no telefone, com o
   argumento de que três barrinhas dizem "menu" e o X só faz sentido havendo
   painel por cima. Isso deixou de valer quando o botão virou a primeira
   célula da cápsula: agora ele abre e fecha algo visível em toda largura, e
   mostrar "menu" com o menu aberto seria mentira.
   Quem carrega o estado é o aria-expanded, que o botão tem por obrigação de
   acessibilidade — não uma classe inventada. */
[data-menu-toggle][aria-expanded="true"] span:nth-child(2) { opacity: 0; }
[data-menu-toggle][aria-expanded="true"] span:first-child { transform: translateY(6.5px) rotate(45deg); }
[data-menu-toggle][aria-expanded="true"] span:last-child  { transform: translateY(-6.5px) rotate(-45deg); }

/* ---------------------------------------------------------------- rodapé
   O _ds fecha o rodapé com um filete de 2px em Latão. Numa pele chapada isso
   é justamente o degrau de cor que saiu de todo o resto: vira aro de vidro,
   como qualquer outra borda do site. */
.ofc-footer { border-top: 1px solid var(--lg-aro); }

/* espaço reservado de foto: sem JS, o slot do Claude Design não existe — o
   lugar precisa continuar reservado e dizer o que falta */
[data-foto-pendente] {
  position: relative;
  width: 100%;
  height: 100%;
  min-height: 220px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--ofc-space-5, 20px);
  border-radius: var(--ofc-radius-md, 12px);
  border-style: dashed;
}
[data-foto-pendente] span {
  max-width: 30ch;
  text-align: center;
  font-family: var(--ofc-font-mono);
  font-size: var(--ofc-size-micro);
  letter-spacing: 0.06em;
  color: rgba(241, 232, 214, 0.55);
}
img[data-foto] { width: 100%; height: 100%; object-fit: cover; display: block; }

/* -------------------------------------------------------------- vídeo do hero
   O vídeo é fundo, nunca conteúdo: fica na camada 0 da seção (a regra genérica
   de [data-secao] > div sobe tudo pra 2, por isso o z-index vem inline no HTML
   também). Roda em laço, sem fim e sem quadro de reserva — o arquivo é curto
   e emenda em si mesmo.

   No celular não adianta reenquadrar: 16:9 dentro de uma tela 9:19 vira uma
   fatia estreita. Testado em 62%/30% e 78%/18% — os dois leem como borrão.
   Fica o centro: no celular o vídeo é atmosfera, não figura. */
[data-video-fundo] { background: var(--ferro); }


[data-video-fundo] video { will-change: transform; }

/* Véu: cor chapada de Ferro sobre o vídeo, autorizado pelo João em 25/08
   depois da medição — com o vídeo cru a sobrelinha do hero dava 1,06:1 e a
   descrição 2,28:1, contra um mínimo de 4,5:1 (3:1 acima de 24px).

   A primeira tentativa foi a 0,46 e ficou pesada demais: véu é tinta por
   cima, levanta o preto e o quadro fica leitoso. Aqui ele é o mais leve que
   a conta permite, porque duas outras coisas carregam parte do peso — a
   sombra do texto (que escurece só atrás da letra) e a descrição em
   Pergaminho no lugar do cinza de apoio. Chapado, não rampa: escurecer por
   degradê criaria uma segunda transição competindo com a do pé. */
[data-video-fundo]::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: rgba(20, 17, 12, 0.34);
}

/* Sobre imagem, o texto ainda precisa de um pé próprio: a sombra macia separa
   a letra do que passa atrás em qualquer quadro do laço, sem escurecer nada
   fora dela. E a descrição sai do cinza de apoio (#a89c8a, feito pra Ferro
   chapado) e vai pro Pergaminho — sobre vídeo, cinza é aposta. */
#topo .ofc-hero__title,
#topo .ofc-hero__description,
#topo .ofc-hero__eyebrow,
#topo .ofc-eyebrow,
#topo [data-mono-row] {
  text-shadow: 0 1px 2px rgba(12, 10, 7, 0.85), 0 2px 20px rgba(12, 10, 7, 0.7);
}
#topo .ofc-hero__description { color: rgba(241, 232, 214, 0.94); }
#topo .ofc-hero__eyebrow,
#topo .ofc-eyebrow { color: rgba(241, 232, 214, 0.86); }

/* ------------------------------------------------------- pé do fundo do hero
   O ÚNICO degradê do site. Uma camada só, ancorada embaixo: transparente no
   alto, onde o vídeo aparece limpo, e fechando em Ferro no pé — é o que
   segura o texto da primeira dobra e o que emenda o hero com a seção seguinte
   sem deixar corte. Sem ele a passagem fica chapada. */
[data-video-pe] {
  background: linear-gradient(180deg,
    rgba(26, 22, 16, 0) 0%,
    rgba(26, 22, 16, 0.06) 20%,
    rgba(26, 22, 16, 0.40) 40%,
    rgba(26, 22, 16, 0.72) 58%,
    rgba(26, 22, 16, 0.92) 80%,
    var(--ferro) 100%);
}
@media (max-width: 768px) {
  /* na tela estreita o texto ocupa quase toda a altura: o pé sobe. */
  [data-video-pe] {
    background: linear-gradient(180deg,
      rgba(26, 22, 16, 0) 0%,
      rgba(26, 22, 16, 0.30) 22%,
      rgba(26, 22, 16, 0.62) 48%,
      rgba(26, 22, 16, 0.86) 74%,
      var(--ferro) 100%);
  }
}

/* ============================== faixa em rolagem =========================
   Entre o hero e a dor: uma linha do que muda pra quem contrata. Roda por
   transform, nunca por left/scroll — fica na GPU e não dispara layout.

   O laço é sem emenda porque o trilho tem duas filas idênticas e anda
   exatamente meia largura: quando a primeira sai, a segunda está no lugar
   dela, pixel a pixel. Por isso a cópia não pode ser abreviada.

   Fundo transparente: a faixa usava --ferro-alto, um degrau acima do Ferro, e
   esse degrau era visível como "mais uma cor de seção". Agora ela é só duas
   linhas de aro sobre o mesmo chão. */
[data-faixa] {
  position: relative;
  z-index: 3;
  overflow: hidden;
  background: transparent;
  border-block: 1px solid var(--lg-aro);
  padding-block: var(--ofc-space-4, 16px);
  /* as pontas dissolvem: item cortado na borda lê como bug, não como fluxo */
  -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 7%, #000 93%, transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0, #000 7%, #000 93%, transparent 100%);
}

[data-faixa-trilho] {
  display: flex;
  width: max-content;
  animation: ofc-faixa 46s linear infinite;
}

[data-faixa-fila] {
  display: flex;
  align-items: center;
  margin: 0;
  padding: 0;
  list-style: none;
}

[data-faixa-fila] li {
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
  font-family: var(--ofc-font-mono);
  font-size: var(--ofc-size-caption);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--latao);
}

/* o losango é separador, não conteúdo: nasce do ::after pra não virar
   caractere solto no leitor de tela */
[data-faixa-fila] li::after {
  content: "◆";
  margin-inline: var(--ofc-space-6, 24px);
  font-size: 0.55em;
  color: rgba(201, 154, 75, 0.45);
}

@keyframes ofc-faixa {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-50%, 0, 0); }
}

/* parar no hover deixa ler o item inteiro sem correr atrás dele */
@media (hover: hover) and (pointer: fine) {
  [data-faixa]:hover [data-faixa-trilho] { animation-play-state: paused; }
}

@media (prefers-reduced-motion: reduce) {
  [data-faixa-trilho] { animation: none; }
}

@media (max-width: 768px) {
  [data-faixa-fila] li { font-size: var(--ofc-size-micro); }
  [data-faixa-fila] li::after { margin-inline: var(--ofc-space-5, 20px); }
  [data-faixa-trilho] { animation-duration: 34s; }
}

/* ============================ a prova ====================================
   A foto deixa de ser um bloco 4:5 ao lado do texto e passa a ser a seção:
   horizontal, sangrada de ponta a ponta, com o conteúdo por cima.

   Aqui o escurecimento não é opcional como no hero: no hero o vídeo é o
   assunto, aqui a foto é o palco e o assunto é o texto. Ainda assim é cor
   chapada, não rampa — a regra da casa não muda por seção. */

[data-prova] { isolation: isolate; }

[data-prova-fundo] {
  position: absolute;
  inset: 0;
  z-index: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 42%;
  /* a foto vem em luz fria; puxa pro quente da casa */
  filter: saturate(0.82) contrast(1.05) sepia(0.14);
}

[data-prova-veu] {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: rgba(20, 17, 12, 0.58);
}

/* Sobre foto, o cinza de apoio (#a89c8a) não serve: medido contra o quadro,
   ele dava 3,32:1 e o mínimo é 4,5:1. Aqui a coluna de texto vira Pergaminho
   e ganha a mesma sombra macia do hero — é o que permitiu o véu descer de
   0,66 para 0,58 e a foto aparecer mais. */
#prova [data-escalonar] .ofc-eyebrow,
#prova [data-escalonar] .ofc-text,
#prova [data-escalonar] .ofc-text--muted { color: rgba(241, 232, 214, 0.94); }

#prova [data-escalonar] .ofc-heading,
#prova [data-escalonar] .ofc-eyebrow,
#prova [data-escalonar] .ofc-text {
  text-shadow: 0 1px 2px rgba(12, 10, 7, 0.85), 0 2px 20px rgba(12, 10, 7, 0.7);
}

/* dois caminhos lado a lado; no telefone empilham e ocupam a linha inteira,
   porque botão espremido em 375px não é escolha, é sorteio */
[data-acoes-prova] {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ofc-space-4, 16px);
  align-items: center;
}
@media (max-width: 560px) {
  [data-acoes-prova] { flex-direction: column; align-items: stretch; }
  [data-acoes-prova] > a,
  [data-acoes-prova] .ofc-button { width: 100%; justify-content: center; }
}

/* ---------------------------------------------------------------- conversa
   O trecho da conversa deixa de ser tipografia parada e passa a ser o que
   ele é: uma conversa que aconteceu. Bolhas, lados, hora, os dois tiques —
   a gramática que qualquer pessoa lê como mensagem sem precisar de legenda.

   Não é a interface do WhatsApp: nada de verde, nada de fonte de outra
   marca, nada de moldura de aparelho. É a estrutura de um fio de mensagens
   nas cores da casa — o que se copia é o gesto, não a tela dos outros.

   As bolhas nascem VISÍVEIS. Quem esconde é o JS, que só esconde depois de
   existir para poder trazer de volta em ordem. Sem script, a prova continua
   legível — a armadilha do elemento que depende do observer para existir já
   custou a lâmpada e o fio de luz dos cartões uma vez. */

[data-chat] { padding: var(--ofc-space-6, 24px); }

[data-chat-titulo] {
  margin: 0 0 var(--ofc-space-5, 20px);
  padding-bottom: var(--ofc-space-4, 16px);
  border-bottom: 1px solid var(--lg-aro);
  font-family: var(--ofc-font-mono);
  font-size: var(--ofc-size-micro);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--latao);
}

[data-chat-fio] {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 10px;
}

[data-chat-bolha] {
  position: relative;
  max-width: 82%;
  padding: 10px 14px 8px;
  border-radius: 16px;
  font-size: var(--ofc-size-body-sm);
  line-height: 1.4;
  color: var(--pergaminho);
  box-shadow: 0 2px 8px -4px rgba(0, 0, 0, 0.7);
}

/* recebida: o que o assistente perguntou. Canto de cima cortado do lado de
   onde a mensagem veio — é o "rabinho" sem desenhar rabinho nenhum. */
[data-chat-bolha="recebida"] {
  align-self: flex-start;
  border-top-left-radius: 5px;
  background: rgba(255, 252, 245, 0.07);
  border: 1px solid rgba(255, 252, 245, 0.13);
  border-top-color: rgba(255, 252, 245, 0.2);
}

/* enviada: a resposta do dono da empresa. Latão em vez do verde da outra
   marca — e é aqui que mora a frase que dói, então ela ganha o acento. */
[data-chat-bolha="enviada"] {
  align-self: flex-end;
  border-top-right-radius: 5px;
  background: rgba(201, 154, 75, 0.20);
  border: 1px solid rgba(201, 154, 75, 0.38);
  border-top-color: rgba(201, 154, 75, 0.55);
}

[data-chat-bolha] time {
  display: inline-block;
  margin-left: 10px;
  transform: translateY(1px);
  font-family: var(--ofc-font-mono);
  font-size: 10px;
  letter-spacing: 0.04em;
  color: rgba(241, 232, 214, 0.55);
  white-space: nowrap;
}
[data-chat-bolha="enviada"] time { color: rgba(241, 232, 214, 0.6); }
[data-chat-bolha] time::after { content: ""; }
[data-chat-bolha="enviada"] time::after {
  content: " ✓✓";
  color: var(--latao);
  letter-spacing: -0.15em;
}

/* os três pontos. Nasce escondido: sem JS ele nunca aparece, e a conversa
   fica sendo só as quatro mensagens. */
[data-chat-digitando] {
  display: none;
  align-self: flex-start;
  gap: 5px;
  padding: 13px 16px;
  border-radius: 16px;
  border-top-left-radius: 5px;
  background: rgba(255, 252, 245, 0.07);
  border: 1px solid rgba(255, 252, 245, 0.13);
}
[data-chat-digitando][data-lado="enviada"] {
  align-self: flex-end;
  border-radius: 16px;
  border-top-right-radius: 5px;
  background: rgba(201, 154, 75, 0.16);
  border-color: rgba(201, 154, 75, 0.3);
}
[data-chat-digitando].mostrando { display: inline-flex; }
[data-chat-digitando] span {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: rgba(241, 232, 214, 0.75);
  animation: ofc-chat-ponto 1.25s ease-in-out infinite;
}
[data-chat-digitando] span:nth-child(2) { animation-delay: 0.16s; }
[data-chat-digitando] span:nth-child(3) { animation-delay: 0.32s; }

@keyframes ofc-chat-ponto {
  0%, 72%, 100% { opacity: 0.3; transform: translateY(0); }
  36%           { opacity: 1;   transform: translateY(-3px); }
}

/* o estado escondido só existe depois que o JS assume a sequência */
[data-chat].tem-js [data-chat-bolha] {
  opacity: 0;
  transform: translateY(10px) scale(0.97);
}
[data-chat].tem-js [data-chat-bolha].chegou {
  opacity: 1;
  transform: none;
  transition: opacity 240ms ease, transform 420ms cubic-bezier(0.22, 1.2, 0.3, 1);
}

@media (prefers-reduced-motion: reduce) {
  [data-chat-digitando] span { animation: none; }
}

@media (max-width: 900px) {
  [data-prova-fundo] { object-position: center 38%; }
  [data-prova-veu]   { background: rgba(20, 17, 12, 0.74); }
  [data-chat-bolha]  { max-width: 90%; }
}
