/*
 * Relay Pulse — motion system · v3.4.1 · June 2026 (synced from main)
 * #00D9C8 is the PULSE colour — motion-only. One pulsing element per view.
 * Product UI transitions stay ≤0.18s. All disabled under prefers-reduced-motion.
 * Pairs with brand/relay-mark*.svg (rm-core / rm-ray hooks, currentColor).
 * Spec: briefs/SPEC.pulse-motion.md (main).
 */
:root {
  --rly-pulse: #00D9C8;
  --rly-pulse-beat: 2.8s;
  --rly-pulse-flash: 0.9s;
}
.rly-heartbeat .rm-core { transform-origin: 16px 16px; animation: rly-core-beat var(--rly-pulse-beat) ease-in-out infinite; }
.rly-heartbeat .rm-ray  { animation: rly-ray-beat var(--rly-pulse-beat) ease-in-out infinite; }
.rly-heartbeat .rm-n  { animation-delay: 0s;  } .rly-heartbeat .rm-ne { animation-delay: .1s; }
.rly-heartbeat .rm-e  { animation-delay: .2s; } .rly-heartbeat .rm-se { animation-delay: .3s; }
.rly-heartbeat .rm-s  { animation-delay: .4s; } .rly-heartbeat .rm-sw { animation-delay: .5s; }
.rly-heartbeat .rm-w  { animation-delay: .6s; } .rly-heartbeat .rm-nw { animation-delay: .7s; }
@keyframes rly-core-beat { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.18); } }
@keyframes rly-ray-beat  { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
.rly-receipt-flash { position: relative; }
.rly-receipt-flash::after {
  content: ''; position: absolute; inset: 0; border-radius: inherit;
  border: 1.5px solid var(--rly-pulse); pointer-events: none;
  animation: rly-receipt var(--rly-pulse-flash) ease-out 1 both;
}
@keyframes rly-receipt { 0% { opacity: .9; transform: scale(1); } 100% { opacity: 0; transform: scale(1.18); } }
.rly-send-burst .rm-ray { animation: rly-burst .7s ease-out 1 both; }
.rly-send-burst .rm-core { transform-origin: 16px 16px; animation: rly-core-beat .7s ease-out 1 both; }
@keyframes rly-burst { 0% { opacity: .2; } 40% { opacity: 1; stroke: var(--rly-pulse); } 100% { opacity: 1; } }
.rly-awaiting .rm-core { transform-origin: 16px 16px; animation: rly-await 4.2s ease-in-out infinite; }
@keyframes rly-await { 0%, 100% { opacity: 1; } 50% { opacity: .45; } }
.rly-arrival-ring { position: relative; }
.rly-arrival-ring::after {
  content: ''; position: absolute; inset: -6px; border-radius: 50%;
  border: 1.5px solid var(--rly-pulse); pointer-events: none;
  animation: rly-receipt var(--rly-pulse-flash) ease-out 1 both;
}
.rly-broadcast .rm-core { transform-origin: 16px 16px; animation: rly-core-beat .7s ease-in-out 3; }
.rly-broadcast::before, .rly-broadcast::after {
  content: ''; position: absolute; inset: -4px; border-radius: 50%;
  border: 1.5px solid var(--rly-pulse); pointer-events: none;
  animation: rly-receipt 1.4s ease-out 2 both;
}
.rly-broadcast::after { animation-delay: .45s; }
@media (prefers-reduced-motion: reduce) {
  .rly-heartbeat .rm-core, .rly-heartbeat .rm-ray,
  .rly-send-burst .rm-ray, .rly-send-burst .rm-core,
  .rly-awaiting .rm-core, .rly-broadcast .rm-core { animation: none; }
  .rly-receipt-flash::after, .rly-arrival-ring::after,
  .rly-broadcast::before, .rly-broadcast::after { animation: none; opacity: 0; }
}
