From cfa21cbee9dd52c1558777379d5e5f4f63f1c83e Mon Sep 17 00:00:00 2001 From: Alireza Hassani Date: Fri, 21 Aug 2026 12:13:41 +0330 Subject: [PATCH] Initial commit: BRB Store Next.js storefront with Meshkee image slots. Co-authored-by: Cursor --- .cursor/rules/static-image-slots.mdc | 13 + .gitignore | 15 + Ai-data/prompt-connect-backend.txt | 23 + Ai-data/prompt-images-slot.txt | 22 + Ai-data/prompt.txt | 18 + CONTEXT.md | 114 + app/about/page.tsx | 59 + app/blog/[slug]/page.tsx | 51 + app/blog/page.tsx | 39 + app/contact/page.tsx | 93 + app/globals.css | 79 + app/layout.tsx | 44 + app/meshkee/static-image-slots/route.ts | 16 + app/page.tsx | 136 + .../franco-debartolo-AXC2vD7y_ho-unsplash.jpg | Bin 0 -> 106439 bytes .../gleb-paniotov-N6Bm7zMCZUo-unsplash.jpg | Bin 0 -> 57687 bytes .../lisa-anna-ZkWMfHPNWpw-unsplash.jpg | Bin 0 -> 220802 bytes ...mium_photo-1661342474567-f84bb6959d9f.avif | Bin 0 -> 565878 bytes .../salar-HVXmK1wqntk-unsplash.jpg | Bin 0 -> 1005663 bytes .../theme-photos-Klby0nxseY8-unsplash.jpg | Bin 0 -> 268021 bytes .../vlad-kutepov-RHCxMPJC5b8-unsplash.jpg | Bin 0 -> 220862 bytes components/Container.tsx | 9 + components/GlassBox.tsx | 30 + components/Placeholder.tsx | 34 + components/SlotLink.tsx | 26 + components/contact/ContactForm.tsx | 55 + components/home/AboutPreview.tsx | 51 + components/home/BannerRow.tsx | 73 + components/home/BlogCarousel.tsx | 79 + components/home/Branches.tsx | 57 + components/home/CategoryShowcase.tsx | 101 + components/home/Hero.tsx | 156 + components/home/ProductStrip.tsx | 47 + components/home/Services.tsx | 46 + components/home/Stats.tsx | 20 + components/home/WideBanner.tsx | 52 + components/layout/Footer.tsx | 74 + components/layout/Header.tsx | 177 + components/layout/HeaderSearch.tsx | 25 + components/layout/PageHero.tsx | 28 + components/layout/TopBar.tsx | 38 + eslint.config.mjs | 11 + lib/config.ts | 16 + lib/data.ts | 463 ++ lib/glossy.ts | 7 + lib/static-images.ts | 227 + next.config.ts | 10 + package-lock.json | 6791 +++++++++++++++++ package.json | 27 + postcss.config.mjs | 7 + public/favicon.ico | Bin 0 -> 4286 bytes public/images/about/store.jpg | Bin 0 -> 93923 bytes public/images/banners/wide.jpg | Bin 0 -> 104246 bytes public/images/brand/logo.png | Bin 0 -> 17080 bytes public/images/categories/battery.jpg | Bin 0 -> 32768 bytes public/images/categories/bearing.jpg | Bin 0 -> 42308 bytes public/images/categories/blender.jpg | Bin 0 -> 28706 bytes public/images/categories/collector.jpg | Bin 0 -> 40655 bytes public/images/categories/fan.jpg | Bin 0 -> 23082 bytes public/images/categories/food-processor.jpg | Bin 0 -> 32245 bytes public/images/categories/iron.jpg | Bin 0 -> 24281 bytes public/images/categories/kettle.jpg | Bin 0 -> 91404 bytes public/images/categories/meat-grinder.jpg | Bin 0 -> 107699 bytes public/images/categories/microwave.png | Bin 0 -> 126551 bytes public/images/categories/steam.jpg | Bin 0 -> 19605 bytes public/images/categories/vacuum.jpg | Bin 0 -> 88406 bytes .../franco-debartolo-AXC2vD7y_ho-unsplash.jpg | Bin 0 -> 106439 bytes .../gleb-paniotov-N6Bm7zMCZUo-unsplash.jpg | Bin 0 -> 57687 bytes .../lisa-anna-ZkWMfHPNWpw-unsplash.jpg | Bin 0 -> 220802 bytes ...mium_photo-1661342474567-f84bb6959d9f.avif | Bin 0 -> 565878 bytes .../lifestyle/salar-HVXmK1wqntk-unsplash.jpg | Bin 0 -> 1005663 bytes .../theme-photos-Klby0nxseY8-unsplash.jpg | Bin 0 -> 268021 bytes .../vlad-kutepov-RHCxMPJC5b8-unsplash.jpg | Bin 0 -> 220862 bytes public/images/slides/slide-1.jpg | Bin 0 -> 1184244 bytes public/images/slides/slide-2.jpg | Bin 0 -> 1000077 bytes src/assets/images/logo/logo.png | Bin 0 -> 17080 bytes src/assets/images/slides/slide-1.jpg | Bin 0 -> 1184244 bytes src/assets/images/slides/slide-2.jpg | Bin 0 -> 1000077 bytes tsconfig.json | 23 + 79 files changed, 9482 insertions(+) create mode 100644 .cursor/rules/static-image-slots.mdc create mode 100644 .gitignore create mode 100644 Ai-data/prompt-connect-backend.txt create mode 100644 Ai-data/prompt-images-slot.txt create mode 100644 Ai-data/prompt.txt create mode 100644 CONTEXT.md create mode 100644 app/about/page.tsx create mode 100644 app/blog/[slug]/page.tsx create mode 100644 app/blog/page.tsx create mode 100644 app/contact/page.tsx create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/meshkee/static-image-slots/route.ts create mode 100644 app/page.tsx create mode 100644 assets/sample images/franco-debartolo-AXC2vD7y_ho-unsplash.jpg create mode 100644 assets/sample images/gleb-paniotov-N6Bm7zMCZUo-unsplash.jpg create mode 100644 assets/sample images/lisa-anna-ZkWMfHPNWpw-unsplash.jpg create mode 100644 assets/sample images/premium_photo-1661342474567-f84bb6959d9f.avif create mode 100644 assets/sample images/salar-HVXmK1wqntk-unsplash.jpg create mode 100644 assets/sample images/theme-photos-Klby0nxseY8-unsplash.jpg create mode 100644 assets/sample images/vlad-kutepov-RHCxMPJC5b8-unsplash.jpg create mode 100644 components/Container.tsx create mode 100644 components/GlassBox.tsx create mode 100644 components/Placeholder.tsx create mode 100644 components/SlotLink.tsx create mode 100644 components/contact/ContactForm.tsx create mode 100644 components/home/AboutPreview.tsx create mode 100644 components/home/BannerRow.tsx create mode 100644 components/home/BlogCarousel.tsx create mode 100644 components/home/Branches.tsx create mode 100644 components/home/CategoryShowcase.tsx create mode 100644 components/home/Hero.tsx create mode 100644 components/home/ProductStrip.tsx create mode 100644 components/home/Services.tsx create mode 100644 components/home/Stats.tsx create mode 100644 components/home/WideBanner.tsx create mode 100644 components/layout/Footer.tsx create mode 100644 components/layout/Header.tsx create mode 100644 components/layout/HeaderSearch.tsx create mode 100644 components/layout/PageHero.tsx create mode 100644 components/layout/TopBar.tsx create mode 100644 eslint.config.mjs create mode 100644 lib/config.ts create mode 100644 lib/data.ts create mode 100644 lib/glossy.ts create mode 100644 lib/static-images.ts create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/favicon.ico create mode 100644 public/images/about/store.jpg create mode 100644 public/images/banners/wide.jpg create mode 100644 public/images/brand/logo.png create mode 100644 public/images/categories/battery.jpg create mode 100644 public/images/categories/bearing.jpg create mode 100644 public/images/categories/blender.jpg create mode 100644 public/images/categories/collector.jpg create mode 100644 public/images/categories/fan.jpg create mode 100644 public/images/categories/food-processor.jpg create mode 100644 public/images/categories/iron.jpg create mode 100644 public/images/categories/kettle.jpg create mode 100644 public/images/categories/meat-grinder.jpg create mode 100644 public/images/categories/microwave.png create mode 100644 public/images/categories/steam.jpg create mode 100644 public/images/categories/vacuum.jpg create mode 100644 public/images/lifestyle/franco-debartolo-AXC2vD7y_ho-unsplash.jpg create mode 100644 public/images/lifestyle/gleb-paniotov-N6Bm7zMCZUo-unsplash.jpg create mode 100644 public/images/lifestyle/lisa-anna-ZkWMfHPNWpw-unsplash.jpg create mode 100644 public/images/lifestyle/premium_photo-1661342474567-f84bb6959d9f.avif create mode 100644 public/images/lifestyle/salar-HVXmK1wqntk-unsplash.jpg create mode 100644 public/images/lifestyle/theme-photos-Klby0nxseY8-unsplash.jpg create mode 100644 public/images/lifestyle/vlad-kutepov-RHCxMPJC5b8-unsplash.jpg create mode 100644 public/images/slides/slide-1.jpg create mode 100644 public/images/slides/slide-2.jpg create mode 100644 src/assets/images/logo/logo.png create mode 100644 src/assets/images/slides/slide-1.jpg create mode 100644 src/assets/images/slides/slide-2.jpg create mode 100644 tsconfig.json diff --git a/.cursor/rules/static-image-slots.mdc b/.cursor/rules/static-image-slots.mdc new file mode 100644 index 0000000..ec124e3 --- /dev/null +++ b/.cursor/rules/static-image-slots.mdc @@ -0,0 +1,13 @@ +--- +description: Keep Meshkee static-image slot catalog in sync with homepage CSS +globs: "{lib/static-images.ts,app/page.tsx,app/meshkee/**,components/home/**}" +alwaysApply: false +--- + +# Static image slots + +Homepage photos come from Meshkee `GET /tenants/{domain}/website/static-images?pageKey=home`. The dashboard catalog is `GET /meshkee/static-image-slots` (`STATIC_IMAGE_SLOTS` in `lib/static-images.ts`). + +If you change a slot’s on-page **width, height, or aspect ratio**, update that slot’s `aspectRatio` and `recommendedWidth` in `STATIC_IMAGE_SLOTS` in the same change. + +Do not invent upload APIs. `url` → ``, `linkUrl` → wrap in a link, empty/fail → keep the current placeholder. Use `slot.aspectRatio` from the API when present. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ffef465 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +/node_modules +/.pnp +.pnp.* +.yarn/* + +/.next/ +/out/ + +.DS_Store +*.pem +npm-debug.log* +.env* +.vercel +next-env.d.ts +tsconfig.tsbuildinfo diff --git a/Ai-data/prompt-connect-backend.txt b/Ai-data/prompt-connect-backend.txt new file mode 100644 index 0000000..6722842 --- /dev/null +++ b/Ai-data/prompt-connect-backend.txt @@ -0,0 +1,23 @@ +Domain: brb-store.com +Documentation for backend is:https://api.meshkee.com/docs/website + + +Login or user icon should go to customer.{domainName}.com + + +Create product page and details >> connect to store items +Details page: +- use light box gallery +- zoom image on hover +- has two tabs in bottom, description and comments. Comment is for authenticated user if not show a login link button or box + +Create blog page and details >> connect to blog + +Product Menu should be a mega menu with level 1 and 2 of categories +Search input should be instant search - activate when type more than 2 char + +First carousel >> special-sale +Second carousel >> multi-vitamin +Third carousel >> body-building-supplement + +update context md for better use in other Ai and systems - update it on every prompt (If required) \ No newline at end of file diff --git a/Ai-data/prompt-images-slot.txt b/Ai-data/prompt-images-slot.txt new file mode 100644 index 0000000..5108a7e --- /dev/null +++ b/Ai-data/prompt-images-slot.txt @@ -0,0 +1,22 @@ +Wire this page to brb-store.com static-image slots. + +Read http://meshkee.com/docs/website (static-images). Env is already set. + +Fetch slots, match by key: +- slider > duplicatable +- 3 icon image +- categories > duplicatable +- about us image - one slot +- five-banner-section → five slot +- two-banner-row → two slot +- full-row-image > one slot +- two-branch-image > two slot + + +Use slot.images (all of them if kind=list, first if kind=single). +url → . linkUrl → wrap in . Empty or fail → keep current placeholder. +Use slot.aspectRatio from the API. Do not invent upload APIs. + +If image size or aspect ratio has changed during development, please update it for statics image reader. Add this as rule + +update context md for better use in other Ai and systems - update it on every prompt (If required) \ No newline at end of file diff --git a/Ai-data/prompt.txt b/Ai-data/prompt.txt new file mode 100644 index 0000000..1c771b4 --- /dev/null +++ b/Ai-data/prompt.txt @@ -0,0 +1,18 @@ +Create a website for spare parts of home appliances store from brb-store.com +Download and use banners,images and fonts from main website, icon and color Pallete from main website +For image you can use images in assets/sample images either +Logo from main website either + +Pick data from current website - all data is valid +Lang:fa +Directions: rtl +Use next js +Color palette like website +use flat design + +Clone only homepage, about us, contact us + +Use image oriented design with a red minimal overlay if needed. Product images are white bg images that will read from backend later + +update context md for better use in other Ai and systems - update it on every prompt (If required) + diff --git a/CONTEXT.md b/CONTEXT.md new file mode 100644 index 0000000..fe09974 --- /dev/null +++ b/CONTEXT.md @@ -0,0 +1,114 @@ +# BRB Store — AI context + +Persian RTL storefront for **brb-store.com** (فروشگاه و تعمیرگاه لوازم خانگی برادران برقعی، قم). +Next.js App Router rebuild of the original WillaMall/BeTheme site. Keep this file current — other AI tools read it first. + +Live DNS for `www.brb-store.com` currently serves a different tenant; source of truth for copy, images, and palette is the archived original at `https://www.brb-store.ir/` (Wayback 2022) plus `Ai-data/prompt.txt`. + +## Stack + +- Next.js 16 (App Router, Turbopack) + React 19 + TypeScript + Tailwind v4 +- Locale: `fa`, direction: `rtl` +- Fonts: Vazirmatn (Persian) + Montserrat (English kickers). Original site used **BYekan-Edited** + **IRANSans** + **Montserrat**; those files were not recoverable from Wayback (`WillaMall_SP/assets/Fonts/...` 404). +- Icons: Lucide, tinted with brand red (original used WillaMall `WMi-*` icon font, not archived). +- Dev: `npm run dev` + +## Brand + +| Token | Value | Source | +| --- | --- | --- | +| Brand red | `#e7432b` | BeTheme `color-red` | +| Brand dark | `#c93621` | hover | +| Ink | `#1a1a1a` | | +| Muted | `#6c6363` | original about text | +| Paper | `#f6f3f1` | | +| Footer copy bar | `#efefef` | original `.footer_copy` | + +Logo: oval **BRB** (black top / red bottom, “Borgheei Brothers”) at `public/images/brand/logo.png` and `src/assets/images/logo/logo.png`. Favicon from original `.ico`. + +Design language comes from the original BeTheme Carpenter homepage, not a generic banner stack: + +- Full-bleed kitchen photography with a **white 92% caption card** (the original slider’s 430px white panel), red 3px bar, Montserrat kicker. +- «قطعات ما» header: red bar + English kicker, title, short catalog note. +- Parts grid: **4 columns**, image cards with a **frosted glass** caption box on the photo (`backdrop-filter`), hover zoom + search icon. +- Red (`#e7432b`) as accent — numbers, icons, underlines — not a wash over every photo. +- Story: فروش / قطعات / تعمیرات, ۳۰+ years, two Qom branches, wholesale. +- Homepage **blog carousel** after the three-banner row: snap-scroll cards, arrows, link to `/blog`. Copy lives in `lib/data.ts` (`blogPosts`) until Meshkee. +- Original **category hover carousel** (`CategoryShowcase`): centered «دسته بندی ها» header, tall photo cards, dark bottom bar that expands on hover with «تماس با ما». Data: `showcaseCategories`. + +Product tiles stay on **white backgrounds**. Lifestyle extras: `public/images/lifestyle/`. + +## Routes (this pass) + +Clone **only** these pages: + +| Path | Content | +| --- | --- | +| `/` | Homepage + static image slots | +| `/about` | About us (original `/AboutUs`) | +| `/contact` | Contact us (original `/ContactUs`) | +| `/blog` | Article list (local placeholders until Meshkee blog is wired) | +| `/blog/[slug]` | Article detail | +| `/meshkee/static-image-slots` | Slot catalog for the dashboard Refresh button | + +Account / user icon → `https://customer.brb-store.com` (`NEXT_PUBLIC_CUSTOMER_PORTAL_URL`). Do not build a local login page. + +## Homepage order + +`Hero` → `Services` (3 icons) → `CategoryShowcase` → `AboutPreview` → five-banner (2-col + 3-col) → `BlogCarousel` → `two-banner-row` → `Stats` → `WideBanner` → `Branches`. + +Caption bars on photos use dark glossy glass (`lib/glossy.ts` `glossyBar`). Hover the card to expand the bar and show `subtext`. + +## Static image slots (wired) + +`GET /tenants/brb-store.com/website/static-images?pageKey=home`. Catalog: `GET /meshkee/static-image-slots` from `STATIC_IMAGE_SLOTS` in `lib/static-images.ts`. Client: `overlaySlotImages` / `pickSlot`. Empty/fail → local placeholder. `url` → ``, `linkUrl` → wrap in a link, `titleFa` / `titleEn` / `subtext` → caption. Use `slot.aspectRatio`. + +If a slot’s CSS size or ratio changes, update `aspectRatio` and `recommendedWidth` in `STATIC_IMAGE_SLOTS` in the same change. + +| key | kind | itemCount | ratio | Local fallback | +| --- | --- | --- | --- | --- | +| `slider` | list | null | 2:1 | `slides` peek carousel, center `1280px` | +| `three-icon-image` | list | 3 | 1:1 | Lucide icons if slot empty | +| `categories` | list | null | 14:23 | `showcaseCategories` tall cards | +| `about-us-image` | single | 1 | 4:3 | `public/images/about/store.jpg` | +| `five-banner-section` | list | 5 | 2:1 | `twoBannerRow` + `threeBannerRow` | +| `two-banner-row` | list | 2 | 2:1 | `bannersBelowSlider` (after blog) | +| `full-row-image` | single | 1 | 32:9 | `public/images/banners/wide.jpg` | +| `two-branch-image` | list | 2 | 2:1 | `branches` photos | + +Do not invent upload APIs. + +## Original business data (valid — do not invent replacements) + +**About:** 30+ years. Sells home appliances, spare parts, and repairs small appliances (vacuum, meat grinder, fan, juicer, mill, steam iron, kettle, mixer, blender, microwave, …). Wholesale and retail, Iran and abroad. Open to manufacturers/traders. + +**Branches** + +1. قم، خیابان سی متری کیوانفر، روبروی داروخانه الهادی +2. قم، بلوار صدوقی، خیابان امام حسین (ع)، نبش کوچه ۲۱ + +**Phones:** 0912-309-3407، 0912-651-7619، 025-36604454، 025-32404070، تلفکس 0253-6638866 +**Telegram:** https://t.me/borgheeibrothers +**Email display:** Alireza borghei20@gmail.com (`alirezaborghei20@gmail.com`) +**Map:** 34.6564, 50.8696 + +**Part categories (homepage):** vacuum, juicer/blender/mill, steam cleaner, meat grinder, iron, microwave/toaster, kettle, fan/evaporative cooler, food processor/chopper/hand blender/mixer, battery, bearing, collector. + +Appliance mega-menu (household + industrial) is copied from the original header; links currently go to `/#parts` until the catalog is connected. + +## Meshkee + +Docs: https://api.meshkee.com/docs/website +OpenAPI: https://api.meshkee.com/docs/website/openapi.json +Base: `https://api.meshkee.com/api/v1` +Tenant domain: `brb-store.com` (`NEXT_PUBLIC_WEBSITE_DOMAIN` / `WEBSITE_DOMAIN`). + +Wired: homepage static images (`Ai-data/prompt-images-slot.txt`). + +Later: `Ai-data/prompt-connect-backend.txt` — products, blog, portfolio, customer portal. + +Public reads only. Do not invent CMS/upload/dashboard APIs. Product images are white-bg and will be read from the backend. + +## Local content + +All copy and nav live in `lib/data.ts`. Downloaded originals are under `public/images/`. Sample lifestyle photos: `assets/sample images/` (copied to `public/images/lifestyle/`). diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..4fc62f5 --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,59 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { Container } from "@/components/Container"; +import { PageHero } from "@/components/layout/PageHero"; +import { Placeholder } from "@/components/Placeholder"; +import { about, features, site, stats } from "@/lib/data"; + +export const metadata: Metadata = { + title: "درباره ما", + description: about.paragraphs[0], +}; + +export default function AboutPage() { + return ( + <> + + +
+ +
+

Burgheii Brothers

+

{about.title}

+
+ {about.paragraphs.map((paragraph) => ( +

{paragraph}

+ ))} +
+ + شروع همکاری / تماس + +
+
+ +
+ {stats.map((stat) => ( +
+

{stat.value}

+

{stat.label}

+
+ ))} +
+
+
+
+ +
+ + {features.map((feature, index) => ( +
+

0{index + 1}

+

{feature.title}

+

{feature.text}

+
+ ))} +
+
+ + ); +} diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx new file mode 100644 index 0000000..58c2945 --- /dev/null +++ b/app/blog/[slug]/page.tsx @@ -0,0 +1,51 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { notFound } from "next/navigation"; +import { Container } from "@/components/Container"; +import { PageHero } from "@/components/layout/PageHero"; +import { blogPosts, getBlogPost } from "@/lib/data"; + +export function generateStaticParams() { + return blogPosts.map((post) => ({ slug: post.slug })); +} + +export async function generateMetadata({ + params, +}: { + params: Promise<{ slug: string }>; +}): Promise { + const { slug } = await params; + const post = getBlogPost(slug); + if (!post) return { title: "مقاله" }; + return { title: post.title, description: post.excerpt }; +} + +export default async function BlogPostPage({ + params, +}: { + params: Promise<{ slug: string }>; +}) { + const { slug } = await params; + const post = getBlogPost(slug); + if (!post) notFound(); + + return ( + <> + +
+ +

{post.date}

+
+ {post.body.map((paragraph) => ( +

{paragraph}

+ ))} +
+ + بازگشت به مقالات + + +
+
+ + ); +} diff --git a/app/blog/page.tsx b/app/blog/page.tsx new file mode 100644 index 0000000..7f5b346 --- /dev/null +++ b/app/blog/page.tsx @@ -0,0 +1,39 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { Container } from "@/components/Container"; +import { PageHero } from "@/components/layout/PageHero"; +import { Placeholder } from "@/components/Placeholder"; +import { blogPosts } from "@/lib/data"; + +export const metadata: Metadata = { + title: "مقالات", + description: "نکته‌هایی از تعمیرگاه و بورس قطعات لوازم خانگی برادران برقعی.", +}; + +export default function BlogPage() { + return ( + <> + +
+ +
+ {blogPosts.map((post) => ( + +
+ +
+

{post.date}

+

{post.title}

+

{post.excerpt}

+ + ))} +
+
+
+ + ); +} diff --git a/app/contact/page.tsx b/app/contact/page.tsx new file mode 100644 index 0000000..777aceb --- /dev/null +++ b/app/contact/page.tsx @@ -0,0 +1,93 @@ +import type { Metadata } from "next"; +import { Mail, MapPin, Send } from "lucide-react"; +import { Container } from "@/components/Container"; +import { ContactForm } from "@/components/contact/ContactForm"; +import { PageHero } from "@/components/layout/PageHero"; +import { Placeholder } from "@/components/Placeholder"; +import { branches, phones, site } from "@/lib/data"; + +export const metadata: Metadata = { + title: "ارتباط با ما", + description: "آدرس شعب، تلفن و فرم تماس فروشگاه و تعمیرگاه برادران برقعی در قم.", +}; + +export default function ContactPage() { + return ( + <> + + +
+ +

+ مجموعه ی فروشگاه و تعمیرگاه برادران برقعی دارای فعالیت در زمینه های فروش لوازم خانگی، فروش قطعات لوازم خانگی + و تعمیرات آنها می باشد. +

+ +
+ {branches.map((branch) => ( +
+
+ +
+
+ +
+

{branch.title}

+

{branch.address}

+
+
+
+ ))} +
+
+
+ +
+ +
+

تلفن و تلگرام

+
+
+ + + {site.emailLabel} + + + + کانال تلگرام borgheeibrothers + +
+
+ +
+

پیام ارسال کنید

+

نام، شماره و پیام — پاسخ از شعبه قم.

+ +
+