/* ==========================================================================
   Motion — restrained. Scroll-reveal, a reading-progress rule, a signal
   pulse through the journey diagram, a filling timeline spine, and one
   slow 青海波 (seigaiha / signal-wave) band. All disabled under
   prefers-reduced-motion.
   ========================================================================== */

/* ---- Scroll reveal ------------------------------------------------- */
.motion-ready .reveal {
  opacity: 0;
  transform: translateY(14px);
}

.motion-ready .reveal.reveal--in {
  opacity: 1;
  transform: none;
  transition: opacity 620ms cubic-bezier(0.22, 1, 0.36, 1),
    transform 620ms cubic-bezier(0.22, 1, 0.36, 1);
}

/* ---- Reading-progress rule (sits on the masthead band) ----------- */
.read-progress {
  position: fixed;
  top: 0;
  left: 0;
  height: 3px;
  width: 100%;
  transform-origin: 0 50%;
  transform: scaleX(0);
  background: linear-gradient(90deg, var(--seal-600), var(--rule) 40%);
  z-index: calc(var(--z-header) + 1);
  pointer-events: none;
  transition: transform 90ms linear;
}

/* ---- Timeline: an indigo spine that fills with scroll ---------- */
.timeline--track {
  position: relative;
}

.timeline--track > .timeline__fill {
  position: absolute;
  left: 17px;
  top: 8px;
  width: 2px;
  background: var(--rule);
  height: 0;
  will-change: height;
  transition: height 120ms linear;
  z-index: 0;
}

.timeline--track .timeline__step.is-reached .timeline__num {
  background: var(--primary-600);
  color: #fff;
  box-shadow: 0 0 0 5px color-mix(in srgb, var(--primary-600) 12%, transparent);
  transition: box-shadow 300ms ease, background 300ms ease;
}

.timeline--track .timeline__step .timeline__num {
  background: var(--surface);
  color: var(--ink-400);
  box-shadow: inset 0 0 0 2px var(--line-strong);
  transition: box-shadow 300ms ease, background 300ms ease, color 300ms ease;
  position: relative;
  z-index: 1;
}

.timeline--track .timeline__step.is-reached.timeline__step--highlight .timeline__num {
  background: var(--seal-600);
  box-shadow: 0 0 0 5px color-mix(in srgb, var(--seal-600) 14%, transparent);
}

/* ---- SVG draw-on (opt-in via [data-draw]) --------------------- */
.motion-ready [data-draw] path,
.motion-ready [data-draw] line,
.motion-ready [data-draw] polyline {
  stroke-dasharray: var(--dash, 1);
  stroke-dashoffset: var(--dash, 1);
}

.motion-ready [data-draw].drawn path,
.motion-ready [data-draw].drawn line,
.motion-ready [data-draw].drawn polyline {
  stroke-dashoffset: 0;
  transition: stroke-dashoffset 900ms ease;
}

/* ---- Seigaiha wave band (top of footer, ambient) ------------- */
.seigaiha-band {
  height: 40px;
  width: 100%;
  overflow: hidden;
  position: relative;
  z-index: 1;
  opacity: 0.4;
  margin-bottom: calc(-1 * var(--space-4));
}

.seigaiha-band svg {
  width: 100%;
  height: 100%;
  display: block;
}

.seigaiha-band .wave {
  opacity: 0.4;
  animation: seigaiha 9s ease-in-out infinite;
}

.seigaiha-band .wave:nth-child(4n) { animation-delay: 0s; }
.seigaiha-band .wave:nth-child(4n + 1) { animation-delay: 1.4s; }
.seigaiha-band .wave:nth-child(4n + 2) { animation-delay: 2.8s; }
.seigaiha-band .wave:nth-child(4n + 3) { animation-delay: 4.2s; }

@keyframes seigaiha {
  0%, 100% { opacity: 0.28; }
  50% { opacity: 0.72; }
}

/* ---- Hover lift only where it reads as "pressable" ----------- */
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  .card--link,
  .category-tile,
  .guide-link,
  .dict-entry {
    transition: border-color 160ms ease, background 160ms ease,
      transform 160ms ease, box-shadow 160ms ease;
  }
}

/* ---- Reduced motion: turn it all off ----------------------- */
@media (prefers-reduced-motion: reduce) {
  .motion-ready .reveal,
  .motion-ready .reveal.reveal--in {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
  .read-progress { display: none; }
  .seigaiha-band .wave { animation: none; opacity: 0.4; }
  .motion-ready [data-draw] path,
  .motion-ready [data-draw] line,
  .motion-ready [data-draw] polyline {
    stroke-dasharray: none !important;
    stroke-dashoffset: 0 !important;
  }
}
