From 351cbc253fe41bc58c95d0f36564cee64db04cb9 Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Tue, 4 Feb 2025 23:41:09 +0330 Subject: [PATCH] Add header animations --- frontend/components/home/Hero.vue | 165 +++++++++++++++++++++++++----- 1 file changed, 137 insertions(+), 28 deletions(-) diff --git a/frontend/components/home/Hero.vue b/frontend/components/home/Hero.vue index adf07db..117305d 100644 --- a/frontend/components/home/Hero.vue +++ b/frontend/components/home/Hero.vue @@ -9,8 +9,14 @@ import useHomeData from "~/composables/api/home/useHomeData"; // state const { data: homeData } = useHomeData(); +const { $gsap: gsap, $ScrollTrigger: ScrollTrigger } = useNuxtApp(); +const route = useRoute(); + const swiper_instance = ref(null); const isMuted = ref(true); +const slidesPerView = ref(1); + +let gsapTimeline: gsap.core.Timeline; // methods @@ -22,15 +28,87 @@ const onChange = (swiper: SwiperClass) => { console.log(swiper.activeIndex, swiper.realIndex, swiper.snapIndex); }; +// lifecycle + +onMounted(() => { + gsapTimeline = gsap.timeline({}); + + gsapTimeline + .fromTo(".header-slider-item", { + borderRadius: 0, + height: "100svh" + }, { + height: "80svh", + borderRadius: "20px" + }) + .fromTo(slidesPerView, { + value: 1 + }, { + value: 1.2 + }, "=") + .fromTo("#header-navbar", { + filter: "invert(100%)" + }, { + filter: "invert(0%)" + }, "=") + .fromTo("#header-navbar", { + background: "transparent" + }, { + background: "white" + }) + .fromTo("#header-slider-wrapper", { + marginTop: "0px", + scale: 1.025 + }, { + marginTop: "96px", + scale: 1 + }, "=") + .fromTo("#header-slider-pagination-child", { + padding: "0px 0px" + }, { + padding: "0px 80px" + }, "=") + .fromTo(".header-slider-item-child", { + padding: "0px 80px" + }, { + padding: "0px 40px" + }, "=") + .to(".header-slider-logo", { + opacity: 0 + }, "-=150%"); + + ScrollTrigger.create({ + trigger: "#header-slider-container", + animation: gsapTimeline, + scrub: 1, + pin: true, + start: "top top", + // markers: true, + end: "bottom top" + }); + +}); + +watch(() => route.path, (nv) => { + if (gsapTimeline) { + if (nv === "/") { + gsapTimeline.play(); + } else { + gsapTimeline.pause().progress(0); + } + } +}, { + immediate: true +}); + \ No newline at end of file