/* Calm movement on the complete chart keeps its routes and source cards aligned.
   Scroll parallax belongs to the outer .hero-visual in reveal.js. */
#knowledge-map {
  --map-rise: -5px;
  --map-fall: 4px;
  --map-roll: .35deg;
  --map-counter-roll: -.35deg;
  --needle-east: 4.5deg;
  --needle-west: -4deg;
  transform-origin: 50% 50%;
  animation: calm-chart-drift 18s ease-in-out infinite;
  will-change: transform;
}
.map-core > .compass-rotor {
  transform-origin: 50% 50%;
  animation: compass-calibration 16s ease-in-out infinite;
}
.map-rings {
  transform-box: view-box;
  transform-origin: 560px 235px;
  animation: compass-ring-sway 20s ease-in-out infinite;
}
@keyframes calm-chart-drift {
  0%, 100% { transform: translate3d(0, 0, 0) rotate(0deg); }
  25% { transform: translate3d(0, var(--map-rise), 0) rotate(var(--map-roll)); }
  50% { transform: translate3d(0, -1px, 0) rotate(.08deg); }
  75% { transform: translate3d(0, var(--map-fall), 0) rotate(var(--map-counter-roll)); }
}
@keyframes compass-calibration {
  0%, 100% { transform: rotate(0deg); }
  22% { transform: rotate(var(--needle-east)); }
  38% { transform: rotate(1deg); }
  60% { transform: rotate(var(--needle-west)); }
  78% { transform: rotate(-.6deg); }
  90% { transform: rotate(.35deg); }
}
@keyframes compass-ring-sway {
  0%, 100% { transform: rotate(0deg); }
  28% { transform: rotate(-2deg); }
  68% { transform: rotate(2deg); }
}
.motion-paused #knowledge-map,
.motion-paused .map-core > .compass-rotor,
.motion-paused .map-rings { animation-play-state: paused !important; }
@media (max-width: 640px) {
  #knowledge-map {
    --map-rise: -2.5px;
    --map-fall: 2px;
    --map-roll: .15deg;
    --map-counter-roll: -.15deg;
    --needle-east: 3deg;
    --needle-west: -2.5deg;
  }
}
@media (prefers-reduced-motion: reduce) {
  #knowledge-map, .map-core > .compass-rotor, .map-rings {
    animation: none !important;
    transform: none !important;
    will-change: auto;
  }
}

.compass-rotor { position:relative; display:block; flex-shrink:0; }
.map-core .compass-rotor > img { display:block; width:100%; height:100%; margin:0; object-fit:contain; }

/* A quiet, shared heartbeat for every lotse. wordmark. */
.brand-dot { display:inline-block; animation:lotse-alive 4s ease-in-out infinite; }
@keyframes lotse-alive { 0%, 65%, 100% { opacity:1; } 82% { opacity:.35; } }
.motion-paused .brand-dot { animation-play-state:paused !important; }
@media(prefers-reduced-motion:reduce) { .brand-dot { animation:none !important; opacity:1; } }

/* Connections circulate around the integration hub; labels stay readable. */
.open-symbol .open-orbit { animation:integration-orbit 32s linear infinite; }
.open-symbol .orbit-two { animation-duration:46s; animation-direction:reverse; }
.open-symbol .open-orbit::after { content:""; position:absolute; top:-3px; left:50%; width:6px; height:6px; border-radius:50%; background:#9bb77b; box-shadow:0 0 0 4px #b6cf8d22; }
.open-symbol .satellite { animation:integration-float 7s ease-in-out infinite; }
.open-symbol .s-two { animation-delay:-2.3s; }
.open-symbol .s-three { animation-delay:-4.6s; }
@keyframes integration-orbit { from { transform:translate(-50%,-50%) rotate(0deg); } to { transform:translate(-50%,-50%) rotate(360deg); } }
@keyframes integration-float { 0%,100% { transform:translateY(0); } 50% { transform:translateY(-7px); } }
.motion-paused .open-symbol .open-orbit,.motion-paused .open-symbol .satellite { animation-play-state:paused !important; }
@media(prefers-reduced-motion:reduce) { .open-symbol .open-orbit,.open-symbol .satellite { animation:none !important; } }

.watch-heading-bell { display:inline-block; width:.7em; height:.7em; margin-left:.3em; vertical-align:.02em; color:#819866; transform-origin:50% 15%; animation:watch-bell-ring 7s ease-in-out infinite; }
@keyframes watch-bell-ring { 0%,72%,100% { transform:rotate(0); } 77% { transform:rotate(9deg); } 82% { transform:rotate(-7deg); } 87% { transform:rotate(4deg); } 92% { transform:rotate(-2deg); } }
.motion-paused .watch-heading-bell { animation-play-state:paused !important; }
@media(prefers-reduced-motion:reduce) { .watch-heading-bell { animation:none !important; } }
