* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html,
body {
  height: 100%;
  overflow: hidden;
  background: #000;
}

#palco {
  position: relative;
  width: 100vw;
  height: 100vh;
  overflow: hidden;

  /* Posição/raio do furo da "lanterna". As camadas reveláveis herdam estes valores.
     Só o raio anima → abrir/fechar suave; a posição segue o cursor sem lag. */
  --spot-x: 50%;
  --spot-y: 50%;
  --spot-r: 0px;
  transition: --spot-r 0.3s ease;
}

/* Regra única para todas as camadas: mesma caixa, mesmo comportamento no resize.
   Preenche 100% da altura; a largura proporcional pode sobrar/cortar nas laterais.
   O único atributo que difere entre camadas é o z-index (definido via JS). */
.camada {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  height: 100%;
  width: auto;
  user-select: none;
  pointer-events: none;
}

/* Propriedade registrada (herdável) para que o raio do furo seja animável por transition. */
@property --spot-r {
  syntax: '<length>';
  inherits: true;
  initial-value: 0px;
}

/* "Lanterna": fura a máscara na posição do cursor, revelando a camada de baixo.
   Aplicada a TODAS as camadas reveláveis (humano e humano_silhueta), que herdam
   as variáveis --spot-* do #palco. */
.revelavel {
  -webkit-mask-image: radial-gradient(circle var(--spot-r) at var(--spot-x) var(--spot-y),
      transparent 0, transparent 60%, #000 100%);
          mask-image: radial-gradient(circle var(--spot-r) at var(--spot-x) var(--spot-y),
      transparent 0, transparent 60%, #000 100%);
}
