Instruction
Guide for Fluke Webflow Template
Guide for Fluke Webflow Template
<script src="https://unpkg.com/lenis@1.3.1/dist/lenis.min.js"></script> 
 
<script>
// lenis smooth scroll
  
{
  let lenis;
  const initScroll = () => {
    lenis = new Lenis({});
    lenis.on("scroll", ScrollTrigger.update);
    gsap.ticker.add((time) => lenis.raf(time * 1000));
    gsap.ticker.lagSmoothing(0);
  };
  function initGsapGlobal() {
    
    // Do everything that needs to happen
    //  before triggering all
    // the gsap animations 
    initScroll();
    // match reduced motion media
    // const media = gsap.matchMedia();
    // Send a custom
    //  event to all your
    // gsap animations
    // to start them 
    const sendGsapEvent = () => {
      window.dispatchEvent(
        new CustomEvent("GSAPReady", {
          detail: {
            lenis,
          },
        })
      );
    };
    // Check if fonts are already loaded
    
    if (document.fonts.status === "loaded") {
      sendGsapEvent();
    } else {
      document.fonts.ready.then(() => {
        sendGsapEvent();
      });
    }
    // We need specific handling because the
    // grid/list changes the scroll height of the whole container
    //
    let resizeTimeout;
    const onResize = () => {
      clearTimeout(resizeTimeout);
      resizeTimeout = setTimeout(() => {
        ScrollTrigger.refresh();
      }, 50);
    };
    window.addEventListener("resize", () => onResize());
    const resizeObserver = new ResizeObserver((entries) => onResize());
    resizeObserver.observe(document.body);
    queueMicrotask(() => {
      gsap.to("[data-start='hidden']", {
        autoAlpha: 1,
        duration: 0.1,
        delay: 0.2,
      });
    });
  }
  // this only for dev
  
  const documentReady =
    document.readyState === "complete" || document.readyState === "interactive";
  if (documentReady) {
    initGsapGlobal();
  } else {
    addEventListener("DOMContentLoaded", (event) => initGsapGlobal());
  }
}
</script><script>
  // Project Card Entrance
  gsap.registerPlugin(ScrollTrigger);
  // Create a timeline for the cards
  let cardsTl = gsap.timeline({
    scrollTrigger: {
      trigger: ".project-card-wrap",
      start: "top 50%",           // enter at 50% viewport
      end: "bottom 50%",          // end when leaving at 50%
      toggleActions: "play reverse play reverse", 
      // play on enter, reverse on leave
    }
  });
  cardsTl.from(".project-card", {
    y: 50,
    opacity: 0,
    duration: 0.8,
    ease: "power3.out",
    stagger: {
      each: 0.2,
      from: "random"
    }
  });
  // END Project Card Entrance
  
</script>
<script>
  
  // Team Draggable  
gsap.registerPlugin(Draggable);
const gallery = document.querySelector(".team-gallery-slide");
Draggable.create(gallery, {
  type: "x",
  bounds: ".team-gallery", // container element
  inertia: true
});
// END Team Draggable
</script>