Initial commit: BRB Store Next.js storefront with Meshkee image slots.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
export const websiteDomain =
|
||||
process.env.NEXT_PUBLIC_WEBSITE_DOMAIN ??
|
||||
process.env.WEBSITE_DOMAIN ??
|
||||
process.env.NEXT_PUBLIC_MESHKEE_DOMAIN ??
|
||||
"brb-store.com";
|
||||
|
||||
export const meshkeeApiBase = (
|
||||
process.env.NEXT_PUBLIC_MESHKEE_API_BASE ??
|
||||
process.env.MESHKEE_API_BASE ??
|
||||
process.env.NEXT_PUBLIC_MESHKEE_API_URL ??
|
||||
"https://api.meshkee.com/api/v1"
|
||||
).replace(/\/$/, "");
|
||||
|
||||
export const customerPortalUrl = (
|
||||
process.env.NEXT_PUBLIC_CUSTOMER_PORTAL_URL ?? `https://customer.${websiteDomain}`
|
||||
).replace(/\/$/, "");
|
||||
+463
@@ -0,0 +1,463 @@
|
||||
export const site = {
|
||||
name: "فروشگاه برادران برقعی",
|
||||
nameEn: "Burgheii Brothers Store",
|
||||
shortName: "BRB",
|
||||
tagline: "بورس قطعات لوازم خانگی",
|
||||
slogan: "تجربه خریدی آسان ...",
|
||||
description:
|
||||
"فروشگاه برادران برقعی، انواع قطعات الکترونیکی لوازم برقی مصرفی در خانه را همچون قطعات ماشین لباس شویی، ماکروویو، جاروبرقی، کولر آبی، آبمیوه گیری و ... را برای استفاده شما در کنار هم فراهم کرده است.",
|
||||
keywords: "قطعات الکترونیکی قم، قطعات لوازم خانگی قم،قطعه ماشین لباس شویی،بورس قطعات لوازم خانگی قم",
|
||||
city: "قم",
|
||||
telegram: "https://t.me/borgheeibrothers",
|
||||
email: "alirezaborghei20@gmail.com",
|
||||
emailLabel: "Alireza borghei20@gmail.com",
|
||||
logo: "/images/brand/logo.png",
|
||||
map: {
|
||||
lat: 34.6564,
|
||||
lng: 50.8696,
|
||||
embed:
|
||||
"https://maps.google.com/maps?q=34.6564,50.8696&hl=fa&z=16&output=embed",
|
||||
},
|
||||
};
|
||||
|
||||
export const about = {
|
||||
title: "مجموعه ی فروشگاه و تعمیرگاه برادران برقعی",
|
||||
paragraphs: [
|
||||
"دارای فعالیت در زمینه های فروش لوازم خانگی، فروش قطعات لوازم خانگی و تعمیرات آنها شامل لوازم خانگی کوچک از قبیل (جارو برقی، چرخ گوشت، پنکه، آبمیوه گیری، آسیاب، اتوبخار، چایساز، همزن، مخلوط کن، ماکرویو و ...) می باشد.",
|
||||
"این مجموعه با بیش از ۳۰ سال سابقه آماده خدمت رسانی در این عرصه ها به صورت خرد و عمده به شما عزیزان در ایران و سراسر جهان می باشد.",
|
||||
"همچنین از تولیدکنندگان و تاجران عزیز در ایران و سراسر جهان که در این زمینه فعالیت دارند تقاضا دارد با معرفی خود به این مجموعه شروع یک همکاری صمیمانه را رقم بزنند.",
|
||||
"مشتاقانه آماده همکاری با شما عزیزان هستیم...",
|
||||
],
|
||||
image: "/images/about/store.jpg",
|
||||
};
|
||||
|
||||
export const phones = [
|
||||
{ label: "تلفن همراه", value: "0912-309-3407", href: "tel:+989123093407" },
|
||||
{ label: "تلفن همراه", value: "0912-651-7619", href: "tel:+989126517619" },
|
||||
{ label: "تلفن", value: "025-36604454", href: "tel:+982536604454" },
|
||||
{ label: "تلفن", value: "025-32404070", href: "tel:+982532404070" },
|
||||
{ label: "تلفکس", value: "0253-6638866", href: "tel:+982536638866" },
|
||||
];
|
||||
|
||||
export const branches = [
|
||||
{
|
||||
id: "keyvanfar",
|
||||
title: "شعبه ۱",
|
||||
address: "قم — خیابان سی متری کیوانفر، روبروی داروخانه الهادی، فروشگاه برادران برقعی",
|
||||
image: "/images/lifestyle/lisa-anna-ZkWMfHPNWpw-unsplash.jpg",
|
||||
},
|
||||
{
|
||||
id: "sadoughi",
|
||||
title: "شعبه ۲",
|
||||
address: "قم — بلوار صدوقی، خیابان امام حسین (ع)، نبش کوچه ۲۱",
|
||||
image: "/images/lifestyle/theme-photos-Klby0nxseY8-unsplash.jpg",
|
||||
},
|
||||
];
|
||||
|
||||
export const navLinks = [
|
||||
{ href: "/", label: "خانه" },
|
||||
{ href: "/#parts", label: "قطعات" },
|
||||
{ href: "/blog", label: "مقالات" },
|
||||
{ href: "/about", label: "درباره ما" },
|
||||
{ href: "/contact", label: "ارتباط با ما" },
|
||||
];
|
||||
|
||||
export const applianceGroups = [
|
||||
{
|
||||
title: "لوازم برقی خانگی",
|
||||
items: [
|
||||
"جارو برقی",
|
||||
"اتو بخار و اتو پرس",
|
||||
"پنکه و کولر",
|
||||
"آبمیوه گیری و مخلوط کن",
|
||||
"دستگاه اسپرسو ساز و آسیاب قهوه اسپرسو",
|
||||
"خرد کن، غذاساز و آسیاب",
|
||||
"چایی ساز و کتری برقی",
|
||||
"ماکروویو و تستر",
|
||||
"ساندویج ساز",
|
||||
"همزن و گوشت کوب برقی",
|
||||
"سماور برقی",
|
||||
"سشوار",
|
||||
"تلفن",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "لوازم برقی صنعتی",
|
||||
items: [
|
||||
"لوازم آشپزخانه صنعتی",
|
||||
"لوازم نظافتی و بهداشتی صنعتی",
|
||||
"دستگاه های واکس زن صنعتی",
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export const slides = [
|
||||
{
|
||||
id: "slide-1",
|
||||
image: "/images/slides/slide-1.jpg",
|
||||
kicker: "Burgheii Appliances Store",
|
||||
title: "تجربه خریدی آسان ...",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "slide-2",
|
||||
image: "/images/slides/slide-2.jpg",
|
||||
kicker: "Burgheii Brothers Store",
|
||||
title: "بورس قطعات لوازم خانگی",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "slide-3",
|
||||
image: "/images/about/store.jpg",
|
||||
kicker: "Qom · 30 years",
|
||||
title: "فروش، قطعه، تعمیر",
|
||||
href: "/about",
|
||||
},
|
||||
];
|
||||
|
||||
export const categories = [
|
||||
{
|
||||
id: "vacuum",
|
||||
title: "قطعات جارو برقی",
|
||||
english: "Vacuum",
|
||||
description: "گروه جاروبرقی: شامل جاروهای صنعتی و خانگی",
|
||||
image: "/images/categories/vacuum.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "blender",
|
||||
title: "قطعات آبمیوه گیری، مخلوط کن، آسیاب",
|
||||
english: "Juicer & Blender",
|
||||
description: "شامل انواع قطعات لوازم فوق در انواع برندها",
|
||||
image: "/images/categories/blender.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "steam",
|
||||
title: "قطعات بخارشویی",
|
||||
english: "Steam Cleaner",
|
||||
description: "گروه بخارشور: شامل انواع بخارشور در برندهای مختلف",
|
||||
image: "/images/categories/steam.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "meat-grinder",
|
||||
title: "قطعات چرخ گوشت",
|
||||
english: "Meat Grinder",
|
||||
description: "خانگی و صنعتی ایستاده و رومیزی — انواع تیغ و شبکه",
|
||||
image: "/images/categories/meat-grinder.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "iron",
|
||||
title: "قطعات اتو",
|
||||
english: "Iron",
|
||||
description: "گروه اتو: شامل انواع قطعات اتوهای پرس و اتوهای دستی",
|
||||
image: "/images/categories/iron.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "microwave",
|
||||
title: "قطعات ماکروویو و تستر",
|
||||
english: "Microwave",
|
||||
description: "سولاردوم، ماکروویو و توستر در سایزها و برندهای مختلف",
|
||||
image: "/images/categories/microwave.png",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "kettle",
|
||||
title: "قطعات چای ساز",
|
||||
english: "Kettle",
|
||||
description: "چای ساز، کتری برقی و قوری چای سازهای روهمی",
|
||||
image: "/images/categories/kettle.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "fan",
|
||||
title: "قطعات پنکه و کولر آبی",
|
||||
english: "Fan & Cooler",
|
||||
description: "پنکه سقفی، رومیزی، پایه بلند و قطعات کولر آبی",
|
||||
image: "/images/categories/fan.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "food-processor",
|
||||
title: "قطعات غذاساز، خردکن، گوشتکوب، همزن",
|
||||
english: "Food Processor",
|
||||
description: "انواع قطعات لوازم فوق در برندهای مختلف",
|
||||
image: "/images/categories/food-processor.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "battery",
|
||||
title: "باطری",
|
||||
english: "Battery",
|
||||
description: "انواع باطری جاروهای شارژی در مدلهای مختلف",
|
||||
image: "/images/categories/battery.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "bearing",
|
||||
title: "بلبرینگ",
|
||||
english: "Bearing",
|
||||
description: "بلبرینگ جاروبرقی، لباسشویی و سایر سایزها",
|
||||
image: "/images/categories/bearing.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "collector",
|
||||
title: "کلکتور",
|
||||
english: "Collector",
|
||||
description: "کلکتور جاروبرقی، آبمیوه گیری و مدلهای دیگر",
|
||||
image: "/images/categories/collector.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
];
|
||||
|
||||
export const showcaseCategories = [
|
||||
{
|
||||
id: "espresso",
|
||||
title: "تعمیر اسپرسو ساز",
|
||||
text: "تعمیر و تأمین قطعات دستگاه اسپرسو و آسیاب قهوه در شعبه قم.",
|
||||
image: "/images/lifestyle/vlad-kutepov-RHCxMPJC5b8-unsplash.jpg",
|
||||
href: "/contact",
|
||||
},
|
||||
{
|
||||
id: "electrical",
|
||||
title: "تعمیر لوازم برقی",
|
||||
text: "تعمیر لوازم خانگی کوچک — جاروبرقی، مخلوطکن، چرخ گوشت و بیشتر.",
|
||||
image: "/images/lifestyle/theme-photos-Klby0nxseY8-unsplash.jpg",
|
||||
href: "/contact",
|
||||
},
|
||||
{
|
||||
id: "microwave",
|
||||
title: "تعمیر ماکروویو",
|
||||
text: "قطعه و تعمیر ماکروویو، سولاردوم و توستر در انواع برندها.",
|
||||
image: "/images/categories/microwave.png",
|
||||
href: "/contact",
|
||||
},
|
||||
{
|
||||
id: "vacuum",
|
||||
title: "تعمیر جاروبرقی",
|
||||
text: "کلکتور، بلبرینگ، تسمه و باطری جاروهای خانگی و صنعتی.",
|
||||
image: "/images/categories/vacuum.jpg",
|
||||
href: "/contact",
|
||||
},
|
||||
{
|
||||
id: "grinder",
|
||||
title: "تعمیر چرخ گوشت",
|
||||
text: "تعویض تیغ، شبکه و قطعات چرخ گوشت خانگی و صنعتی.",
|
||||
image: "/images/categories/meat-grinder.jpg",
|
||||
href: "/contact",
|
||||
},
|
||||
{
|
||||
id: "kettle",
|
||||
title: "تعمیر چای ساز",
|
||||
text: "المنت، ترموستات و قطعات چایساز و کتری برقی.",
|
||||
image: "/images/categories/kettle.jpg",
|
||||
href: "/contact",
|
||||
},
|
||||
{
|
||||
id: "blender",
|
||||
title: "تعمیر مخلوط کن",
|
||||
text: "قطعات آبمیوهگیری، مخلوطکن و آسیاب در برندهای مختلف.",
|
||||
image: "/images/categories/blender.jpg",
|
||||
href: "/contact",
|
||||
},
|
||||
{
|
||||
id: "iron",
|
||||
title: "تعمیر اتو",
|
||||
text: "قطعات اتو بخار، اتو پرس و اتوهای دستی.",
|
||||
image: "/images/categories/iron.jpg",
|
||||
href: "/contact",
|
||||
},
|
||||
];
|
||||
|
||||
export const services = [
|
||||
{
|
||||
id: "sell",
|
||||
title: "فروش لوازم خانگی",
|
||||
text: "لوازم خانگی کوچک؛ جاروبرقی، چرخ گوشت، مخلوط کن، ماکروویو و بیشتر.",
|
||||
image: "/images/slides/slide-1.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "parts",
|
||||
title: "بورس قطعات یدکی",
|
||||
text: "تیغ، شبکه، کلکتور، بلبرینگ و قطعه اصلی برای تعمیرکار و همکار.",
|
||||
image: "/images/categories/meat-grinder.jpg",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "repair",
|
||||
title: "تعمیرگاه تخصصی",
|
||||
text: "تعمیر لوازم خانگی کوچک در دو شعبه قم؛ خرد و عمده.",
|
||||
image: "/images/lifestyle/theme-photos-Klby0nxseY8-unsplash.jpg",
|
||||
href: "/contact",
|
||||
},
|
||||
];
|
||||
|
||||
export const stats = [
|
||||
{ value: "۳۰+", label: "سال سابقه در قم" },
|
||||
{ value: "۲", label: "شعبه فعال" },
|
||||
{ value: "۱۲", label: "گروه تخصصی قطعه" },
|
||||
{ value: "خرد / عمده", label: "فروش به همکار و مصرفکننده" },
|
||||
];
|
||||
|
||||
export const bannersBelowSlider = [
|
||||
{
|
||||
id: "banner-kitchen",
|
||||
image: "/images/lifestyle/lisa-anna-ZkWMfHPNWpw-unsplash.jpg",
|
||||
kicker: "Appliances",
|
||||
title: "لوازم خانگی کوچک",
|
||||
text: "جاروبرقی، مخلوطکن، چرخ گوشت، ماکروویو و سایر لوازم خانگی کوچک.",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "banner-espresso",
|
||||
image: "/images/lifestyle/vlad-kutepov-RHCxMPJC5b8-unsplash.jpg",
|
||||
kicker: "Espresso",
|
||||
title: "قطعات اسپرسو و آسیاب",
|
||||
text: "قطعه و تعمیر دستگاه اسپرسو و آسیاب قهوه در شعبه قم.",
|
||||
href: "/#parts",
|
||||
},
|
||||
];
|
||||
|
||||
export const twoBannerRow = [
|
||||
{
|
||||
id: "banner-repair",
|
||||
image: "/images/lifestyle/theme-photos-Klby0nxseY8-unsplash.jpg",
|
||||
kicker: "Workshop",
|
||||
title: "تعمیرات تخصصی در محل شعبه",
|
||||
text: "تعمیر لوازم خانگی کوچک در دو شعبه قم — خرد و عمده.",
|
||||
href: "/about",
|
||||
},
|
||||
{
|
||||
id: "banner-wholesale",
|
||||
image: "/images/lifestyle/franco-debartolo-AXC2vD7y_ho-unsplash.jpg",
|
||||
kicker: "Wholesale",
|
||||
title: "فروش خرد و عمده به همکاران",
|
||||
text: "تأمین قطعه برای تعمیرکار، همکار و مصرفکننده.",
|
||||
href: "/contact",
|
||||
},
|
||||
];
|
||||
|
||||
export const threeBannerRow = [
|
||||
{
|
||||
id: "banner-kettle",
|
||||
image: "/images/lifestyle/gleb-paniotov-N6Bm7zMCZUo-unsplash.jpg",
|
||||
kicker: "Kettle",
|
||||
title: "چای ساز و کتری برقی",
|
||||
text: "المنت، ترموستات و قطعات چایساز و کتری برقی.",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "banner-cooling",
|
||||
image: "/images/lifestyle/salar-HVXmK1wqntk-unsplash.jpg",
|
||||
kicker: "Cooling",
|
||||
title: "کولر آبی و تهویه",
|
||||
text: "قطعات پنکه، کولر آبی و تهویه خانگی.",
|
||||
href: "/#parts",
|
||||
},
|
||||
{
|
||||
id: "banner-stove",
|
||||
image: "/images/lifestyle/franco-debartolo-AXC2vD7y_ho-unsplash.jpg",
|
||||
kicker: "Cooking",
|
||||
title: "قطعات پختوپز",
|
||||
text: "قطعه لوازم پختوپز کوچک برای تعمیرگاه و مصرفکننده.",
|
||||
href: "/#parts",
|
||||
},
|
||||
];
|
||||
|
||||
/** Placeholder products with white backgrounds until Meshkee store items are wired. */
|
||||
export const sampleProducts = [
|
||||
{ id: "p-vacuum", title: "قطعات جاروبرقی", image: "/images/categories/vacuum.jpg" },
|
||||
{ id: "p-blender", title: "قطعات مخلوط کن", image: "/images/categories/blender.jpg" },
|
||||
{ id: "p-grinder", title: "تیغ و شبکه چرخ گوشت", image: "/images/categories/meat-grinder.jpg" },
|
||||
{ id: "p-microwave", title: "قطعات ماکروویو", image: "/images/categories/microwave.png" },
|
||||
{ id: "p-kettle", title: "قطعات چای ساز", image: "/images/categories/kettle.jpg" },
|
||||
{ id: "p-iron", title: "قطعات اتو", image: "/images/categories/iron.jpg" },
|
||||
{ id: "p-bearing", title: "بلبرینگ", image: "/images/categories/bearing.jpg" },
|
||||
{ id: "p-collector", title: "کلکتور", image: "/images/categories/collector.jpg" },
|
||||
];
|
||||
|
||||
export const blogPosts = [
|
||||
{
|
||||
slug: "meat-grinder-blades",
|
||||
title: "زمان تعویض تیغ و شبکه چرخ گوشت",
|
||||
excerpt: "کند شدن تیغ فقط کیفیت چرخ را پایین نمیآورد؛ موتور را هم تحت فشار میگذارد.",
|
||||
date: "۱۴۰۴/۰۵/۱۲",
|
||||
image: "/images/categories/meat-grinder.jpg",
|
||||
body: [
|
||||
"تیغ و شبکه چرخ گوشت از پرمصرفترین قطعات تعمیرگاه هستند. وقتی گوشت بهجای برش، له میشود یا موتور داغ میکند، معمولاً لبه تیغ گرد شده یا سوراخ شبکه گشاد شده است.",
|
||||
"شبکه و تیغ را بهصورت جفت عوض کنید تا سطح تماس یکنواخت بماند. در مدلهای خانگی و صنعتی ایستاده، سایز و تعداد سوراخ فرق دارد؛ قطعه را با مدل دستگاه مطابقت دهید.",
|
||||
"در شعبههای قم، تیغ و شبکه اصلی برای برندهای رایج موجود است — خرد و عمده.",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "vacuum-maintenance",
|
||||
title: "نگهداری جاروبرقی خانگی و صنعتی",
|
||||
excerpt: "فیلتر گرفته و برس فرسوده، مکش را کم میکند و کلکتور را زودتر میسوزاند.",
|
||||
date: "۱۴۰۴/۰۴/۲۸",
|
||||
image: "/images/categories/vacuum.jpg",
|
||||
body: [
|
||||
"کمشدن مکش همیشه به موتور مربوط نیست. کیسه پر، فیلتر مسدود و برس غلتکی فرسوده سه علت اول مراجعه به تعمیرگاه هستند.",
|
||||
"جاروهای صنعتی و خانگی قطعات مشترک زیادی دارند: کلکتور، بلبرینگ، تسمه و باطری مدلهای شارژی. تعویض بهموقع اینها از سوختن آرمیچر جلوگیری میکند.",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "bearings-guide",
|
||||
title: "بلبرینگ جاروبرقی و لباسشویی",
|
||||
excerpt: "صدای زوزه یا لرزش غیرعادی معمولاً از بلبرینگ خشک یا خردشده است.",
|
||||
date: "۱۴۰۴/۰۴/۰۹",
|
||||
image: "/images/categories/bearing.jpg",
|
||||
body: [
|
||||
"بلبرینگ در جاروبرقی، لباسشویی و بعضی مخلوطکنها کار میکند. سایز غلط یعنی لقی، داغی و در نهایت قفل شدن شفت.",
|
||||
"شماره حکشده روی بلبرینگ را بخوانید یا قطعه معیوب را به فروشگاه بیاورید تا همان سایز تحویل شود.",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "microwave-parts",
|
||||
title: "قطعات ماکروویو: مگنترون تا سینی",
|
||||
excerpt: "ماکروویو، سولاردوم و توستر قطعات جداگانهای دارند؛ مدل دستگاه را دقیق اعلام کنید.",
|
||||
date: "۱۴۰۴/۰۳/۲۱",
|
||||
image: "/images/categories/microwave.png",
|
||||
body: [
|
||||
"گرم نشدن غذا الزاماً به معنی تعویض کل دستگاه نیست. مگنترون، دکمهها، سینی شیشهای و لولای در از قطعات قابل تهیه در بورس قطعات هستند.",
|
||||
"برای سولاردوم و توستر هم قطعه جدا موجود است. مدل و برند را همراه داشته باشید.",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "vacuum-collector",
|
||||
title: "کلکتور موتور جاروبرقی چیست؟",
|
||||
excerpt: "جرقه زیاد پشت موتور و بوی سوختگی، نشانه تمام شدن ذغال کلکتور است.",
|
||||
date: "۱۴۰۴/۰۲/۱۸",
|
||||
image: "/images/categories/collector.jpg",
|
||||
body: [
|
||||
"کلکتور مسیر جریان را به آرمیچر میرساند. وقتی ذغال تمام شود، جرقه میزند، قدرت کم میشود و در نهایت موتور از کار میافتد.",
|
||||
"کلکتور جاروبرقی، آبمیوهگیری و چند مدل دیگر در فروشگاه موجود است. قطعه سوخته را برای تطبیق بیاورید.",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "kettle-repair",
|
||||
title: "تعمیر چایساز و کتری برقی",
|
||||
excerpt: "جوش نیاوردن معمولاً به المنت، ترموستات یا سوکت زیر کتری برمیگردد.",
|
||||
date: "۱۴۰۴/۰۱/۳۰",
|
||||
image: "/images/categories/kettle.jpg",
|
||||
body: [
|
||||
"چایساز روهمی، کتری برقی و قوری هر کدام قطعه مخصوص خود را دارند. رسوب زیاد المنت را ضعیف میکند و ترموستات معیوب دستگاه را بیدلیل قطع میکند.",
|
||||
"قبل از تعویض کل دستگاه، قطعه را در شعبه کیوانفر یا صدوقی بررسی کنید.",
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export function getBlogPost(slug: string) {
|
||||
return blogPosts.find((post) => post.slug === slug);
|
||||
}
|
||||
|
||||
export const features = [
|
||||
{ title: "۳۰ سال سابقه", text: "خدمترسانی خرد و عمده در قم و سراسر کشور" },
|
||||
{ title: "قطعات تخصصی", text: "جاروبرقی، چرخ گوشت، مخلوط کن، ماکروویو و بیشتر" },
|
||||
{ title: "تعمیرگاه فعال", text: "تعمیر لوازم خانگی کوچک در کنار فروش قطعه" },
|
||||
{ title: "دو شعبه در قم", text: "کیوانفر و بلوار صدوقی — امام حسین" },
|
||||
];
|
||||
@@ -0,0 +1,7 @@
|
||||
export const glossyBar = {
|
||||
background: "linear-gradient(180deg, rgb(48 52 56 / 0.78) 0%, rgb(18 20 22 / 0.88) 100%)",
|
||||
backdropFilter: "blur(22px) saturate(180%)",
|
||||
WebkitBackdropFilter: "blur(22px) saturate(180%)",
|
||||
border: "1px solid rgb(255 255 255 / 0.22)",
|
||||
boxShadow: "inset 0 1px 0 rgb(255 255 255 / 0.28), 0 10px 28px rgb(0 0 0 / 0.28)",
|
||||
} as const;
|
||||
@@ -0,0 +1,227 @@
|
||||
import { meshkeeApiBase, websiteDomain } from "@/lib/config";
|
||||
|
||||
export type SlotKind = "single" | "list";
|
||||
|
||||
export type SlotImage = {
|
||||
id: string;
|
||||
url: string;
|
||||
titleFa?: string | null;
|
||||
titleEn?: string | null;
|
||||
subtext?: string | null;
|
||||
linkUrl?: string | null;
|
||||
width?: number | null;
|
||||
height?: number | null;
|
||||
sortOrder?: number | null;
|
||||
};
|
||||
|
||||
export type StaticImageSlotCatalogItem = {
|
||||
key: string;
|
||||
label: string;
|
||||
kind: SlotKind;
|
||||
pageKey: string;
|
||||
aspectRatio: string;
|
||||
itemCount: number | null;
|
||||
recommendedWidth: number;
|
||||
};
|
||||
|
||||
export type StaticImageSlot = StaticImageSlotCatalogItem & {
|
||||
images: SlotImage[];
|
||||
};
|
||||
|
||||
export type SlotMediaItem = {
|
||||
id: string;
|
||||
image: string;
|
||||
href?: string;
|
||||
title?: string;
|
||||
kicker?: string;
|
||||
text?: string;
|
||||
fallbackSrc?: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* Homepage slot catalog published at GET /meshkee/static-image-slots.
|
||||
* Ratios match the live homepage at max-w-[1280px]. If a section’s CSS size
|
||||
* or aspect ratio changes, update this catalog in the same change — Meshkee
|
||||
* reads it as the static-image source of truth.
|
||||
*/
|
||||
export const STATIC_IMAGE_SLOTS: StaticImageSlotCatalogItem[] = [
|
||||
{
|
||||
key: "slider",
|
||||
label: "Homepage slider",
|
||||
kind: "list",
|
||||
pageKey: "home",
|
||||
aspectRatio: "2:1",
|
||||
itemCount: null,
|
||||
recommendedWidth: 1280,
|
||||
},
|
||||
{
|
||||
key: "three-icon-image",
|
||||
label: "Three service icons",
|
||||
kind: "list",
|
||||
pageKey: "home",
|
||||
aspectRatio: "1:1",
|
||||
itemCount: 3,
|
||||
recommendedWidth: 128,
|
||||
},
|
||||
{
|
||||
key: "categories",
|
||||
label: "Category carousel",
|
||||
kind: "list",
|
||||
pageKey: "home",
|
||||
aspectRatio: "14:23",
|
||||
itemCount: null,
|
||||
recommendedWidth: 280,
|
||||
},
|
||||
{
|
||||
key: "about-us-image",
|
||||
label: "About us image",
|
||||
kind: "single",
|
||||
pageKey: "home",
|
||||
aspectRatio: "4:3",
|
||||
itemCount: 1,
|
||||
recommendedWidth: 720,
|
||||
},
|
||||
{
|
||||
key: "five-banner-section",
|
||||
label: "Five banner section",
|
||||
kind: "list",
|
||||
pageKey: "home",
|
||||
aspectRatio: "2:1",
|
||||
itemCount: 5,
|
||||
recommendedWidth: 606,
|
||||
},
|
||||
{
|
||||
key: "two-banner-row",
|
||||
label: "Two banner row",
|
||||
kind: "list",
|
||||
pageKey: "home",
|
||||
aspectRatio: "2:1",
|
||||
itemCount: 2,
|
||||
recommendedWidth: 606,
|
||||
},
|
||||
{
|
||||
key: "full-row-image",
|
||||
label: "Full-row contact banner",
|
||||
kind: "single",
|
||||
pageKey: "home",
|
||||
aspectRatio: "32:9",
|
||||
itemCount: 1,
|
||||
recommendedWidth: 1920,
|
||||
},
|
||||
{
|
||||
key: "two-branch-image",
|
||||
label: "Two branch images",
|
||||
kind: "list",
|
||||
pageKey: "home",
|
||||
aspectRatio: "2:1",
|
||||
itemCount: 2,
|
||||
recommendedWidth: 606,
|
||||
},
|
||||
];
|
||||
|
||||
export function catalogSlot(key: string) {
|
||||
return STATIC_IMAGE_SLOTS.find((slot) => slot.key === key);
|
||||
}
|
||||
|
||||
export function parseAspectRatio(ratio?: string | null) {
|
||||
if (!ratio) return undefined;
|
||||
const match = /^(\d+(?:\.\d+)?)\s*:\s*(\d+(?:\.\d+)?)$/.exec(ratio.trim());
|
||||
if (!match) return undefined;
|
||||
return `${match[1]} / ${match[2]}`;
|
||||
}
|
||||
|
||||
export function pickSlot(slots: StaticImageSlot[], key: string) {
|
||||
return slots.find((slot) => slot.key === key);
|
||||
}
|
||||
|
||||
function normalizeImages(images: SlotImage[] | undefined) {
|
||||
return [...(images ?? [])]
|
||||
.filter((image) => Boolean(image?.url))
|
||||
.sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0));
|
||||
}
|
||||
|
||||
export function imagesFromSlot(slot?: StaticImageSlot | null): SlotImage[] {
|
||||
if (!slot) return [];
|
||||
const images = normalizeImages(slot.images);
|
||||
if (slot.kind === "single") return images.slice(0, 1);
|
||||
return images;
|
||||
}
|
||||
|
||||
function toMedia(image: SlotImage, fallback?: SlotMediaItem): SlotMediaItem {
|
||||
return {
|
||||
id: String(image.id),
|
||||
image: image.url,
|
||||
href: image.linkUrl?.trim() || fallback?.href,
|
||||
title: image.titleFa?.trim() || fallback?.title,
|
||||
kicker: image.titleEn?.trim() || fallback?.kicker,
|
||||
text: image.subtext?.trim() || fallback?.text,
|
||||
fallbackSrc: fallback?.image || fallback?.fallbackSrc,
|
||||
};
|
||||
}
|
||||
|
||||
export function overlaySlotImages(
|
||||
slot: StaticImageSlot | undefined,
|
||||
fallbacks: SlotMediaItem[],
|
||||
key: string,
|
||||
): { items: SlotMediaItem[]; aspectRatio?: string } {
|
||||
const catalog = catalogSlot(key);
|
||||
const aspectRatio = slot?.aspectRatio || catalog?.aspectRatio;
|
||||
const kind = slot?.kind ?? catalog?.kind ?? "list";
|
||||
const itemCount = slot?.itemCount ?? catalog?.itemCount ?? null;
|
||||
const apiImages = imagesFromSlot(slot ? { ...slot, kind, images: slot.images ?? [] } : undefined);
|
||||
|
||||
if (kind === "single") {
|
||||
const image = apiImages[0];
|
||||
const fallback = fallbacks[0];
|
||||
return {
|
||||
aspectRatio,
|
||||
items: image ? [toMedia(image, fallback)] : fallbacks.slice(0, 1),
|
||||
};
|
||||
}
|
||||
|
||||
if (apiImages.length === 0) {
|
||||
return {
|
||||
aspectRatio,
|
||||
items: itemCount ? fallbacks.slice(0, itemCount) : fallbacks,
|
||||
};
|
||||
}
|
||||
|
||||
if (itemCount) {
|
||||
return {
|
||||
aspectRatio,
|
||||
items: Array.from({ length: itemCount }, (_, index) => {
|
||||
const image = apiImages[index];
|
||||
const fallback = fallbacks[index] ?? fallbacks[fallbacks.length - 1];
|
||||
return image ? toMedia(image, fallback) : fallback;
|
||||
}).filter(Boolean),
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
aspectRatio,
|
||||
items: apiImages.map((image, index) => toMedia(image, fallbacks[index])),
|
||||
};
|
||||
}
|
||||
|
||||
function readItems(payload: unknown): StaticImageSlot[] {
|
||||
if (Array.isArray(payload)) return payload as StaticImageSlot[];
|
||||
if (payload && typeof payload === "object") {
|
||||
const record = payload as { items?: StaticImageSlot[]; slots?: StaticImageSlot[] };
|
||||
return record.items ?? record.slots ?? [];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
export async function fetchStaticImageSlots(pageKey = "home"): Promise<StaticImageSlot[]> {
|
||||
const url = `${meshkeeApiBase}/tenants/${encodeURIComponent(websiteDomain)}/website/static-images?pageKey=${encodeURIComponent(pageKey)}`;
|
||||
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
next: { revalidate: 60 },
|
||||
});
|
||||
if (!response.ok) return [];
|
||||
return readItems(await response.json());
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user