diff --git a/app/page.tsx b/app/page.tsx index a5295f1..1486ea8 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -84,7 +84,7 @@ const faqs = [ export default function Home() { const [activeTab, setActiveTab] = useState(0); const brands = ["NTN", "KOYO", "NACHI", "TIMKEN", "FAG", "SKF"]; - const latestArticles = articles.slice(-3); + const latestArticles = articles.slice(-4); const featuredProducts = products.slice(0, 10); const [startIndex, setStartIndex] = useState(0); @@ -333,7 +333,7 @@ export default function Home() { {/* grid */} -
+
{latestArticles.map((article, i) => ( ))} diff --git a/app/products/[id]/[slug]/page.tsx b/app/products/[id]/[slug]/page.tsx index 45e78a3..5600471 100644 --- a/app/products/[id]/[slug]/page.tsx +++ b/app/products/[id]/[slug]/page.tsx @@ -2,8 +2,8 @@ import ScrollToTop from '@/components/scrolltop'; import { products } from '@/lib/data'; import { notFound } from 'next/navigation'; import Image from "next/image"; +import ProductCartAction from '@/components/cartaction'; -// تعریف دقیق پارامترهایی که از URL می‌آیند interface PageProps { params: Promise<{ id: string; @@ -11,68 +11,229 @@ interface PageProps { }>; } - - - export default async function SingleProductPage({ params }: PageProps) { const resolvedParams = await params; - - const product = products.find((p) => p.id.toString() === resolvedParams.id); - // ۳. اگر محصول با این ID در دیتابیس نبود if (!product) { notFound(); } + + const formattedPrice = product.price + ? Number(product.price.toString().replace(/,/g, '')).toLocaleString('fa-IR') + : null; return ( -
-
- +
+
+ -
- {product.title} + {/* مسیر راهنما */} +
+ خانه > محصولات > {product.title}
-
-
-

{product.title}

-

برند: {product.brand}

- -
-
- قطر داخلی (L): - {product.l} + {/* + کانتینر اصلی گرید (Grid) + موبایل: 1 ستون + دسکتاپ: 12 ستون + */} +
+ + {/* ========================================= */} + {/* بخش 1: معرفی محصول (بالای ستون راست) */} + {/* دسکتاپ: 8 ستون عرض دارد. موبایل: اولین آیتم نمایش داده می‌شود */} + {/* ========================================= */} +
+
+ {/* باکس تصویر */} +
+ {product.badge && ( + + {product.badge} + + )} + {product.title}
-
- قطر خارجی (D): - {product.d} + +
+
+ {product.brand} +
+

+ {product.title} +

+ +

+ طراحی شده برای عملکرد در دورهای بالا با آب‌بندی کامل پلاستیکی (Rubber Seal). مناسب برای الکتروموتور و گیربکس. +

+ +
+
+ تحمل بار ($C$) + {product.loadCapacity} +
+
+ سرعت نهایی + {product.maxSpeed} +
+
+ نوع آب‌بند + {product.sealType} +
+
+ محدوده دما + {product.tempRange} +
+
-
- - {product.stock ? "موجود در انبار" : "ناموجود"} - - - {product.price ? ( - {product.price} تومان - ) : ( - - نیاز به استعلام - - )} + {/* ========================================= */} + {/* بخش 2: سایدبار و دکمه خرید (ستون چپ) */} + {/* دسکتاپ: 4 ستون عرض دارد و 2 ردیف طول دارد (row-span-2) تا کنار هر دو بخش راست بماند */} + {/* موبایل: با order-2 بین بخش معرفی و مشخصات قرار می‌گیرد */} + {/* ========================================= */} +
+ {/* کانتینر استیکی */} +
+ +
+ {product.stock ? ( +
+ موجود در انبار شیراز +
+ ) : ( +
+ ناموجود - نیاز به تامین +
+ )} + +
+ قیمت مصرف‌کننده: + {formattedPrice ? ( + <> + {formattedPrice} + تومان + + ) : ( + استعلام قیمت + )} +
+ + + +
+
+ ضمانت اصالت دائم کالا +
+
+ ارسال فوری (شیراز ۲ ساعته) +
+
+ فاکتور رسمی شرکتی +
+
+
+ +
+
+ دانلود دیتاشیت + PDF • 1.2 MB • English +
+
+ + + +
+
+ +
+
+ نیاز به مشاوره؟ + تماس مستقیم با مهندسین +
+
+ + + +
+
+
+ +
+ + {/* ========================================= */} + {/* بخش 3: مشخصات ابعادی (پایین ستون راست) */} + {/* دسکتاپ: 8 ستون عرض دارد و به طور خودکار زیر بخش معرفی قرار می‌گیرد */} + {/* موبایل: با order-3 در انتهای صفحه قرار می‌گیرد */} + {/* ========================================= */} +
+
+
+

مشخصات ابعادی دقیق

+ واحد: میلیمتر (mm) +
+ +
+
+
+
+
+
+ +
+ {"$D=" + (product.l ? product.l.replace('mm', '').trim() : '') + "$"} +
+
+ {"$d=" + (product.d ? product.d.replace('mm', '').trim() : '') + "$"} +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
قطر داخلی ($d$){product.d}
قطر خارجی ($D$){product.l}
پهنا ($B$){product.width}
وزن خالص{product.weight}
جنس قفسه{product.cageMaterial}
کد بین‌المللی{product.intCode}
+
+
+
+
+
- -
); diff --git a/components/articlecard.tsx b/components/articlecard.tsx index eb82758..77c520b 100644 --- a/components/articlecard.tsx +++ b/components/articlecard.tsx @@ -28,7 +28,7 @@ export default function ArticleCard({ article }: { article: Article }) { return ( -
+
{/* بخش تصویر با نسبت ابعاد متناسب (مربعی‌تر) */}
@@ -43,7 +43,7 @@ export default function ArticleCard({ article }: { article: Article }) {
{/* محتوای متنی */} -
+
{/* تاریخ مقاله */}
diff --git a/components/cartaction.tsx b/components/cartaction.tsx new file mode 100644 index 0000000..e096483 --- /dev/null +++ b/components/cartaction.tsx @@ -0,0 +1,74 @@ +'use client'; + +import { Plus, Minus, Trash2 } from "lucide-react"; +import { useCart } from "./context/cartcontext"; +interface ProductCartActionProps { + product: any; +} + +export default function ProductCartAction({ product }: ProductCartActionProps) { + const { addToCart, decreaseQuantity, cart } = useCart(); + + // بررسی وجود و تعداد محصول در سبد خرید + const cartItem = cart.find((item) => item.id === product.id); + const quantity = cartItem ? cartItem.quantity : 0; + + const handleIncrease = (e: React.MouseEvent) => { + e.preventDefault(); + addToCart(product); + }; + + const handleDecrease = (e: React.MouseEvent) => { + e.preventDefault(); + decreaseQuantity(product.id); + }; + + // اگر محصول ناموجود بود + if (!product.stock) { + return ( +
+ +
+ ); + } + + return ( +
+ {quantity > 0 ? ( + // حالت ۲: محصول در سبد خرید وجود دارد (نمایش کنترلر کم و زیاد) +
+ + + + {quantity} + + + +
+ ) : ( + // حالت ۱: پیش‌فرض (دکمه نارنجی افزودن به سبد مطابق با تصویر) + <> + + + + )} +
+ ); +} diff --git a/components/footer.tsx b/components/footer.tsx index 0c69538..7189bd6 100644 --- a/components/footer.tsx +++ b/components/footer.tsx @@ -70,7 +70,7 @@ export default function Footer() {
  • - قزوین، مینودر + شیراز،معالی اباد
  • diff --git a/components/header.tsx b/components/header.tsx index e9296d0..46d3f9d 100644 --- a/components/header.tsx +++ b/components/header.tsx @@ -296,7 +296,7 @@ export function Header() { {/* User/Cart Actions */}
    {/* دراپ‌داون سبد خرید */} -
    +
    diff --git a/lib/data.tsx b/lib/data.tsx index 506cd1f..dd1dbec 100644 --- a/lib/data.tsx +++ b/lib/data.tsx @@ -1,14 +1,21 @@ - export const products = [ { id: "1", title: "بلبرینگ شبکه‌ای 22220", image: "/src/img/1.jpg", - l: "120 mm", + l: "120 mm", // نمایانگر D d: "60 mm", brand: "K", price: null, stock: true, + width: "33 mm", + weight: "1.52 kg", + cageMaterial: "Brass", + intCode: "22220-E1", + loadCapacity: "kN 156.0", + maxSpeed: "r/min 4,300", + tempRange: "C° 150+ / 30-", + sealType: "Open", }, { id: "2", @@ -20,59 +27,107 @@ export const products = [ price: "450,000", badge: "جدید", stock: false, + width: "9 mm", + weight: "0.032 kg", + cageMaterial: "Polyamide", + intCode: "7200-B-TVP", + loadCapacity: "kN 5.4", + maxSpeed: "r/min 28,000", + tempRange: "C° 120+ / 30-", + sealType: "Open", }, { id: "3", title: "رولبرینگ مخروطی 30205", image: "/src/img/3.jpg", - l: "20 mm", - d: "52 mm", + l: "52 mm", // مقدار L و D جابجا بود، تصحیح شد + d: "25 mm", brand: "KOYO", price: "870,000", badge: "-8%", stock: true, + width: "16.25 mm", + weight: "0.15 kg", + cageMaterial: "Steel", + intCode: "30205-A", + loadCapacity: "kN 34.5", + maxSpeed: "r/min 9,500", + tempRange: "C° 120+ / 30-", + sealType: "Open", }, { id: "4", title: "بلبرینگ شیار عمیق 6204", image: "/src/img/4.jpg", - l: "20 mm", - d: "47 mm", + l: "47 mm", + d: "20 mm", brand: "SKF", price: "1,250,000", badge: "پرفروش", stock: false, + width: "14 mm", + weight: "0.106 kg", + cageMaterial: "Sheet Metal", + intCode: "6204-2RSH/C3", + loadCapacity: "kN 13.5", + maxSpeed: "r/min 10,000", + tempRange: "C° 100+ / 40-", + sealType: "Double Seal", }, { id: "5", title: "بلبرینگ استوانه‌ای NU220", image: "/src/img/5.jpg", - l: "200 mm", - d: "85 mm", + l: "180 mm", + d: "100 mm", brand: "NSK", price: "2,400,000", badge: "پیشنهادی", stock: true, + width: "34 mm", + weight: "3.75 kg", + cageMaterial: "Machined Brass", + intCode: "NU220-EM1", + loadCapacity: "kN 255.0", + maxSpeed: "r/min 3,800", + tempRange: "C° 150+ / 30-", + sealType: "Open", }, { id: "6", title: "رولبرینگ سوزنی NK20", image: "/src/img/6.jpg", - l: "20 mm", - d: "35 mm", + l: "28 mm", + d: "20 mm", brand: "INA", price: "690,000", stock: true, + width: "16 mm", + weight: "0.027 kg", + cageMaterial: "Steel", + intCode: "NK20/16", + loadCapacity: "kN 12.8", + maxSpeed: "r/min 18,000", + tempRange: "C° 120+ / 20-", + sealType: "Open", }, { id: "7", title: "بوش بلبرینگ برنزی B1810", image: "/src/img/7.jpg", - l: "28 mm", - d: "45 mm", + l: "45 mm", + d: "28 mm", brand: "KBT", price: "330,000", stock: true, + width: "25 mm", + weight: "0.085 kg", + cageMaterial: "Bronze", + intCode: "B-1810-25", + loadCapacity: "kN 8.5", + maxSpeed: "r/min 1,200", + tempRange: "C° 200+ / 50-", + sealType: "None", }, { id: "8", @@ -84,28 +139,52 @@ export const products = [ price: "980,000", badge: "ویژه", stock: true, + width: "16 mm", + weight: "0.21 kg", + cageMaterial: "Polyamide", + intCode: "1206-TVH", + loadCapacity: "kN 15.6", + maxSpeed: "r/min 11,000", + tempRange: "C° 120+ / 30-", + sealType: "Open", }, { id: "9", title: "رولبرینگ کف‌گرد 51206", image: "/src/img/2.jpg", - l: "24 mm", - d: "60 mm", + l: "52 mm", + d: "30 mm", brand: "NACHI", price: "1,080,000", stock: false, + width: "16 mm", + weight: "0.14 kg", + cageMaterial: "Sheet Steel", + intCode: "51206", + loadCapacity: "kN 26.5", + maxSpeed: "r/min 4,500", + tempRange: "C° 100+ / 20-", + sealType: "Open", }, { id: "10", title: "بلبرینگ دوبل ردیفی 5206", image: "/src/img/3.jpg", - l: "30 mm", - d: "62 mm", + l: "62 mm", + d: "30 mm", brand: "SKF", price: "1,550,000", badge: "جدید", stock: true, - }, + width: "23.8 mm", + weight: "0.29 kg", + cageMaterial: "Polyamide", + intCode: "5206-A-2RS1", + loadCapacity: "kN 30.5", + maxSpeed: "r/min 7,500", + tempRange: "C° 110+ / 30-", + sealType: "Double Seal", + } ]; diff --git a/package-lock.json b/package-lock.json index f1da574..0ca0e72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "lucide-react": "^0.577.0", "next": "16.1.6", "react": "19.2.3", - "react-dom": "19.2.3" + "react-dom": "19.2.3", + "swiper": "^12.1.2" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -1667,6 +1668,25 @@ } } }, + "node_modules/swiper": { + "version": "12.1.2", + "resolved": "https://mirror-npm.runflare.com/swiper/-/swiper-12.1.2.tgz", + "integrity": "sha512-4gILrI3vXZqoZh71I1PALqukCFgk+gpOwe1tOvz5uE9kHtl2gTDzmYflYCwWvR4LOvCrJi6UEEU+gnuW5BtkgQ==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "license": "MIT", + "engines": { + "node": ">= 4.7.0" + } + }, "node_modules/tailwindcss": { "version": "4.2.1", "resolved": "https://hub.megan.ir/repository/npm/tailwindcss/-/tailwindcss-4.2.1.tgz", diff --git a/package.json b/package.json index a80f160..551a3ce 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "lucide-react": "^0.577.0", "next": "16.1.6", "react": "19.2.3", - "react-dom": "19.2.3" + "react-dom": "19.2.3", + "swiper": "^12.1.2" }, "devDependencies": { "@tailwindcss/postcss": "^4",