/* ============================================================================
   gs-footer.css — rodapé compartilhado do GS Design System · DUAS marcas
   ----------------------------------------------------------------------------
   Par obrigatório: /assets/gs-footer.js. Este arquivo desenha, o JS preenche.

   ── COMO A PÁGINA USA (é só isto; a página NÃO escreve markup interno) ──────
     <head>
       <link rel="stylesheet" href="/assets/gs-footer.css?v=3">
     <body>
       <footer class="gsf-footer" data-gsf-brand="gustavos" role="contentinfo"></footer>
       <script src="/assets/gs-footer.js?v=3" defer></script>

     data-gsf-brand = "gustavos" (pessoal)  |  "magu" (produto)
     data-gsf-sub   = tagline opcional exibida sob a animação

   ── POR QUE TODO SELETOR COMEÇA COM gsf- ───────────────────────────────────
   As páginas do site JÁ definem, com valores DIFERENTES entre si:
     .footer-brand   index.html:1122 · quemsoueu · autossuficiencialismo · aff
                     · biblia · livros · magu/assets/magu.css
     .typed-text     idem, e portfolio/*:304 com OUTRA cor de marca
     .cursor-blink   idem
     .reveal         8 páginas declaram opacity:0 e cada uma tem o SEU
                     IntersectionObserver para pôr .visible
     #typed-target   10 páginas usam esse id e rodam getElementById nele
     --accent, --gs-1..9, --gs-color, --gs-glow, --gs-blur, --gs-weight  no :root
   Reaproveitar qualquer um desses nomes = colisão silenciosa. Então:
     · todo seletor daqui vive sob o prefixo gsf-;
     · nenhum id;
     · nada declarado em :root bare — os tokens moram em .gsf-footer, onde só
       o componente os alcança;
     · keyframe próprio (gsf-caret), nunca `blink`, que 8 páginas já declaram;
     · .reveal não é usado nem mencionado: o rodapé nasce visível. Herdar
       opacity:0 de um observer que já rodou é rodapé invisível para sempre.

   ── FUNCIONAR SEM CSS DA PÁGINA E SOB RESET UNIVERSAL ──────────────────────
   Um `* { margin:0; padding:0; box-sizing:border-box }` no host tem
   especificidade ZERO e perde de qualquer classe daqui — MAS vence a HERANÇA,
   porque declara direto em cada descendente. Por isso cada nó do componente
   declara explicitamente o que precisa (font, cor, margem, alinhamento,
   text-transform): não sobra propriedade dependendo de herança para o `*`
   capturar.

   ── OS TRÊS ÚNICOS !important, E O MOTIVO DE CADA UM ────────────────────────
   Levantamento real de `!important` neste repositório (grep, 31/08):
     1) text-transform  →  .gsf-brand, .gsf-prefix, .gsf-typed, .gsf-sub
        Uppercase herdado ou forçado destrói a grafia `gustavOS` / `Magu`, que
        é identidade de marca. É o único erro do rodapé que não é cosmético:
        vira outra marca. Custo de perder: alto. Custo de blindar: nenhum.
     2) margin          →  .gsf-brand, .gsf-sub
        As duas páginas que carregam este arquivo hoje declaram
        `p { margin:0 !important }` e `p { margin:0 !important; font-size:… }`
        (aviso-de-privacidade.html:189/197, termos-de-uso.html:193/201) e
        outras páginas põem margin-bottom global em <p>. O ritmo vertical do
        rodapé é definido aqui; margem de fora empurra a tagline e mexe o
        layout depois da primeira pintura.
     3) color           →  .gsf-brand, .gsf-prefix, .gsf-link, .gsf-typed, .gsf-sub
        `.highlight-box p { color: … !important }` nas duas páginas legais e
        `a { color: … }` em quase todas. Se a cor da palavra animada é
        sequestrada, o espectro de 9 (ou 4) cores — a razão de existir do
        componente — simplesmente não acontece; e um `p { color: … !important }`
        do host pinta "Powered by" com a cor de link da página.
   Nada mais leva !important. Em particular: `animation` e `transition` NÃO
   levam, mesmo sabendo que 12 páginas trazem
   `*{animation-duration:.01ms!important}` dentro de
   @media (prefers-reduced-motion:reduce) — ali o host está certo e nós
   queremos exatamente esse resultado.

   ── TEMA ───────────────────────────────────────────────────────────────────
   ESCURO É O DEFAULT, E É DEFAULT DE VERDADE: os tokens escuros moram no bloco
   base `.gsf-footer`, sem media query e sem atributo nenhum. Um rodapé sem
   `data-theme` no <html> e sem `data-gsf-theme` renderiza escuro — inclusive
   antes do JS rodar (a tag é `defer`). Isso não é conveniência: 13 das 21
   páginas de produto são escuras por construção, sem paleta clara alguma
   (lista completa em gs-footer.js, seção TEMA), e nenhuma delas declara
   @media (prefers-color-scheme). O claro é opt-in explícito.

   Três chaves, propositalmente:
     [data-theme="light"] .gsf-footer          ← contrato do site (gs-theme.js)
     .gsf-footer[data-gsf-theme="light"]       ← espelho escrito pelo gs-footer.js
     .gsf-footer[data-gsf-theme="dark"]        ← PINO: reafirma o escuro
   A terceira existe porque as duas primeiras têm a MESMA especificidade
   (0,2,0): num documento com <html data-theme="light">, um rodapé pinado com
   data-gsf-theme="dark" perderia para `[data-theme="light"] .gsf-footer` por
   ordem de origem. O bloco de pino aparece DEPOIS do bloco claro no arquivo e
   reafirma a paleta escura, então o pino documentado em gs-footer.js
   ("página declara => respeitado para sempre") vale nos dois sentidos.

   ── CACHE ──────────────────────────────────────────────────────────────────
   /assets/* está com Cache-Control immutable de 1 ano no _headers:116-117. Ao
   editar, suba o ?v= nas DUAS tags, em TODAS as páginas. Versão desta API: v=3.

   O que os números querem dizer, conferido no git (não é lineage inventada):
     v=1  o par que está em HEAD: `git show HEAD:assets/gs-footer.css` = 5492 B
          e o único seletor dela é `.gs-footer`; `git show
          HEAD:assets/gs-footer.js` = 4840 B, documenta `.gs-footer` +
          `.footer-brand` + `.typed-text` e se carrega como ?v=1.
     v=2  NUNCA EXISTIU como arquivo. É só a query que aviso-de-privacidade.html
          (:250, :1033) e termos-de-uso.html (:243, :867) pedem. Elas
          escreveram à mão a marcação `<gs-footer variant="gustavos">` contra o
          componente v=1, que só entendia `.gs-footer` — daí o rodapé quebrado
          das duas hoje.
     v=3  esta API: `<footer class="gsf-footer">` preenchido pelo JS.
   Consequência operacional: como o cache é immutable e as duas páginas ainda
   pedem ?v=2, quem já visitou tem o arquivo v=1 preso por um ano e NÃO recebe
   nem este arquivo nem o bloco RETRO dele. Subir o ?v= nessas duas páginas é o
   PRIMEIRO passo da migração, antes e independente de trocar marcação
   (_gauntlet/ADOPTION.md §0.1).
   ============================================================================ */

/* ── BLOCO + TOKENS ─────────────────────────────────────────────────────────
   Escuro, marca gustavos: é o default. Espectro do acrônimo GUSTAVOS, uma cor
   por palavra, extraído de _reference/footer-gustavOS.html. */
.gsf-footer {
  /* espectro — 9 slots */
  --gsf-1: #818cf8;  --gsf-1-glow: rgba(129, 140, 248, .50);  /* gustavOS     */
  --gsf-2: #a5b4fc;  --gsf-2-glow: rgba(165, 180, 252, .45);  /* Genius       */
  --gsf-3: #c4b5fd;  --gsf-3-glow: rgba(196, 181, 253, .45);  /* Unique       */
  --gsf-4: #d8b4fe;  --gsf-4-glow: rgba(216, 180, 254, .45);  /* Strategic    */
  --gsf-5: #f0abfc;  --gsf-5-glow: rgba(240, 171, 252, .45);  /* Thinker      */
  --gsf-6: #7dd3fc;  --gsf-6-glow: rgba(125, 211, 252, .45);  /* Ambitious    */
  --gsf-7: #67e8f9;  --gsf-7-glow: rgba(103, 232, 249, .45);  /* Visionary    */
  --gsf-8: #5eead4;  --gsf-8-glow: rgba(94, 234, 212, .45);   /* Orchestrator */
  --gsf-9: #93c5fd;  --gsf-9-glow: rgba(147, 197, 253, .45);  /* Simple       */

  /* slot em uso — o JS troca SÓ isto, apontando para var(--gsf-N).
     Consequência: mudar o tema no meio da digitação repinta na hora, porque
     quem resolve o valor final é a paleta do tema, não o JS. */
  --gsf-color: var(--gsf-1);
  --gsf-glow:  var(--gsf-1-glow);
  --gsf-blur:   10px;
  --gsf-weight: 600;

  /* superfície */
  --gsf-text: #8b8b9e;
  --gsf-edge: rgba(255, 255, 255, .07);
  --gsf-pad:  48px 20px 32px;

  /* Respiro ACIMA do fio, para a página escolher.
     Existe por um motivo medido: `.gsf-footer` tem especificidade (0,1,0) e a
     regra de elemento `footer { … }` que a página já tem tem (0,0,1) — então
     o `margin` daqui SEMPRE vence o da página, silenciosamente. index.html:1114
     declara `footer { margin-top: 48px }` e perderia 48px de ritmo vertical na
     migração (medido: marginTop 48px -> 0px). Em vez de mandar o migrador
     brigar com a cascata, ele declara o valor no próprio componente:
       <footer class="gsf-footer" style="--gsf-mt:48px" …>
     Default 0: nenhuma página muda de aparência por causa deste token. */
  --gsf-mt: 0px;

  display: block;
  box-sizing: border-box;
  width: auto;
  margin: var(--gsf-mt) 0 0;
  padding: var(--gsf-pad);
  border: 0;
  border-top: 1px solid var(--gsf-edge);
  background: none;
  position: relative;

  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  font-size: .85rem;
  font-weight: 600;
  font-style: normal;
  line-height: 1.5;
  letter-spacing: .08em;
  text-align: center;
  color: var(--gsf-text);
}

/* Espectro em tons profundos: os tons claros do modo escuro dariam ~1,3:1
   sobre #f8f9fc. Estes ficam entre 5,2:1 e 10,4:1 (AA). */
[data-theme="light"] .gsf-footer,
.gsf-footer[data-gsf-theme="light"] {
  --gsf-1: #4338ca;  --gsf-1-glow: rgba(67, 56, 202, .22);
  --gsf-2: #4c1d95;  --gsf-2-glow: rgba(76, 29, 149, .20);
  --gsf-3: #6d28d9;  --gsf-3-glow: rgba(109, 40, 217, .20);
  --gsf-4: #7e22ce;  --gsf-4-glow: rgba(126, 34, 206, .20);
  --gsf-5: #a3178f;  --gsf-5-glow: rgba(163, 23, 143, .20);
  --gsf-6: #0369a1;  --gsf-6-glow: rgba(3, 105, 161, .20);
  --gsf-7: #0b6f86;  --gsf-7-glow: rgba(11, 111, 134, .20);
  --gsf-8: #0f766e;  --gsf-8-glow: rgba(15, 118, 110, .20);
  --gsf-9: #1d4ed8;  --gsf-9-glow: rgba(29, 78, 216, .20);

  /* halo zerado no claro: em fundo claro o glow vira borrão e derruba a
     leitura. O peso sobe para compensar a perda de presença. */
  --gsf-blur:   0px;
  --gsf-weight: 700;

  --gsf-text: #6b7280;
  --gsf-edge: rgba(15, 23, 42, .08);
}

/* ── MARCA MAGU ─────────────────────────────────────────────────────────────
   4 frases, 4 slots. Paleta mágica de _reference/footer-magu.html. Os slots
   5..9 continuam definidos (herdados do bloco base) e simplesmente não são
   usados: a sequência magu nunca aponta para eles. */
.gsf-footer[data-gsf-brand="magu"] {
  --gsf-1: #c084fc;  --gsf-1-glow: rgba(192, 132, 252, .55);  /* ametista    */
  --gsf-2: #67e8f9;  --gsf-2-glow: rgba(103, 232, 249, .45);  /* aura ciano  */
  --gsf-3: #f5b8fd;  --gsf-3-glow: rgba(245, 184, 253, .45);  /* rosa fada   */
  --gsf-4: #fcd34d;  --gsf-4-glow: rgba(252, 211, 77, .45);   /* poeira ouro */
}

[data-theme="light"] .gsf-footer[data-gsf-brand="magu"],
.gsf-footer[data-gsf-brand="magu"][data-gsf-theme="light"] {
  --gsf-1: #7314c4;  --gsf-1-glow: rgba(115, 20, 196, .22);   /* ametista profunda */
  --gsf-2: #0b6f86;  --gsf-2-glow: rgba(11, 111, 134, .20);   /* ciano petróleo    */
  --gsf-3: #a3178f;  --gsf-3-glow: rgba(163, 23, 143, .20);   /* magenta encantado */
  --gsf-4: #8a5106;  --gsf-4-glow: rgba(138, 81, 6, .20);     /* ouro velho        */
}

/* ── PINO ESCURO ────────────────────────────────────────────────────────────
   `data-gsf-theme="dark"` no <footer> é uma AFIRMAÇÃO da página: este rodapé
   é escuro, aconteça o que acontecer com o <html>. Sem este bloco o pino não
   valeria dentro de um documento claro, porque `[data-theme="light"]
   .gsf-footer` e `.gsf-footer[data-gsf-theme="light"]` têm a mesma
   especificidade (0,2,0) e a última declaração ganharia.

   Só reafirmo o que o bloco claro sobrescreve — as duas paletas e os quatro
   tokens de superfície/peso. Nada de novo entra aqui: os valores são
   literalmente os do bloco base. Repetir é o preço de não usar !important. */
.gsf-footer[data-gsf-theme="dark"] {
  --gsf-1: #818cf8;  --gsf-1-glow: rgba(129, 140, 248, .50);
  --gsf-2: #a5b4fc;  --gsf-2-glow: rgba(165, 180, 252, .45);
  --gsf-3: #c4b5fd;  --gsf-3-glow: rgba(196, 181, 253, .45);
  --gsf-4: #d8b4fe;  --gsf-4-glow: rgba(216, 180, 254, .45);
  --gsf-5: #f0abfc;  --gsf-5-glow: rgba(240, 171, 252, .45);
  --gsf-6: #7dd3fc;  --gsf-6-glow: rgba(125, 211, 252, .45);
  --gsf-7: #67e8f9;  --gsf-7-glow: rgba(103, 232, 249, .45);
  --gsf-8: #5eead4;  --gsf-8-glow: rgba(94, 234, 212, .45);
  --gsf-9: #93c5fd;  --gsf-9-glow: rgba(147, 197, 253, .45);

  --gsf-blur:   10px;
  --gsf-weight: 600;
  --gsf-text: #8b8b9e;
  --gsf-edge: rgba(255, 255, 255, .07);
}

.gsf-footer[data-gsf-brand="magu"][data-gsf-theme="dark"] {
  --gsf-1: #c084fc;  --gsf-1-glow: rgba(192, 132, 252, .55);
  --gsf-2: #67e8f9;  --gsf-2-glow: rgba(103, 232, 249, .45);
  --gsf-3: #f5b8fd;  --gsf-3-glow: rgba(245, 184, 253, .45);
  --gsf-4: #fcd34d;  --gsf-4-glow: rgba(252, 211, 77, .45);
}

/* ── LINHA DA MARCA ─────────────────────────────────────────────────────────
   min-height reserva a altura da frase mais longa: sem isso, a frase de 38
   caracteres do magu entrando em tela estreita empurraria a página. */
.gsf-footer .gsf-brand {
  display: block;
  box-sizing: border-box;
  margin: 0 0 6px !important;   /* (2) host declara margin em <p> com !important */
  padding: 0;
  min-height: 1.6em;
  font: inherit;
  letter-spacing: inherit;
  text-align: center;
  text-transform: none !important;  /* (1) protege a grafia gustavOS / Magu */
  color: var(--gsf-text) !important; /* (3) host declara color em p/a/span com !important */
}

.gsf-footer .gsf-prefix {
  font: inherit;
  color: inherit !important;         /* (3) */
  letter-spacing: inherit;
  text-transform: none !important;   /* (1) */
}

.gsf-footer .gsf-link {
  display: inline;
  margin: 0;
  padding: 0 0 1px;
  border: 0;
  border-bottom: 1px solid transparent;
  background: none;
  font: inherit;
  letter-spacing: inherit;
  color: inherit !important;         /* (3) host declara a { color } quase sempre */
  text-decoration: none;
  transition: border-color .25s ease, opacity .25s ease;
}

.gsf-footer .gsf-link:hover,
.gsf-footer .gsf-link:focus-visible {
  border-bottom-color: var(--gsf-color);
  opacity: .85;
}

/* Foco visível de verdade: contorno na cor da palavra da vez, não só o
   sublinhado do hover — que some em quem navega por teclado. */
.gsf-footer .gsf-link:focus-visible {
  outline: 2px solid var(--gsf-color);
  outline-offset: 3px;
  border-radius: 2px;
}

/* Fallback para navegador sem :focus-visible (o :focus vem depois, então
   vence em caso de suporte parcial). */
.gsf-footer .gsf-link:focus {
  outline: 2px solid var(--gsf-color);
  outline-offset: 3px;
  border-radius: 2px;
}

.gsf-footer .gsf-link:focus:not(:focus-visible) {
  outline: none;
}

.gsf-footer .gsf-typed {
  display: inline;
  margin: 0;
  padding: 0;
  font-family: inherit;
  font-size: inherit;
  font-style: normal;
  font-weight: var(--gsf-weight);
  letter-spacing: inherit;
  color: var(--gsf-color) !important;   /* (3) host sequestra color em p e a */
  text-transform: none !important;      /* (1) */
  text-shadow: 0 0 var(--gsf-blur) var(--gsf-glow);
  white-space: nowrap;
  transition: color .35s ease, text-shadow .35s ease;
}

.gsf-footer .gsf-caret {
  display: inline-block;
  box-sizing: border-box;
  width: 2px;
  height: 1em;
  margin: 0 0 0 3px;
  padding: 0;
  border: 0;
  vertical-align: text-bottom;
  background: var(--gsf-color);
  box-shadow: 0 0 var(--gsf-blur) var(--gsf-glow);
  animation: gsf-caret 1s step-end infinite;
  transition: background .35s ease, box-shadow .35s ease;
}

/* Nome próprio: `blink` já é declarado por 8 páginas deste repositório. */
@keyframes gsf-caret { 50% { opacity: 0; } }

/* ── TAGLINE OPCIONAL (data-gsf-sub) ────────────────────────────────────── */
.gsf-footer .gsf-sub {
  display: block;
  box-sizing: border-box;
  margin: 4px 0 0 !important;   /* (2) */
  padding: 0;
  font-family: inherit;
  font-size: .75rem;
  font-weight: 400;
  font-style: italic;
  letter-spacing: normal;
  line-height: 1.5;
  text-align: center;
  text-transform: none !important;     /* (1) */
  color: var(--gsf-text) !important;   /* (3) */
  opacity: .6;
}

/* ── MOVIMENTO REDUZIDO ─────────────────────────────────────────────────────
   O JS já mostra a palavra-marca estática e colorida; aqui só some o cursor,
   que sem digitação é um traço parado sem significado. */
@media (prefers-reduced-motion: reduce) {
  .gsf-footer .gsf-caret { display: none; }
  .gsf-footer .gsf-typed { transition: none; }
  .gsf-footer .gsf-link  { transition: none; }
}

/* ── MOBILE ─────────────────────────────────────────────────────────────────
   nowrap vira normal: a frase mais longa do magu (38 caracteres) não cabe em
   320px e nowrap ali geraria rolagem horizontal na página inteira. */
@media (max-width: 480px) {
  .gsf-footer {
    font-size: .78rem;
    letter-spacing: .05em;
    --gsf-pad: 40px 16px 28px;
  }
  .gsf-footer .gsf-typed { white-space: normal; }
  .gsf-footer .gsf-brand { min-height: 3.2em; }
}

/* ── IMPRESSÃO ──────────────────────────────────────────────────────────── */
@media print {
  .gsf-footer { border-top: 1px solid #ccc; color: #333; }
  .gsf-footer .gsf-typed { color: #333 !important; text-shadow: none; }
  .gsf-footer .gsf-caret { display: none; }
}

/* ============================================================================
   RETRO-COMPATIBILIDADE — não é parte da API
   ----------------------------------------------------------------------------
   Duas páginas carregam ESTE arquivo hoje e ainda escrevem à mão a marcação do
   custom element `<gs-footer>` (a marcação "B" da seção RETRO do gs-footer.js
   — nunca houve um arquivo componente que a implementasse):
     aviso-de-privacidade.html:990-1012 · termos-de-uso.html:824-846
   Enquanto a migração descrita em _gauntlet/ADOPTION.md não é aplicada, sem
   este bloco as duas renderizariam o rodapé cru: alinhado à esquerda, sem fio
   de topo, sem cor de marca. O JS anima essa marcação (ver gs-footer.js,
   seção RETRO); aqui ela ganha a mesma pele.

   ATENÇÃO — este bloco NÃO chega a quem já visitou as duas páginas enquanto
   elas pedirem `?v=2`. `/assets/*` é `max-age=31536000, immutable`
   (_headers:116-117), então a URL `gs-footer.css?v=2` que o visitante tem em
   cache continua devolvendo o arquivo antigo por um ano. Subir o `?v=` nas
   duas páginas (ADOPTION.md §0.1) é o que entrega este bloco — não é um passo
   opcional nem posterior à troca de marcação.

   Escopado dentro de `gs-footer`, um nome de elemento que não existe em
   nenhuma outra página do repositório — logo, zero risco de colisão. Some
   junto com a última página migrada.
   ============================================================================ */
gs-footer {
  /* Paleta ESCOPADA no elemento, não no :root — o gs-footer.js escreve
     `--gs-color: var(--gs-1)` inline no nó da marca, e sem estes slots aqui
     dentro o var() seria inválido e a palavra ficaria sem cor. Como está
     dentro de `gs-footer`, nada disso alcança o resto da página. */
  --gs-1: #818cf8;  --gs-1-glow: rgba(129, 140, 248, .50);
  --gs-2: #a5b4fc;  --gs-2-glow: rgba(165, 180, 252, .45);
  --gs-3: #c4b5fd;  --gs-3-glow: rgba(196, 181, 253, .45);
  --gs-4: #d8b4fe;  --gs-4-glow: rgba(216, 180, 254, .45);
  --gs-5: #f0abfc;  --gs-5-glow: rgba(240, 171, 252, .45);
  --gs-6: #7dd3fc;  --gs-6-glow: rgba(125, 211, 252, .45);
  --gs-7: #67e8f9;  --gs-7-glow: rgba(103, 232, 249, .45);
  --gs-8: #5eead4;  --gs-8-glow: rgba(94, 234, 212, .45);
  --gs-9: #93c5fd;  --gs-9-glow: rgba(147, 197, 253, .45);

  display: block;
  box-sizing: border-box;
  padding: 48px 20px 32px;
  border-top: 1px solid rgba(255, 255, 255, .07);
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  font-size: .85rem;
  line-height: 1.5;
  text-align: center;
  color: #8b8b9e;
}

[data-theme="light"] gs-footer {
  --gs-1: #4338ca;  --gs-1-glow: rgba(67, 56, 202, .22);
  --gs-2: #4c1d95;  --gs-2-glow: rgba(76, 29, 149, .20);
  --gs-3: #6d28d9;  --gs-3-glow: rgba(109, 40, 217, .20);
  --gs-4: #7e22ce;  --gs-4-glow: rgba(126, 34, 206, .20);
  --gs-5: #a3178f;  --gs-5-glow: rgba(163, 23, 143, .20);
  --gs-6: #0369a1;  --gs-6-glow: rgba(3, 105, 161, .20);
  --gs-7: #0b6f86;  --gs-7-glow: rgba(11, 111, 134, .20);
  --gs-8: #0f766e;  --gs-8-glow: rgba(15, 118, 110, .20);
  --gs-9: #1d4ed8;  --gs-9-glow: rgba(29, 78, 216, .20);

  border-top-color: rgba(15, 23, 42, .08);
  color: #6b7280;
}

/* Marcação v=2 da MAGU: mesmos nomes de slot, paleta mágica. */
gs-footer[variant="magu"],
gs-footer[brand="magu"] {
  --gs-1: #c084fc;  --gs-1-glow: rgba(192, 132, 252, .55);
  --gs-2: #67e8f9;  --gs-2-glow: rgba(103, 232, 249, .45);
  --gs-3: #f5b8fd;  --gs-3-glow: rgba(245, 184, 253, .45);
  --gs-4: #fcd34d;  --gs-4-glow: rgba(252, 211, 77, .45);
}

[data-theme="light"] gs-footer[variant="magu"],
[data-theme="light"] gs-footer[brand="magu"] {
  --gs-1: #7314c4;  --gs-1-glow: rgba(115, 20, 196, .22);
  --gs-2: #0b6f86;  --gs-2-glow: rgba(11, 111, 134, .20);
  --gs-3: #a3178f;  --gs-3-glow: rgba(163, 23, 143, .20);
  --gs-4: #8a5106;  --gs-4-glow: rgba(138, 81, 6, .20);
}

gs-footer .gs-footer__brand {
  margin: 0 0 6px !important;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: none !important;
  min-height: 1.6em;
}

gs-footer .gs-footer__prefix,
gs-footer .gs-footer__sub,
gs-footer .gs-footer__copy {
  text-transform: none !important;
  color: inherit !important;
}

gs-footer .gs-footer__link {
  color: inherit;
  text-decoration: none;
  border-bottom: 1px solid transparent;
  padding-bottom: 1px;
}

gs-footer .gs-footer__link:focus-visible {
  outline: 2px solid #818cf8;
  outline-offset: 3px;
}

/* O JS escreve --gs-color / --gs-glow inline neste nó (ver gs-footer.js,
   seção RETRO). O fallback cobre o instante antes do primeiro frame. */
gs-footer .gs-footer__typed {
  color: var(--gs-color, #818cf8);
  font-weight: 600;
  text-transform: none !important;
  text-shadow: 0 0 10px var(--gs-glow, rgba(129, 140, 248, .5));
  white-space: nowrap;
}

[data-theme="light"] gs-footer .gs-footer__typed {
  color: var(--gs-color, #4338ca);
  font-weight: 700;
  text-shadow: none;
}

gs-footer .gs-footer__caret {
  display: inline-block;
  width: 2px;
  height: 1em;
  margin-left: 3px;
  vertical-align: text-bottom;
  background: var(--gs-color, #818cf8);
  animation: gsf-caret 1s step-end infinite;
}

gs-footer .gs-footer__sub {
  margin: 4px 0 0;
  font-size: .75rem;
  font-style: italic;
  opacity: .6;
}

gs-footer .gs-footer__extra { margin-top: 18px; }

gs-footer .gs-footer__nav,
gs-footer .gs-footer__links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px 18px;
  margin: 0;
  padding: 0;
  list-style: none;
  font-size: .78rem;
  font-weight: 500;
}

gs-footer .gs-footer__links { margin-top: 10px; }

gs-footer .gs-footer__extra a,
gs-footer .gs-footer__links a {
  color: inherit;
  text-decoration: none;
  border-bottom: 1px solid transparent;
}

gs-footer .gs-footer__extra a:hover,
gs-footer .gs-footer__links a:hover {
  border-bottom-color: currentColor;
}

gs-footer .gs-footer__copy {
  margin: 14px 0 0;
  font-size: .72rem;
  opacity: .7;
}

@media (prefers-reduced-motion: reduce) {
  gs-footer .gs-footer__caret { display: none; }
}

/* ── LINKS LEGAIS ───────────────────────────────────────────────────────────
   Sempre presentes. A auditoria mediu zero links funcionais para Política e
   Termos em todo o site; como o rodapé é o único elemento em todas as páginas,
   o link mora aqui. color leva !important pela mesma razão que .gsf-link:
   quase toda página do site declara `a { color: … }` global.
   O botão "Cookies" é <button> resetado para parecer link — sem isso ele
   herdaria o estilo de botão do host, que varia em 18 páginas. */
.gsf-footer .gsf-links {
  /* NEUTRALIZACAO DO SELETOR DE ELEMENTO `nav` DO HOST — hoje defesa em
     profundidade, nao mais necessidade.
     O bloco de links e' um <nav>, e cinco paginas declaravam uma regra de
     ELEMENTO `nav { position: fixed|sticky; top:0; z-index:100 }` para a barra
     de navegacao que a gs-menubar substituiu: aviso-de-privacidade,
     termos-de-uso, monitoria/index, monitoria/termos e
     livros/configuracoes-mandatorias. Sem as declaracoes abaixo o rodape era
     arrancado do fluxo e grudado no TOPO da viewport — medido na epoca.
     Especificidade nao resolve sozinha: `.gsf-footer .gsf-links` (0,2,0) so
     vence `nav` (0,0,1) nas propriedades que ele TAMBEM declara. Por isso cada
     uma esta escrita aqui explicitamente, e nao por !important.
     Em 03/09/2026 as cinco regras foram REMOVIDAS na origem, depois que uma
     delas sequestrou uma trilha de navegacao recem-inserida no
     /monitoria/termos.html e a transformou numa segunda barra pegajosa — o
     rodape estava protegido, a trilha nao. Estas declaracoes ficam: elas custam
     nada e cobrem a proxima pagina que declarar `nav {}` sem saber disso. */
  position: static;
  top: auto; right: auto; bottom: auto; left: auto;
  z-index: auto;
  width: auto;
  height: auto;
  min-height: 0;
  background: none;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  border: 0;
  box-shadow: none;
  padding: 0;
  transform: none;

  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 0 18px;
  margin: 14px 0 0;
  line-height: 1.9;
}
.gsf-footer .gsf-legal-link {
  font-family: inherit;
  font-size: 0.78rem;
  font-weight: 500;
  letter-spacing: 0.01em;
  text-transform: none !important;
  text-decoration: none;
  color: var(--gsf-text) !important;
  opacity: .62;
  transition: color 0.22s ease, opacity 0.22s ease;
  white-space: nowrap;
}
.gsf-footer .gsf-legal-link:hover,
.gsf-footer .gsf-legal-link:focus-visible {
  color: var(--gsf-color) !important;
  opacity: 1;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.gsf-footer .gsf-legal-link:focus-visible {
  outline: 2px solid var(--gsf-color);
  outline-offset: 3px;
  border-radius: 3px;
}
/* reset de <button> para que "Cookies" seja indistinguível dos <a> vizinhos */
.gsf-footer .gsf-legal-btn {
  appearance: none;
  -webkit-appearance: none;
  background: none;
  border: 0;
  padding: 0;
  margin: 0;
  cursor: pointer;
}
@media (prefers-reduced-motion: reduce) {
  .gsf-footer .gsf-legal-link { transition: none; }
}

/* Copyright. Sete paginas traziam um aviso proprio no rodape artesanal (um deles
   congelado em "© 2024"); a padronizacao levou todos. O ano agora vem do
   relogio do visitante, entao nao ha o que envelhecer. */
.gsf-footer .gsf-copy {
  display: block;
  box-sizing: border-box;
  margin: 12px 0 0 !important;
  padding: 0;
  font-family: inherit;
  font-size: .72rem;
  font-weight: 400;
  letter-spacing: normal;
  line-height: 1.5;
  text-align: center;
  text-transform: none !important;
  color: var(--gsf-text) !important;
  opacity: .45;
}

/* ── O RODAPE E' DONO DA PROPRIA CAIXA ─────────────────────────────────────
   Duas quebras medidas em producao:
   · /quemsoueu declara `p { max-width: 66ch }`. Como .gsf-brand e .gsf-copy sao
     <p>, herdavam o teto de 66ch (~592px) e, sendo blocos sem margem automatica,
     encostavam na esquerda: o texto ficava centrado DENTRO de uma caixa
     descentrada. Daí a marca 232px fora do eixo enquanto os links estavam no
     centro.
   · /404 usa `body { display:flex; align-items:center; justify-content:center }`
     para centralizar o cartao de erro. O rodape virou item da MESMA linha e foi
     comprimido a 309px, 300px a direita do centro.
   Por isso cada peca reafirma largura, teto e margem — e o rodape se declara
   item de linha inteira, para o caso de cair num pai flex ou grid. */
.gsf-footer {
  width: 100%;
  max-width: none;
  margin-left: auto;
  margin-right: auto;
  flex: 0 0 100%;      /* pai flex: ocupa a linha, nao divide espaco */
  grid-column: 1 / -1; /* pai grid: atravessa todas as colunas */
  align-self: stretch;
  justify-self: stretch;
}
.gsf-footer .gsf-brand,
.gsf-footer .gsf-sub,
.gsf-footer .gsf-copy,
.gsf-footer .gsf-links {
  max-width: none !important;   /* vence `p { max-width: 66ch }` do host */
  width: auto;
  margin-left: auto;
  margin-right: auto;
}

/* ── SEM FILETE ────────────────────────────────────────────────────────────
   `data-gsf-rule="none"` remove a linha de topo. Existe para paginas cujo
   layout nao e' uma coluna de conteudo — a /404 centraliza um cartao sobre um
   gradiente, e ali um filete de ponta a ponta corta a composicao em vez de
   separar secoes. Nas paginas de conteudo o filete continua, porque ali ele
   faz o trabalho dele. */
.gsf-footer[data-gsf-rule="none"] { border-top: 0; }
