/* ═══════════════════════════════════════════════════════════════
   ADVENTO DESIGN — Design System
   ---------------------------------------------------------------
   Conceito: "advento" é chegada. O elemento assinatura do site é
   A LINHA — um traço contínuo em gradiente rosa→laranja→amarelo que
   percorre a experiência: desenha o símbolo, marca o scroll, divide
   seções, sublinha links e mede o progresso do briefing.
   Um único dispositivo, muitas funções.
   ═══════════════════════════════════════════════════════════════ */

/* ─── 01. TIPOGRAFIA ─────────────────────────────────────────────
   Forma DJR Banner é a fonte oficial da marca (licença confirmada
   pelo cliente em 03/07/2026). Assim que os arquivos .woff2 forem
   entregues pela DJR/Adobe, basta soltá-los em /assets/fonts/ com
   os nomes abaixo — nenhuma outra alteração é necessária.
   Até lá o site usa Archivo (mesmo esqueleto grotesco) auto-hospedada.
   ---------------------------------------------------------------- */
/* ⚠️ ATIVE ESTE BLOCO quando receber os .woff2 da Forma DJR Banner:
   basta remover este comentário e soltar os arquivos em /assets/fonts/.
   Enquanto os arquivos não existem, mantê-los declarados custa 5 requisições
   404 em cada carregamento de página — por isso ficam desativados.
   Quando ativar: 'Hanken Grotesk' pode sair de --font-body (tokens logo
   abaixo) — ela é só o substituto de leitura enquanto a fonte real não chega,
   a Forma DJR Banner de verdade assume o corpo do texto também.

@font-face {
  font-family: 'Forma DJR Banner';
  src: url('/assets/fonts/FormaDJRBanner-Light.woff2') format('woff2');
  font-weight: 300; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Forma DJR Banner';
  src: url('/assets/fonts/FormaDJRBanner-Regular.woff2') format('woff2');
  font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Forma DJR Banner';
  src: url('/assets/fonts/FormaDJRBanner-Italic.woff2') format('woff2');
  font-weight: 400; font-style: italic; font-display: swap;
}
@font-face {
  font-family: 'Forma DJR Banner';
  src: url('/assets/fonts/FormaDJRBanner-Medium.woff2') format('woff2');
  font-weight: 500; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Forma DJR Banner';
  src: url('/assets/fonts/FormaDJRBanner-Bold.woff2') format('woff2');
  font-weight: 700; font-style: normal; font-display: swap;
}
*/

/* archivo latin-ext */
@font-face {
  font-family: 'Archivo';
  font-style: italic;
  font-weight: 300 700;
  font-stretch: 100%;
  font-display: swap;
  src: url('/assets/fonts/archivo-latin-ext-68099.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* archivo latin */
@font-face {
  font-family: 'Archivo';
  font-style: italic;
  font-weight: 300 700;
  font-stretch: 100%;
  font-display: swap;
  src: url('/assets/fonts/archivo-latin-63170.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* archivo latin-ext */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 300 700;
  font-stretch: 100%;
  font-display: swap;
  src: url('/assets/fonts/archivo-latin-ext-99696.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* archivo latin */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 300 700;
  font-stretch: 100%;
  font-display: swap;
  src: url('/assets/fonts/archivo-latin-60094.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* Hanken Grotesk — fallback de TEXTO DE CORPO enquanto a Forma DJR Banner não
   chega. A Archivo segura bem os títulos gigantes (condensada, confiante em
   maiúscula), mas em parágrafo e legenda minúscula ela lê apertada — os
   contadores das letras são estreitos demais para texto corrido. Hanken
   Grotesk é fonte variável (um arquivo cobre peso 300 a 800), x-height maior
   e contraparte mais aberta, sem sair do registro grotesco/geométrico que a
   marca pede. Enquanto os arquivos da Forma DJR Banner não chegam, ela some
   sozinha da pilha assim que a real for ativada — ver bloco no topo do arquivo. */
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: normal;
  font-weight: 300 800;
  font-display: swap;
  src: url('/assets/fonts/hanken-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: normal;
  font-weight: 300 800;
  font-display: swap;
  src: url('/assets/fonts/hanken-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: italic;
  font-weight: 300 800;
  font-display: swap;
  src: url('/assets/fonts/hanken-latin-italic.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Hanken Grotesk';
  font-style: italic;
  font-weight: 300 800;
  font-display: swap;
  src: url('/assets/fonts/hanken-latin-ext-italic.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Space Grotesk — opção de fonte para TÍTULOS, escolhida em /admin/aparencia.
   Só a família 'normal' existe (sem itálico real); nesse caso o navegador
   sintetiza um oblíquo — aceitável em título, onde o itálico é raro. */
@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url('/assets/fonts/space-grotesk-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url('/assets/fonts/space-grotesk-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Big Shoulders — condensada industrial, alternativa de TÍTULO à Archivo.
   Mesma ressalva: sem itálico real na família. */
@font-face {
  font-family: 'Big Shoulders';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('/assets/fonts/big-shoulders-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Big Shoulders';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('/assets/fonts/big-shoulders-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Inter — opção de fonte para PARÁGRAFO. x-height grande, desenhada pra
   tela pequena; a mais neutra das opções, mas a mais testada do mundo. */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300 800;
  font-display: swap;
  src: url('/assets/fonts/inter-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300 800;
  font-display: swap;
  src: url('/assets/fonts/inter-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Inter';
  font-style: italic;
  font-weight: 300 800;
  font-display: swap;
  src: url('/assets/fonts/inter-latin-italic.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: italic;
  font-weight: 300 800;
  font-display: swap;
  src: url('/assets/fonts/inter-latin-ext-italic.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}


/* manrope latin */
@font-face {
  font-family: 'Manrope';
  font-style: normal; font-weight: 300 800; font-display: swap;
  src: url('/assets/fonts/manrope-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* manrope latin-ext */
@font-face {
  font-family: 'Manrope';
  font-style: normal; font-weight: 300 800; font-display: swap;
  src: url('/assets/fonts/manrope-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* sora latin */
@font-face {
  font-family: 'Sora';
  font-style: normal; font-weight: 300 700; font-display: swap;
  src: url('/assets/fonts/sora-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* sora latin-ext */
@font-face {
  font-family: 'Sora';
  font-style: normal; font-weight: 300 700; font-display: swap;
  src: url('/assets/fonts/sora-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* instrument sans latin */
@font-face {
  font-family: 'Instrument Sans';
  font-style: normal; font-weight: 400 700; font-display: swap;
  src: url('/assets/fonts/instrument-sans-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* instrument sans latin-ext */
@font-face {
  font-family: 'Instrument Sans';
  font-style: normal; font-weight: 400 700; font-display: swap;
  src: url('/assets/fonts/instrument-sans-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* instrument sans latin italic */
@font-face {
  font-family: 'Instrument Sans';
  font-style: italic; font-weight: 400 700; font-display: swap;
  src: url('/assets/fonts/instrument-sans-latin-italic.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* instrument sans latin-ext italic */
@font-face {
  font-family: 'Instrument Sans';
  font-style: italic; font-weight: 400 700; font-display: swap;
  src: url('/assets/fonts/instrument-sans-latin-ext-italic.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* jbmono latin-ext */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/jbmono-latin-ext-72469.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* jbmono latin */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/jbmono-latin-14064.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* jbmono latin-ext */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('/assets/fonts/jbmono-latin-ext-72469.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* jbmono latin */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('/assets/fonts/jbmono-latin-14064.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* ─── 02. TOKENS ─────────────────────────────────────────────────
   A identidade é gráfica e editorial, não "UI arredondada":
   raio quase sempre 0, sombra quase nunca, contraste sempre.
   ---------------------------------------------------------------- */
:root {
  /* Cor — valores oficiais do MASTER PROMPT */
  --color-black:   #000000;
  --color-pink:    #FF0C6A;
  --color-purple:  #4E4797;
  --color-yellow:  #E8E220;
  --color-white:   #FFFFFF;
  --color-orange:  #FF6B2C;   /* ponto médio do gradiente da marca */

  /* Superfícies derivadas do preto — não são cinzas neutros:
     carregam um traço do roxo para o preto nunca ficar "morto". */
  --surface-0:  #000000;
  --surface-1:  #08080B;
  --surface-2:  #101015;
  --surface-3:  #17171E;
  --line:       rgba(255,255,255,.13);
  --line-strong:rgba(255,255,255,.28);
  --text:       #FFFFFF;
  --text-soft:  rgba(255,255,255,.72);
  --text-mute:  rgba(255,255,255,.58);

  /* Gradiente proprietário — a "linha de energia" da marca */
  --color-gradient: linear-gradient(90deg, var(--color-pink) 0%, var(--color-orange) 52%, var(--color-yellow) 100%);
  --gradient-v:     linear-gradient(180deg, var(--color-pink) 0%, var(--color-orange) 52%, var(--color-yellow) 100%);

  /* Cor de acento corrente — cada território reescreve esta variável
     e todo o bloco (linha, hover, foco, tag) acompanha sozinho. */
  --accent: var(--color-pink);
  --on-accent: var(--color-black);

  /* Tipografia */
  --font-display: 'Forma DJR Banner', 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  /* Corpo de texto: Hanken Grotesk antes da Archivo — mais legível em
     parágrafo e legenda minúscula, ver nota junto ao @font-face acima. */
  --font-body:    'Forma DJR Banner', 'Hanken Grotesk', 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  --font-mono:    'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;

  /* Escala tipográfica fluida — clamp em vez de breakpoints:
     o texto respira em qualquer largura sem salto. */
  --step--2: clamp(.69rem, .66rem + .12vw, .75rem);
  --step--1: clamp(.82rem, .78rem + .18vw, .92rem);
  --step-0:  clamp(1rem, .96rem + .2vw, 1.12rem);
  --step-1:  clamp(1.2rem, 1.1rem + .5vw, 1.5rem);
  --step-2:  clamp(1.5rem, 1.3rem + 1vw, 2.1rem);
  --step-3:  clamp(1.9rem, 1.5rem + 2vw, 3rem);
  --step-4:  clamp(2.4rem, 1.7rem + 3.4vw, 4.4rem);
  --step-5:  clamp(2.5rem, 1.5rem + 4.6vw, 5.4rem);
  --step-6:  clamp(2.9rem, 1.4rem + 6.4vw, 7.4rem);

  /* Espaço — escala de 4px com passos largos no topo,
     porque a direção pede grandes áreas de respiro. */
  --space-1: .25rem;  --space-2: .5rem;   --space-3: .75rem;
  --space-4: 1rem;    --space-5: 1.5rem;  --space-6: 2rem;
  --space-7: 3rem;    --space-8: 4rem;    --space-9: 6rem;
  --space-10: 8rem;   --space-11: 11rem;
  --section-y: clamp(4.5rem, 3rem + 8vw, 11rem);

  /* Grid */
  --gutter: clamp(1.25rem, .8rem + 2vw, 3rem);
  --rail: 0px;                 /* trilho lateral: 0 no mobile */
  --max: 1680px;

  /* Raio e sombra — usados com parcimônia deliberada */
  --radius-0: 0;
  --radius-pill: 999px;
  --shadow-lift: 0 24px 60px -24px rgba(0,0,0,.9);

  /* Motion */
  --ease-out: cubic-bezier(.16, 1, .3, 1);
  --ease-in-out: cubic-bezier(.65, 0, .35, 1);
  --dur-1: 160ms;   /* microinteração */
  --dur-2: 320ms;   /* estado */
  --dur-3: 620ms;   /* entrada de seção */
  --dur-4: 1100ms;  /* destaque / símbolo */

  --header-h: 72px;
  color-scheme: dark;
}

@media (min-width: 1024px) {
  :root { --rail: 76px; --header-h: 84px; }
}

/* Territórios: trocar o tema é trocar duas variáveis. */
[data-territory="marcas"]   { --accent: var(--color-pink);   --on-accent: #fff; }
[data-territory="sites"]    { --accent: var(--color-yellow); --on-accent: #000; }
[data-territory="sistemas"] { --accent: var(--color-purple); --on-accent: #fff; }
[data-territory="crms"]     { --accent: var(--color-orange); --on-accent: #000; }


/* O display de uma classe empata em especificidade com o [hidden] da folha do
   navegador e, vindo depois, vence — um elemento com o atributo hidden continua
   na tela. O JS deste projeto liga e desliga coisas por .hidden (filtro do
   portfólio, linhas de tabela, avisos), então o atributo precisa ser soberano. */
[hidden] { display: none !important; }

/* ─── 03. RESET E BASE ───────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-h) + 1rem);
}

body {
  background: var(--surface-0);
  color: var(--text);
  font-family: var(--font-body);
  font-size: var(--step-0);
  font-weight: 400;
  line-height: 1.55;
  letter-spacing: -.005em;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: clip;
  min-height: 100svh;
}

img, svg, video { display: block; max-width: 100%; height: auto; }
button, input, select, textarea { font: inherit; color: inherit; }
a { color: inherit; text-decoration: none; }
ul, ol { list-style: none; padding: 0; }

::selection { background: var(--color-pink); color: #fff; }

:focus-visible {
  outline: 2px solid var(--color-yellow);
  outline-offset: 3px;
  border-radius: 2px;
}

.skip-link {
  position: absolute; top: -100px; left: var(--space-4); z-index: 999;
  background: var(--color-yellow); color: #000;
  padding: .75rem 1.25rem; font-family: var(--font-mono);
  font-size: var(--step--1); text-transform: uppercase; letter-spacing: .06em;
}
.skip-link:focus { top: var(--space-4); }

.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* ─── 04. TIPOGRAFIA APLICADA ─────────────────────────────────────
   O display trabalha em caixa alta, tracking negativo e leading
   fechado: o título é bloco gráfico, não linha de texto.
   ------------------------------------------------------------------ */
.display, h1, h2, h3 {
  font-family: var(--font-display);
  font-weight: 500;
  line-height: .95;
  letter-spacing: -.022em;
  text-wrap: balance;
}

.t-hero    { font-size: clamp(2.6rem, 1.5rem + 5vw, 6rem); font-weight: 500; text-transform: uppercase; line-height: .9; letter-spacing: -.022em; word-spacing: .06em; }
.t-display { font-size: var(--step-5); text-transform: uppercase; line-height: .9; letter-spacing: -.022em; word-spacing: .05em; }
.t-title   { font-size: var(--step-4); text-transform: uppercase; line-height: .95; }
.t-section { font-size: var(--step-3); }
/* t-sub também veste parágrafo de 2-3 linhas (pitch de território, corpo de
   serviço) — não só título curto. line-height 1.1 e letter-spacing -.02em
   foram calibrados olhando só pro título e esmagavam qualquer texto que
   quebrasse linha. Título curto não estranha 1.25; parágrafo agradece. */
.t-sub     { font-size: var(--step-2); font-weight: 400; letter-spacing: -.008em; line-height: 1.25; }
.t-lead    { font-size: var(--step-1); font-weight: 400; line-height: 1.45; color: var(--text-soft); letter-spacing: -.006em; max-width: 40ch; }
.t-body    { font-size: var(--step-0); line-height: 1.6; color: var(--text-soft); max-width: 62ch; }
.t-small   { font-size: var(--step--1); line-height: 1.5; color: var(--text-mute); }

/* O itálico da DJR entra em momentos pontuais — nunca em blocos. */
.t-italic { font-style: italic; font-weight: 400; letter-spacing: -.02em; }

/* Voz técnica: a mono carrega rótulos, contadores e dados.
   Ela existe porque metade do que o estúdio entrega é sistema. */
.eyebrow {
  font-family: var(--font-mono);
  font-size: var(--step--2);
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: .16em;
  color: var(--text-mute);
  display: flex; align-items: center; gap: .7rem;
}
.eyebrow::before {
  content: ''; width: 1.75rem; height: 1px; flex: none;
  background: var(--accent);
}
.eyebrow--plain::before { display: none; }
.eyebrow--accent { color: var(--accent); }

.mono { font-family: var(--font-mono); font-size: var(--step--2); letter-spacing: .08em; }

/* Texto pintado com o gradiente da marca. Uso restrito: uma palavra. */
.grad { color: var(--color-pink); }
@supports (background-clip: text) or (-webkit-background-clip: text) {
  .grad {
    background: var(--color-gradient);
    -webkit-background-clip: text; background-clip: text;
    color: transparent;
  }
}

.prose p + p { margin-top: 1.1em; }
.prose p { color: var(--text-soft); max-width: 62ch; }
.prose a { color: var(--accent); text-decoration: underline; text-underline-offset: .2em; }

/* ─── 05. GRID E LAYOUT ───────────────────────────────────────────
   12 colunas no desktop, 8 no tablet, 4 no mobile.
   O trilho esquerdo (--rail) é reservado para a linha de scroll.
   ------------------------------------------------------------------ */
.shell {
  width: 100%;
  max-width: var(--max);
  margin-inline: auto;
  padding-inline: var(--gutter);
  padding-left: calc(var(--gutter) + var(--rail));
}

.grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--gutter);
}
@media (min-width: 768px)  { .grid { grid-template-columns: repeat(8, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .grid { grid-template-columns: repeat(12, minmax(0, 1fr)); } }

.section { padding-block: var(--section-y); position: relative; }
.section--tight { padding-block: calc(var(--section-y) * .55); }
.section--flush-top { padding-top: 0; }

.stack > * + * { margin-top: var(--space-5); }
.stack-sm > * + * { margin-top: var(--space-3); }
.stack-lg > * + * { margin-top: var(--space-7); }

/* Quebra proposital do grid: o título avança sobre a margem. */
.bleed-left  { margin-left: calc(var(--rail) * -1); }
@media (min-width: 1024px) { .bleed-right { margin-right: calc(var(--gutter) * -1); } }

.section-head {
  display: flex; flex-wrap: wrap; align-items: end;
  justify-content: space-between; gap: var(--space-5);
  margin-bottom: var(--space-8);
}

/* ─── 06. A LINHA — elemento assinatura ──────────────────────────── */

/* Trilho fixo à esquerda: barra de progresso do documento inteiro.
   No mobile o trilho não existe; a linha vira um fio no topo. */
.rail {
  position: fixed; inset-block: 0; left: 0; width: var(--rail);
  z-index: 60; pointer-events: none;
  display: none;
}
@media (min-width: 1024px) {
  .rail { display: block; }
  .rail::before {
    content: ''; position: absolute; left: 50%; top: 0; bottom: 0;
    width: 1px; background: var(--line);
  }
  .rail__progress {
    position: absolute; left: 50%; top: 0; width: 1px;
    height: var(--scroll, 0%);
    background: var(--gradient-v);
    box-shadow: 0 0 12px 0 rgba(255,12,106,.5);
  }
  .rail__label {
    position: absolute; bottom: var(--space-7); left: 50%;
    transform: translateX(-50%) rotate(180deg);
    writing-mode: vertical-rl;
    font-family: var(--font-mono); font-size: var(--step--2);
    letter-spacing: .28em; text-transform: uppercase;
    color: var(--text-mute);
  }
  .rail__mark {
    position: absolute; top: calc(var(--header-h) / 2); left: 50%;
    transform: translate(-50%, -50%);
    width: 12px; height: 12px;
    background: var(--accent);
  }
}

/* Fio de progresso no topo (mobile e como reforço no desktop) */
.thread {
  position: fixed; top: 0; left: 0; height: 2px; z-index: 70;
  width: var(--scroll, 0%);
  background: var(--color-gradient);
  transition: width 80ms linear;
}
@media (min-width: 1024px) { .thread { display: none; } }

/* Divisor de seção: a mesma linha, na horizontal. */
.hr-line {
  height: 1px; border: 0; background: var(--line);
  position: relative; overflow: hidden;
}
.hr-line::after {
  content: ''; position: absolute; inset: 0;
  background: var(--color-gradient);
  transform: scaleX(var(--reveal, 0)); transform-origin: left;
  transition: transform var(--dur-4) var(--ease-out);
}
.is-visible .hr-line::after, .hr-line.is-visible::after { --reveal: 1; }

/* ─── 07. COMPONENTES ─────────────────────────────────────────────
   Todo elemento interativo tem os cinco estados: normal, hover,
   focus, active e — quando faz sentido — disabled.
   ------------------------------------------------------------------ */

/* Botão primário: retângulo sólido, sem raio. O gradiente entra
   como faixa que sobe por trás do rótulo no hover. */
.btn {
  /* var(--accent), não var(--color-pink): o botão primário é o elemento que
     mais aparece na página, então é ele que devia puxar a cor do território
     em que está. Hardcoded em rosa, ele ficava rosa até dentro da seção
     roxa de Sistemas — o único componente que não seguia a própria régua
     do design system ("cada território reescreve --accent e todo o bloco
     acompanha sozinho"). */
  --btn-bg: var(--accent);
  --btn-fg: var(--on-accent, #fff);
  position: relative; isolation: isolate;
  display: inline-flex; align-items: center; gap: .65rem;
  padding: 1.05rem 1.6rem;
  background: var(--btn-bg); color: var(--btn-fg);
  border: 1px solid var(--btn-bg);
  border-radius: var(--radius-0);
  font-family: var(--font-mono);
  font-size: var(--step--1); font-weight: 500;
  text-transform: uppercase; letter-spacing: .1em;
  cursor: pointer;
  transition: color var(--dur-2) var(--ease-out), border-color var(--dur-2) var(--ease-out);
}
.btn::before {
  content: ''; position: absolute; inset: 0; z-index: -1;
  background: var(--color-gradient);
  transform: scaleY(0); transform-origin: bottom;
  transition: transform var(--dur-2) var(--ease-out);
}
.btn:hover::before, .btn:focus-visible::before { transform: scaleY(1); }
.btn:hover, .btn:focus-visible { color: #000; }
.btn:active { transform: translateY(1px); }
.btn[disabled], .btn[aria-disabled="true"] {
  opacity: .4; pointer-events: none;
}
.btn__arrow { transition: transform var(--dur-2) var(--ease-out); }
.btn:hover .btn__arrow { transform: translateX(4px); }

.btn--ghost { --btn-bg: transparent; --btn-fg: #fff; border-color: var(--line-strong); }
.btn--ghost:hover, .btn--ghost:focus-visible { border-color: transparent; }
.btn--yellow { --btn-bg: var(--color-yellow); --btn-fg: #000; }
.btn--sm { padding: .7rem 1.1rem; font-size: var(--step--2); }

/* Link editorial: a linha da marca desenha o sublinhado. */
.link {
  position: relative; display: inline-flex; align-items: center; gap: .4rem;
  padding-bottom: 2px;
}
.link::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1px;
  background: var(--color-gradient);
  transform: scaleX(0); transform-origin: right;
  transition: transform var(--dur-2) var(--ease-out);
}
.link:hover::after, .link:focus-visible::after { transform: scaleX(1); transform-origin: left; }

.tag {
  display: inline-flex; align-items: center;
  font-family: var(--font-mono); font-size: var(--step--2);
  text-transform: uppercase; letter-spacing: .12em;
  padding: .35rem .7rem;
  border: 1px solid var(--line-strong); color: var(--text-soft);
}
.tag--accent { border-color: var(--accent); color: var(--accent); }

/* Pílulas de filtro — o único componente com raio, de propósito:
   contrasta com a rigidez editorial de todo o resto. */
.pill {
  border: 1px solid var(--line-strong); background: transparent;
  border-radius: var(--radius-pill);
  padding: .55rem 1.1rem;
  font-family: var(--font-mono); font-size: var(--step--2);
  text-transform: uppercase; letter-spacing: .1em;
  color: var(--text-mute); cursor: pointer;
  transition: color var(--dur-2), border-color var(--dur-2), background var(--dur-2);
}
.pill:hover { color: #fff; border-color: #fff; }
.pill[aria-pressed="true"] { background: #fff; border-color: #fff; color: #000; }

/* ─── Cabeçalho ─────────────────────────────────────────────────── */
.header {
  position: fixed; top: 0; left: 0; right: 0; z-index: 80;
  height: var(--header-h);
  display: flex; align-items: center;
  padding-inline: var(--gutter);
  padding-left: calc(var(--gutter) + var(--rail));
  transition: background var(--dur-2) var(--ease-out), border-color var(--dur-2);
  border-bottom: 1px solid transparent;
}
.header[data-scrolled="true"] {
  background: rgba(0,0,0,.82);
  backdrop-filter: blur(14px);
  border-bottom-color: var(--line);
}
.header[data-hidden="true"] { transform: translateY(-100%); }
.header { transition: transform var(--dur-3) var(--ease-out), background var(--dur-2), border-color var(--dur-2); }

.header__inner {
  width: 100%; max-width: var(--max); margin-inline: auto;
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-5);
}

.brand { display: flex; align-items: center; }
/* Logo completa (símbolo + "Advento Design" em duas linhas) como
   máscara, não <img> — mesmo tratamento do símbolo solto no hero:
   herda o gradiente da marca e acompanha qualquer troca de cor. */
.brand__logo {
  height: 38px; width: auto; aspect-ratio: 1718 / 650; flex: none;
  background: var(--color-gradient);
  -webkit-mask: url('/assets/img/logo.svg') no-repeat center / contain;
  mask: url('/assets/img/logo.svg') no-repeat center / contain;
}

.nav { display: none; }
@media (min-width: 1024px) {
  .nav { display: flex; align-items: center; gap: var(--space-6); }
}
.nav__link {
  font-family: var(--font-mono); font-size: var(--step--2);
  text-transform: uppercase; letter-spacing: .12em;
  color: var(--text-mute); position: relative; padding-block: .35rem;
  transition: color var(--dur-2);
}
.nav__link:hover, .nav__link:focus-visible { color: #fff; }
.nav__link[aria-current="page"] { color: #fff; }
.nav__link[aria-current="page"]::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: -2px; height: 1px;
  background: var(--color-gradient);
}

.burger {
  display: inline-flex; flex-direction: column; justify-content: center; gap: 5px;
  width: 44px; height: 44px; padding: 0 10px;
  background: none; border: 0; cursor: pointer;
}
@media (min-width: 1024px) { .burger { display: none; } }
.burger span { height: 1.5px; background: #fff; transition: transform var(--dur-2) var(--ease-out), opacity var(--dur-1); }
.burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
.burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }

/* Menu mobile: painel cheio, tipografia grande, sem ruído. */
.menu {
  position: fixed; inset: 0; z-index: 75;
  background: var(--surface-0);
  padding: calc(var(--header-h) + var(--space-6)) var(--gutter) var(--space-7);
  display: flex; flex-direction: column; justify-content: space-between;
  clip-path: inset(0 0 100% 0);
  transition: clip-path var(--dur-3) var(--ease-out);
  visibility: hidden;
}
.menu[data-open="true"] { clip-path: inset(0 0 0 0); visibility: visible; }
.menu__link {
  display: block; font-family: var(--font-display);
  font-size: var(--step-4); text-transform: uppercase;
  letter-spacing: -.03em; line-height: 1.05;
  padding-block: .18em; border-bottom: 1px solid var(--line);
}
.menu__link:last-of-type { border-bottom: 0; }
.menu__meta { display: flex; flex-wrap: wrap; gap: var(--space-4); }

/* ─── Frase de fechamento ───────────────────────────────────────── */
.closing-line { padding-block: var(--space-8); border-top: 1px solid var(--line); }
.closing-line .t-lead { text-align: center; margin-inline: auto; max-width: 34ch; color: var(--text); }

/* ─── Rodapé ────────────────────────────────────────────────────── */
.footer { border-top: 1px solid var(--line); padding-block: var(--space-9) var(--space-6); }
.footer__word {
  font-family: var(--font-display); text-transform: uppercase;
  font-size: clamp(3rem, 14vw, 15rem); line-height: .8; letter-spacing: -.05em;
  color: transparent; -webkit-text-stroke: 1px var(--line-strong);
  margin-bottom: var(--space-8); user-select: none;
}
.footer__cols { display: grid; gap: var(--space-7); grid-template-columns: repeat(2, 1fr); }
@media (min-width: 768px) { .footer__cols { grid-template-columns: repeat(4, 1fr); } }
.footer__bar {
  margin-top: var(--space-8); padding-top: var(--space-5);
  border-top: 1px solid var(--line);
  display: flex; flex-wrap: wrap; gap: var(--space-4); justify-content: space-between;
}

/* ─── Formulários ───────────────────────────────────────────────── */
.field { display: block; }
.field__label {
  display: block; margin-bottom: .55rem;
  font-family: var(--font-mono); font-size: var(--step--2);
  text-transform: uppercase; letter-spacing: .12em; color: var(--text-mute);
}
.field__req { color: var(--accent); }
.input, .textarea, .select {
  width: 100%; padding: .95rem 1rem;
  background: var(--surface-2); color: #fff;
  border: 1px solid var(--line); border-radius: var(--radius-0);
  transition: border-color var(--dur-2), background var(--dur-2);
}
.input::placeholder, .textarea::placeholder { color: rgba(255,255,255,.28); }
.input:hover, .textarea:hover, .select:hover { border-color: var(--line-strong); }
.input:focus, .textarea:focus, .select:focus {
  outline: none; border-color: var(--accent); background: var(--surface-3);
}
.textarea { min-height: 9rem; resize: vertical; line-height: 1.5; }
.select { appearance: none; background-image: linear-gradient(45deg, transparent 50%, #fff 50%), linear-gradient(135deg, #fff 50%, transparent 50%);
  background-position: calc(100% - 20px) 50%, calc(100% - 14px) 50%;
  background-size: 6px 6px, 6px 6px; background-repeat: no-repeat; padding-right: 2.5rem; }
.field__error { display: block; margin-top: .45rem; font-size: var(--step--1); color: var(--color-pink); }
.field[data-invalid="true"] .input, .field[data-invalid="true"] .textarea { border-color: var(--color-pink); }

/* Escolha múltipla desenhada como bloco, não como checkbox de sistema. */
.choice { position: relative; display: block; cursor: pointer; }
.choice input { position: absolute; opacity: 0; inset: 0; cursor: pointer; }
.choice__box {
  display: flex; align-items: center; gap: .8rem;
  padding: 1rem 1.1rem; border: 1px solid var(--line);
  background: var(--surface-1);
  transition: border-color var(--dur-2), background var(--dur-2), color var(--dur-2);
}
.choice:hover .choice__box { border-color: var(--line-strong); }
.choice input:focus-visible + .choice__box { outline: 2px solid var(--color-yellow); outline-offset: 2px; }
.choice input:checked + .choice__box { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 14%, transparent); }
.choice__key {
  flex: none; width: 1.6rem; height: 1.6rem; display: grid; place-items: center;
  border: 1px solid var(--line-strong);
  font-family: var(--font-mono); font-size: 11px; color: var(--text-mute);
}
.choice input:checked + .choice__box .choice__key { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }

/* Escolha visual — a opção mostra a própria fonte que descreve, sem
   precisar de imagem: "Aa" grande renderizado na font-family da
   opção. Usada hoje só na pergunta de estilo de fonte do briefing
   de identidade, mas serve pra qualquer escolha que se explica
   melhor mostrada do que escrita. */
.bf-options--visual { grid-template-columns: repeat(auto-fill, minmax(9.5rem, 1fr)); gap: .8rem; }
.choice--visual .choice__box {
  flex-direction: column; align-items: stretch; gap: 0;
  padding: 0; overflow: hidden;
}
.choice__sample {
  display: flex; align-items: center; justify-content: center;
  min-height: 5.5rem; font-size: 2.4rem; line-height: 1;
  background: var(--surface-2); color: var(--text);
  border-bottom: 1px solid var(--line);
}
.choice--visual .choice__box > span:last-child { padding: .7rem .9rem .8rem; }
.choice__help { display: block; margin-top: .2rem; font-size: var(--step--2); color: var(--text-mute); font-family: var(--font-mono); }
.choice input:checked + .choice__box .choice__sample { background: color-mix(in srgb, var(--accent) 20%, var(--surface-2)); }

.alert {
  padding: 1rem 1.1rem; border-left: 2px solid var(--accent);
  background: var(--surface-2); font-size: var(--step--1);
}
.alert--error { --accent: var(--color-pink); }
.alert--ok { --accent: var(--color-yellow); }

/* Aviso interno de conteúdo pendente — nunca vai ao ar sem revisão. */
.todo {
  display: inline-block; font-family: var(--font-mono); font-size: var(--step--2);
  background: repeating-linear-gradient(45deg, rgba(232,226,32,.16) 0 8px, transparent 8px 16px);
  border: 1px dashed var(--color-yellow); color: var(--color-yellow);
  padding: .2rem .5rem;
}

/* ─── 08. MOTION ──────────────────────────────────────────────────
   Hierarquia (regra 30): 1 microinteração · 2 entrada de seção ·
   3 destaque (hero e cases) · 4 experimental.
   Só transform, opacity e clip-path — propriedades que compõem.
   ------------------------------------------------------------------ */
/* O estado "escondido antes de revelar" só existe com .js no <html>
   (setado por um script inline síncrono em base.php, antes do primeiro
   paint). Sem JavaScript, essas regras nunca aplicam e o conteúdo
   nasce visível — página continua utilizável mesmo se o script
   falhar ou não rodar (crawler, erro de rede, JS desabilitado). */
.js [data-reveal]:not(.word-reveal) {
  opacity: 0;
  transform: translate3d(0, 22px, 0);
  transition: opacity var(--dur-3) var(--ease-out), transform var(--dur-3) var(--ease-out);
  transition-delay: var(--delay, 0ms);
}
.js [data-reveal]:not(.word-reveal).is-visible { opacity: 1; transform: none; }

/* Subhead do hero: a palavra entra em cascata, não o parágrafo como
   bloco só — por isso o .word-reveal fica de fora da regra acima e
   cada <span> filho ganha seu próprio delay (--wd, escrito inline). */
.js .word-reveal .word-reveal__w {
  display: inline-block;
  opacity: 0;
  transform: translate3d(0, 10px, 0);
  transition: opacity var(--dur-2) var(--ease-out), transform var(--dur-2) var(--ease-out);
  transition-delay: var(--wd, 0ms);
}
.js .word-reveal.is-visible .word-reveal__w { opacity: 1; transform: none; }

.js [data-reveal="mask"] { opacity: 1; transform: none; clip-path: inset(0 0 101% 0); transition: clip-path var(--dur-3) var(--ease-out); transition-delay: var(--delay, 0ms); }
.js [data-reveal="mask"].is-visible { clip-path: inset(0 0 0 0); }

.js [data-reveal="scale"] { opacity: 0; transform: scale(1.04); }
.js [data-reveal="scale"].is-visible { opacity: 1; transform: none; }

/* Linhas de título reveladas por máscara, uma a uma.

   O line-height de .9 deixa a caixa mais baixa que o ascendente da fonte, então
   o overflow:hidden da máscara cortava o acento das maiúsculas — "NÓS" aparecia
   como "NOS". O respiro no topo devolve o espaço da tinta e a margem negativa
   devolve o espaço do layout, então o ritmo entre as linhas não muda. */
.line-mask {
  display: block;
  overflow: hidden;
  padding-top: .14em;
  margin-top: -.14em;
}
.line-mask > span {
  display: block;
  transform: translate3d(0, 105%, 0);
  transition: transform var(--dur-4) var(--ease-out);
  transition-delay: var(--delay, 0ms);
}
.is-visible .line-mask > span, .line-mask.is-visible > span { transform: none; }

/* Marquee do manifesto. Pausa no hover e no reduced-motion. */
.marquee { overflow: hidden; border-block: 1px solid var(--line); padding-block: var(--space-5); }
.marquee__track { display: flex; width: max-content; animation: marquee 38s linear infinite; }
.marquee:hover .marquee__track { animation-play-state: paused; }
.marquee__item {
  font-family: var(--font-display); text-transform: uppercase;
  font-size: clamp(1.6rem, 5vw, 3.4rem); letter-spacing: -.03em;
  padding-inline: 1.5rem; white-space: nowrap; color: var(--text-mute);
}
.marquee__item em { font-style: italic; color: #fff; }
.marquee__dot { align-self: center; width: 8px; height: 8px; background: var(--color-pink); flex: none; }
@keyframes marquee { to { transform: translateX(-50%); } }

/* Transição entre páginas: a linha da marca varre a tela. */
.page-veil {
  position: fixed; inset: 0; z-index: 300; pointer-events: none;
  background: var(--surface-0);
  transform: scaleY(0); transform-origin: bottom;
}
.page-veil::after {
  content: ''; position: absolute; inset-inline: 0; top: 0; height: 2px;
  background: var(--color-gradient);
}
body[data-leaving="true"] .page-veil {
  transform: scaleY(1); transform-origin: bottom;
  transition: transform 480ms var(--ease-in-out);
}

/* Regra 38: quem pediu menos movimento recebe menos movimento. */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
  [data-reveal], .line-mask > span { opacity: 1 !important; transform: none !important; clip-path: none !important; }
  .marquee__track { animation: none; }
}

/* ─── 09. HERO ────────────────────────────────────────────────────
   A tese da página: o símbolo da marca sendo construído por uma
   varredura da linha, e a frase que o estúdio já usa como manifesto.
   ------------------------------------------------------------------ */
.hero {
  padding-top: calc(var(--header-h) + var(--space-8));
  padding-bottom: var(--space-8);
  display: flex; flex-direction: column;
  gap: var(--space-8);
  position: relative; overflow: clip;
}

/* O símbolo é revelado por uma máscara que sobe — a marca "chega".
   Nunca é redesenhado nem deformado: é o arquivo original. Antes
   competia com um H1 de 4 linhas em --step-6; com o hero mais curto
   ele finalmente respira e fica visível de verdade, não um traço. */
.hero__symbol {
  position: absolute; right: calc(var(--gutter) * -1); top: 4%;
  width: clamp(220px, 34vw, 560px); aspect-ratio: 294 / 393;
  background: var(--color-gradient);
  -webkit-mask: url('/assets/img/simbolo-advento.svg') no-repeat center / contain;
  mask: url('/assets/img/simbolo-advento.svg') no-repeat center / contain;
  opacity: .18;
  clip-path: inset(100% 0 0 0);
  animation: symbol-arrive 1400ms var(--ease-out) 200ms forwards;
  pointer-events: none;
}
@media (min-width: 1024px) { .hero__symbol { opacity: .22; right: 3vw; top: 2%; } }
@keyframes symbol-arrive { to { clip-path: inset(0 0 0 0); } }

.hero__title { position: relative; z-index: 1; }
/* Só a palavra de assinatura do hero ganha o brilho contínuo — o
   .grad genérico (usado em mais 4 lugares do site) fica estático,
   pra esse respiro de cor não virar tique repetido em toda página. */
.hero__title .grad {
  display: inline-block;
  background-size: 220% auto;
  animation: hero-grad-shimmer 5s ease-in-out infinite;
}
@keyframes hero-grad-shimmer {
  0%, 100% { background-position: 0% 50%; }
  50% { background-position: 100% 50%; }
}

/* Faixa de territórios: quatro palavras que reescrevem o acento
   da página quando recebem foco ou hover. */
.territories {
  display: grid; gap: 0;
  border-top: 1px solid var(--line);
}
@media (min-width: 768px) { .territories { grid-template-columns: repeat(4, 1fr); } }
.territory {
  display: flex; align-items: baseline; gap: .8rem;
  padding: var(--space-4) 0;
  border-bottom: 1px solid var(--line);
  position: relative;
  transition: color var(--dur-2) var(--ease-out);
}
@media (min-width: 768px) {
  .territory { border-bottom: 0; border-right: 1px solid var(--line); padding-inline: var(--space-4); flex-direction: column; gap: .35rem; min-height: 8.5rem; justify-content: end; }
  .territory:first-child { padding-left: 0; }
  .territory:last-child { border-right: 0; }
}
.territory::before {
  content: ''; position: absolute; left: 0; right: 0; top: -1px; height: 2px;
  background: var(--accent);
  transform: scaleX(0); transform-origin: left;
  transition: transform var(--dur-2) var(--ease-out);
}
.territory:hover::before, .territory:focus-visible::before { transform: scaleX(1); }
.territory:hover, .territory:focus-visible { color: var(--accent); }
.territory__name {
  font-family: var(--font-display); text-transform: uppercase;
  font-size: var(--step-2); letter-spacing: -.03em; line-height: 1;
}
.territory__desc { font-size: var(--step--1); color: var(--text-mute); max-width: 22ch; }

/* ─── 09a. POSICIONAMENTO ──────────────────────────────────────────
   Pilha de cartões — receita tirada direto do DOM do jitter.video:
   cada cartão é sticky, o "top" cresce e a "margin-bottom" encolhe
   na mesma proporção a cada índice (--space-6 por cartão). É só
   isso — sem JS de escala nem esmaecimento; o próprio CSS já cria
   o efeito de leque, com uma tira de cada cartão anterior visível
   acima do que está por cima. Cantos arredondados e a divisão
   imagem/texto (60/40) também seguem a referência: não é só texto
   grande, é objeto com composição.
   ------------------------------------------------------------------ */
.pos__layout { display: grid; gap: var(--space-7); }
@media (min-width: 1024px) {
  .pos__layout { grid-template-columns: 1fr 1fr; align-items: start; gap: var(--gutter); }
  /* O texto fica fixo na tela enquanto os cartões, ao lado, se
     empilham rolando — os dois ficam visíveis ao mesmo tempo em vez
     do texto sumir de tela nos primeiros px de scroll da seção. */
  .pos__intro { position: sticky; top: calc(var(--header-h) + var(--space-7)); }
}
.stack-cards {
  display: flex; flex-direction: column;
  width: min(92vw, 480px);
  padding-block: var(--space-8) var(--space-9);
}
.stack-card {
  position: sticky;
  top: calc(var(--header-h) + var(--space-5) + (var(--i) - 1) * var(--space-6));
  margin-bottom: calc((4 - var(--i)) * var(--space-6));
  height: 480px;
  display: flex; flex-direction: column;
  border-radius: 32px; overflow: hidden;
  box-shadow: 0 30px 70px rgba(0, 0, 0, .45);
  z-index: var(--i);
}
.stack-card__media {
  flex: 1 1 auto; min-height: 0;
  display: flex; align-items: center; justify-content: center;
  background: rgba(0, 0, 0, .12);
}
.stack-card__symbol {
  width: 46%; aspect-ratio: 294 / 393;
  background: currentColor;
  -webkit-mask: url('/assets/img/simbolo-advento.svg') no-repeat center / contain;
  mask: url('/assets/img/simbolo-advento.svg') no-repeat center / contain;
  opacity: .9;
}
.stack-card__content { flex: none; padding: var(--space-6) var(--space-6) var(--space-7); }
.stack-card__eyebrow {
  font-family: var(--font-mono); font-size: var(--step--2);
  text-transform: uppercase; letter-spacing: .1em; opacity: .65;
  margin-bottom: .5rem;
}
.stack-card__title { font-family: var(--font-display); font-size: var(--step-1); line-height: 1.25; text-wrap: balance; }
.stack-card__note { font-size: var(--step--1); opacity: .7; margin-top: .6rem; }

@media (max-width: 480px) {
  .stack-card { height: 420px; }
}

/* ─── 10. PORTFÓLIO ───────────────────────────────────────────────
   Grade uniforme de cards — cada um é um objeto com folga: imagem
   encaixada dentro de um cartão com respiro, título e resumo sempre
   visíveis embaixo (não escondidos até o hover). Cantos arredondados
   aqui são exceção deliberada ao radius≈0 do resto do site, igual à
   do carrossel da home: o card physical importa mais que o grid seco.
   ------------------------------------------------------------------ */
.works { display: grid; gap: var(--gutter); grid-template-columns: repeat(4, 1fr); }
@media (min-width: 768px)  { .works { grid-template-columns: repeat(8, 1fr); } }
@media (min-width: 1024px) { .works { grid-template-columns: repeat(12, 1fr); } }

.work {
  grid-column: span 4; position: relative;
  display: flex; flex-direction: column;
  background: var(--surface-1); border: 1px solid var(--line);
  border-radius: 20px; padding: var(--space-4);
  transition: border-color var(--dur-2) var(--ease-out);
}
@media (min-width: 768px)  { .work { grid-column: span 4; } }
@media (min-width: 1024px) { .work { grid-column: span 4; } }
.work:hover, .work:focus-within { border-color: var(--line-strong); }

.work__frame {
  position: relative; overflow: hidden; border-radius: 14px;
  background: var(--surface-2);
  aspect-ratio: 4 / 3;
}
.work__img {
  width: 100%; height: 100%; object-fit: cover;
  transform: scale(1.001);
  transition: transform 900ms var(--ease-out);
}
.work:hover .work__img, .work:focus-within .work__img { transform: scale(1.045); }

.work__meta { display: flex; flex-direction: column; gap: .5rem; padding: var(--space-5) var(--space-2) var(--space-2); }
.work__title { font-size: var(--step-2); text-transform: uppercase; }
.work__desc { font-size: var(--step--1); line-height: 1.5; color: var(--text-mute); }
.work__client { font-family: var(--font-mono); font-size: var(--step--2); letter-spacing: .1em; color: var(--text-mute); text-transform: uppercase; margin-top: .2rem; }
.work__link::after { content: ''; position: absolute; inset: 0; }

/* ─── 10b. FILEIRA CONTÍNUA DE PROJETOS ───────────────────────────
   Mecânica emprestada do carrossel de templates do jitter.video: uma
   fileira horizontal em loop infinito, sem depender do visitante
   rolar — o convite pra agir é a pastilha "ver todos", flutuando por
   cima. A pele continua da Advento: cartão reto (raio 0, como o
   resto do site), o arredondado mora só na etiqueta e na pastilha,
   no mesmo --radius-pill que já veste tag e botão em toda parte.
   ------------------------------------------------------------------ */
.reel-section { overflow: hidden; position: relative; }
.reel { overflow: hidden; margin-top: var(--space-7); }
.reel__track {
  display: flex; width: max-content; gap: var(--gutter);
  animation: reel-scroll 72s linear infinite;
}
.reel:hover .reel__track, .reel:focus-within .reel__track { animation-play-state: paused; }
@keyframes reel-scroll { to { transform: translateX(-50%); } }

.reel__card { flex: none; width: clamp(19rem, 28vw, 27rem); }
.reel__link { display: block; }

/* O painel é o cartão de verdade — preto/cinza translúcido (branco a
   6% de opacidade sobre o fundo escuro, com uma borda mais clara
   ainda pra não achatar), não a cor do território. O cartão continua
   no mesmo tamanho fixo de sempre; o que muda é object-fit: a imagem
   inteira aparece dentro, na proporção original — nunca cortada pra
   preencher a caixa — com a sobra (se houver) só respirando ao redor. */
.reel__panel {
  display: flex; align-items: center; justify-content: center;
  aspect-ratio: 4 / 5; padding: clamp(1rem, 2.6vw, 1.75rem);
  background: rgba(255, 255, 255, .06);
  border: 1px solid rgba(255, 255, 255, .1);
  border-radius: 22px;
}
.reel__frame {
  display: block; position: relative; overflow: hidden;
  width: 100%; height: 100%;
  background: var(--surface-2);
}
.reel__img {
  width: 100%; height: 100%; object-fit: contain;
  transform: scale(1.001);
  transition: transform 900ms var(--ease-out);
}
.reel__link:hover .reel__img, .reel__link:focus-visible .reel__img { transform: scale(1.05); }

.reel__badge { display: flex; align-items: center; gap: .6rem; margin-top: var(--space-4); }
.reel__tag {
  flex: none; font-family: var(--font-mono); font-size: var(--step--2);
  text-transform: uppercase; letter-spacing: .08em;
  color: var(--on-accent); background: var(--accent);
  padding: .32rem .65rem; border-radius: var(--radius-pill);
}
.reel__client {
  font-size: var(--step--1); color: var(--text-soft);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.reel__note {
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden;
  margin-top: .5rem; font-size: var(--step--2); line-height: 1.4; color: var(--text-mute);
  max-width: 32ch;
}

.pill-float {
  display: inline-flex; align-items: center; gap: .6rem;
  margin: var(--space-6) var(--gutter) 0; padding: 1rem 1.6rem;
  background: var(--surface-1); border: 1px solid var(--line-strong);
  border-radius: var(--radius-pill);
  font-family: var(--font-mono); font-size: var(--step--1);
  text-transform: uppercase; letter-spacing: .04em; color: var(--text);
  width: fit-content;
  transition: background var(--dur-2) var(--ease-out), border-color var(--dur-2) var(--ease-out), color var(--dur-2) var(--ease-out);
}
.pill-float:hover, .pill-float:focus-visible { background: var(--accent); color: var(--on-accent); border-color: var(--accent); }
.pill-float .btn__arrow { transition: transform var(--dur-2) var(--ease-out); }
.pill-float:hover .btn__arrow { transform: translateX(4px); }

@media (min-width: 900px) {
  .pill-float { position: absolute; right: var(--gutter); bottom: 0; margin: 0; z-index: 2; }
}

@media (prefers-reduced-motion: reduce) {
  .reel__track { animation: none; }
}

/* ─── 11. SERVIÇOS COMO EXPERIÊNCIA ───────────────────────────────
   Não são quatro caixas: é uma lista que se abre. O item ativo troca
   o acento, revela a descrição e mostra a lista de entregas.
   ------------------------------------------------------------------ */
.svc { border-top: 1px solid var(--line); }
.svc__item { border-bottom: 1px solid var(--line); }
.svc__head {
  width: 100%; background: none; border: 0; cursor: pointer;
  display: grid; grid-template-columns: auto 1fr auto; align-items: center;
  gap: var(--space-4); padding-block: clamp(1.2rem, 3vw, 2.2rem);
  text-align: left; color: inherit;
  transition: color var(--dur-2) var(--ease-out), padding-left var(--dur-2) var(--ease-out);
}
.svc__head:hover { color: var(--accent); padding-left: .6rem; }
.svc__index { font-family: var(--font-mono); font-size: var(--step--2); color: var(--text-mute); letter-spacing: .1em; }
.svc__name { font-family: var(--font-display); text-transform: uppercase; font-size: var(--step-4); letter-spacing: -.04em; line-height: .95; }
.svc__toggle { width: 18px; height: 18px; position: relative; flex: none; }
.svc__toggle::before, .svc__toggle::after {
  content: ''; position: absolute; inset: 50% 0 auto 0; height: 1px; background: currentColor;
}
.svc__toggle::after { transform: rotate(90deg); transition: transform var(--dur-2) var(--ease-out); }
.svc__item[data-open="true"] .svc__toggle::after { transform: rotate(0deg); }
.svc__item[data-open="true"] .svc__head { color: var(--accent); }

.svc__panel { display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--dur-3) var(--ease-out); }
.svc__item[data-open="true"] .svc__panel { grid-template-rows: 1fr; }
.svc__panel > div { overflow: hidden; }
.svc__body {
  display: grid; gap: var(--space-5); padding-bottom: var(--space-7);
}
@media (min-width: 1024px) { .svc__body { grid-template-columns: 1.1fr 1fr; gap: var(--space-8); } }
.svc__list li {
  display: flex; gap: .8rem; padding-block: .55rem; border-bottom: 1px solid var(--line);
  font-size: var(--step--1); color: var(--text-soft);
}
.svc__list li::before { content: '—'; color: var(--accent); flex: none; }

/* ─── 11a. O DIFERENCIAL ───────────────────────────────────────────
   Quatro linhas de princípio, sem virar lista de bullet — cada uma
   é uma pequena coluna com um traço de acento em cima. */
.principles {
  display: grid; gap: 1px; background: var(--line);
  border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
}
@media (min-width: 768px) { .principles { grid-template-columns: repeat(4, 1fr); } }
.principles li {
  background: var(--surface-0); padding: var(--space-5) var(--space-4);
  font-family: var(--font-mono); font-size: var(--step--1);
  color: var(--text-soft); border-top: 2px solid var(--accent);
}

/* ─── 12. PROCESSO ────────────────────────────────────────────────
   A numeração 01–05 existe porque o conteúdo é mesmo uma sequência:
   a ordem carrega informação. No desktop a seção prende e rola na
   horizontal — o movimento repete a progressão do próprio processo.
   ------------------------------------------------------------------ */
.process { position: relative; }
.process__track { display: grid; gap: var(--gutter); }
@media (min-width: 1024px) {
  .process__viewport { position: sticky; top: var(--header-h); height: 100svh; display: flex; align-items: center; overflow: hidden; }
  .process__track {
    display: flex; gap: var(--gutter); will-change: transform;
    transform: translate3d(calc(var(--x, 0) * -1), 0, 0);
  }
  .process__step { width: min(38vw, 460px); flex: none; }
}
.process__step { border-top: 1px solid var(--line); padding-top: var(--space-5); position: relative; }
.process__step::before {
  content: ''; position: absolute; top: -1px; left: 0; width: 100%; height: 1px;
  background: var(--color-gradient);
  transform: scaleX(var(--done, 0)); transform-origin: left;
  transition: transform var(--dur-3) var(--ease-out);
}
.process__num {
  font-family: var(--font-mono); font-size: var(--step--2); letter-spacing: .16em;
  color: var(--accent); display: block; margin-bottom: var(--space-4);
}
.process__name { font-size: var(--step-3); text-transform: uppercase; margin-bottom: var(--space-3); }

/* ─── 13. PÁGINA DE CASE ──────────────────────────────────────────── */
.case-hero { padding-top: calc(var(--header-h) + var(--space-8)); }
.case-cover { margin-top: var(--space-7); aspect-ratio: 16 / 9; overflow: hidden; background: var(--surface-2); }
.case-cover img { width: 100%; height: 100%; object-fit: cover; }

.case-facts { display: grid; gap: var(--space-5); grid-template-columns: repeat(2, 1fr); }
@media (min-width: 768px) { .case-facts { grid-template-columns: repeat(4, 1fr); } }
.case-facts dt { font-family: var(--font-mono); font-size: var(--step--2); letter-spacing: .12em; text-transform: uppercase; color: var(--text-mute); margin-bottom: .4rem; }
.case-facts dd { font-size: var(--step-0); }

.case-block { display: grid; gap: var(--space-5); }
@media (min-width: 1024px) {
  .case-block { grid-template-columns: 4fr 8fr; gap: var(--gutter); }
  .case-block__aside { position: sticky; top: calc(var(--header-h) + var(--space-6)); align-self: start; }
}
.case-block + .case-block { margin-top: var(--space-9); }

.case-gallery { display: grid; gap: var(--gutter); grid-template-columns: repeat(4, 1fr); }
@media (min-width: 768px) { .case-gallery { grid-template-columns: repeat(8, 1fr); } }
@media (min-width: 1024px) { .case-gallery { grid-template-columns: repeat(12, 1fr); } }
.case-gallery figure { grid-column: span 4; margin: 0; }
@media (min-width: 768px) {
  .case-gallery figure { grid-column: span 8; }
  .case-gallery figure[data-span="half"] { grid-column: span 4; }
}
@media (min-width: 1024px) {
  .case-gallery figure { grid-column: span 12; }
  .case-gallery figure[data-span="half"] { grid-column: span 6; }
  .case-gallery figure[data-span="third"] { grid-column: span 4; }
}
.case-gallery img, .case-gallery video { width: 100%; background: var(--surface-2); }
.case-gallery figcaption { margin-top: .6rem; font-family: var(--font-mono); font-size: var(--step--2); color: var(--text-mute); }

/* Próximo projeto: bloco de largura total que troca de cor no hover. */
.next-project {
  display: block; padding-block: var(--space-9);
  border-top: 1px solid var(--line);
  transition: background var(--dur-3) var(--ease-out);
}
.next-project:hover { background: var(--accent); }
.next-project:hover .next-project__title { color: var(--on-accent); }
.next-project:hover .eyebrow { color: var(--on-accent); }
.next-project__title { font-size: var(--step-5); text-transform: uppercase; transition: color var(--dur-3); }

/* ─── 14. BLOCOS DE COR ───────────────────────────────────────────
   Seções inteiras trocam de fundo. É o recurso que separa territórios
   sem precisar de moldura, ícone ou card.
   ------------------------------------------------------------------ */
.band { background: var(--surface-1); }
.band--pink   { background: var(--color-pink);   --text-soft: rgba(255,255,255,.85); --text-mute: rgba(255,255,255,.7); --line: rgba(0,0,0,.2); --line-strong: rgba(0,0,0,.4); --accent: #fff; }
.band--purple { background: var(--color-purple); --text-soft: rgba(255,255,255,.82); --text-mute: rgba(255,255,255,.62); --line: rgba(255,255,255,.2); --accent: var(--color-yellow); }
.band--yellow { background: var(--color-yellow); color: #000; --text: #000; --text-soft: rgba(0,0,0,.76); --text-mute: rgba(0,0,0,.56); --line: rgba(0,0,0,.18); --line-strong: rgba(0,0,0,.4); --accent: #000; }
.band--yellow .btn { --btn-bg: #000; --btn-fg: var(--color-yellow); }
.band--orange { background: var(--color-orange); color: #000; --text: #000; --text-soft: rgba(0,0,0,.76); --text-mute: rgba(0,0,0,.56); --line: rgba(0,0,0,.18); --line-strong: rgba(0,0,0,.4); --accent: #000; }
.band--orange .btn { --btn-bg: #000; --btn-fg: var(--color-orange); }
.band--pink .btn--ghost, .band--purple .btn--ghost { border-color: rgba(255,255,255,.5); }
/* .band--yellow ainda não é usado em nenhuma view, mas se um dia for: texto
   branco de .btn--ghost em cima de fundo amarelo não teria contraste nenhum.
   O botão fantasma precisa seguir a cor de texto da própria faixa, não a
   regra padrão pensada para fundo escuro. */
.band--yellow .btn--ghost { --btn-fg: #000; border-color: rgba(0,0,0,.4); }

/* ─── 15. CTA GLOBAL ──────────────────────────────────────────────── */
.cta-advento { position: relative; overflow: hidden; text-align: center; }
.cta-advento__title { font-size: var(--step-5); text-transform: uppercase; }
.cta-advento__actions { display: flex; flex-wrap: wrap; gap: var(--space-4); justify-content: center; }

/* ─── 16. BLOG ────────────────────────────────────────────────────── */
.posts { display: grid; gap: var(--space-7) var(--gutter); }
@media (min-width: 768px) { .posts { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1280px) { .posts { grid-template-columns: repeat(3, 1fr); } }
.post { position: relative; display: flex; flex-direction: column; gap: var(--space-3); }
.post__frame { aspect-ratio: 3 / 2; overflow: hidden; background: var(--surface-2); }
.post__frame img { width: 100%; height: 100%; object-fit: cover; transition: transform 900ms var(--ease-out); }
.post:hover .post__frame img { transform: scale(1.04); }
.post__title { font-size: var(--step-1); text-transform: none; letter-spacing: -.02em; line-height: 1.15; }
.post__link::after { content: ''; position: absolute; inset: 0; }

.article { max-width: 68ch; margin-inline: auto; }
.article h2 { font-size: var(--step-2); margin-top: 2em; margin-bottom: .6em; }
.article h3 { font-size: var(--step-1); margin-top: 1.6em; margin-bottom: .5em; }
.article p, .article li { color: var(--text-soft); }
.article p + p, .article ul, .article ol { margin-top: 1.1em; }
.article ul li { padding-left: 1.2em; position: relative; }
.article ul li::before { content: '—'; position: absolute; left: 0; color: var(--accent); }
.article blockquote {
  margin: 2em 0; padding-left: var(--space-5); border-left: 2px solid var(--accent);
  font-size: var(--step-1); font-style: italic; font-weight: 400; color: #fff;
}
.article img { margin-block: 2em; width: 100%; }
.article a { color: var(--accent); text-decoration: underline; text-underline-offset: .2em; }

/* ─── 17. UTILITÁRIOS ─────────────────────────────────────────────── */
.flow-tight { line-height: 1.25; }
.text-center { text-align: center; }
.muted { color: var(--text-mute); }
.accent { color: var(--accent); }
.full-bleed { width: 100vw; margin-left: 50%; transform: translateX(-50%); }
.hide-mobile { display: none; }
@media (min-width: 768px) { .hide-mobile { display: revert; } .hide-desktop { display: none; } }
.cluster { display: flex; flex-wrap: wrap; gap: var(--space-4); align-items: center; }
.between { display: flex; flex-wrap: wrap; gap: var(--space-4); align-items: center; justify-content: space-between; }
