@font-face {
  font-family: "Space Mono";
  src: local("Space Mono");
}
/* fonte de verdade do design (Figma usa "Carbona Variable" em quase todo
   texto mono do site — poema do about, títulos/listas do services, labels
   do work etc., ver PROJECT_NOTES.md). Arquivo próprio da licença do
   usuário, self-hosted (era só uma tentativa de local() antes, pra "Space
   Mono", que falha silenciosamente em quem não tem a fonte instalada no
   sistema — esse aqui carrega de verdade pra todo mundo).
   4º arquivo testado (ver PROJECT_NOTES.md pro histórico dos 3 anteriores —
   1º vinha sempre inclinado, 2º tinha o eixo "wght" declarado mas sem
   dados de verdade, 3º era estático só com o peso Regular). Esse aqui
   (Carbona_Variable_Regular.ttf) é BEM maior que os anteriores (525KB) e
   tem os eixos "wght"/"slnt" com dados de verdade (`gvar`/`avar`
   presentes, conferido no binário) — variable font completa. `font-weight:
   1 999` (faixa, não um número fixo) deixa o `font-weight` normal do CSS
   (que os elementos do site já usam) mapear pro eixo "wght" de verdade. */
@font-face {
  font-family: "Carbona Variable";
  src: url("fonts/Carbona_Variable_Regular.ttf") format("truetype");
  font-weight: 1 999;
  font-style: normal;
  font-display: swap;
}
body {
  /* garante o eixo de inclinação em 0 (reto) explicitamente — mesmo motivo
     do 2º arquivo testado, que tinha um padrão de eixo diferente de 0;
     tag de eixo que não existe numa fonte é ignorada sem efeito colateral */
  font-variation-settings: "slnt" 0;
}

:root {
  --bg: #12171f;
  --fg: #ffffff;
  --fg-rgb: 255, 255, 255;
  --line: #2e343a;
  --menu-bg: #2e343a;
  /* cor de texto/ícone pras seções que usam "--menu-bg" de fundo (menu
     overlay, .clients, festivals/manifesto do about etc.) — no escuro é a
     mesma cor de "--fg" (branco), então historicamente nunca precisou de
     uma variável própria; separada agora porque no CLARO ela NÃO é igual a
     "--fg" (ver bloco [data-theme="light"] abaixo) */
  --menu-fg: #ffffff;
  --menu-fg-rgb: 255, 255, 255;
  --font-mono: "Carbona Variable", "Space Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
  --font-display: "Archivo Black", "Arial Black", Helvetica, Arial, sans-serif;
  --font-menu: "Manrope", var(--font-mono);
  --edge: clamp(16px, 1.1vw, 24px);
  --icon: clamp(20px, 1.6vw, 27px);
}

/* modo claro: paleta tirada do Figma (node 14003:7, "home" — link do
   usuário), nas seções que NÃO são cobertas por vídeo/foto (onde dá pra ver
   a cor de fundo de verdade: rodapé/CTA e a grade de logos das produtoras).
   Duas famílias de cor, uma pra cada fundo que o site já usa:
   - "--bg" (fundo principal, #12171f no escuro) vira BRANCO puro (#fff) no
     claro — medido no rodapé/CTA do Figma (fundo 100% rgb(255,255,255) em
     vários pontos). O texto/ícone por cima ("--fg") vira #12171f — ou seja,
     a MESMA cor que era o fundo escuro agora é o texto claro (medido no
     ícone "X"/Twitter do rodapé: rgb(18,23,31), bate exato com o
     "--bg" escuro original).
   - "--menu-bg" (fundo secundário, #2e343a no escuro — menu aberto,
     .clients, festivals/manifesto do about) vira um LILÁS/cinza claro
     (#c2c0c8) no claro — medido na grade de logos das produtoras do Figma
     (fundo 100% rgb(194,192,200) em vários pontos, incluindo os 4 cantos).
     O texto/logo por cima ("--menu-fg") vira #2e343a — de novo, a MESMA
     cor que era esse fundo escuro agora é o texto claro (medido no logo
     "GREAT" da mesma grade: rgb(46,52,58), bate exato com o "--menu-bg"
     escuro original). Era antes um "invert(1)" cru (branco constant, sem
     essa 2ª família de cor nenhuma) — usuário reportou e pediu pra seguir
     esse Figma à risca. */
:root[data-theme="light"] {
  --bg: #ffffff;
  --fg: #12171f;
  --fg-rgb: 18, 23, 31;
  --line: #d8d4cc;
  --menu-bg: #c2c0c8;
  --menu-fg: #2e343a;
  --menu-fg-rgb: 46, 52, 58;
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  background: var(--bg);
  color: var(--fg);
  font-family: var(--font-mono);
  /* "clip" em vez de "hidden": evita barra de rolagem horizontal sem quebrar
     position:sticky em nenhuma página (hidden em qualquer ancestral desativa
     sticky dos descendentes) */
  overflow-x: clip;
  /* "background-color" (não a abreviação "background"!) — achado testando o
     modo claro nesta tarefa: transicionar a abreviação "background" (que
     empacota cor+imagem+posição+repeat juntos) quando só a COR muda via
     variável CSS (var(--bg) trocando de valor) deixa o navegador "travado"
     no valor antigo pra sempre nesse elemento (bug/limitação real,
     reproduzido e confirmado: "--bg" media corretamente o valor novo,
     "background-color" computado não atualizava nunca, nem esperando bem
     mais que os 0.4s da transição). "background-color" sozinho (só a cor,
     sem o resto do pacote) não tem esse problema. */
  transition: background-color .4s ease, color .4s ease;
}

img { max-width: none; }

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

button {
  background: none;
  border: none;
  cursor: pointer;
  color: inherit;
  padding: 0;
}

.icon-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: var(--icon);
  height: var(--icon);
  opacity: .92;
  transition: opacity .2s ease, transform .2s ease;
}
.icon-btn:hover { opacity: 1; transform: scale(1.08); }
.icon-btn img { width: 100%; height: 100%; display: block; }

/* ícones/logos brancos (arquivos <img>, não dá pra pintar com "color") —
   continuam usando "invert(1)" pra virar escuro no modo claro. Não é a cor
   EXATA do Figma pra essas imagens especificamente (branco invertido vira
   preto puro, #000, não o #12171f/#2e343a medido no Figma) — mas a
   diferença é mínima no tamanho que esses ícones aparecem, e evita ter que
   reconverter cada arquivo (a fidelidade de cor de verdade importa mais nos
   FUNDOS e no TEXTO, que já usam os valores exatos via "--bg"/"--menu-bg"/
   "--fg"/"--menu-fg" acima). ".client-logo" e ".mobile-footer-social-icon"/
   ".mobile-footer-wordmark" entraram na lista agora — antes ficavam de fora
   de propósito porque suas seções (.clients/.mobile-footer) tinham fundo
   sempre escuro, ignorando o tema; isso mudou (ver comentário em ".clients"
   mais abaixo), então os logos precisam inverter junto agora. */
:root[data-theme="light"] .icon-btn img,
:root[data-theme="light"] .brand-mark,
:root[data-theme="light"] .hero-logo-mark,
:root[data-theme="light"] .hero-logo-bracket,
:root[data-theme="light"] .contact-wordmark,
:root[data-theme="light"] .contact-social,
:root[data-theme="light"] .client-logo img,
:root[data-theme="light"] .mobile-footer-wordmark,
:root[data-theme="light"] .mobile-footer-social-icon img {
  filter: invert(1);
}

/* --- controles fixos (menu / idioma / modo) --- */
.site-controls {
  position: fixed;
  top: 50%;
  transform: translateY(-50%);
  z-index: 500;
  display: flex;
  align-items: center;
  gap: clamp(10px, 1.2vw, 23px);
  transition: opacity .25s ease, visibility .25s ease;
}
.site-controls.left { left: var(--edge); }
.site-controls.right { right: var(--edge); }
body.menu-open .site-controls.right {
  opacity: 0;
  visibility: hidden;
}
/* logo fixo do canto (home, mobile) — ver @media(max-width:720px) pro
   resto do estilo; nunca aparece no desktop */
.home-logo-fixed { display: none; }

/* --- menu overlay --- */
.menu-overlay {
  position: fixed;
  inset: 0;
  z-index: 400;
  background: var(--menu-bg);
  /* texto/colchete (".menu-link"/".menu-bracket" abaixo, ambos sem "color"/
     "border-color" próprios) herdam esta cor — combina com o fundo em
     qualquer tema, sem precisar de "invert()" (são texto/borda de verdade,
     não imagem) */
  color: var(--menu-fg);
  visibility: hidden;
  transform: translateX(-100%);
  transition: transform .55s cubic-bezier(.65,0,.35,1), visibility 0s linear .55s;
}
.menu-overlay.open {
  visibility: visible;
  transform: translateX(0);
  transition: transform .55s cubic-bezier(.65,0,.35,1);
}
.menu-links {
  position: relative;
  width: 100%;
  height: 100%;
}
.menu-link {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  font-family: var(--font-menu);
  font-weight: 400;
  font-size: clamp(20px, 2.416vw, 46.39px);
  letter-spacing: .05em;
  text-transform: uppercase;
  color: var(--menu-fg);
  white-space: nowrap;
  opacity: .92;
  transition: opacity .2s ease;
}
.menu-link--center { transform: translate(-50%, -50%); }
.menu-link:hover { opacity: 1; }
.menu-link.is-active { font-weight: 800; opacity: 1; }
.menu-link:not(.is-active).has-active { opacity: .3; }

/* colchete que envolve do "X" de fechar até o item ativo — mesmo motivo "["
   recorrente do site (about/contact/work), 3 lados só, sem borda embaixo.
   left/top/height fixos (sempre começa logo depois do hambúrguer/X); a
   largura vem do inline style de cada página (varia com o item ativo) */
.menu-bracket {
  position: absolute;
  left: 14%;
  top: 25.3%;
  height: 26.6%;
  border: 15px solid var(--menu-fg);
  border-bottom: none;
  pointer-events: none;
}
/* só a home tem esse elemento sem nenhum item "ativo" de verdade pra
   envolver (Trabalhos/Serviços/Sobre/Contato são só destinos, nenhum
   representa "você está aqui") — escondido no desktop; o mobile mostra ele
   de qualquer forma, decorativo (ver @media max-width:720px, que usa uma
   seletor mais específico pra vencer esta regra) */
.home-page .menu-bracket { display: none; }
/* work.html: o hambúrguer/overlay novo (Figma node 14043:1562) só existe pro
   mobile — no desktop ".work-page .site-controls.left" fica escondido (ver
   work.css), então o overlay nunca abre lá; escondemos o colchete aqui
   também, por segurança/redundância (mesmo padrão da home acima) */
.work-page .menu-bracket { display: none; }

/* --- hero --- */
.hero {
  position: relative;
  width: 100%;
  height: 100vh;
  min-height: 560px;
  overflow: hidden;
}

/* cada vídeo mantém a proporção do tamanho NATIVO do arquivo (nunca
   cortado nem esticado — ver fitHeroVideo/heroVideoScale em script.js): em
   telas de 1920px+ aparece no tamanho nativo exato; entre 1280 e 1920px o
   tamanho acompanha a largura da tela (escala proporcional); abaixo de
   1280px fica travado no tamanho mínimo. Se ainda assim for maior que a
   tela, o excesso simplesmente não aparece (overflow:hidden aqui e em
   .hero, igual qualquer conteúdo centralizado maior que a área visível) */
.hero-video-frame {
  position: absolute;
  inset: 0;
  overflow: hidden;
  background: var(--bg);
  opacity: 0;
  transform: scale(1.08);
  transition: opacity 1.2s ease, transform 1.4s cubic-bezier(.19,1,.22,1);
}
.hero-video-frame.is-visible {
  opacity: 1;
  transform: scale(1);
}
/* tamanho (width/height em px) definido via JS = resolução nativa exata do
   vídeo (ver fitHeroVideo em script.js) — nunca cortado nem esticado, só
   centralizado via left/top 50% + translate(-50%,-50%); a troca de
   width/height anima suavemente entre um vídeo e outro (não é um corte
   abrupto) */
.hero-video {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  object-fit: cover;
  pointer-events: none;
  opacity: 0;
  transition: opacity .9s ease, width .6s cubic-bezier(.19,1,.22,1), height .6s cubic-bezier(.19,1,.22,1), transform .9s cubic-bezier(.19,1,.22,1);
}
.hero-video.is-visible { opacity: 1; }
/* troca entre vídeos vira um slide com fade: o que está saindo desliza pra
   fora à esquerda E dá fade-out ao mesmo tempo (perde .is-visible — ver
   handleHeroVideoEnded em script.js), enquanto o próximo entra deslizando
   da direita. Desloca 100vw (não 100%, que seria relativo ao próprio
   tamanho do vídeo, variável por arquivo) — garante que fica bem fora da
   tela não importa o tamanho nativo do vídeo. Opacidade e transform com a
   mesma duração (.9s) pra sentir como um movimento só, mais suave. */
.hero-video.is-offscreen-right { transform: translate(calc(-50% + 100vw), -50%); }
.hero-video.is-offscreen-left { transform: translate(calc(-50% - 100vw), -50%); }
/* usado só no instante de posicionar o próximo vídeo fora da tela à direita
   ANTES de soltar a transição — sem isso, esse posicionamento inicial
   também deslizaria (entraria "andando" desde o centro), em vez de já
   nascer fora da tela pronto pra deslizar de lá pra cá */
.hero-video.no-transition { transition: none; }

/* fica fixo no centro da tela por cima dos vídeos o tempo todo (não some
   mais entre um vídeo e outro) — só a entrada inicial (ao carregar a
   página) é que anima, via .is-visible, e nunca mais é removida depois */
.hero-logo {
  position: absolute;
  left: 50%;
  top: 50%;
  width: clamp(190px, 17.92vw, 344px);
  text-align: left;
  z-index: 10;
  pointer-events: auto;
  opacity: 0;
  transform: translate(-50%, -50%) translateY(22px);
  transition: opacity .8s ease, transform .8s cubic-bezier(.19,1,.22,1);
}
.hero-logo.is-visible {
  opacity: 1;
  transform: translate(-50%, -50%) translateY(0);
}
.hero-logo-eyebrow {
  display: block;
  font-family: var(--font-display);
  font-size: clamp(15px, 1.57vw, 30px);
  letter-spacing: .04em;
  margin-bottom: clamp(2px, .5vw, 8px);
}
.hero-logo-mark-wrap { position: relative; width: 100%; overflow: visible; }
/* overflow:visible é essencial aqui: quando o colchete "empurra" o resto da
   palavra pra direita (#heroLogoPushGroup, ver comentário abaixo), o texto
   ultrapassa o viewBox original do SVG — por padrão os navegadores recortam
   qualquer conteúdo fora do viewBox (nem que seja um <svg> sem width/height
   fixos), então sem isso o final da palavra ficava cortado depois da
   animação. */
.hero-logo-mark { width: 100%; height: auto; display: block; overflow: visible; }
/* quando o último dos 10 vídeos termina, o primeiro "A" de "PAPAKI" some e
   um colchete (mesmo motivo "[" recorrente do site) toma o lugar dele — ver
   a classe is-letter-swapped em script.js. É como se a própria letra
   esticasse: o colchete nasce do tamanho do "A" original e cresce ~3.3x na
   HORIZONTAL (largura — era 3x, aumentado um pouco pra ficar mais
   retangular), ancorado na borda esquerda (mesma posição do "A", sem mexer
   no topo/altura — a altura já é a altura da fonte, não precisa esticar na
   vertical); o texto que vem depois ("PAKI", agrupado em
   #heroLogoPushGroup) é empurrado pra direita na mesma proporção que o
   colchete cresce, dando a sensação de que ele tá fisicamente empurrando o
   resto da palavra — não são duas animações soltas, as duas usam a mesma
   duração/curva pra parecerem uma coisa só. */
#heroLogoLetterA1 { transition: opacity 1s ease; }
.hero-logo-mark-wrap.is-letter-swapped #heroLogoLetterA1 { opacity: 0; }
.hero-logo-bracket {
  position: absolute;
  left: 18.494%;
  width: 54.791%;
  top: 0;
  height: 100%;
  border: clamp(10px, 1vw, 20px) solid #fff;
  border-bottom: none;
  opacity: 0;
  transform: scaleX(0);
  transform-origin: 0% 50%;
  transition: opacity 1s ease, transform 1s cubic-bezier(.19,1,.22,1);
}
.hero-logo-mark-wrap.is-letter-swapped .hero-logo-bracket {
  opacity: 1;
  transform: scaleX(1);
}
/* empurra "PAKI" pra direita pela mesma distância que o colchete ganhou de
   largura extra (2.3x a largura original do "A" — a diferença entre o
   tamanho novo, 3.3x, e o antigo, 1x): 2.3 * (120.16 - 63.3132) = 130.7476,
   nas unidades do próprio viewBox do SVG (não px de tela — por isso escala
   certinho em qualquer tamanho de logo) */
#heroLogoPushGroup { transition: transform 1s cubic-bezier(.19,1,.22,1); }
.hero-logo-mark-wrap.is-letter-swapped #heroLogoPushGroup {
  transform: translateX(130.7476px);
}

/* --- seção de logos das produtoras --- */
.clients {
  position: relative;
  width: 100%;
  padding: clamp(64px, 11vw, 160px) 0;
  border-top: 1px solid var(--line);
  /* fundo desktop (node 12001:298). Antes ficava sempre escuro (não seguia
     o tema) de propósito — o Figma do modo claro (node 14003:7) mostra
     essa mesma seção com um fundo lilás claro (medido: rgb(194,192,200) =
     "--menu-bg" no claro), então virou tema-dependente igual o resto —
     os logos (.client-logo img) agora entram na lista de invert() lá em
     cima também. */
  background: var(--menu-bg);
}
/* grade de "boxes": cada logo fica dentro da sua própria célula
   (.client-logo) e é centralizado nela (ver .client-logo mais abaixo) —
   antes cada logo era posicionado solto por left/top/width/height em % do
   palco inteiro (coordenadas exatas tiradas do Figma), o que não dava pra
   organizar em boxes uniformes nem centralizar de verdade */
.clients-stage {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  align-items: center;
  justify-items: center;
  row-gap: clamp(32px, 4.5vw, 72px);
  column-gap: clamp(24px, 3.5vw, 56px);
  width: min(1352px, 90vw);
  margin: 0 auto;
}
.client-logo {
  width: 100%;
  height: clamp(56px, 7.6vw, 140px);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform .25s cubic-bezier(.19,1,.22,1);
}
.client-logo:hover { transform: scale(1.14); }
/* altura de cada logo (ou do wrapper .client-logo-pieces) definida via JS,
   em % da altura do box — ver campo "scale" em data.js; a largura sai
   sozinha (width:auto), seguindo a proporção natural de cada arquivo, nunca
   esticada nem cortada */
.client-logo > img:not(.logo-piece) {
  display: block;
  width: auto;
  max-width: 100%;
  object-fit: contain;
}
.client-logo-pieces {
  position: relative;
  display: block;
  width: auto;
  max-width: 100%;
}
.client-logo-pieces .logo-piece {
  position: absolute;
  display: block;
}

/* --- contato / rodapé --- */
.contact {
  position: relative;
  width: 100%;
  /* era min-height:100vh, depois um aspect-ratio:16/9 chutado pra "imitar"
     a proporção antiga — os dois ainda deixavam a altura dependendo de
     alguma coisa que não é o conteúdo de verdade. Agora .contact-wordmark
     (abaixo) virou um bloco NORMAL (não mais position:absolute) — a altura
     da seção sai direto da altura renderizada da imagem + o padding, sem
     nenhum número de proporção pra manter sincronizado à mão. Mais
     dinâmico de verdade: cresce/encolhe exatamente junto com a imagem,
     sempre a mesma relação visual entre wordmark/CTA e o fim da seção,
     em qualquer resolução — sem precisar acertar uma proporção por fora. */
  padding: 2.19% 2.99% 2.2% 2.24%; /* mesmas margens de antes (era inset em .contact-wordmark, % da ALTURA da seção) — convertidas pra padding, que sempre usa % da LARGURA (regra do CSS), multiplicando pelos 9/16 que já eram a proporção "correta" calculada antes */
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.contact-wordmark {
  display: block;
  width: 100%;
  height: auto;
  pointer-events: none;
  user-select: none;
  will-change: transform;
}
/* .contact-row não tem CSS de posicionamento própria — os filhos
   (.contact-cta/.contact-social) são posicionados via % direto relativo ao
   .contact (mesma referência que o .contact-wordmark já usa, ver acima),
   calculado a partir do frame do Figma (node 12001:267) pra bater com o
   fundo (wordmark "papaki"): mais centralizados e um pouco mais pra baixo
   do que a distribuição borda-a-borda de antes (justify-content:
   space-between num container quase full-width). No mobile isso é
   desfeito, ver media query lá embaixo — nas telas estreitas as
   porcentagens do desktop empurrariam o texto pra fora da tela. */
/* .contact-cta agora é um <div> (não é mais o link em si) — só o texto
   "CONTATE-NOS" (dentro de .contact-cta-link) é clicável; a seta continua
   visível do lado, do mesmo tamanho/proporção de antes, mas sem link nem
   cursor de clique (pedido do usuário: "manter a seta mas sem link") */
.contact-cta {
  position: absolute;
  z-index: 2;
  left: 19%;
  top: 59%;
  transform: translate(-50%, -50%);
  display: inline-flex;
  align-items: center;
  gap: .5em;
  font-family: var(--font-mono);
  /* 40px no frame do Figma (node 12001:267, "CONTACT US", 1920px de largura)
     — 2.9vw era um valor calibrado a olho, não proporcional ao frame; 40 /
     1920 * 100 = 2.083vw bate exatamente com o design em qualquer largura de
     tela até o teto de 1920px (acima disso o clamp já travava em 40px, então
     essa parte não mudou). */
  font-size: clamp(20px, 2.083vw, 40px);
  white-space: nowrap;
}
.contact-cta-link {
  text-decoration: underline;
  text-underline-offset: .18em;
}
.contact-cta-link:hover { opacity: .8; }
.contact-cta .arrow {
  /* no Figma a seta é maior que o texto (47px vs 40px) — em vez de um
     tamanho fixo, usa a mesma proporção (47/40 = 1.175) em `em`, herdando do
     tamanho responsivo do texto ao lado (mantém a proporção certa em
     qualquer largura de tela, não só no teto de 40px) */
  font-size: 1.175em;
}

/* ícones sociais: eram 1 imagem só com os 2 logos desenhados lado a lado
   (não dava pra cada um linkar pro seu próprio perfil) — separados em 2
   arquivos (assets/img/icon-instagram.svg, icon-linkedin.svg) e cada um
   dentro do seu próprio elemento, pronto pra virar <a href="..."> assim que
   tiver as URLs oficiais (ver TODO no HTML) */
.contact-social {
  position: absolute;
  z-index: 2;
  left: 73.8%;
  top: 59%;
  transform: translate(-50%, -50%);
  display: flex;
  align-items: center;
  gap: 60px;
}
.contact-social-icon { display: block; }
.contact-social-icon img {
  /* mesma escala visual que a imagem combinada tinha antes (altura no
     mesmo range de clamp(50px,6.6vw,126px) de largura × proporção
     58.7192/150.1 ≈ .391 do arquivo original) */
  display: block;
  width: auto;
  height: clamp(20px, 2.6vw, 50px);
}

/* --- rodapé final: fora do bloco de CTA (.contact), abaixo do wordmark de
   fundo, sempre o último elemento da página --- */
.site-footer {
  position: relative;
  width: 100%;
  padding: clamp(28px, 4vw, 48px) var(--edge) clamp(24px, 3vw, 40px);
  text-align: center;
}
.site-footer-copy {
  /* 14px no frame do Figma (node 12001:288, "info") — era 13px; o
     letter-spacing já estava em .05em (0.7px em 14px, batendo exato com o
     tracking do Figma), só o tamanho da fonte estava 1px menor */
  font-size: 14px;
  letter-spacing: .05em;
  line-height: 1.5;
  opacity: .8;
  margin-bottom: clamp(14px, 2vw, 22px);
}
.site-footer-copy p { margin: 2px 0; }
.site-footer-links {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: clamp(16px, 2.4vw, 32px);
  font-size: 13px;
  letter-spacing: .05em;
  text-transform: uppercase;
}
.site-footer-links a {
  opacity: .75;
  text-decoration: underline;
  text-underline-offset: .2em;
  transition: opacity .2s ease;
}
.site-footer-links a:hover { opacity: 1; }

/* rodapé mobile (Figma node 14035:590) — cópia paralela de
   .contact+.site-footer, só usada em telas estreitas (ver
   @media max-width:720px abaixo). Escondida por padrão pra nunca aparecer
   no desktop, nem por engano. */
.mobile-footer { display: none; }

@media (max-width: 720px) {
  /* em telas estreitas o conteúdo ocupa a largura toda, então os ícones
     fixos em top:50% acabam caindo por cima de texto que passa pelo meio da
     tela ao rolar — no mobile eles sobem para o topo, fora do fluxo do
     conteúdo */
  .site-controls { top: var(--edge); transform: none; }
  .site-controls.right { gap: 10px; }
  /* --- hambúrguer/modo/idioma no mobile (Figma): o hambúrguer vai pro canto
     SUPERIOR DIREITO (era esquerdo), e os ícones de modo claro/escuro +
     idioma saem da tela e só aparecem DENTRO do menu aberto — reaproveita o
     MESMO elemento/JS de sempre (".site-controls.right", com o
     modeToggle/langToggle originais), só reposiciona e troca quando ele
     fica visível, em vez de duplicar os botões. Pedido do usuário como algo
     que vale pra TODAS as páginas com esse mesmo menu — mas ".work-brand"/
     ".work-bottom-menu" do work.html usam um padrão de navegação totalmente
     diferente (sem hambúrguer, sem ".menu-overlay"), então essas regras vêm
     protegidas por "body:has(.menu-overlay)" pra nunca afetar o work.html
     (lá ".site-controls.right" continua do jeito que sempre foi). */
  body:has(.menu-overlay) .site-controls.left {
    left: auto;
    right: var(--edge);
  }
  /* posição de verdade tirada do Figma (node 14021:1831, "menu" mobile
     aberto, frame 393×852) — era um chute (embaixo, centralizado) antes de
     ter esse frame; agora bate exato: canto SUPERIOR ESQUERDO, sol
     (modo) e globo (idioma) a 4.34%/10.4% e 4.58%/28.5% do frame */
  body:has(.menu-overlay) .site-controls.right {
    top: 4.34%;
    left: 10.4%;
    right: auto;
    bottom: auto;
    transform: none;
    gap: clamp(28px, 11.7vw, 46px);
    opacity: 0;
    visibility: hidden;
    transition: opacity .25s ease, visibility 0s linear .25s;
  }
  body:has(.menu-overlay.open) .site-controls.right {
    opacity: 1;
    visibility: visible;
    transition: opacity .3s ease .2s, visibility 0s linear 0s;
  }
  /* colchete decorativo acima da lista — no Figma mobile NÃO envolve o item
     ativo (era assim no desktop, ver comentário em ".menu-bracket" lá em
     cima) — é um retângulo de 3 lados FIXO, sempre no mesmo tamanho/posição
     não importa a página/item ativo. "width" tem !important pra vencer o
     inline style de cada página (que no desktop varia com o item ativo).
     Seletor "body:has(.menu-overlay) .menu-bracket" (em vez de só
     ".menu-bracket") pra ter especificidade suficiente de vencer
     ".home-page .menu-bracket { display:none }" (a home não tem colchete
     no desktop, mas tem no mobile — ver comentário lá) */
  body:has(.menu-overlay) .menu-bracket {
    display: block;
    left: 10.31%;
    top: 16.31%;
    width: 79.39% !important;
    height: 16.78%;
    border-width: 17px;
  }
  /* desfaz o posicionamento em % (pensado pro layout desktop do Figma) —
     nas telas estreitas isso empurraria o texto pra fora da tela, então
     volta a ser um fluxo normal em coluna, como antes. Continua valendo
     pro about.html (que também usa ".contact" e não ganhou uma versão
     mobile própria nesta tarefa — só a home, ver ".home-page .contact"
     mais abaixo, que esconde essa seção de vez só no index.html) */
  .contact-row {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 28px;
  }
  .contact-cta,
  .contact-social {
    position: static;
    transform: none;
  }
  .contact-social-icon img { height: clamp(20px, 3.97vw, 28.56px); }
  .contact-cta { font-size: clamp(16px, 3.06vw, 22px); }
  .contact { min-height: 460px; }

  /* --- home mobile: segue o Figma exato (node 14035:590), não mais uma
     versão "encolhida" do layout desktop — ver .clients-stage/.mobile-footer
     abaixo. .contact (CTA+wordmark desktop) e .site-footer-copy (endereço
     desktop) saem do fluxo mobile de vez, substituídos pelo .mobile-footer
     (bloco único, com o degradê, que o Figma mobile já mostra).
     IMPORTANTE: ".contact"/".site-footer" são compartilhados com about.html
     (que também termina com CTA+wordmark+rodapé) — por isso essas 2 regras
     vêm prefixadas com ".home-page"/".about-page" (classes só no <body> de
     cada página), pra não esconder o CTA/endereço mobile de nenhuma outra
     página que ainda use ".contact"/".site-footer" sem ".mobile-footer"
     próprio (nenhuma no momento — about.html ganhou o seu próprio bloco
     nesta tarefa, igual à home). */
  .home-page .contact, .about-page .contact { display: none; }
  .home-page .site-footer-copy, .about-page .site-footer-copy { display: none; }
  .home-page .site-footer, .about-page .site-footer { padding: 0 var(--edge) clamp(24px, 6vw, 40px); }

  /* logo fixo no canto — some por padrão, some ".is-visible" (JS,
     updateHomeLogoDock em script.js) só depois que o hero sai da tela.
     "colado" de propósito (sem var(--edge)) — pedido explícito do usuário,
     diferente de todo outro controle fixo do site */
  .home-logo-fixed {
    display: block;
    position: fixed;
    z-index: 150;
    left: 0;
    top: 0;
    width: clamp(64px, 20vw, 84px);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity .3s ease, visibility 0s linear .3s;
  }
  .home-logo-fixed img { display: block; width: 100%; height: auto; }
  .home-logo-fixed.is-visible {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transition: opacity .3s ease;
  }

  /* --- grade de logos das produtoras ---
     1ª versão seguia as coordenadas soltas do Figma (posição própria por
     logo, sem alinhamento de grade de verdade) — usuário reportou 2
     problemas: (1) a altura da seção ficava travada num "aspect-ratio" fixo
     (393/539) que não tinha relação com quanto espaço os logos de verdade
     ocupavam, sobrando uma faixa vazia no fim que criava a aparência de uma
     "borda"/caixa antes do rodapé; (2) a distribuição não seguia uma grade
     de verdade (a 1ª linha do Figma, por exemplo, só tinha 2 logos com
     espaço de um 3º vazio). Trocado por uma grade de VERDADE — mesmo padrão
     do desktop (.clients-stage já é um CSS grid lá, só que com 4 colunas),
     aqui com 3 colunas, altura 100% natural (sai do conteúdo, sem sobra) —
     a última linha fica com o que sobrar. De quebra, "vision-lab" (que tinha
     ficado de fora só porque não aparecia no mockup solto do Figma) volta a
     aparecer também no mobile — com uma grade de verdade em vez de posições
     copiadas 1:1, não faz mais sentido excluir só ele (os outros 20 também
     não tinham exatamente essa posição/vizinhança no Figma). CLIENT_LOGOS
     tem 21 itens = 7 linhas de 3, sem sobra. */
  /* padding de baixo bem menor que o de cima (era simétrico) — pedido do
     usuário pra diminuir a distância entre a última linha de logos e o
     rodapé */
  .clients { padding: clamp(48px, 13vw, 96px) 0 clamp(16px, 4vw, 32px); }
  .clients-stage {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    align-items: center;
    justify-items: center;
    row-gap: clamp(28px, 8vw, 48px);
    column-gap: clamp(12px, 4vw, 24px);
    width: 100%;
  }
  .client-logo {
    height: clamp(36px, 10vw, 56px);
    transition: none; /* sem o scale(1.14) de hover do desktop — não faz sentido em touch */
  }
  .client-logo:hover { transform: none; }

  /* --- rodapé mobile unificado (Figma node 14040:1524, "footer") ---
     degradê de cima pra baixo #2e343a -> #12171f (mesmas cores de
     --menu-bg/--bg do site, só que combinadas num só bloco em vez de 2
     fundos sólidos separados) — proporção 393×555 do frame do Figma, todo o
     conteúdo interno posicionado em % relativo a essa mesma caixa. */
  .mobile-footer {
    display: block;
    position: relative;
    width: 100%;
    aspect-ratio: 393 / 555;
    overflow: hidden;
    background: linear-gradient(to bottom, var(--menu-bg) 0%, var(--bg) 100%);
    /* mesmo sem gap nenhum no box model (".clients"/".mobile-footer" sempre
       bateram encostados, 0px de diferença), sobrava uma linha fina bem
       escura na costura — o navegador antialiasa a borda de cada caixa
       (uma com fundo sólido, a outra com gradiente) separadamente, então um
       fiapo de 1px do fundo do body (--bg, bem mais escuro que a cor de
       cima do degradê) conseguia "vazar" entre as duas. Sobrepõe 1px de
       propósito pra nunca sobrar esse fiapo, não importa o arredondamento
       de sub-pixel de cada aspect-ratio */
    margin-top: -1px;
  }
  .mobile-footer-wordmark {
    position: absolute;
    left: 0;
    top: 27.75%;
    width: 100%;
    height: auto;
    pointer-events: none;
    user-select: none;
  }
  .mobile-footer-cta {
    position: absolute;
    z-index: 2;
    left: 50%;
    top: 38.74%;
    transform: translateX(-50%);
    display: inline-flex;
    align-items: center;
    gap: .5em;
    font-family: var(--font-mono);
    /* 25px no frame do Figma (393px de largura) = 6.36vw */
    font-size: clamp(18px, 6.36vw, 25px);
    white-space: nowrap;
  }
  .mobile-footer-cta-link {
    text-decoration: underline;
    text-underline-offset: .18em;
  }
  .mobile-footer-cta .arrow {
    /* mesma lógica do CTA desktop: seta maior que o texto (32px vs 25px no
       Figma = proporção 1.28), em vez de tamanho fixo */
    font-size: 1.28em;
  }
  .mobile-footer-social {
    position: absolute;
    z-index: 2;
    left: 50%;
    top: 69.37%;
    transform: translateX(-50%);
    display: flex;
    align-items: center;
    gap: 24px;
  }
  .mobile-footer-social-icon { display: block; }
  .mobile-footer-social-icon img {
    display: block;
    width: auto;
    /* ~21px no frame do Figma (393px de largura) = 5.34vw */
    height: clamp(18px, 5.34vw, 21px);
  }
  .mobile-footer-copy {
    position: absolute;
    left: 16.28%;
    top: 82.34%;
    width: 67.43%;
    text-align: center;
    font-size: 10px;
    letter-spacing: .05em;
    line-height: 1.5;
    /* "top:82.34%" cai na ponta de baixo do degradê (".mobile-footer",
       "--menu-bg"→"--bg"), então "--fg" (par de "--bg") é mais preciso
       aqui que "--menu-fg" */
    color: var(--fg);
  }
  .mobile-footer-copy p { margin: 2px 0; }

  .menu-links {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 28px;
  }
  .menu-link,
  .menu-link--center {
    position: static;
    transform: none !important;
    font-size: 28px;
  }
}

@media (prefers-reduced-motion: reduce) {
  /* a troca de vídeos continua funcionando (é o conteúdo, não só decoração) —
     só as transições viram instantâneas, sem animar opacidade/tamanho */
  .hero-video-frame, .hero-video, .hero-logo, #heroLogoLetterA1, .hero-logo-bracket, #heroLogoPushGroup { transition: none !important; }
  .contact-wordmark { transform: none !important; }
}
