/* Localsewa v32.8.64 — Motion System Phase C: loading primitives */

:root {
  --ls-loading-soft-duration: 1.75s;
  --ls-loading-spinner-duration: 720ms;
  --ls-loading-ease: cubic-bezier(.4, 0, .2, 1);
}

/*
 * Skeletons intentionally use a restrained tonal breathe instead of shimmer.
 * Existing content stays mounted during background refreshes; these styles are
 * for first-load placeholders only.
 */
@keyframes ls-skeleton-soft-pulse {
  0%, 100% { opacity: .92; }
  50% { opacity: .68; }
}

.animate-pulse {
  animation: ls-skeleton-soft-pulse var(--ls-loading-soft-duration) var(--ls-loading-ease) infinite !important;
  will-change: opacity;
}

/* One spinner language across auth, location, lazy admin and action states. */
@keyframes ls-loading-spin {
  to { transform: rotate(360deg); }
}

.animate-spin,
.ls-inline-spinner {
  animation: ls-loading-spin var(--ls-loading-spinner-duration) linear infinite !important;
  will-change: transform;
}

.ls-inline-spinner {
  display: inline-block;
  flex: 0 0 auto;
  border: 2px solid rgba(255, 255, 255, .38);
  border-top-color: currentColor;
}

/* JS adds this only while a disabled action is genuinely processing. */
.ls-action-loading {
  cursor: wait !important;
  user-select: none;
}

.ls-action-loading:not(.ls-has-native-spinner)::before {
  content: "";
  display: inline-block;
  width: 1em;
  height: 1em;
  flex: 0 0 1em;
  margin-right: .48em;
  vertical-align: -.12em;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 9999px;
  opacity: .88;
  animation: ls-loading-spin var(--ls-loading-spinner-duration) linear infinite;
}

/* Avoid showing a static action glyph next to the generated progress spinner. */
.ls-action-loading:not(.ls-has-native-spinner) > svg:first-child {
  display: none !important;
}

/* Customer review loader now mirrors the final testimonial footprint. */
.ls-customer-reviews__loading {
  margin-top: 1.25rem;
}

.ls-customer-reviews__loading-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: .75rem;
}

.ls-customer-reviews__skeleton-card {
  min-width: 0;
  min-height: 170px;
  padding: 1rem;
  border: 1px solid rgba(221, 233, 225, .9);
  border-radius: 20px;
  background: rgba(255, 255, 255, .82);
}

@media (min-width: 640px) {
  .ls-customer-reviews__loading-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1rem;
  }
  .ls-customer-reviews__skeleton-card { min-height: 184px; padding: 1.15rem; }
}

@media (min-width: 1024px) {
  .ls-customer-reviews__loading-grid {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
}

/* Skeletons and spinners stay quiet when reduced motion is requested. */
@media (prefers-reduced-motion: reduce) {
  .animate-pulse {
    animation: none !important;
    opacity: .82 !important;
  }

  .animate-spin,
  .ls-inline-spinner,
  .ls-action-loading:not(.ls-has-native-spinner)::before {
    animation-duration: 1.6s !important;
  }
}
