/* ===== Animations ==========================================================
   GSAP setzt opacity/transform per JS — CSS definiert hier NUR die Transition
   wenn GSAP nicht lädt. Keine opacity:0 als Default mehr.
   ========================================================================== */

/* GSAP fügt .gsap-ready zur body hinzu sobald es geladen ist */
body.gsap-ready .reveal         { opacity: 0; transform: translateY(24px); }
body.gsap-ready .reveal-left    { opacity: 0; transform: translateX(-32px); }
body.gsap-ready .reveal-right   { opacity: 0; transform: translateX(32px); }
body.gsap-ready .reveal-scale   { opacity: 0; transform: scale(0.94); }
body.gsap-ready .stagger-parent > * { opacity: 0; transform: translateY(16px); }
body.gsap-ready .osc-dept-card  { opacity: 0; transform: translateY(20px); }

/* Smooth transitions für alle animierten Elemente */
.reveal, .reveal-left, .reveal-right, .reveal-scale,
.stagger-parent > *, .osc-dept-card {
  transition: opacity 0.4s ease, transform 0.4s ease;
}

/* Dept-Transition: sanfter Farbwechsel */
.osc-dept-bar,
.osc-subnav,
.osc-hero--dept {
  transition: background var(--transition-slow, 400ms ease);
}

/* Hero Parallax */
.parallax-bg { will-change: transform; }

/* Dept Bar active indicator */
.osc-dept-bar__item.is-active::after {
  animation: bar-slide-in 300ms ease forwards;
}

@keyframes bar-slide-in {
  from { transform: scaleX(0); transform-origin: left; }
  to   { transform: scaleX(1); transform-origin: left; }
}

/* Download items */
.osc-download-item {
  transition: opacity var(--transition-base, 250ms ease),
              transform var(--transition-base, 250ms ease),
              border-color var(--transition-fast, 150ms ease),
              box-shadow var(--transition-fast, 150ms ease);
}

.osc-downloads__filter-btn.is-filtering .osc-download-item {
  opacity: 0;
  transform: translateX(-8px);
}
