From 46bc25f3e804462e501f0576b66eec42ddf1c68d Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Fri, 30 May 2025 15:20:12 +0330 Subject: [PATCH 01/51] Make product description collapsable --- .../ProductHero/ProductDescription.vue | 58 +++++++++++++++++++ .../index.vue} | 9 +-- 2 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 frontend/components/product/ProductHero/ProductDescription.vue rename frontend/components/product/{ProductHero.vue => ProductHero/index.vue} (97%) diff --git a/frontend/components/product/ProductHero/ProductDescription.vue b/frontend/components/product/ProductHero/ProductDescription.vue new file mode 100644 index 0000000..babbba1 --- /dev/null +++ b/frontend/components/product/ProductHero/ProductDescription.vue @@ -0,0 +1,58 @@ + + + diff --git a/frontend/components/product/ProductHero.vue b/frontend/components/product/ProductHero/index.vue similarity index 97% rename from frontend/components/product/ProductHero.vue rename to frontend/components/product/ProductHero/index.vue index 3f0e3f0..a3a989a 100644 --- a/frontend/components/product/ProductHero.vue +++ b/frontend/components/product/ProductHero/index.vue @@ -73,8 +73,8 @@ watch( to="#" class="typo-label-sm" > - {{ product!.category.name }} + {{ product!.category.name }} +

{{ product!.name }}

@@ -161,10 +161,7 @@ watch( /> -
+
تنوع رنگی : From 417522dc727ad748662f18f855cb2d2eb55048de Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Fri, 30 May 2025 15:38:54 +0330 Subject: [PATCH 02/51] Remove unused code --- frontend/components/global/product/ProductCard.vue | 5 ----- 1 file changed, 5 deletions(-) diff --git a/frontend/components/global/product/ProductCard.vue b/frontend/components/global/product/ProductCard.vue index b927d2d..b1f3563 100644 --- a/frontend/components/global/product/ProductCard.vue +++ b/frontend/components/global/product/ProductCard.vue @@ -4,7 +4,6 @@ import Tag from "~/components/global/Tag.vue"; import Rate from "~/components/global/Rate.vue"; import ColorCircle from "~/components/global/ColorCircle.vue"; -import { useImageColor } from "~/composables/global/useImageColor"; // types @@ -25,10 +24,6 @@ type Props = { const props = defineProps(); const { id, colors } = toRefs(props); -// state - -const { colorObject } = useImageColor(`#product-image-${id.value}`); - // computed const limitedColors = computed(() => { From c0190953b7096b187f0debb401d401be825a1322 Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Fri, 30 May 2025 15:38:59 +0330 Subject: [PATCH 03/51] Updated --- frontend/components/global/LoadingOverlay.vue | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/frontend/components/global/LoadingOverlay.vue b/frontend/components/global/LoadingOverlay.vue index 4b10c09..6196932 100644 --- a/frontend/components/global/LoadingOverlay.vue +++ b/frontend/components/global/LoadingOverlay.vue @@ -35,14 +35,16 @@ const progressStyle = computed(() => { // }; const onAssetFinished = () => { - gsap.to("#loading-overlay", { - opacity: 0, - onComplete: () => { - shouldRenderLoadingOverlay.value = false; - isWindowScrollLocked.value = false; - isSiteLoadingDisabled.value = true; - }, - }); + if (!isSiteLoadingDisabled.value) { + gsap.to("#loading-overlay", { + opacity: 0, + onComplete: () => { + shouldRenderLoadingOverlay.value = false; + isWindowScrollLocked.value = false; + isSiteLoadingDisabled.value = true; + }, + }); + } }; // watch From d9d6006c2e77d306faa4f28e8e3d222c2455babe Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Fri, 30 May 2025 15:39:26 +0330 Subject: [PATCH 04/51] Updated --- frontend/components/home/ProductsShowcase.vue | 299 +++++++++++------- 1 file changed, 186 insertions(+), 113 deletions(-) diff --git a/frontend/components/home/ProductsShowcase.vue b/frontend/components/home/ProductsShowcase.vue index 788d81e..6e8621a 100644 --- a/frontend/components/home/ProductsShowcase.vue +++ b/frontend/components/home/ProductsShowcase.vue @@ -2,135 +2,208 @@ // import import useHomeData from "~/composables/api/home/useHomeData"; +import { motion } from "motion-v"; // state const { data: homeData } = useHomeData(); -const { $gsap: gsap, $ScrollTrigger: ScrollTrigger } = useNuxtApp(); +const activeSlide = ref(0); -let gsapTimeline: gsap.core.Timeline; -let scrollTrigger: ScrollTrigger; +const variants = { + hide: { opacity: 0, y: -200 }, + show: { + opacity: 1, + y: 0, + transition: { + when: "beforeChildren", + staggerChildren: 0.15, + }, + }, + exit: (slidesCount: number) => { + return { + opacity: 0, + y: 200, + transition: { + when: "afterChildren", + delay: slidesCount * 0.21, + staggerChildren: 0.1, + staggerDirection: 1, + }, + }; + }, +}; -// lifecycle +const childContentVariants = { + hide: { + filter: "blur(20px)", + opacity: 0, + }, + show: { + filter: "blur(0px)", + opacity: 1, + }, + exit: { + filter: "blur(20px)", + opacity: 0, + }, +}; + +const childImageVariants = { + hide: { + filter: "blur(20px)", + y: 70, + scale: 0.65, + opacity: 0, + }, + show: { + filter: "blur(0px)", + y: 0, + scale: 1, + opacity: 1, + transition: { + type: "spring", + damping: 20, + }, + }, + exit: { + filter: "blur(20px)", + y: 70, + scale: 0.65, + opacity: 0, + transition: { + default: { + type: "spring", + damping: 20, + }, + opacity: { + duration: 0.1, + }, + }, + }, +}; + +const nextSlide = () => { + const slidesCount = homeData.value!.show_case_slider.length; + if (activeSlide.value > slidesCount - 2) { + activeSlide.value = 0; + } else { + activeSlide.value = activeSlide.value + 1; + } +}; onMounted(() => { - gsapTimeline = gsap.timeline(); - const showcaseElements = gsap.utils.toArray(".showcase-slide"); + nextSlide(); - setTimeout(() => { - showcaseElements.forEach((element, index) => { - gsapTimeline.fromTo( - element, - index === 0 - ? { - opacity: 1, - scale: 1, - // rotateX: -25, - zIndex: 1, - top: 0, - ease: "none", - } - : { - opacity: 0, - scale: 1, - // rotateX: -25, - zIndex: 1, - top: 20, - ease: "none", - }, - { - opacity: 1, - scale: 1, - // rotateX: 0, - zIndex: 5, - top: 0, - ease: "none", - }, - index === 0 ? "-=0%" : undefined - ); - - if (index < showcaseElements.length - 1) { - gsapTimeline.to(element, { - opacity: 0, - scale: 1.03, - // rotateX: 25, - top: -20, - ease: "none", - }); - } - }); - - scrollTrigger = ScrollTrigger.create({ - trigger: "#products-showcase-container", - animation: gsapTimeline, - scrub: 1, - pin: true, - start: "top top", - anticipatePin: 1, - // markers: true, - end: "bottom top", - }); - - setTimeout(() => { - scrollTrigger.update(); - scrollTrigger.refresh(); - }, 1000); - }, 1000); -}); - -onUnmounted(() => { - gsapTimeline.progress(1).pause(); - gsapTimeline.kill(); + setInterval(() => { + nextSlide(); + }, 5000); }); From 7cc89e899ac57274a3c25e00eee1626a70c342f4 Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Fri, 30 May 2025 15:39:32 +0330 Subject: [PATCH 05/51] Update types --- frontend/composables/api/home/useHomeData.ts | 60 ++++++++++---------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/frontend/composables/api/home/useHomeData.ts b/frontend/composables/api/home/useHomeData.ts index a7fec35..e06c00f 100644 --- a/frontend/composables/api/home/useHomeData.ts +++ b/frontend/composables/api/home/useHomeData.ts @@ -7,37 +7,39 @@ import type { GetArticleResponse } from "~/composables/api/blog/useGetArticle"; // types export type GetHomeDataResponse = { - "sliders": { - "id": number, - "link": string, - "title": string, - "description": string, - "image": string | null, - "video": string | null - }[], - "main_categories": Category[], - "products": ProductListItem[], - "difreance_section": { - "image1": string, - "image2": string, - "title1": string, - "title2": string, - "description1": string, - "description2": string, - "link1": string, - "link2": string - }, - "show_case_slider" : { - "id": number, - "title": string, - "description": string, - "link": string, - "image": string, - }[] + sliders: { + id: number; + link: string; + title: string; + description: string; + image: string | null; + video: string | null; + }[]; + main_categories: Category[]; + products: ProductListItem[]; + difreance_section: { + image1: string; + image2: string; + title1: string; + title2: string; + description1: string; + description2: string; + link1: string; + link2: string; + }; + show_case_slider: { + id: number; + title: string; + description: string; + link: string; + image1: string; + image2: string; + image3: string; + background_image: string; + }[]; }; const useHomeData = () => { - // state const { $axios: axios } = useNuxtApp(); @@ -51,7 +53,7 @@ const useHomeData = () => { return useQuery({ queryKey: [QUERY_KEYS.home], - queryFn: () => handleHomeData() + queryFn: () => handleHomeData(), }); }; From ee4b43c288a4e95ce8d833075e4ccddcac9a9a1c Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Fri, 30 May 2025 15:50:58 +0330 Subject: [PATCH 06/51] Make showcase responsive --- frontend/components/home/ProductsShowcase.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/components/home/ProductsShowcase.vue b/frontend/components/home/ProductsShowcase.vue index 6e8621a..8e53bc0 100644 --- a/frontend/components/home/ProductsShowcase.vue +++ b/frontend/components/home/ProductsShowcase.vue @@ -138,13 +138,13 @@ onMounted(() => { exit="exit" class="size-full flex flex-col gap-20 items-center justify-center" > -
+
@@ -155,7 +155,7 @@ onMounted(() => { class="origin-bottom" > @@ -166,7 +166,7 @@ onMounted(() => { class="origin-bottom-right" > From 3ec093b173465cdb2ee8415b6b5d82917b1e5ed5 Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Sat, 31 May 2025 15:29:13 +0330 Subject: [PATCH 07/51] Add pagination --- frontend/components/home/ProductsShowcase.vue | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/frontend/components/home/ProductsShowcase.vue b/frontend/components/home/ProductsShowcase.vue index 8e53bc0..ef721c8 100644 --- a/frontend/components/home/ProductsShowcase.vue +++ b/frontend/components/home/ProductsShowcase.vue @@ -8,6 +8,7 @@ import { motion } from "motion-v"; const { data: homeData } = useHomeData(); +const sliderTimer = ref(null); const activeSlide = ref(0); const variants = { @@ -83,6 +84,11 @@ const childImageVariants = { }, }; +const slideTo = (index: number) => { + activeSlide.value = index; + restartSliderTimer(); +}; + const nextSlide = () => { const slidesCount = homeData.value!.show_case_slider.length; if (activeSlide.value > slidesCount - 2) { @@ -92,12 +98,16 @@ const nextSlide = () => { } }; -onMounted(() => { - nextSlide(); - - setInterval(() => { +const restartSliderTimer = () => { + if (sliderTimer.value) clearInterval(sliderTimer.value); + sliderTimer.value = setInterval(() => { nextSlide(); }, 5000); +}; + +onMounted(() => { + nextSlide(); + restartSliderTimer(); }); @@ -177,6 +187,20 @@ onMounted(() => { :variants="childContentVariants" class="flex flex-col items-center justify-center gap-6 text-center" > + +
+ +
+ {{ slide.title }} From 110b33aeb72c7958f8f6ece57546ec1d7a2dda25 Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Sat, 31 May 2025 15:29:25 +0330 Subject: [PATCH 08/51] Revert brands to old style --- frontend/components/global/Brands.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/components/global/Brands.vue b/frontend/components/global/Brands.vue index d570827..0e77d5a 100644 --- a/frontend/components/global/Brands.vue +++ b/frontend/components/global/Brands.vue @@ -29,20 +29,20 @@ const brands = ref([ متون بلکه روزنامه و مجله در ستون و سطرآنچنان که

-
+
-
+
HEYMLZ
@@ -63,7 +63,7 @@ const brands = ref([ >
From cc23a7c086ee46fa72b4004c11ef4091dd608006 Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Sat, 31 May 2025 20:34:59 +0330 Subject: [PATCH 09/51] Update head icon tags --- frontend/nuxt.config.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index b3d1b9f..bf0c480 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -16,6 +16,30 @@ export default defineNuxtConfig({ name: "fade", mode: "out-in", }, + head: { + link: [ + { + rel: "icon", + href: "/logo/apple-touch-icon.png", + media: "(prefers-color-scheme: dark)", + }, + { + rel: "icon", + href: "/logo/apple-touch-icon-light.png", + media: "(prefers-color-scheme: light)", + }, + { + rel: "apple-touch-icon", + href: "/logo/apple-touch-icon.png", + media: "(prefers-color-scheme: dark)", + }, + { + rel: "apple-touch-icon", + href: "/logo/apple-touch-icon-light.png", + media: "(prefers-color-scheme: light)", + }, + ], + }, // layoutTransition: { // name: "fade", // mode: "out-in", From c51b0b3d9fd78f0671f5a401ba027c412f40e633 Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Sat, 31 May 2025 20:46:26 +0330 Subject: [PATCH 10/51] Update icons --- frontend/nuxt.config.ts | 8 ++++---- ...ple-touch-icon.png => apple-touch-icon.dark.png} | Bin ...ch-icon-light.png => apple-touch-icon.light.png} | Bin 3 files changed, 4 insertions(+), 4 deletions(-) rename frontend/public/logo/{apple-touch-icon.png => apple-touch-icon.dark.png} (100%) rename frontend/public/logo/{apple-touch-icon-light.png => apple-touch-icon.light.png} (100%) diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index bf0c480..a3e75e1 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -20,22 +20,22 @@ export default defineNuxtConfig({ link: [ { rel: "icon", - href: "/logo/apple-touch-icon.png", + href: "/logo/apple-touch-icon.dark.png", media: "(prefers-color-scheme: dark)", }, { rel: "icon", - href: "/logo/apple-touch-icon-light.png", + href: "/logo/apple-touch-icon.light.png", media: "(prefers-color-scheme: light)", }, { rel: "apple-touch-icon", - href: "/logo/apple-touch-icon.png", + href: "/logo/apple-touch-icon.dark.png", media: "(prefers-color-scheme: dark)", }, { rel: "apple-touch-icon", - href: "/logo/apple-touch-icon-light.png", + href: "/logo/apple-touch-icon.light.png", media: "(prefers-color-scheme: light)", }, ], diff --git a/frontend/public/logo/apple-touch-icon.png b/frontend/public/logo/apple-touch-icon.dark.png similarity index 100% rename from frontend/public/logo/apple-touch-icon.png rename to frontend/public/logo/apple-touch-icon.dark.png diff --git a/frontend/public/logo/apple-touch-icon-light.png b/frontend/public/logo/apple-touch-icon.light.png similarity index 100% rename from frontend/public/logo/apple-touch-icon-light.png rename to frontend/public/logo/apple-touch-icon.light.png From e3f40eddfc513d755c1bb36a389372c8f92e69dd Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Sat, 31 May 2025 21:35:47 +0330 Subject: [PATCH 11/51] Updated --- frontend/nuxt.config.ts | 14 ++------------ .../apple-touch-icon.dark.png => icon-dark.png} | Bin ...apple-touch-icon.light.png => icon-light.png} | Bin frontend/public/logo/icon-dark.png | Bin 0 -> 5843 bytes frontend/public/logo/icon-light.png | Bin 0 -> 6248 bytes 5 files changed, 2 insertions(+), 12 deletions(-) rename frontend/public/{logo/apple-touch-icon.dark.png => icon-dark.png} (100%) rename frontend/public/{logo/apple-touch-icon.light.png => icon-light.png} (100%) create mode 100644 frontend/public/logo/icon-dark.png create mode 100644 frontend/public/logo/icon-light.png diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index a3e75e1..b7dea1a 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -18,24 +18,14 @@ export default defineNuxtConfig({ }, head: { link: [ - { - rel: "icon", - href: "/logo/apple-touch-icon.dark.png", - media: "(prefers-color-scheme: dark)", - }, - { - rel: "icon", - href: "/logo/apple-touch-icon.light.png", - media: "(prefers-color-scheme: light)", - }, { rel: "apple-touch-icon", - href: "/logo/apple-touch-icon.dark.png", + href: "icon-dark.png", media: "(prefers-color-scheme: dark)", }, { rel: "apple-touch-icon", - href: "/logo/apple-touch-icon.light.png", + href: "icon-light.png", media: "(prefers-color-scheme: light)", }, ], diff --git a/frontend/public/logo/apple-touch-icon.dark.png b/frontend/public/icon-dark.png similarity index 100% rename from frontend/public/logo/apple-touch-icon.dark.png rename to frontend/public/icon-dark.png diff --git a/frontend/public/logo/apple-touch-icon.light.png b/frontend/public/icon-light.png similarity index 100% rename from frontend/public/logo/apple-touch-icon.light.png rename to frontend/public/icon-light.png diff --git a/frontend/public/logo/icon-dark.png b/frontend/public/logo/icon-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..172eed57abfae756c4093f721859c67f7e237ba9 GIT binary patch literal 5843 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 literal 0 HcmV?d00001 diff --git a/frontend/public/logo/icon-light.png b/frontend/public/logo/icon-light.png new file mode 100644 index 0000000000000000000000000000000000000000..48cbb2a1d42bd369b53cd8143f54e557b8bb681c GIT binary patch literal 6248 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 Date: Sat, 31 May 2025 23:35:08 +0330 Subject: [PATCH 12/51] Updated --- frontend/components/home/ProductsShowcase.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/components/home/ProductsShowcase.vue b/frontend/components/home/ProductsShowcase.vue index ef721c8..a09f06e 100644 --- a/frontend/components/home/ProductsShowcase.vue +++ b/frontend/components/home/ProductsShowcase.vue @@ -109,6 +109,10 @@ onMounted(() => { nextSlide(); restartSliderTimer(); }); + +onUnmounted(() => { + restartSliderTimer(); +});