/* ==========================================================================
   Motion pass — design.md §16 / prd.md §10. Applied AFTER functionality
   (build order step 18). transform/opacity only (§19), quiet easing,
   full prefers-reduced-motion fallback.
   ========================================================================== */

/* ---- Page transition: 250ms fade-through on route change (§16) ----
   Old content fades out 120ms (JS adds .page-leaving before navigation),
   new page fades in 130ms on load. No slides — "boutique, not app". */
body {
  animation: page-enter 130ms var(--easing-entrance) both;
}

@keyframes page-enter {
  from { opacity: 0; }
  to { opacity: 1; }
}

body.page-leaving {
  opacity: 0;
  transition: opacity 120ms var(--easing-standard);
}

/* ---- Shared scroll-reveal (§16): translate up 20-24px + fade,
   20% viewport trigger, 60-80ms sibling stagger (set inline by JS). ---- */
.reveal {
  opacity: 0;
  transform: translateY(22px);
  transition: opacity 400ms var(--easing-entrance), transform 400ms var(--easing-entrance);
}

.reveal--visible {
  opacity: 1;
  transform: none;
}

/* ---- Reduced motion: instant swaps, no parallax, no page fade (§16) ---- */
@media (prefers-reduced-motion: reduce) {
  body { animation: none; }
  body.page-leaving { opacity: 1; transition: none; }
  .reveal { opacity: 1; transform: none; transition: none; }
}

/* ---- Skip link (§18 keyboard navigation) ---- */
.skip-link {
  position: absolute;
  top: -48px;
  left: var(--space-4);
  z-index: calc(var(--z-toast) + 1);
  background: var(--color-neutral-ink);
  color: var(--color-neutral-50);
  padding: var(--space-3) var(--space-5);
  border-radius: 0 0 var(--radius-md) var(--radius-md);
  font-family: var(--font-label);
  font-size: 13px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  transition: top 150ms var(--easing-standard);
}

.skip-link:focus-visible {
  top: 0;
}

/* ---- LQIP blur-up (§19): image fades in over a champagne placeholder ---- */
.img-lqip {
  background: linear-gradient(135deg, var(--color-neutral-100), var(--color-accent-champagne));
}

.img-lqip > img,
img.img-blur-up {
  opacity: 0;
  filter: blur(8px);
  transition: opacity 400ms var(--easing-entrance), filter 400ms var(--easing-entrance);
}

img.img-blur-up--loaded {
  opacity: 1;
  filter: none;
}

@media (prefers-reduced-motion: reduce) {
  img.img-blur-up { opacity: 1; filter: none; transition: none; }
}
