/* ==========================================================================
   MAGA MORGANA — Oráculos Autorais
   Identidade: preto profundo, vermelho sangue, dourado envelhecido, marfim.
   Editorial, oracular, sofisticado. Sem excessos góticos.
   ========================================================================== */

/*
  VARIÁVEIS CSS (CSS Custom Properties)

  O seletor :root representa o elemento mais "alto" do documento (na
  prática, equivale ao <html>). Declarar propriedades ali dentro faz com
  que elas fiquem disponíveis para TODO o site.

  Propriedades que começam com "--" não são propriedades CSS de verdade
  (como "color" ou "padding") — são VARIÁVEIS que nós mesmos criamos.

  Exemplo:
  --gold: #b6892f;

  Depois, em qualquer lugar do CSS, podemos usar:
  color: var(--gold);

  Isso é enorme para manutenção: se um dia a Maga Morgana quiser mudar o
  tom do dourado da marca, basta alterar o valor de --gold aqui em cima
  UMA vez, em vez de procurar e trocar a mesma cor espalhada em dezenas
  de seletores pelo arquivo inteiro.
*/
:root {
  /* Cores base — extraídas das artes de referência da marca */
  --black-abs: #050403;
  --black: #0a0806;
  --black-soft: #120e0c;
  --wine: #2a0a0a;
  --red-deep: #6e1414;
  --red: #8f1c1f;
  --red-bright: #b5222c;
  --gold: #b6892f;
  --gold-light: #d7b567;
  --ivory: #ebe1cd;
  --ivory-dim: #c9bfa9;

  /* Tipografia — nomes das três famílias de fonte carregadas no <head> */
  --font-display: "Cinzel", serif;
  --font-serif: "Cormorant Garamond", serif;
  --font-body: "Lato", sans-serif;

  /*
    Espaçamento

    --section-pad usa clamp(), uma função explicada com detalhes mais
    abaixo, na primeira vez que ela aparece em um contexto de layout.
    Resumindo aqui: ela cria um valor "elástico", que cresce ou encolhe
    conforme o tamanho da tela, mas sem nunca passar dos limites definidos.
  */
  --section-pad: clamp(4.5rem, 9vw, 8rem);
  --container-w: 1200px;
  --container-narrow: 780px;

  /*
    Efeitos

    --ease guarda uma "curva de aceleração" personalizada, usada em quase
    toda transição do site (troque para "ease" ou "linear" em qualquer
    transition e sinta a diferença) — é o que dá aquela sensação suave,
    "elegante", em vez de um movimento mecânico.
  */
  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --radius-soft: 2px;
}

/*
  ---------- Reset ----------

  Cada navegador vem com estilos padrão próprios para títulos, listas,
  links etc., o que causa pequenas inconsistências entre eles. Um
  "reset" zera essas diferenças, para o site começar do mesmo ponto de
  partida em qualquer navegador — depois disso, definimos nós mesmos
  cada espaçamento e comportamento, com controle total.
*/

/*
  box-sizing: border-box;

  Por padrão, o navegador soma padding e border a largura/altura que você
  define. Com border-box, padding e border passam a ficar DENTRO da
  largura/altura declarada — assim, um elemento com width: 200px continua
  com exatamente 200px de largura total, mesmo que ganhe um padding
  depois. Isso evita muita dor de cabeça calculando tamanhos manualmente.
*/
*, *::before, *::after { box-sizing: border-box; }

/*
  scroll-behavior: smooth;

  Faz a página rolar suavemente até o destino quando clicamos em um link
  de âncora (href="#algum-id"), em vez de "pular" instantaneamente.
*/
html { scroll-behavior: smooth; }

/*
  @media (prefers-reduced-motion: reduce)

  Alguns sistemas operacionais têm uma opção de acessibilidade para
  reduzir animações (útil para quem sente enjoo ou desconforto com
  movimento na tela). Esta media query detecta essa preferência e, quando
  ativa, praticamente elimina a duração de animações e transições no
  site inteiro — respeitando a escolha da pessoa, sem que ela precise
  configurar nada dentro do nosso site.
*/
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; }
}

/* Remove a margem padrão que navegadores aplicam a esses elementos. */
body, h1, h2, h3, p, ul, ol, figure { margin: 0; }

/* Listas (<ul>/<ol>) vêm, por padrão, com preenchimento e marcadores
   (•, 1., 2. ...). Como nosso menu, timeline e outras listas têm
   estilo visual próprio, removemos esse comportamento padrão aqui. */
ul, ol { padding: 0; list-style: none; }

/* Impede que uma imagem "estoure" a largura do elemento pai, e remove o
   pequeno espaço fantasma que aparece embaixo de imagens quando elas são
   tratadas como texto (display: inline, o padrão do navegador). */
img { max-width: 100%; display: block; }

/* Links, por padrão, vêm sublinhados e com uma cor azul própria. Aqui
   fazemos o link herdar a cor do texto ao redor (color: inherit) e
   removemos o sublinhado — cada estilo de link específico (menu, botões
   etc.) é então definido individualmente mais abaixo. */
a { color: inherit; text-decoration: none; }

/* Botões HTML também vêm com uma aparência padrão do sistema operacional
   (borda 3D, fundo cinza). Zeramos tudo isso para poder estilizar cada
   botão do zero, mantendo apenas o cursor de "mãozinha" ao passar por
   cima, que ajuda a indicar que é clicável. */
button { font: inherit; background: none; border: none; cursor: pointer; color: inherit; }

/* Configuração padrão para todos os ícones SVG do site (usados nos
   cartões de "O que é um oráculo autoral" e na lista "Todos os oráculos
   incluem"): sem preenchimento (fill: none), com o traço na cor do texto
   ao redor (stroke: currentColor) e pontas arredondadas. */
svg { fill: none; stroke: currentColor; stroke-width: 1.4; stroke-linecap: round; stroke-linejoin: round; }

/*
  Estilos base do <body>.

  line-height: 1.7 define o espaçamento vertical entre linhas de texto —
  um valor confortável (bem maior que 1) ajuda a leitura de parágrafos
  longos, como os da seção "Sobre".
*/
body {
  background: var(--black);
  color: var(--ivory);
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 16px;
  line-height: 1.7;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/*
  Textura sutil de fundo — vinheta radial, não imagem.

  Em vez de usar uma imagem de textura (o que pesaria no carregamento da
  página), simulamos uma atmosfera com dois radial-gradient() bem sutis:
  um vermelho perto do topo, outro dourado perto do canto inferior
  direito. background-attachment: fixed faz esse gradiente ficar "preso"
  à janela do navegador, em vez de rolar junto com o conteúdo — por isso
  a sensação de profundidade se mantém durante toda a rolagem da página.
*/
body {
  background-image:
    radial-gradient(ellipse 90% 60% at 50% 0%, rgba(110, 20, 20, 0.14), transparent 60%),
    radial-gradient(ellipse 70% 50% at 85% 100%, rgba(182, 137, 47, 0.06), transparent 60%);
  background-attachment: fixed;
}

/* Cor de destaque quando o usuário seleciona (arrasta o mouse sobre) um
   texto da página, em vez do azul padrão do navegador. */
::selection { background: var(--red-deep); color: var(--ivory); }

/*
  :focus-visible

  Define o contorno dourado que aparece ao redor de links e botões quando
  navegados via TECLADO (tecla Tab). Diferente de :focus (que dispara
  também em cliques de mouse), :focus-visible é mais inteligente: o
  navegador só o aciona quando entende que a pessoa está navegando por
  teclado — assim, o contorno de foco não "pisca" desnecessariamente a
  cada clique do mouse, mas continua disponível para quem depende dele.
*/
:focus-visible {
  outline: 1.5px solid var(--gold-light);
  outline-offset: 3px;
}

/*
  .skip-link

  position: absolute tira o elemento do fluxo normal da página e permite
  posicioná-lo livremente com left/top, em relação ao ancestral
  posicionado mais próximo (aqui, na prática, a própria janela).
  Colocamos left: -999px para jogar o link BEM para fora da tela — ele
  existe no HTML (por isso leitores de tela o encontram), mas fica
  invisível para quem enxerga, até o momento em que ganha foco.
*/
.skip-link {
  position: absolute;
  left: -999px;
  top: 0;
  background: var(--black);
  color: var(--ivory);
  padding: 0.8rem 1.4rem;
  z-index: 999;
  border: 1px solid var(--gold);
}
/* Ao receber foco (Tab), o link "entra" na tela, ficando visível no
   canto superior esquerdo até perder o foco novamente. */
.skip-link:focus { left: 1rem; top: 1rem; }

/*
  ---------- Utilitários de tipografia ----------

  "Utilitário" aqui significa: uma classe pequena e reutilizável, criada
  para resolver um único aspecto visual (neste caso, o texto pequeno de
  destaque acima dos títulos, como "O que é um oráculo autoral").

  letter-spacing (espaçamento entre letras) bem alto, combinado com
  text-transform: uppercase (força tudo em maiúsculas), é o que dá aquele
  efeito de "selo"/legenda editorial, no mesmo espírito das legendas nos
  cantos das artes originais da marca.
*/
.eyebrow {
  font-family: var(--font-body);
  font-size: 0.72rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--gold-light);
  margin-bottom: 0.9rem;
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
}

/*
  clamp(mínimo, ideal, máximo)

  Esta é a primeira vez que clamp() aparece no arquivo, então vale
  explicar: é uma função CSS que escolhe um valor entre um mínimo e um
  máximo, baseado em um terceiro valor "ideal" (aqui, quase sempre uma
  unidade "vw" — % da largura da tela).

  Em font-size: clamp(1.8rem, 3.4vw, 2.7rem):
  - nunca fica menor que 1.8rem (protege a leitura em telas pequenas);
  - nunca fica maior que 2.7rem (evita um título gigante em monitores
    muito largos);
  - entre esses dois limites, o tamanho cresce suavemente conforme a
    tela aumenta (3.4vw = 3.4% da largura da janela).

  Isso substitui a necessidade de escrever várias media queries só para
  ajustar o tamanho da fonte em cada largura de tela.
*/
.section-title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(1.8rem, 3.4vw, 2.7rem);
  line-height: 1.28;
  letter-spacing: 0.01em;
  color: var(--ivory);
}
.section-title .accent { color: var(--red-bright); }

.section-lead {
  font-family: var(--font-serif);
  font-style: italic;
  font-size: clamp(1.1rem, 1.6vw, 1.35rem);
  color: var(--ivory-dim);
  margin-top: 1.1rem;
  max-width: 46ch;
}

.section-body {
  margin-top: 1rem;
  max-width: 60ch;
  color: var(--ivory-dim);
  font-weight: 300;
}

/*
  ---------- Layout containers ----------

  "Container" é um termo comum em CSS para um elemento que centraliza e
  limita a largura do conteúdo dentro dele — evita, por exemplo, que um
  parágrafo de texto se estique de ponta a ponta em uma tela ultrawide,
  o que dificultaria muito a leitura.

  max-width: var(--container-w) impede que o conteúdo ultrapasse 1200px
  de largura. margin: 0 auto centraliza o elemento horizontalmente: como
  ele tem uma largura máxima definida, o navegador distribui o espaço
  sobrante igualmente nas margens esquerda e direita.

  position: relative em .section não move nada visualmente por si só —
  ela existe para servir de "âncora" para elementos filhos que usem
  position: absolute (como o selo do modal, os cantos decorativos do
  hero etc.), fazendo esses filhos se posicionarem em relação a esta
  seção, e não em relação à janela inteira do navegador.
*/
.section { padding: var(--section-pad) 0; position: relative; }
.section-inner { max-width: var(--container-w); margin: 0 auto; padding: 0 clamp(1.25rem, 4vw, 2.5rem); }
.section-inner.narrow { max-width: var(--container-narrow); }

.section-head { max-width: 640px; margin-bottom: clamp(2.5rem, 5vw, 4rem); }

/* ---------- Botões ---------- */
/*
  .btn (estilo base compartilhado por todos os botões do site)

  transition

  Diz ao navegador: "quando alguma dessas propriedades mudar de valor
  (por exemplo, no hover), não troque instantaneamente — anime a
  mudança suavemente, ao longo do tempo indicado". Aqui, quatro
  propriedades diferentes têm sua própria duração/curva, todas usando a
  mesma curva --ease definida lá no :root.

  Sem transition, o botão simplesmente "pularia" de um estado para o
  outro; com ela, a cor de fundo e a posição (transform) deslizam
  suavemente entre os estados normal e :hover.
*/
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.95rem 2.1rem;
  font-family: var(--font-body);
  font-size: 0.85rem;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  font-weight: 600;
  border: 1px solid transparent;
  border-radius: var(--radius-soft);
  transition: transform 0.35s var(--ease), background-color 0.35s var(--ease), border-color 0.35s var(--ease), color 0.35s var(--ease);
  white-space: nowrap;
}

.btn-primary {
  background: linear-gradient(180deg, var(--red) 0%, var(--red-deep) 100%);
  color: var(--ivory);
  border-color: var(--red-bright);
}
/*
  transform: translateY(-2px);

  transform aplica transformações visuais (mover, girar, escalar) sem
  afetar o espaço que o elemento ocupa no layout — diferente de mudar
  "margin" ou "top", por exemplo, que empurrariam outros elementos ao
  redor. translateY(-2px) move o botão 2 pixels para CIMA no hover,
  criando a sensação sutil de que ele "levanta" ao passar o mouse.
*/
.btn-primary:hover { background: linear-gradient(180deg, var(--red-bright) 0%, var(--red) 100%); transform: translateY(-2px); }

.btn-ghost {
  background: transparent;
  color: var(--gold-light);
  border-color: var(--gold);
}
.btn-ghost:hover { background: rgba(182, 137, 47, 0.1); transform: translateY(-2px); }

.btn-small { padding: 0.7rem 1.4rem; font-size: 0.72rem; }
.btn-large { padding: 1.15rem 2.8rem; font-size: 0.92rem; }

/*
  RESPONSIVIDADE E MEDIA QUERIES

  "Breakpoint" é a largura de tela em que o layout muda de comportamento
  para se adaptar melhor ao espaço disponível. Este projeto usa,
  principalmente, dois breakpoints:
  - até ~1179px  → tratado como "mobile/tablet estreito" (menu hamburguer,
                  colunas empilhadas);
  - a partir de 1180px → tratado como "desktop" (menu completo visível,
                  grades em várias colunas).

  Uma @media query é um bloco de CSS que só é aplicado quando a condição
  entre parênteses é verdadeira. @media (min-width: 1180px) significa
  "só aplique este bloco quando a tela tiver 1180px de largura OU MAIS".

  Aqui embaixo, por exemplo: o botão "Criar meu Oráculo" do cabeçalho
  fica escondido (display: none) em telas pequenas — porque nelas já
  existe o botão de destaque repetido dentro do hero, logo abaixo — e só
  aparece no cabeçalho a partir de 1180px, quando há espaço sobrando.
*/
.btn-header { display: none; }

@media (min-width: 1180px) {
  .btn-header { display: inline-flex; }
}

/* ==========================================================================
   HEADER
   ========================================================================== */
/*
  position: fixed

  Diferente de position: relative (que só cria uma "âncora" sem se mover),
  fixed tira o elemento do fluxo normal da página e o gruda em um ponto
  da JANELA do navegador — aqui, top/left/right: 0 fixam o cabeçalho no
  topo, ocupando toda a largura, e ele permanece visível mesmo quando a
  página é rolada para baixo.

  z-index: 100

  Camadas: quando elementos se sobrepõem na tela, o z-index decide qual
  fica por cima. Quanto maior o número, mais "acima" o elemento aparece.
  O cabeçalho precisa de um z-index alto (100) para ficar por cima do
  conteúdo das seções ao rolar a página, mas o modal, mais abaixo neste
  arquivo, usa um z-index ainda maior (200), pois precisa aparecer por
  cima de tudo, inclusive do próprio cabeçalho.

  backdrop-filter: blur(10px)

  Desfoca o que está ATRÁS do elemento (o conteúdo da página passando por
  trás do cabeçalho semitransparente), criando aquele efeito de "vidro
  fosco" comum em interfaces modernas. A versão "-webkit-" é necessária
  para garantir que o efeito também funcione no Safari.
*/
.site-header {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: 100;
  background: rgba(10, 8, 6, 0.72);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-bottom: 1px solid rgba(182, 137, 47, 0.18);
  transition: background-color 0.4s var(--ease), border-color 0.4s var(--ease);
}

/*
  Flexbox (display: flex)

  Flexbox organiza os filhos diretos de um elemento em uma única linha
  (ou coluna). Aqui:
  - align-items: center      → alinha logo, menu e botões verticalmente
                                no centro do cabeçalho;
  - justify-content: space-between → empurra o primeiro filho (logo)
                                para a esquerda e o último (botões) para
                                a direita, distribuindo o espaço vazio
                                entre eles;
  - gap: 1.5rem              → cria um espaço mínimo garantido entre os
                                filhos, sem precisar de margin manual em
                                cada um.
*/
.header-inner {
  max-width: var(--container-w);
  margin: 0 auto;
  padding: 0.85rem clamp(1.25rem, 4vw, 2.5rem);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
}

.brand {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  flex-shrink: 0;
}

/*
  .brand-seal

  A partir da v2, o selo usa um arquivo PNG com fundo transparente e um
  brilho vermelho já "assado" na própria imagem (ver README, seção sobre
  o logo). Por isso não recortamos mais em círculo (border-radius não
  faria sentido aqui — cortaria o brilho) nem usamos object-fit: cover
  (que também cortaria a imagem); o tamanho da caixa é um pouco maior que
  o selo em si, porque o arquivo já inclui uma margem ao redor para o
  brilho "respirar" sem ser cortado nas bordas.
*/
.brand-seal {
  width: 50px;
  height: 50px;
  object-fit: contain;
}

.brand-text { display: flex; flex-direction: column; line-height: 1.15; }
.brand-name {
  font-family: var(--font-display);
  font-size: 1rem;
  letter-spacing: 0.04em;
  color: var(--ivory);
}
.brand-tag {
  font-size: 0.62rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--gold-light);
  margin-top: 0.15rem;
}

.main-nav { flex: 1; display: flex; justify-content: center; }
.nav-list {
  display: none;
  align-items: center;
  gap: clamp(1rem, 2vw, 1.9rem);
}
.nav-list a {
  font-size: 0.8rem;
  letter-spacing: 0.05em;
  color: var(--ivory-dim);
  position: relative;
  padding: 0.3rem 0.1rem;
  transition: color 0.3s var(--ease);
}
/*
  ::before e ::after (pseudo-elementos)

  São "elementos fantasmas" que o CSS pode criar antes ou depois do
  conteúdo real de um elemento, sem precisar adicionar nenhuma tag extra
  no HTML. Eles só aparecem se tiverem a propriedade "content" definida
  (mesmo que vazia, como aqui: content: "").

  Usamos ::after em cada link do menu para desenhar um sublinho dourado
  que começa com largura 0 (invisível) e, no :hover, cresce até 100% —
  a transition na largura é o que cria o efeito de "traço se desenhando"
  da esquerda para a direita.
*/
.nav-list a::after {
  content: "";
  position: absolute;
  left: 0; bottom: 0;
  width: 0;
  height: 1px;
  background: var(--gold);
  transition: width 0.3s var(--ease);
}
.nav-list a:hover { color: var(--ivory); }
.nav-list a:hover::after { width: 100%; }

@media (min-width: 1180px) {
  .nav-list { display: flex; }
}

.header-actions { display: flex; align-items: center; gap: 1rem; flex-shrink: 0; }

/* Botão hamburger */
.nav-toggle {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 34px;
  height: 34px;
}
.nav-toggle span {
  display: block;
  width: 100%;
  height: 1px;
  background: var(--ivory);
  transition: transform 0.35s var(--ease), opacity 0.35s var(--ease);
}
/*
  Seletor de atributo: [aria-expanded="true"]

  Este é um exemplo de como CSS pode "reagir" a um atributo alterado
  pelo JavaScript. Quando main.js muda aria-expanded do botão de "false"
  para "true" (ao abrir o menu), estas três regras entram em ação e
  transformam as três barrinhas do ícone hamburguer em um "X": as barras
  1 e 3 giram 45°/-45° e se movem até se cruzarem no centro, e a barra 2
  (a do meio) desaparece (opacity: 0). O resultado é a animação clássica
  de hambúrguer → X.
*/
.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

@media (min-width: 1180px) {
  .nav-toggle { display: none; }
}

/*
  Menu mobile: painel deslizante

  @media (max-width: 1179px) → o oposto de min-width: só aplica o bloco
  quando a tela tem 1179px de largura OU MENOS (ou seja, mobile/tablet).

  A técnica usada aqui é bem comum: o menu já existe sempre no HTML e no
  CSS, só que começa posicionado FORA da tela, à direita
  (transform: translateX(100%) desloca 100% da própria largura do
  elemento para a direita). Quando ganha a classe .is-open (adicionada
  pelo JavaScript no clique do hamburguer), o translateX volta a 0 e a
  transition anima esse deslocamento suavemente — dando a sensação de o
  menu "deslizar" para dentro da tela, vindo da direita.
*/
@media (max-width: 1179px) {
  .main-nav {
    position: fixed;
    top: 0; right: 0;
    height: 100vh;
    width: min(78vw, 340px);
    background: var(--black-soft);
    border-left: 1px solid rgba(182, 137, 47, 0.22);
    transform: translateX(100%);
    transition: transform 0.45s var(--ease);
    display: block;
    padding: 6.5rem 2rem 2rem;
  }
  .main-nav.is-open { transform: translateX(0); }
  .nav-list {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 1.4rem;
  }
  .nav-list a { font-size: 1rem; }
}

.nav-scrim {
  position: fixed; inset: 0;
  background: rgba(5, 4, 3, 0.6);
  z-index: 90;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.4s var(--ease);
}
.nav-scrim.is-visible { opacity: 1; pointer-events: auto; }

/* ==========================================================================
   HERO
   ========================================================================== */
/*
  min-height: 100svh

  "svh" (small viewport height) é uma unidade parecida com "vh" (1vh =
  1% da altura da tela), mas pensada para celulares: em navegadores
  mobile, a barra de endereço às vezes aparece/desaparece ao rolar a
  página, mudando a altura visível disponível. "svh" usa sempre a menor
  altura possível da tela, evitando que o hero "pule" de tamanho nesses
  momentos. Na prática, min-height: 100svh faz esta seção ocupar pelo
  menos a altura inteira da tela ao carregar a página.
*/
.hero {
  position: relative;
  min-height: 100svh;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 8rem 1.5rem 5rem;
  overflow: hidden;
}

/*
  inset: 0

  Atalho para "top: 0; right: 0; bottom: 0; left: 0;" de uma só vez —
  faz o pseudo-elemento cobrir totalmente o elemento pai (aqui, a seção
  .hero inteira), já que ele está com position: absolute.

  Este ::before fica ATRÁS de todo o conteúdo do hero (graças a
  z-index: -1) e é puramente visual. A partir da v2, além dos dois
  radial-gradient() que já criavam os brilhos vermelho e dourado, uma
  foto real (textura-fumaca.jpg, recorte da arte oficial da marca) entra
  como mais uma camada de fundo, no lado esquerdo. O
  linear-gradient() escuro logo antes da imagem funciona como um "véu":
  ele fica por cima da foto e a escurece, garantindo que o texto do hero
  continue com contraste alto e fácil de ler, mesmo com a foto por trás.

  CSS permite empilhar várias camadas de fundo separadas por vírgula —
  a primeira da lista fica mais "na frente", a última mais "atrás". A
  cor sólida (--black-abs) no final funciona como uma base, caso alguma
  camada acima não cubra 100% da área.
*/
.hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse 60% 45% at 50% 28%, rgba(143, 28, 31, 0.22), transparent 65%),
    radial-gradient(ellipse 80% 60% at 50% 100%, rgba(182, 137, 47, 0.08), transparent 70%),
    linear-gradient(100deg, rgba(5, 4, 3, 0.4) 0%, rgba(5, 4, 3, 0.94) 46%, rgba(5, 4, 3, 0.98) 100%),
    url("../assets/backgrounds/textura-fumaca.jpg") left center / auto 100% no-repeat,
    var(--black-abs);
  z-index: -1;
}

.hero-corner {
  position: absolute;
  top: 7.5rem;
  font-size: 0.66rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ivory-dim);
  line-height: 1.7;
  opacity: 0.75;
  display: none;
}
.hero-corner--tl { left: 2.5rem; text-align: left; }
.hero-corner--tr { right: 2.5rem; text-align: right; }
@media (min-width: 1000px) { .hero-corner { display: block; } }

.hero-content { max-width: 700px; display: flex; flex-direction: column; align-items: center; }

/*
  .hero-seal

  Mesmo raciocínio do .brand-seal: a imagem já vem com fundo transparente
  e brilho vermelho embutido, então não recortamos em círculo. Removemos
  também o antigo filter: drop-shadow (que simulava um brilho vermelho
  via CSS) porque o brilho agora já existe dentro do próprio arquivo de
  imagem — manter os dois ao mesmo tempo deixaria o efeito exagerado.
*/
.hero-seal {
  width: 112px;
  height: 112px;
  object-fit: contain;
  margin-bottom: 1.8rem;
}

.hero-motto {
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 1.15rem;
  color: var(--gold-light);
  margin-bottom: 1.6rem;
}

.hero-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2rem, 5.2vw, 3.6rem);
  line-height: 1.22;
  color: var(--ivory);
  text-transform: uppercase;
  letter-spacing: 0.01em;
}
.hero-title .accent { color: var(--red-bright); }

.hero-text {
  margin-top: 1.6rem;
  max-width: 46ch;
  color: var(--ivory-dim);
  font-size: 1.02rem;
}

.hero-buttons {
  margin-top: 2.4rem;
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  justify-content: center;
}

.hero-keywords {
  margin-top: 3rem;
  font-size: 0.68rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ivory-dim);
  opacity: 0.7;
}

.hero-scroll-hint {
  position: absolute;
  bottom: 2.2rem;
  left: 50%;
  transform: translateX(-50%);
  width: 1px;
  height: 42px;
  background: linear-gradient(180deg, transparent, var(--gold));
  overflow: hidden;
}
.hero-scroll-hint span {
  position: absolute;
  top: -100%;
  left: 0;
  width: 100%;
  height: 100%;
  background: linear-gradient(180deg, transparent, var(--gold-light));
  animation: scrollLine 2.6s ease-in-out infinite;
}
@keyframes scrollLine {
  0% { top: -100%; }
  60%, 100% { top: 100%; }
}

/* ==========================================================================
   FEATURE GRID (O que é um oráculo autoral)
   ========================================================================== */
/*
  CSS Grid (display: grid)

  Enquanto o Flexbox (visto lá no header) organiza itens em UMA linha ou
  coluna, o Grid organiza itens em LINHAS E COLUNAS ao mesmo tempo —
  ideal para grades de cartões, como esta.

  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr))

  Lido em partes:
  - minmax(190px, 1fr)  → cada coluna deve ter, no mínimo, 190px, mas
                           pode crescer até dividir igualmente o espaço
                           disponível (1fr = "1 fração" do espaço livre).
  - auto-fit            → o navegador calcula sozinho quantas colunas
                           cabem na largura atual da tela, respeitando
                           esse mínimo de 190px.

  Resultado prático: em telas largas, os 5 cartões ficam lado a lado;
  conforme a tela estreita, o navegador vai reduzindo o número de
  colunas automaticamente, SEM precisarmos escrever uma media query
  para cada tamanho de tela.

  O truque do "gap: 1px" com "background" no elemento pai e um fundo
  sólido em cada .feature-card (mais abaixo) cria linhas finas de
  separação entre os cartões, sem precisar de "border" em cada um.
*/
.feature-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 1px;
  background: rgba(182, 137, 47, 0.18);
  border: 1px solid rgba(182, 137, 47, 0.18);
}

.feature-card {
  background: var(--black);
  padding: 2.4rem 1.6rem;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.feature-icon {
  width: 46px;
  height: 46px;
  color: var(--gold);
  margin-bottom: 1.3rem;
}
.feature-icon svg { width: 100%; height: 100%; }

.feature-card h3 {
  font-family: var(--font-display);
  font-size: 0.95rem;
  letter-spacing: 0.03em;
  color: var(--ivory);
  margin-bottom: 0.6rem;
  text-transform: uppercase;
}

.feature-card p {
  font-size: 0.86rem;
  color: var(--ivory-dim);
  line-height: 1.6;
}

/* ==========================================================================
   SPLIT SECTION (Criado para você)
   ========================================================================== */
.section--split { background: var(--black-soft); }

.split-inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: 3rem;
  align-items: center;
}
@media (min-width: 860px) {
  .split-inner { grid-template-columns: 0.9fr 1.1fr; gap: 4.5rem; }
}

.split-frame {
  position: relative;
  border: 1px solid var(--gold);
  padding: 10px;
  aspect-ratio: 2 / 3;
  max-width: 380px;
  margin: 0 auto;
}
.split-frame::before {
  content: "";
  position: absolute;
  inset: 4px;
  border: 1px solid rgba(182, 137, 47, 0.45);
  pointer-events: none;
}
.split-frame img { width: 100%; height: 100%; object-fit: cover; }

.split-text .btn { margin-top: 1.8rem; }

/* ==========================================================================
   TIMELINE (Como nasce um oráculo)
   ========================================================================== */
.timeline {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
  border-top: 1px solid rgba(182, 137, 47, 0.22);
}
@media (min-width: 760px) {
  .timeline { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1080px) {
  .timeline { grid-template-columns: repeat(3, 1fr); }
}

.timeline-step {
  padding: 2.4rem 2rem 2.4rem 0;
  border-bottom: 1px solid rgba(182, 137, 47, 0.22);
  display: flex;
  gap: 1.2rem;
  position: relative;
}
@media (min-width: 760px) {
  .timeline-step:nth-child(odd) { border-right: 1px solid rgba(182, 137, 47, 0.22); padding-left: 0; padding-right: 2rem; }
  .timeline-step:nth-child(even) { padding-left: 2rem; }
}
@media (min-width: 1080px) {
  .timeline-step { padding-left: 2rem !important; padding-right: 2rem !important; }
  .timeline-step:nth-child(3n+1) { padding-left: 0 !important; }
  .timeline-step:nth-child(3n) { border-right: none !important; }
  .timeline-step:not(:nth-child(3n)) { border-right: 1px solid rgba(182, 137, 47, 0.22); }
}

.timeline-index {
  font-family: var(--font-display);
  font-size: 1.6rem;
  color: var(--red-bright);
  flex-shrink: 0;
  line-height: 1;
  padding-top: 0.15rem;
}

.timeline-body h3 {
  font-family: var(--font-display);
  font-size: 1.02rem;
  color: var(--ivory);
  text-transform: uppercase;
  letter-spacing: 0.03em;
  margin-bottom: 0.5rem;
}
.timeline-body p { font-size: 0.9rem; color: var(--ivory-dim); }

/* ==========================================================================
   VALORES / PREÇOS
   ========================================================================== */
.section--valores { background: var(--black-soft); }

.pricing-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.5rem;
}
@media (min-width: 780px) {
  .pricing-grid { grid-template-columns: repeat(3, 1fr); align-items: end; }
}

.price-card {
  border: 1px solid rgba(182, 137, 47, 0.4);
  padding: 2.6rem 2rem;
  text-align: center;
  position: relative;
  background: var(--black);
  display: flex;
  flex-direction: column;
  align-items: center;
  transition: transform 0.4s var(--ease), border-color 0.4s var(--ease);
}
.price-card:hover { transform: translateY(-4px); border-color: var(--gold); }

.price-card--featured {
  border-color: var(--red-bright);
  background: linear-gradient(180deg, rgba(143, 28, 31, 0.12), var(--black) 55%);
  padding-top: 3.2rem;
}
@media (min-width: 780px) { .price-card--featured { padding-bottom: 3rem; } }

.price-card__badge {
  position: absolute;
  top: -13px;
  left: 50%;
  transform: translateX(-50%);
  background: var(--red-bright);
  color: var(--ivory);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  padding: 0.4rem 1rem;
  white-space: nowrap;
}

.price-card__name {
  font-family: var(--font-display);
  font-size: 1.05rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--gold-light);
  margin-bottom: 1rem;
}

.price-card__value {
  font-family: var(--font-display);
  font-size: 2.6rem;
  color: var(--ivory);
  margin-bottom: 1.1rem;
  line-height: 1;
}
.price-card__value .currency { font-size: 1.1rem; vertical-align: super; margin-right: 0.15rem; color: var(--ivory-dim); }
.price-card__value .cents { font-size: 1.2rem; color: var(--ivory-dim); }

.price-card__desc {
  font-size: 0.88rem;
  color: var(--ivory-dim);
  margin-bottom: 1.8rem;
  max-width: 26ch;
}

.price-card .btn { margin-top: auto; width: 100%; }

.includes {
  margin-top: clamp(3rem, 6vw, 4.5rem);
  padding-top: clamp(3rem, 6vw, 4.5rem);
  border-top: 1px solid rgba(182, 137, 47, 0.22);
  text-align: center;
}
.includes-title {
  font-family: var(--font-display);
  font-size: 0.85rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--gold-light);
  margin-bottom: 2.2rem;
}

.includes-list {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 2.6rem 3.2rem;
  margin-bottom: 2.2rem;
}
.includes-list li {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.7rem;
  max-width: 140px;
}
.includes-list svg { width: 36px; height: 36px; color: var(--gold); }
.includes-list span { font-size: 0.82rem; color: var(--ivory-dim); }

.includes-note {
  max-width: 60ch;
  margin: 0 auto;
  font-size: 0.85rem;
  color: var(--ivory-dim);
  opacity: 0.85;
}

.strip { background: var(--wine); border-top: 1px solid rgba(182, 137, 47, 0.3); border-bottom: 1px solid rgba(182, 137, 47, 0.3); margin-top: clamp(3rem, 6vw, 4.5rem); }
.strip-inner {
  max-width: var(--container-w);
  margin: 0 auto;
  padding: 2.4rem clamp(1.25rem, 4vw, 2.5rem);
  display: grid;
  grid-template-columns: 1fr;
  gap: 2rem;
  text-align: center;
}
@media (min-width: 760px) {
  .strip-inner { grid-template-columns: 1fr auto 1fr; text-align: left; align-items: center; }
}
.strip-item { display: flex; flex-direction: column; gap: 0.35rem; }
.strip-divider { width: 1px; height: 100%; background: rgba(235, 225, 205, 0.15); justify-self: center; display: none; }
@media (min-width: 760px) { .strip-divider { display: block; } }
.strip-label { font-size: 0.68rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold-light); }
.strip-value { font-family: var(--font-display); font-size: 1.15rem; color: var(--ivory); }
.strip-note { font-size: 0.8rem; color: var(--ivory-dim); max-width: 44ch; }

/* ==========================================================================
   PORTFÓLIO
   ========================================================================== */
/*
  .portfolio-hero foi removida nesta versão: a seção de Portfólio deu
  lugar ao Catálogo de Oráculos, que não usa mais essa classe. Ver
  README para o histórico dessa mudança.
*/

.portfolio-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.5rem;
}
@media (min-width: 620px) { .portfolio-grid { grid-template-columns: repeat(2, 1fr); } }
/*
  Nesta versão, o catálogo tem exatamente 9 cartões. Em telas largas,
  3 colunas formam uma grade 3×3 perfeitamente equilibrada (sem sobrar
  espaço vazio em uma última linha incompleta, como aconteceria com 4
  colunas). Esta é uma das alterações de layout feitas especificamente
  para acomodar o novo catálogo.
*/
@media (min-width: 1080px) { .portfolio-grid { grid-template-columns: repeat(3, 1fr); } }

.portfolio-card {
  border: 1px solid rgba(182, 137, 47, 0.3);
  padding: 1.8rem 1.6rem 1.6rem;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.85rem;
  transition: border-color 0.35s var(--ease), transform 0.35s var(--ease);
}
.portfolio-card:hover { border-color: var(--gold); transform: translateY(-3px); }

/*
  .portfolio-card__image

  A imagem de cada oráculo "sangra" até as bordas do cartão: como o
  cartão já tem padding definido acima (1.8rem no topo, 1.6rem nas
  laterais), usamos margens NEGATIVAS do mesmo tamanho para puxar a
  imagem de volta até a borda, cobrindo a área que o padding deixaria
  vazia. aspect-ratio mantém uma proporção fixa (retrato, como a capa
  de uma caixa de oráculo) mesmo com fotos de tamanhos originais
  diferentes; object-fit: cover preenche esse espaço sem distorcer a
  imagem, cortando o excesso quando necessário.
*/
.portfolio-card__image {
  width: calc(100% + 3.2rem);
  margin: -1.8rem -1.6rem 0.2rem;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  display: block;
  border-bottom: 1px solid rgba(182, 137, 47, 0.3);
}

.portfolio-card__seal {
  font-size: 0.62rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--red-bright);
  border: 1px solid rgba(181, 34, 44, 0.5);
  padding: 0.3rem 0.65rem;
}

.portfolio-card h3 {
  font-family: var(--font-display);
  font-size: 1.02rem;
  color: var(--ivory);
  line-height: 1.35;
}
.portfolio-card p { font-size: 0.86rem; color: var(--ivory-dim); font-style: italic; font-family: var(--font-serif); }
.portfolio-card .btn { margin-top: auto; }

/* Bloco de reforço do serviço de criação personalizada, logo abaixo da
   grade do catálogo — ver comentário no HTML sobre catálogo x criação. */
.catalog-cta {
  margin-top: clamp(2.5rem, 5vw, 3.5rem);
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.2rem;
}
.catalog-cta p {
  max-width: 46ch;
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 1.05rem;
  color: var(--ivory-dim);
}


/* ==========================================================================
   SOBRE / PROSE
   ========================================================================== */
/*
  Assim como no Hero, uma foto real (recorte da arte oficial da marca)
  entra como camada de fundo, desta vez do lado direito, atrás do texto
  narrativo. O gradient escuro à frente dela garante que a leitura do
  texto continue confortável.
*/
.section--sobre {
  background:
    linear-gradient(260deg, rgba(18, 14, 12, 0.4) 0%, rgba(18, 14, 12, 0.95) 42%, rgba(18, 14, 12, 0.98) 100%),
    url("../assets/backgrounds/textura-lua-cartas.jpg") right center / auto 100% no-repeat,
    var(--black-soft);
}

.prose p {
  margin-bottom: 1.3rem;
  font-family: var(--font-serif);
  font-size: 1.15rem;
  color: var(--ivory-dim);
}
.prose-signature {
  margin-top: 2rem;
  color: var(--gold-light) !important;
  font-style: italic;
}

/* ==========================================================================
   EXCLUSIVIDADE
   ========================================================================== */
.section--exclusividade { text-align: center; }
.section--exclusividade .section-lead,
.section--exclusividade .section-body { margin-left: auto; margin-right: auto; }

/* ==========================================================================
   FAQ ACCORDION
   ========================================================================== */
.accordion { border-top: 1px solid rgba(182, 137, 47, 0.25); }
.accordion-item { border-bottom: 1px solid rgba(182, 137, 47, 0.25); }

.accordion-trigger {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
  padding: 1.5rem 0.2rem;
  text-align: left;
  font-family: var(--font-display);
  font-size: 1rem;
  color: var(--ivory);
}
.accordion-trigger:hover { color: var(--gold-light); }

.accordion-icon {
  position: relative;
  width: 16px;
  height: 16px;
  flex-shrink: 0;
}
.accordion-icon::before, .accordion-icon::after {
  content: "";
  position: absolute;
  background: var(--gold);
  transition: transform 0.35s var(--ease);
}
.accordion-icon::before { top: 50%; left: 0; width: 100%; height: 1px; transform: translateY(-50%); }
.accordion-icon::after { left: 50%; top: 0; height: 100%; width: 1px; transform: translateX(-50%); }
.accordion-trigger[aria-expanded="true"] .accordion-icon::after { transform: translateX(-50%) scaleY(0); }

/*
  .accordion-panel

  Começa com max-height: 0 e overflow: hidden — ou seja, a resposta
  existe no HTML, mas fica "cortada" em uma altura zero, então nada
  aparece. Não existe uma forma nativa em CSS de animar "de altura 0 até
  altura automática" (o navegador não sabe, sozinho, qual seria essa
  altura final). Por isso o JavaScript (função initAccordion, em
  main.js) calcula a altura real do conteúdo com panel.scrollHeight e
  aplica esse valor exato aqui via JavaScript — a transition abaixo é só
  quem torna essa mudança de altura suave, em vez de instantânea.
*/
.accordion-panel {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.4s var(--ease);
}
.accordion-panel p {
  padding: 0 0.2rem 1.6rem;
  color: var(--ivory-dim);
  max-width: 60ch;
}

/* ==========================================================================
   CTA FINAL
   ========================================================================== */
.cta-final {
  position: relative;
  padding: clamp(5rem, 10vw, 8rem) 1.5rem;
  text-align: center;
  overflow: hidden;
}
.cta-final::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse 55% 65% at 50% 50%, rgba(143, 28, 31, 0.24), transparent 70%),
    linear-gradient(80deg, rgba(5, 4, 3, 0.4) 0%, rgba(5, 4, 3, 0.95) 40%, rgba(5, 4, 3, 0.98) 100%),
    url("../assets/backgrounds/textura-cristal.jpg") left center / auto 100% no-repeat,
    var(--black-abs);
  z-index: -1;
}
.cta-final__inner { max-width: 620px; margin: 0 auto; }
.cta-final__seal {
  width: 76px; height: 76px;
  object-fit: contain;
  margin: 0 auto 1.6rem;
  opacity: 0.85;
}
.cta-final h2 {
  font-family: var(--font-display);
  font-size: clamp(1.7rem, 3.6vw, 2.6rem);
  color: var(--ivory);
  line-height: 1.3;
}
.cta-final p {
  margin-top: 1rem;
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 1.15rem;
  color: var(--gold-light);
}
.cta-final .btn { margin-top: 2.2rem; }

/* ==========================================================================
   FOOTER
   ========================================================================== */
.site-footer {
  background: var(--black-abs);
  border-top: 1px solid rgba(182, 137, 47, 0.2);
  padding: clamp(3rem, 6vw, 4rem) 1.5rem 2rem;
}
.footer-inner {
  max-width: var(--container-w);
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2rem;
  text-align: center;
}
.footer-seal { width: 58px; height: 58px; object-fit: contain; margin: 0 auto 0.8rem; }
.footer-name { font-family: var(--font-display); font-size: 1.05rem; color: var(--ivory); }
.footer-tag { font-size: 0.68rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold-light); margin-top: 0.3rem; }

.footer-links { display: flex; gap: 2rem; }
.footer-links a {
  font-size: 0.78rem;
  letter-spacing: 0.06em;
  color: var(--ivory-dim);
  transition: color 0.3s var(--ease);
}
.footer-links a:hover { color: var(--gold-light); }

.footer-bottom {
  border-top: 1px solid rgba(235, 225, 205, 0.1);
  padding-top: 1.5rem;
  width: 100%;
  font-size: 0.74rem;
  color: var(--ivory-dim);
  opacity: 0.75;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.1rem;
}

/*
  .footer-tech — crédito técnico da SeteVias

  Fica dentro do .footer-bottom, ou seja, já visualmente "abaixo" e
  secundário em relação ao nome e às redes sociais da Maga Morgana
  (que aparecem antes, no .footer-inner). O logo é pequeno (28px de
  altura) — pequeno o bastante para não competir com o selo da Maga
  Morgana, que é o elemento de marca principal do rodapé.
*/
.footer-tech {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.6rem;
  opacity: 0.85;
}
@media (min-width: 560px) {
  .footer-tech { flex-direction: row; text-align: left; gap: 0.9rem; }
}
.footer-tech__logo {
  height: 28px;
  width: auto;
  flex-shrink: 0;
  opacity: 0.9;
}
.footer-tech__text p {
  font-size: 0.68rem;
  line-height: 1.6;
  color: var(--ivory-dim);
}
.footer-tech__text a {
  color: var(--ivory-dim);
  text-decoration: underline;
  text-decoration-color: rgba(235, 225, 205, 0.3);
  transition: color 0.3s var(--ease);
}
.footer-tech__text a:hover { color: var(--gold-light); }

/* ==========================================================================
   MODAL (Portfólio)
   ========================================================================== */
/*
  .modal

  z-index: 200 — o valor mais alto do site, de propósito: o modal precisa
  aparecer por cima de absolutamente tudo, inclusive do cabeçalho fixo
  (que usa z-index: 100).

  Assim como .reveal, o modal fica invisível por padrão (opacity: 0), mas
  aqui também usamos pointer-events: none — isso impede CLIQUES no modal
  enquanto ele está fechado (mesmo estando "logicamente" ali, sobre a
  página, ele não deve capturar nenhuma interação). Quando o JavaScript
  adiciona a classe .is-open, tanto a opacidade quanto os cliques voltam
  ao normal.
*/
.modal {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.35s var(--ease);
}
.modal.is-open { opacity: 1; pointer-events: auto; }

.modal-overlay {
  position: absolute;
  inset: 0;
  background: rgba(5, 4, 3, 0.82);
  backdrop-filter: blur(4px);
}

.modal-panel {
  position: relative;
  background: var(--black-soft);
  border: 1px solid var(--gold);
  max-width: 480px;
  width: 100%;
  padding: 2.6rem 2.2rem;
  transform: translateY(16px);
  transition: transform 0.4s var(--ease);
}
.modal.is-open .modal-panel { transform: translateY(0); }

.modal-panel h3 {
  font-family: var(--font-display);
  font-size: 1.3rem;
  color: var(--ivory);
  margin-bottom: 1rem;
}
.modal-panel p:not(.eyebrow) { color: var(--ivory-dim); margin-bottom: 1.8rem; }

.modal-close {
  position: absolute;
  top: 1rem; right: 1rem;
  width: 32px; height: 32px;
  font-size: 1.4rem;
  color: var(--ivory-dim);
  transition: color 0.3s var(--ease);
}
.modal-close:hover { color: var(--gold-light); }

/* ==========================================================================
   REVEAL ON SCROLL
   Anima blocos suavemente quando eles entram na área visível da tela
   ao rolar a página. A DETECÇÃO de quando isso acontece é feita em
   JavaScript (função initRevealOnScroll, em main.js, usando
   IntersectionObserver) — aqui no CSS só definimos os DOIS ESTADOS
   visuais possíveis; quem alterna entre eles é o JavaScript.
   ========================================================================== */

/*
  .reveal — estado inicial (escondido)

  opacity: 0            → totalmente transparente (invisível, mas ainda
                           ocupa espaço no layout, diferente de
                           display: none).
  transform: translateY(18px) → começa 18px mais abaixo da posição final,
                           criando um leve efeito de "subida" quando
                           aparece.
  transition             → diz para animar suavemente qualquer mudança
                           futura nessas duas propriedades.
*/
.reveal {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 0.8s var(--ease), transform 0.8s var(--ease);
}

/*
  .reveal.is-visible — estado final (visível)

  Este seletor combinado (duas classes grudadas, sem espaço) só afeta
  elementos que têm AS DUAS classes ao mesmo tempo: .reveal E
  .is-visible. O JavaScript adiciona .is-visible no elemento assim que
  ele entra na tela; a partir daí, a transition definida acima anima a
  opacidade e a posição até os valores finais (totalmente visível, na
  posição original).
*/
.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}
