/* agent-orbit.css — motion for Orbit's avatar (templates/_feedback_agent.html).

   Loaded globally from base.html so the home dashboard's feedback bubble and
   the settings page's feedback row animate identically; the blink keyframes
   that used to be copied into home.css and settings.css are gone with the
   face they belonged to. Sizing stays with each caller — this file only
   moves things. Reduced motion is handled globally by base.css's
   `*,*::before,*::after` rule. */

.ao { display: block; overflow: visible; }

/* The dish breathes, so the avatar is alive even when the mote is far side. */
.ao-halo {
  animation: ao-breathe 6.4s ease-in-out infinite;
  transform-box: view-box;
  transform-origin: 22px 22px;
}
@keyframes ao-breathe {
  0%, 100% { transform: scale(1); }
  50%      { transform: scale(1.035); }
}

/* The ring turns very slowly — enough to catch the eye, not enough to spin. */
.ao-ring, .ao-ring-front {
  fill: none;
  animation: ao-ring-tilt 11s ease-in-out infinite;
  transform-box: view-box;
  transform-origin: 22px 22px;
}
@keyframes ao-ring-tilt {
  0%, 100% { transform: rotate(0deg)  scaleY(1); }
  50%      { transform: rotate(5deg)  scaleY(1.12); }
}

/* The mote runs the same ellipse the ring is drawn on. The path starts at the
   ring's left point and sweeps down first, so 25% is the near (lower) half and
   75% the far (upper) one — hence large then small, which is what sells the
   circuit as three-dimensional on a 44px icon. */
.ao-mote {
  offset-path: path('M 4,22 a 18,7.4 0 1,0 36,0 a 18,7.4 0 1,0 -36,0');
  offset-rotate: 0deg;
  offset-distance: 0%;
  transform-box: fill-box;
  transform-origin: center;
  animation: ao-travel 7s linear infinite, ao-depth 7s ease-in-out infinite;
}
@keyframes ao-travel { to { offset-distance: 100%; } }
@keyframes ao-depth {
  0%, 100% { transform: scale(1);    opacity: .92; }
  25%      { transform: scale(1.16); opacity: 1; }
  75%      { transform: scale(.68);  opacity: .55; }
}

/* The rim light brightens as the halo breathes out. */
.ao-rim {
  fill: none;
  animation: ao-rim-pulse 6.4s ease-in-out infinite;
}
@keyframes ao-rim-pulse {
  0%, 100% { opacity: .38; }
  50%      { opacity: .78; }
}

/* Dust off the ring: two specks, out of phase with each other. */
.ao-dust {
  transform-box: fill-box;
  transform-origin: center;
  animation: ao-twinkle 4.4s ease-in-out infinite;
}
.ao-dust--a { animation-delay: -.6s; }
.ao-dust--b { animation-delay: -2.7s; }
@keyframes ao-twinkle {
  0%, 100% { opacity: .22; transform: scale(.7); }
  50%      { opacity: .85; transform: scale(1.15); }
}
