/* ==========================================================================
   WEBINAR ANIMADO — design system tiagobastos.site
   fundo escuro · grid ciano · Anton caixa alta · gradiente ciano→violeta→magenta
   ========================================================================== */

:root {
  --bg: #05070e;
  --bg-2: #070c16;
  --panel: #080f1c;
  --line: #16233a;
  --cyan: #00e5ff;
  --violet: #8b5cf6;
  --magenta: #ff2e88;
  --green: #00d68f;
  --amber: #ffb020;
  --white: #f4f8ff;
  --soft: #c9d6e8;
  --grey: #8b99af;
  --dim: #5f6e86;

  --display: "Anton", "Arial Narrow", "Helvetica Neue", sans-serif;
  --body: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;

  --u: min(1vw, 1.7778vh);
  --dot-off: #ff2b3d;
  --dot-on: #00d68f;
}

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

html, body {
  height: 100%;
  overflow: hidden;
  background: var(--bg);
  color: var(--soft);
  font-family: var(--body);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

::selection { background: rgba(0, 229, 255, .28); color: #fff; }

/* ---------------------------------------------------------------- palco */
#stage {
  position: fixed;
  inset: 0;
  overflow: hidden;
  background: var(--bg);
}

/* ==========================================================================
   FUNDO GLOBAL — um só para o deck inteiro
   camadas: base escura → neon nos cantos → feixes em movimento → grid → partículas
   Regra: o centro fica escuro. A luz vem das bordas, senão o texto perde força.
   ========================================================================== */
.bg-layer {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
  background: var(--bg);
}

/* vinheta base: leve clareada no alto, peso embaixo */
.bg-veil {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse 78% 46% at 50% -8%, rgba(12, 26, 48, .85), transparent 62%),
    radial-gradient(ellipse 120% 60% at 50% 108%, rgba(6, 11, 22, .95), transparent 64%);
}

/* neon nos cantos — halos pequenos, opacidade baixa, movimento lento */
.aurora {
  position: absolute;
  border-radius: 50%;
  filter: blur(calc(var(--u) * 7));
  mix-blend-mode: screen;
  will-change: transform, opacity;
  pointer-events: none;
  opacity: .16;
}
.aurora.a {                                   /* ciano, canto inferior esquerdo */
  width: 46vw; height: 46vw; left: -16vw; bottom: -14vw;
  background: radial-gradient(circle, rgba(0, 200, 240, .85), transparent 64%);
  animation: driftA 38s ease-in-out infinite, pulseA 14s ease-in-out infinite;
}
.aurora.b {                                   /* violeta, canto superior direito */
  width: 40vw; height: 40vw; right: -14vw; top: -12vw;
  background: radial-gradient(circle, rgba(139, 92, 246, .8), transparent 64%);
  animation: driftB 47s ease-in-out infinite, pulseB 19s ease-in-out infinite;
}
.aurora.c {                                   /* magenta, faixa direita baixa */
  width: 34vw; height: 34vw; right: 6vw; bottom: -16vw;
  background: radial-gradient(circle, rgba(255, 46, 136, .7), transparent 66%);
  animation: driftC 55s ease-in-out infinite, pulseA 23s ease-in-out infinite reverse;
}

@keyframes driftA {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
  50%      { transform: translate3d(6vw, -4vh, 0) scale(1.12); }
}
@keyframes driftB {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1.06); }
  50%      { transform: translate3d(-7vw, 5vh, 0) scale(.94); }
}
@keyframes driftC {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
  50%      { transform: translate3d(-5vw, -3vh, 0) scale(1.16); }
}
@keyframes pulseA {
  0%, 100% { opacity: .11; }
  50%      { opacity: .22; }
}
@keyframes pulseB {
  0%, 100% { opacity: .13; }
  50%      { opacity: .26; }
}

/* feixes de neon: faixas largas e desfocadas que atravessam devagar */
.beams {
  position: absolute;
  inset: -30%;
  mix-blend-mode: screen;
  opacity: .55;
  filter: blur(calc(var(--u) * 2.2));
}
.beams i {
  position: absolute;
  display: block;
  width: calc(var(--u) * 14);
  height: 150%;
  transform: rotate(14deg);
  will-change: transform, opacity;
}
.beams i:nth-child(1) {
  left: 4%;
  background: linear-gradient(90deg, transparent,
    rgba(0, 229, 255, .16) 46%, rgba(0, 229, 255, .05) 72%, transparent);
  animation: beamA 30s ease-in-out infinite;
}
.beams i:nth-child(2) {
  left: 40%;
  width: calc(var(--u) * 20);
  background: linear-gradient(90deg, transparent,
    rgba(139, 92, 246, .13) 50%, transparent);
  animation: beamB 38s ease-in-out infinite;
}
.beams i:nth-child(3) {
  left: 72%;
  background: linear-gradient(90deg, transparent,
    rgba(255, 46, 136, .11) 44%, transparent 78%);
  animation: beamA 46s ease-in-out infinite reverse;
}
@keyframes beamA {
  0%, 100% { transform: rotate(14deg) translate3d(0, -5%, 0); opacity: .40; }
  50%      { transform: rotate(14deg) translate3d(4vw, 5%, 0); opacity: .85; }
}
@keyframes beamB {
  0%, 100% { transform: rotate(14deg) translate3d(0, 4%, 0); opacity: .30; }
  50%      { transform: rotate(14deg) translate3d(-5vw, -4%, 0); opacity: .75; }
}

/* varredura larga, quase invisível — dá a sensação de "luz passando" */
.sweep {
  position: absolute;
  inset: -40%;
  mix-blend-mode: screen;
  background: linear-gradient(112deg,
    transparent 38%,
    rgba(0, 229, 255, .030) 46%,
    rgba(190, 210, 255, .045) 50%,
    rgba(139, 92, 246, .030) 54%,
    transparent 64%);
  animation: sweepX 46s ease-in-out infinite alternate;
  will-change: transform;
}
@keyframes sweepX {
  from { transform: translate3d(-24%, 0, 0); }
  to   { transform: translate3d(24%, 0, 0); }
}

/* grid do site, com a mesma máscara radial */
.bg-grid {
  position: absolute;
  inset: -40%;
  background-image:
    linear-gradient(to right, rgba(0, 229, 255, .055) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(0, 229, 255, .055) 1px, transparent 1px);
  background-size: calc(var(--u) * 5.6) calc(var(--u) * 5.6);
  mask-image: radial-gradient(ellipse 65% 55% at 50% 30%, #000 20%, transparent 78%);
  -webkit-mask-image: radial-gradient(ellipse 65% 55% at 50% 30%, #000 20%, transparent 78%);
  animation: gridDrift 34s linear infinite;
}
@keyframes gridDrift {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(0, calc(var(--u) * 5.6), 0); }
}

/* partículas: canvas por cima de tudo do fundo */
#fx {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  mask-image: radial-gradient(ellipse 84% 80% at 50% 48%, #000 30%, transparent 88%);
  -webkit-mask-image: radial-gradient(ellipse 84% 80% at 50% 48%, #000 30%, transparent 88%);
}

@media (prefers-reduced-motion: reduce) {
  .aurora, .sweep, .bg-grid, .beams i { animation: none !important; }
}


/* ==========================================================================
   SLIDES DE CURSO — palco 1920x1080 escalado + revelação por clique
   Geometria absoluta (a mesma do PDF/PPTX), mas cada elemento entra no seu
   próprio clique, como no webinar.
   ========================================================================== */

#stage { display: grid; place-items: center; }

.slide {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 1920px;
  height: 1080px;
  margin: -540px 0 0 -960px;
  padding: 0;
  z-index: 2;
  display: none;
  overflow: hidden;
  background: transparent;
  transform: scale(var(--s, .5));
  transform-origin: center center;
}
.slide.on { display: block; }
.slide.in { animation: slideFade .5s cubic-bezier(.22,.61,.36,1) both; }

/* véu: garante leitura do texto sobre partículas/neon sem apagar o fundo */
.slide::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background: radial-gradient(ellipse 72% 76% at 50% 50%,
    rgba(5, 7, 14, .46) 0%, rgba(5, 7, 14, .18) 56%, transparent 84%);
}

/* ------------------------------------------------------------ elementos */
.el { position: absolute; z-index: 1; }
.el.text { white-space: pre-wrap; }
.el.text span { display: inline; }
.el.upper { text-transform: uppercase; }
/* a foto vive dentro de uma moldura estática; só ela respira */
.el.img {
  overflow: hidden;
  border-radius: 20px;
  border: 1px solid rgba(0, 229, 255, .34);
  box-shadow:
    0 0 0 1px rgba(0, 229, 255, .07),
    0 40px 110px -50px rgba(0, 229, 255, .55),
    0 0 70px -18px rgba(139, 92, 246, .35);
  background: #05070e;
}
/* arte de espera: a moldura já vem na imagem, não desenhar outra */
.el.img.bare { border: 0; box-shadow: none; }
.el.img img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* a arte nunca fica parada: respiração lenta em loop (o zoom do genvid faz o
   mesmo no webinar). Cada imagem recebe --imgloop diferente para não
   sincronizar, e a borda cortada fica escondida pelo overflow acima. */
.el.img img {
  animation: imgLoop var(--imgloop, 26s) ease-in-out infinite alternate;
  transform-origin: 50% 46%;
}
@keyframes imgLoop {
  from { transform: scale(1.015) translate3d(0, 0, 0); }
  to   { transform: scale(1.085) translate3d(-0.9%, -1.1%, 0); }
}
@media (prefers-reduced-motion: reduce) {
  .el.img img { animation: none; }
}
.el.chart svg { width: 100%; height: 100%; display: block; }
.el.glyph svg { width: 100%; height: 100%; display: block; overflow: visible; }
.el.line { position: absolute; transform-origin: left center; }
.on .el.line.grow { animation: ruleGrow .9s cubic-bezier(.22,.61,.36,1) both; }
@keyframes ruleGrow { from { transform: scaleX(0); } to { transform: scaleX(1); } }

.acc {
  background: linear-gradient(96deg, #00e5ff 0%, #33b6ff 30%, #8b5cf6 66%, #ff2e88 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  -webkit-text-fill-color: transparent;
}

/* -------------------------------------------------------- revelação */
.rv {
  opacity: 0;
  transition:
    opacity .58s cubic-bezier(.22,.61,.36,1),
    transform .86s cubic-bezier(.16,1,.3,1),
    clip-path .9s cubic-bezier(.22,.61,.36,1),
    filter .7s ease;
  will-change: opacity, transform;
}
.rv-rise { transform: translateY(56px); filter: blur(6px); }
.rv-fade { transform: translateY(22px); }
.rv-pop  { transform: scale(.93); filter: blur(4px); }
.rv-wipe { clip-path: inset(0 100% 0 0); opacity: 1; }
.rv.show {
  opacity: 1;
  transform: none;
  filter: none;
  /* folga de propósito: em Anton o til de "Õ"/"Ã" sobe acima da caixa do
     elemento e um inset(0) decapitava o acento (VERSÃO virava VERSAO). */
  clip-path: inset(-90px -20px -40px -20px);
}
.slide.all .rv { opacity: 1 !important; transform: none !important;
  filter: none !important; clip-path: none !important; transition: none !important; }

@media (prefers-reduced-motion: reduce) {
  .rv { transition: opacity .3s linear; transform: none !important; filter: none !important; }
  .on .el.line.grow { animation: none; }
}

/* -------------------------------------------------------- controles */
.deck-bar {
  position: fixed;
  top: 0; left: 0;
  height: 2px;
  width: 0;
  z-index: 70;
  background: linear-gradient(90deg, var(--cyan), var(--violet) 55%, var(--magenta));
  box-shadow: 0 0 16px rgba(0, 229, 255, .5);
  transition: width .45s cubic-bezier(.22,.61,.36,1);
}

.dots {
  position: fixed;
  left: calc(var(--u) * 3.2);
  bottom: calc(var(--u) * 3.2);
  z-index: 60;
  display: flex;
  gap: calc(var(--u) * .85);
  align-items: center;
}
.dots i {
  display: block;
  width: calc(var(--u) * .78);
  height: calc(var(--u) * .78);
  border-radius: 50%;
  background: var(--dot-off);
  box-shadow: 0 0 10px rgba(255, 43, 61, .55);
  transition: background .3s, box-shadow .3s, transform .3s;
}
.dots i.on {
  background: var(--dot-on);
  box-shadow: 0 0 12px rgba(0, 214, 143, .8);
  transform: scale(1.12);
}

.controls {
  position: fixed;
  right: calc(var(--u) * 3.2);
  bottom: calc(var(--u) * 2.6);
  z-index: 60;
  display: flex;
  align-items: center;
  gap: calc(var(--u) * 1.2);
  transition: opacity .6s;
}
.navbtn {
  width: calc(var(--u) * 5.4);
  height: calc(var(--u) * 5.4);
  border-radius: 50%;
  border: 1px solid var(--line);
  background: rgba(8, 15, 28, .82);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  display: grid;
  place-items: center;
  cursor: pointer;
  color: var(--soft);
  transition: border-color .25s, color .25s, box-shadow .25s, transform .18s, background .25s;
}
.navbtn:hover {
  border-color: rgba(0, 229, 255, .6);
  color: var(--white);
  box-shadow: 0 0 30px rgba(0, 229, 255, .22);
  background: rgba(8, 18, 32, .92);
}
.navbtn:active { transform: scale(.94); }
.navbtn:disabled { opacity: .28; cursor: default; box-shadow: none; }
.navbtn svg { width: 42%; height: 42%; }
.navbtn.next { border-color: rgba(0, 229, 255, .35); color: var(--cyan); }

.counter {
  position: fixed;
  left: 50%;
  bottom: calc(var(--u) * 1.15);
  transform: translateX(-50%);
  z-index: 55;
  font-family: var(--mono);
  font-size: calc(var(--u) * .92);
  letter-spacing: .18em;
  text-transform: uppercase;
  color: rgba(95, 110, 134, .9);
  pointer-events: none;
  transition: opacity .6s;
}
.counter b { color: #9fe9ff; font-weight: 500; }

.idle .controls, .idle .counter { opacity: 0; }

/* celular em pé: o deck 16:9 fica pequeno — avisa para girar (não bloqueia) */
.rotate-hint {
  position: fixed;
  top: calc(var(--u) * 2.4);
  left: 50%;
  transform: translateX(-50%);
  z-index: 80;
  display: none;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  border-radius: 999px;
  border: 1px solid rgba(0, 229, 255, .28);
  background: rgba(8, 15, 28, .82);
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--grey);
  pointer-events: none;
}
.rotate-hint b { color: var(--cyan); font-weight: 500; }
@media (max-width: 820px) and (orientation: portrait) {
  .rotate-hint { display: flex; }
}

@media print {
  .aurora, .beams, .sweep, .bg-grid, #fx { display: none !important; }
  .dots, .controls, .counter, .deck-bar, .rotate-hint { display: none !important; }
}
