/* ============================================================
   Scroll reveals and small transitions.
   Restraint by design: section/grid-item level only, ease-out,
   150-400ms. No bounce, no parallax, no carousels.
   ============================================================ */

.reveal {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity var(--dur-slow) var(--ease), transform var(--dur-slow) var(--ease);
}
.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1 !important; transform: none !important; transition: none !important; }
  html { scroll-behavior: auto; }
}

/* Product grid fade during filter changes */
.product-card.is-filtering-out {
  opacity: 0;
  transform: scale(0.98);
  transition: opacity var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease);
}
.product-card.is-filtering-in {
  animation: fadeIn var(--dur-mid) var(--ease);
}
@keyframes fadeIn {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Gallery cross-fade */
.gallery-main img {
  transition: opacity var(--dur-fast) var(--ease);
}
.gallery-main.is-swapping img { opacity: 0; }

/* Count-up target used by jQuery counter plugin — no visual keyframe needed,
   the number itself is the animation. */
