@keyframes crmFadeUp {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}

@keyframes crmShimmer {
  0% { background-position: -400px 0; }
  100% { background-position: 400px 0; }
}

@keyframes crmPulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}

@keyframes crmSpin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

.crm-anim-in {
  animation: crmFadeUp var(--motion-normal) ease both;
}

.crm-skeleton {
  border-radius: var(--radius-sm);
  background: linear-gradient(90deg, var(--color-neutral-100) 25%, var(--color-neutral-200) 37%, var(--color-neutral-100) 63%);
  background-size: 800px 100%;
  animation: crmShimmer 1.4s infinite linear;
}

.crm-skeleton--text {
  height: 14px;
  margin-bottom: 8px;
  width: 100%;
}

.crm-skeleton--text-sm {
  height: 12px;
  width: 60%;
}

.crm-skeleton--text-lg {
  height: 18px;
  width: 80%;
}

.crm-skeleton--heading {
  height: 24px;
  width: 40%;
  margin-bottom: 12px;
}

.crm-skeleton--value {
  height: 36px;
  width: 50%;
  margin-bottom: 6px;
}

.crm-skeleton--card {
  height: 120px;
  border-radius: var(--radius-lg);
}

.crm-skeleton--row {
  height: 44px;
  margin-bottom: 4px;
}

.crm-skeleton--avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
}

.crm-skeleton--badge {
  width: 72px;
  height: 22px;
  border-radius: 999px;
}

.crm-spinner {
  width: 20px;
  height: 20px;
  border: 2px solid var(--color-neutral-200);
  border-top-color: var(--color-primary-600);
  border-radius: 50%;
  animation: crmSpin 0.6s linear infinite;
  display: inline-block;
}

.crm-spinner--sm {
  width: 14px;
  height: 14px;
  border-width: 1.5px;
}

.crm-spinner--lg {
  width: 32px;
  height: 32px;
  border-width: 3px;
}

.crm-toast-container .toast {
  animation: crmFadeUp var(--motion-soft) ease;
}

.btn {
  transition: transform var(--motion-fast) ease, box-shadow var(--motion-fast) ease;
}

.btn:active { transform: translateY(1px) scale(0.995); }

.modal.fade .modal-dialog,
.offcanvas {
  transition-duration: var(--motion-normal);
}
