-
+
+
ترتیب بر اساس
@@ -134,11 +138,7 @@ watch(
v-for="(sort, index) in sort_filter"
:key="index"
@click="params.sort = sort.value"
- :class="
- params.sort == sort.value
- ? 'bg-black text-white'
- : 'bg-slate-100'
- "
+ :class="params.sort == sort.value ? 'bg-black text-white' : 'bg-slate-100'"
class="py-1 px-3 cursor-pointer text-nowrap transition-all rounded-md text-sm"
>
{{ sort.title }}
@@ -147,20 +147,25 @@ watch(
-
-
-
+
+
محدوده قیمت
-
-
+
+
- {{
- filtersSuccessMessage.title
- }}
+ {{ filtersSuccessMessage.title }}
@@ -246,14 +241,29 @@ watch(
@click="resetFilters"
class="w-full rounded-full py-4 !cursor-pointer disabled:pointer-events-none z-[3]"
>
-
-
+
+
در حال دریافت اطلاعات
-
+
-
+
بازنشانی به پیش فرض
-
+
diff --git a/frontend/components/home/Categories.vue b/frontend/components/home/Categories.vue
index e1bb9e4..da46dd8 100644
--- a/frontend/components/home/Categories.vue
+++ b/frontend/components/home/Categories.vue
@@ -4,17 +4,27 @@
import { Swiper, SwiperSlide } from "swiper/vue";
import type { SwiperClass } from "swiper/react";
import useHomeData from "~/composables/api/home/useHomeData";
+import { EffectCoverflow } from "swiper/modules";
// state
const { data: homeData } = useHomeData();
+
const swiper_instance = ref(null);
+const activeIndex = ref(0);
+
+const slideElement = ref(null);
+const { width: slideWidth } = useElementSize(slideElement);
// methods
const onSwiper = (swiper: SwiperClass) => {
swiper_instance.value = swiper;
};
+
+const onSlideChange = (swiper: SwiperClass) => {
+ activeIndex.value = swiper.realIndex;
+};
@@ -23,7 +33,7 @@ const onSwiper = (swiper: SwiperClass) => {
class="flex flex-col justify-center gap-4 bg-black sm:min-h-[110svh] relative overflow-hidden shrink-0 py-24 lg:py-32"
>
- دسته بندی ها
+ دسته بندی ها
@@ -38,8 +48,17 @@ const onSwiper = (swiper: SwiperClass) => {
:loop="true"
:centered-slides="true"
:slides-per-view="1.5"
- :space-between="20"
@swiper="onSwiper"
+ @slideChange="onSlideChange"
+ :modules="[EffectCoverflow]"
+ :effect="'coverflow'"
+ :coverflowEffect="{
+ rotate: 10,
+ stretch: -100,
+ depth: 200,
+ modifier: 1,
+ slideShadows: true,
+ }"
:breakpoints="{
640: {
centeredSlides: true,
@@ -52,7 +71,8 @@ const onSwiper = (swiper: SwiperClass) => {
}"
>
{
:category="slide.name"
:picture="slide.image"
:count="slide.product_count"
+ :isActive="activeIndex === index"
description="توضیحات دسته بندی"
/>
@@ -69,7 +90,10 @@ const onSwiper = (swiper: SwiperClass) => {
{
) => {
category: params?.category,
price_gte: params?.price_gte,
price_lte: params?.price_lte,
- offset: Number(params?.page) * 12 - 12,
- limit: 12
+ offset: Number(params?.page) * 15 - 15,
+ limit: 15
}
}
);
diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts
index c758552..467d589 100644
--- a/frontend/nuxt.config.ts
+++ b/frontend/nuxt.config.ts
@@ -12,9 +12,6 @@ export default defineNuxtConfig({
},
app: {
- head: {
- title: "فروشگاه هی ملز",
- },
pageTransition: {
name: "fade",
mode: "out-in",
@@ -67,8 +64,13 @@ export default defineNuxtConfig({
"@formkit/auto-animate/nuxt",
"@vite-pwa/nuxt",
"@nuxt/image",
+ "@nuxtjs/seo",
],
+ sitemap: {
+ enabled: false,
+ },
+
pwa: {
strategies: "injectManifest",
srcDir: "public",
diff --git a/frontend/package.json b/frontend/package.json
index ff3c169..fd054dd 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -19,6 +19,7 @@
"@nuxt/icon": "^1.10.3",
"@nuxt/image": "^1.10.0",
"@nuxtjs/google-fonts": "^3.2.0",
+ "@nuxtjs/seo": "^3.0.3",
"@tanstack/vue-query": "^5.62.2",
"@tanstack/vue-query-devtools": "^5.62.3",
"@vite-pwa/nuxt": "^0.10.6",
diff --git a/frontend/pages/article/[id].vue b/frontend/pages/article/[id].vue
index 2c2f43e..6f7d1fa 100644
--- a/frontend/pages/article/[id].vue
+++ b/frontend/pages/article/[id].vue
@@ -1,5 +1,4 @@
-
+
@@ -41,13 +51,13 @@ if (response.isError) {
/>
-
-
+ class="w-fit pr-2 pl-5 h-[50px] rounded-full flex items-center justify-center gap-3 bg-white"
+ >
+ class="relative flex items-center justify-center rounded-full overflow-hidden size-[35px]"
+ >
- {{ article!.author.full_name }}
-
+ {{ article!.author.full_name }}
+
-
- دسته بندی موبایل
-
+ class="w-fit pr-4 pl-5 h-[50px] rounded-full flex items-center justify-center gap-2 border-[1.5px] border-white text-white"
+ >
+ دسته بندی موبایل
-
-
-
- ۲۴ مهر 1403
-
+ class="w-fit pr-4 pl-5 h-[50px] rounded-full flex items-center justify-center gap-2 border-[1.5px] border-white text-white"
+ >
+
+ ۲۴ مهر 1403
-
+ class="w-fit pr-4 pl-5 h-[50px] rounded-full flex items-center justify-center gap-2 border-[1.5px] border-white text-white"
+ >
+
- {{ article!.views }}
-
+ {{ article!.views }}
+
-
-
-
\ No newline at end of file
+
diff --git a/frontend/pages/articles.vue b/frontend/pages/articles.vue
index fddeea3..39b29c7 100644
--- a/frontend/pages/articles.vue
+++ b/frontend/pages/articles.vue
@@ -7,6 +7,10 @@ import ArticlesList from "~/components/articles/ArticlesList.vue";
// state
+useSeoMeta({
+ title : "مقالات"
+});
+
const page = ref(1);
const search = ref("");
const debouncedSearch = refDebounced(search, 700);
diff --git a/frontend/pages/cart/checkout.vue b/frontend/pages/cart/checkout.vue
index e5e01fe..c37d546 100644
--- a/frontend/pages/cart/checkout.vue
+++ b/frontend/pages/cart/checkout.vue
@@ -3,10 +3,13 @@
const route = useRoute();
+useSeoMeta({
+ title: "ثبت سفارش",
+});
+
definePageMeta({
layout: "cart",
middleware: "check-is-logged-in",
- pageTitle: "ثبت سفارش",
prevPage: { name: "cart-delivery", label: "انتخاب آدرس" },
nextPage: { name: "payment", label: "پرداخت" },
});
diff --git a/frontend/pages/cart/delivery.vue b/frontend/pages/cart/delivery.vue
index 7174721..988e452 100644
--- a/frontend/pages/cart/delivery.vue
+++ b/frontend/pages/cart/delivery.vue
@@ -7,10 +7,14 @@ import useGetCartOrders from "~/composables/api/orders/useGetCartOrders";
// meta
+useSeoMeta({
+ title: "انتخاب آدرس",
+});
+
definePageMeta({
layout: "cart",
middleware: "check-is-logged-in",
- pageTitle: "انتخاب آدرس",
+
prevPage: { name: "cart", label: "سبد خرید" },
nextPage: { name: "cart-checkout", label: "تسویه حساب", query: "ZARINPAL" },
});
diff --git a/frontend/pages/cart/index.vue b/frontend/pages/cart/index.vue
index b9fbae4..84ef551 100644
--- a/frontend/pages/cart/index.vue
+++ b/frontend/pages/cart/index.vue
@@ -5,10 +5,13 @@ import useGetCartOrders from "~/composables/api/orders/useGetCartOrders";
// meta
+useSeoMeta({
+ title : "سبد خرید"
+});
+
definePageMeta({
layout: "cart",
middleware: "check-is-logged-in",
- pageTitle: "سبد خرید",
prevPage: { name: "index", label: "بازگشت به خانه" },
nextPage: { name: "cart-delivery", label: "انتخاب آدرس" },
});
diff --git a/frontend/pages/category.vue b/frontend/pages/category.vue
index 642c489..8fd4ed9 100644
--- a/frontend/pages/category.vue
+++ b/frontend/pages/category.vue
@@ -5,6 +5,10 @@ import useGetCategories from "~/composables/api/product/useGetCategories";
// state
+useSeoMeta({
+ title : "دسته بندی ها"
+});
+
const { data: categories, suspense } = useGetCategories();
const search = ref("");
diff --git a/frontend/pages/contact-us.vue b/frontend/pages/contact-us.vue
index dc7d036..00486ed 100644
--- a/frontend/pages/contact-us.vue
+++ b/frontend/pages/contact-us.vue
@@ -1,6 +1,10 @@