/* ===========================================================
   MORPH-SLIDES BASE
   Stage 1920x1080 scaled by JS (idea from frontend-slides
   viewport-base.css, MIT). Actors = persistent shapes that
   morph between poses; slides = per-slide content layer.
   =========================================================== */

:root {
  --morph-dur: 1.2s;
  --morph-ease: cubic-bezier(0.16, 1, 0.3, 1);   /* ease-out-expo */
  --fade-dur: 0.35s;
  --reveal-base: 0.45s;   /* content waits for actors to start moving */
  --reveal-step: 0.09s;
  --stage-bg: #000;
}

html, body {
  width: 100%; height: 100%; margin: 0;
  overflow: hidden;
  background: var(--stage-bg);
}
*, *::before, *::after { box-sizing: border-box; }

.deck-viewport { position: fixed; inset: 0; overflow: hidden; background: var(--stage-bg); }

.deck-stage {
  position: absolute; left: 0; top: 0;
  width: 1920px; height: 1080px;
  overflow: hidden;
  transform-origin: 0 0;
  background-color: var(--bg, #fff);
  color: var(--fg, #111);
  font-family: var(--font-body, system-ui, sans-serif);
  transition: background-color var(--morph-dur) var(--morph-ease),
              color var(--morph-dur) var(--morph-ease);
}

/* ---------- ACTORS ----------
   Pose = CSS variables set by style files per layout/pose:
   --x --y --w --h (px, --h defaults to --w), --r (deg), --s (scale),
   --o (opacity), --bw (outline width, centered on the edge like
   PowerPoint lines). Width/height animate so borders keep thickness. */
.actors { position: absolute; inset: 0; pointer-events: none; }
.actors.back  { z-index: 0; }
.actors.front { z-index: 20; }

.actor {
  position: absolute; left: 0; top: 0;
  width: calc(var(--w, 200px) + var(--bw, 0px));
  height: calc(var(--h, var(--w, 200px)) + var(--bw, 0px));
  transform: translate(calc(var(--x, -400px) - var(--bw, 0px) / 2), calc(var(--y, -400px) - var(--bw, 0px) / 2))
             rotate(var(--r, 0deg)) scale(var(--s, 1));
  opacity: var(--o, 1);
  transition-property: transform, width, height, opacity, background-color,
                       border-color, border-width, border-radius, box-shadow, filter, color;
  transition-duration: var(--morph-dur);
  transition-timing-function: var(--morph-ease);
  /* no will-change: it caused 1px seams on large panels when the stage is scaled down */
}
.actor > svg { display: block; width: 100%; height: 100%; overflow: visible; }

/* ---------- SLIDES (content layer) ---------- */
.slide {
  position: absolute; inset: 0; z-index: 10;
  width: 1920px; height: 1080px;
  overflow: hidden;
  visibility: hidden; opacity: 0; pointer-events: none;
  transition: opacity var(--fade-dur) ease, visibility 0s linear var(--fade-dur);
}
.slide.active {
  visibility: visible; opacity: 1; pointer-events: auto;
  transition: opacity var(--fade-dur) ease, visibility 0s;
}

/* Reveal: hidden until slide is active, staggered by --i (set by engine) */
.reveal, .reveal-left, .reveal-right, .reveal-scale, .reveal-blur {
  opacity: 0;
  transition: opacity 0.3s ease, transform 0.3s ease, filter 0.3s ease;
}
.reveal       { transform: translateY(40px); }
.reveal-left  { transform: translateX(-60px); }
.reveal-right { transform: translateX(60px); }
.reveal-scale { transform: scale(0.85); }
.reveal-blur  { filter: blur(12px); }
/* repeated layouts enter differently: variant 2 slides in from the left, variant 3 zooms in */
.slide[data-variant="2"] .reveal { transform: translateX(-56px); }
.slide[data-variant="3"] .reveal { transform: scale(0.92); }

.slide.active :is(.reveal, .reveal-left, .reveal-right, .reveal-scale, .reveal-blur) {
  opacity: 1; transform: none; filter: none;
  transition-duration: 0.8s;
  transition-timing-function: var(--morph-ease);
  transition-delay: calc(var(--reveal-base) + var(--i, 0) * var(--reveal-step));
}

/* FLIP: element shared between two slides (data-morph-id) */
.slide .flip-run {
  opacity: 1 !important; filter: none !important;
  transform-origin: 0 0;
  transition: transform var(--morph-dur) var(--morph-ease) !important;
}
.slide .flip-src { opacity: 0 !important; transition: none !important; }

/* ---------- UI chrome (outside design) ---------- */
.deck-progress {
  position: fixed; left: 0; bottom: 0; height: 4px; width: 0;
  background: var(--accent, #3b82f6); z-index: 1000;
  /* dark + light hairline so the bar stays visible on any background colour */
  box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.35), 0 -2px 0 rgba(255, 255, 255, 0.35);
  transition: width 0.6s var(--morph-ease);
}
/* edge buttons: a thin strip on each side, almost invisible until the mouse comes near */
.deck-edge {
  position: fixed; top: 0; bottom: 0; z-index: 1001; width: 64px; padding: 0; border: 0;
  display: flex; align-items: center; justify-content: center;
  background: transparent; color: #fff; cursor: pointer; opacity: .18;
  transition: opacity .25s ease, background .25s ease;
}
.deck-edge.prev { left: 0; }
.deck-edge.next { right: 0; }
.deck-edge span {
  display: grid; place-items: center; width: 44px; height: 44px; border-radius: 50%;
  font: 400 34px/1 system-ui, sans-serif; background: rgba(0, 0, 0, .45); padding-bottom: 4px;
}
.deck-edge:hover, .deck-edge:focus-visible { opacity: 1; }
.deck-edge.prev:hover { background: linear-gradient(90deg, rgba(0, 0, 0, .28), transparent); }
.deck-edge.next:hover { background: linear-gradient(270deg, rgba(0, 0, 0, .28), transparent); }
.deck-counter {
  position: fixed; right: 18px; bottom: 12px; z-index: 1000;
  font: 600 13px/1 system-ui, sans-serif; letter-spacing: 0.08em;
  color: #fff; mix-blend-mode: difference; opacity: 0.55;
}

/* Reduced motion (often from Windows "Animation effects" = off):
   keep a short, gentle morph because motion IS the deck's content. */
@media (prefers-reduced-motion: reduce) {
  :root { --morph-dur: 0.7s; --reveal-base: 0.2s; --reveal-step: 0.04s; }
  .reveal-blur { filter: none; }
  *, *::before, *::after { animation-duration: 0.01ms !important; }
}
