/**
 * 心脏 · 统一 pulse / 光影 token（全站复用）
 */
:root {
  --heart-tone-steady: rgba(80, 210, 140, 0.95);
  --heart-tone-accumulate: rgba(100, 180, 255, 0.95);
  --heart-tone-leap: rgba(255, 140, 70, 0.98);
  --heart-tone-low: rgba(150, 160, 180, 0.7);

  --heart-glow-steady: 0 0 8px rgba(80, 210, 140, 0.55);
  --heart-glow-accumulate: 0 0 8px rgba(100, 180, 255, 0.5);
  --heart-glow-leap: 0 0 10px rgba(255, 120, 60, 0.65);
  --heart-glow-low: none;

  --heart-ring-color: #cc66ff;
  --heart-ring-opacity-min: 0.35;
  --heart-ring-opacity-max: 0.6;
  --heart-ring-scale-amp: 0.05;

  --heart-pulse-period: 2.2s;
  --heart-pulse-period-fast: 1.1s;
  --heart-pulse-easing: ease-in-out;

  --heart-aura-up: #2a9d6a;
  --heart-aura-down: #c45c26;
  --heart-hero-glow: rgba(0, 210, 255, 0.62);
  --heart-hero-glow-soft: rgba(0, 130, 195, 0.18);
}

@keyframes heart-pulse-scale {
  0%, 100% {
    transform: scale(1);
    opacity: 0.85;
  }
  50% {
    transform: scale(1.25);
    opacity: 1;
  }
}

@keyframes heart-pulse-opacity {
  0%, 100% {
    opacity: var(--heart-ring-opacity-min);
  }
  50% {
    opacity: var(--heart-ring-opacity-max);
  }
}

@keyframes heart-pulse-glow {
  0%, 100% {
    box-shadow:
      inset 0 0 0 1px rgba(0, 210, 255, 0.35),
      inset 0 0 16px var(--heart-hero-glow-soft);
  }
  50% {
    box-shadow:
      inset 0 0 0 2px var(--heart-hero-glow),
      0 0 24px rgba(0, 210, 255, 0.28),
      inset 0 0 24px var(--heart-hero-glow-soft);
  }
}

.heart-pulse-dot {
  animation: heart-pulse-scale var(--heart-pulse-period) var(--heart-pulse-easing) infinite;
}

.heart-pulse-ring {
  animation: heart-pulse-opacity var(--heart-pulse-period) var(--heart-pulse-easing) infinite;
}

.heart-pulse-glow {
  animation: heart-pulse-glow var(--heart-pulse-period-fast) var(--heart-pulse-easing) 2;
}

@media (prefers-reduced-motion: reduce) {
  .heart-pulse-dot,
  .heart-pulse-ring,
  .heart-pulse-glow,
  .site-nav__link--heart-leap .site-nav__heart-dot,
  .calendar-mode__btn--heart-leap .site-nav__heart-dot {
    animation: none !important;
  }
}
