/* ---------------------------------------------------------------------------
   copy.css — a Maxeville Tekst em tudo abaixo de 18 pt.

   REGRA DA CASA: a Tekst é a tipografia PRINCIPAL para qualquer tamanho
   abaixo de 18 pt (= 24 px). Construct e Regular são cortes de display e
   valem acima desse limiar. O transform.mjs marca com [data-copy] todo <p>
   cujo --framer-font-size inline fica abaixo de 24 px — nos exports isso é
   12, 13 e 14 px (copy, rótulos, nav, menu); o primeiro tamanho acima do
   limiar é 32 px.

   POR QUE UM ARQUIVO PRÓPRIO E NÃO tokens.css: as páginas do Framer NÃO
   carregam tokens.css (verificado: zero ocorrências em cada.html e
   index.html) — ele só entra nas páginas geradas pela loja. Os @font-face que
   as páginas de projeto usam vêm inline, no CSS que o Framer exporta. Então
   este arquivo é injetado pelo transform.mjs junto com os outros, e traz o
   @font-face consigo, sem depender de tokens.css.

   Antes o critério era "copy longo" (tamanho + mais de 60 caracteres), o que
   deixava rótulos e nav de 12-14px na Regular. A regra da casa não faz essa
   distinção: abaixo de 18 pt é texto, e texto é Tekst.

   UMA EXCEÇÃO: rótulo de botão fica na Construct — "a tipografia com os
   espaços". Não vale a pena listar quais: esses <p> já declaram a Construct
   no style inline do Framer, e o transform respeita essa declaração. Ou seja,
   a nav, o SELECTED WORK e os títulos de seção não são marcados.
   --------------------------------------------------------------------------- */

@font-face {
  font-family: 'Maxeville Tekst';
  src: url('/fonts/maxeville-tekst.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;   /* nunca esconde o copy esperando a fonte */
}

/* Marcado pelo build (transform.mjs) nos parágrafos que passam no critério de
   tamanho e comprimento — não por seletor de hash do Framer, que muda a cada
   re-export. A regra usa a família diretamente, com a Regular como primeiro
   fallback: se o woff2 falhar, o copy volta ao que era, não a uma serifada
   de sistema. */
/* A classe é repetida e o seletor casa com a do Framer de propósito.
   Medido: o Framer aplica `p.framer-text { font-family: var(--framer-font-family…) }`
   — especificidade (0,1,1) — e o faz num <style> inline que o export coloca
   DEPOIS dos nossos <link> no <head> (folhas 7 e 8, contra copy.css em 6).
   Empate de especificidade resolve pelo último a aparecer, então a regra do
   Framer vencia e o copy continuava em Regular.

   `p[data-copy][data-copy]` = (0,2,1), ganha sem depender de ordem e sem
   !important — que eu não teria como desfazer depois se você quiser voltar. */
p[data-copy][data-copy],
[data-copy][data-copy] {
  font-family: 'Maxeville Tekst', 'Maxeville Regular', 'General Sans', sans-serif;
}

/* ---------------------------------------------------------------------------
   Accordions de case study (espelho do Framer, com motion melhorada).

   Comportamento medido no site ao vivo (gravação 2026-09-02):
     · clique no título abre UM painel por vez (os outros fecham)
     · altura cresce e empurra os irmãos para baixo
     · ícone: + cinza fechado → quadrado preto aberto
     · corpo do texto some/aparece com a altura

   A variante closed do Framer trava height:40px (.framer-v-asecgf). Sem React
   o toggle mora em runtime.js (altura medida em px + transition). A classe
   .fel-accordion-open é o estado aberto; !important ganha da regra fechada.
   --------------------------------------------------------------------------- */
.framer-FNcnB[data-fel-acc] {
  overflow: hidden !important;
  will-change: height;
}

.framer-FNcnB.fel-accordion-open {
  height: min-content !important;
}

/* Corpo: some fechado, entra com a abertura.
   !important: o markReveals/motion pode deixar opacity:0 inline no data-reveal. */
.framer-FNcnB[data-fel-acc]:not(.fel-accordion-open) .framer-g68n0c {
  opacity: 0 !important;
  transition: opacity 0.22s ease;
}
.framer-FNcnB.fel-accordion-open .framer-g68n0c {
  opacity: 1 !important;
  transition: opacity 0.22s ease 0.08s;
}

/* Ícone 5×5 do Framer: vira + cinza fechado, quadrado preto aberto. */
.framer-FNcnB[data-fel-acc] .framer-1fb8scs {
  background-color: transparent !important;
  width: 7px !important;
  height: 7px !important;
}
.framer-FNcnB[data-fel-acc] .framer-1fb8scs::before,
.framer-FNcnB[data-fel-acc] .framer-1fb8scs::after {
  content: '';
  position: absolute;
  left: 50%;
  top: 50%;
  background: #828282;
  transform: translate(-50%, -50%);
  transition: background-color 0.2s ease, opacity 0.2s ease;
}
.framer-FNcnB[data-fel-acc] .framer-1fb8scs::before {
  width: 7px;
  height: 1.5px;
}
.framer-FNcnB[data-fel-acc] .framer-1fb8scs::after {
  width: 1.5px;
  height: 7px;
}
.framer-FNcnB.fel-accordion-open .framer-1fb8scs {
  background-color: #000 !important;
}
.framer-FNcnB.fel-accordion-open .framer-1fb8scs::before,
.framer-FNcnB.fel-accordion-open .framer-1fb8scs::after {
  opacity: 0;
}

@media (prefers-reduced-motion: reduce) {
  .framer-FNcnB[data-fel-acc] .framer-g68n0c,
  .framer-FNcnB[data-fel-acc] .framer-1fb8scs::before,
  .framer-FNcnB[data-fel-acc] .framer-1fb8scs::after {
    transition: none;
  }
}

/* ---------------------------------------------------------------------------
   FOUC do acordeão nas páginas de case.

   O intro ("DESIGN by FEL") NÃO é um overlay de tela cheia nestas páginas:
   .framer-nQ9AK é position:relative, sem o shell .framer-32eczs-container da
   home. O First Block (acordeão sticky + mosaico) pinta ao mesmo tempo, e o
   ABOUT chega aberto no SSR (data-framer-name="Open"). Resultado: a pilha
   branca aparece por cima da cortina no first paint.

   html.fel-intro-done entra quando a cortina termina (runtime.js). Páginas
   sem intro (geonav, jbs…) já nascem com a classe no <html>, via transform.
   O <style id="fel-acc-boot"> no <head> é a mesma regra, inline, para não
   esperar o <link> do copy.css.
   --------------------------------------------------------------------------- */
html:not(.fel-intro-done) body[data-project-page] .framer-FNcnB,
html:not(.fel-intro-done) body[data-project-page] [data-framer-name="ABOUT MAIN"] {
  opacity: 0 !important;
  visibility: hidden !important;
  pointer-events: none !important;
}

/* ---------------------------------------------------------------------------
   Coluna esquerda sticky (Menu = nav FEL/WORK/ABOUT + acordeão).

   O Framer já declara position:sticky;top:0 nela. Dois fatores desgrudavam:
     1. motion.js etiquetava essa coluna como [data-site-nav]. Ao rolar,
        html.m-nav-hidden faz translate(-100% - 80px) + opacity:0 — a pilha
        inteira some e sobra o vão branco de 30% ao lado do mosaico.
     2. Em ≥1920px o Framer troca a coluna para align-self:stretch / height:auto,
        então o sticky fica tão alto quanto o mosaico e não tem onde grudar.

   Mobile (max 809.98px): o Menu leva hidden-* (display:none) e o First Block
   vira coluna — não forçamos sticky, senão cobriria o mosaico.

   O BURACO DOS 810–1199 (13/09).
   ---------------------------------------------------------------------------
   A regra de 30% abaixo já tratava essa faixa como desktop — acordeão à
   esquerda, mosaico ao lado. O Framer, porém, só vira fileira acima de
   1199.98px. Entre 810 e 1200 ele ainda é o tablet: First Block em column,
   Mosaic travado em 380px, Menu com order:1 (vai PARA BAIXO). A coluna de
   30% sozinha, nesse empilhamento, não monta o desktop — só encolhe o
   Menu e deixa o mosaico numa tira estreita com um vão branco do tamanho
   da página. É o "grid desconfigurado" das páginas de projeto.

   Nasceu cruzado: a sticky de 30% veio da loja (Tekst / coluna que não
   colapsa) assumindo a fileira; o breakpoint de 1200 do Framer nunca foi
   puxado junto. Completar o que a regra já prometia — fileira, ordem
   zerada, mosaico nos 70% — não inventar outro layout.
   --------------------------------------------------------------------------- */
@media (min-width: 810px) {
  body[data-project-page] [data-framer-name="First Block"] {
    flex-direction: row;
    gap: 0;
  }
  body[data-project-page] [data-framer-name="First Block"] > [data-framer-name="Menu"] {
    position: sticky !important;
    top: 0 !important;
    align-self: flex-start !important;
    height: min-content !important;
    /* Geonav (e ≥1920 na Perzona) usa flex:1 0 0 + width:1px para encher a
       fileira. Sem uma base de 30% a coluna colapsa (~9px), o copy empilha na
       vertical e o sticky fica tão alto quanto o mosaico — some ao rolar. */
    flex: 0 0 30% !important;
    width: 30% !important;
    overflow: visible !important;
    z-index: 4;
    order: 0;
  }
  body[data-project-page] [data-framer-name="First Block"] > [data-framer-name="Mosaic"] {
    flex: 1 1 70%;
    width: 70%;
    min-width: 0;
    order: 0;
  }

  /* O HEADER DO MOSAICO (chip da marca + tags) É A MESMA FILEIRA.
     CADA/Geonav/a maioria só empilha abaixo de 810. B3 Digitas (e o
     breakpoint 1200 de algumas irmãs) ainda trata 810–1199 como tablet:
     o wrapper vira column, as tags ganham width:100% e caem DEBAIXO do
     chip. Não é layout novo: é o space-between que o Framer já declara
     no desktop. */
  body[data-project-page] [data-framer-name="Mosaic"] > :first-child {
    flex-direction: row !important;
    flex-wrap: nowrap !important;
    justify-content: space-between !important;
    align-items: flex-start !important;
    height: 70px !important;
    gap: 8px !important;
  }
  body[data-project-page] [data-framer-name="Mosaic"] > :first-child > *:last-child {
    flex: 1 0 0px !important;
    width: 1px !important;
    justify-content: flex-end !important;
  }
}

html.m-nav-hidden body[data-project-page] [data-site-nav][data-site-nav] {
  translate: none;
  opacity: 1;
  pointer-events: auto;
}
