/**
 * Loading States Component
 * Reusable loading spinners, skeletons, and animations
 */

/* ============================================================================
   Spinner API
   ============================================================================ */

.loading-spinner {
  --spinner-size: 32px;
  --spinner-border-width: 3px;
  --spinner-color: var(--color-primary, #00a8ff);

  width: var(--spinner-size);
  height: var(--spinner-size);
  border: var(--spinner-border-width) solid rgba(255, 255, 255, 0.1);
  border-top-color: var(--spinner-color);
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
}

.loading-spinner-small {
  --spinner-size: 14px;
  --spinner-border-width: 2px;
}

/* ============================================================================
   Skeleton API
   ============================================================================ */

.skeleton-card {
  background: rgba(255, 255, 255, 0.05);
  border-radius: var(--radius-lg, 12px);
  animation: pulse-glow 1.5s ease-in-out infinite;
}

.skeleton-text {
  height: 1em;
  background: rgba(255, 255, 255, 0.08);
  border-radius: var(--radius-sm, 4px);
  animation: shimmer 1.5s ease-in-out infinite;
}

.skeleton-avatar {
  width: 40px;
  height: 40px;
  background: rgba(255, 255, 255, 0.08);
  border-radius: 50%;
  animation: pulse-glow 1.5s ease-in-out infinite;
}

/* ============================================================================
   Keyframes
   ============================================================================ */

@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

/* loadingDots and loadingBar owned by timeline-carousel.css */

@keyframes pulse-glow {
  0%, 100% {
    opacity: 0.5;
  }
  50% {
    opacity: 0.8;
  }
}

@keyframes shimmer {
  0% {
    background-position: -200% 0;
  }
  100% {
    background-position: 200% 0;
  }
}
