@keyframes markBreathe { 0%, 100% { opacity: .35; transform: scale(.96); } 50% { opacity: .9; transform: scale(1.02); } }
@keyframes railDrift { 0% { stroke-dashoffset: 0; } 100% { stroke-dashoffset: -280; } }
@keyframes softBlink { 0%, 100% { opacity: .35; } 50% { opacity: 1; } }
@keyframes fadeIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
@keyframes lineGrow { from { transform: scaleX(0); } to { transform: scaleX(1); } }
.sound-start .start-mark { animation: markBreathe 4s ease-in-out infinite; }
.river-trace { stroke-dasharray: 6 14; animation: railDrift 18s linear infinite; }
.river-trace.ghost { animation-duration: 26s; }
.field-node i { animation: softBlink 3.2s ease-in-out infinite; }
.voice-chapter.is-entered .chapter-index span { animation: lineGrow .6s var(--ease) both; transform-origin: left; }
.resonance-overlay.is-active .resonance-message { animation: fadeIn 1.2s .35s var(--ease) both; }
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; transition-duration: .01ms !important; }
}
