Files
brb-store/CONTEXT.md
T
Alireza HassaniandCursor 24b5649abd Polish storefront SEO, specials, and homepage UX.
Publish Meshkee sitemap-config, map product-source specials without variants, restore hero autoplay, and tighten page heroes, product images, and section order.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-22 21:48:00 +03:30

122 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.
## Stack
- Next.js 16 (App Router, Turbopack) + React 19 + TypeScript + Tailwind v4
- Locale: `fa`, direction: `rtl`
- Fonts: Vazirmatn (Persian) + Montserrat (English kickers)
- Icons: Lucide
- Dev: `npm run dev`
## Brand
| Token | Value |
| --- | --- |
| Brand red | `#e7432b` |
| Brand dark | `#c93621` |
| Ink | `#161616` |
| Muted | `#6c6363` |
| Paper | `#f4f0ec` |
Logo: `public/images/brand/logo.png`. Dark glossy caption bars: `lib/glossy.ts`.
## Meshkee API
- 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`)
- Customer portal: `https://customer.brb-store.com` (`NEXT_PUBLIC_CUSTOMER_PORTAL_URL`)
- Public reads: `/tenants/{domain}/...` (no auth).
- Do not invent CMS, upload, or dashboard APIs.
This site is **catalog-only** (no shopping cart). Login / user icon goes to the customer portal. Do not build a local login page.
## Routes
| Path | Source |
| --- | --- |
| `/` | Homepage + static image slots + store specials + latest blogs |
| `/products` | Store items (`GET /tenants/{domain}/store-items`) |
| `/products?categoryId=` | Same, filtered |
| `/products/[variantId]` | Store item variant + product description/gallery + comments |
| `/blog` | `GET /tenants/{domain}/blogs` (falls back to `lib/data.ts` `blogPosts`) |
| `/blog/[slug]` | Blog details + comments |
| `/about` | About us |
| `/contact` | Contact us |
| `/meshkee/static-image-slots` | Slot catalog for the dashboard Refresh button |
| `/meshkee/sitemap-config.json` | Build-time route manifest for Meshkee sitemap sync |
| `/api/search?q=` | Instant product search (`store-items?name=`, min 3 chars) |
## Homepage order
`Hero` → `Services` → اقلام مصرفی → `CategoryShowcase` → قطعات یخچال → `AboutPreview` → قطعات ماشین لباسشویی → five-banner (2+3) → `BlogCarousel` → `two-banner-row` → `Stats` → `WideBanner` → `Branches`.
## Homepage carousels (store specials)
`GET /tenants/{domain}/store-specials` matched by `key`:
1. `consumeables` — اقلام مصرفی
2. `refrigrator-parts` — قطعات یخچال
3. `washing-machine-parts` — قطعات ماشین لباسشویی
BRB specials use `source: "product"` (items may have empty `variants[]`). Map product fields directly; resolve slug via catalog for detail links. If a special has no `items`, keep sample products from `lib/data.ts`.
Products list/search: prefer store-items; if empty, fall back to `GET /products` catalog.
## Catalog
- Mega menu: product categories **level 1 and 2** (`GET /tenants/{domain}/categories?entityType=product`). Links: `/products?categoryId={id}`.
- Instant search: header input searches **products** when query length **> 2** (`/api/search` → `store-items?name=`). Enter or “مشاهده همه” → `/products?q=`.
- Product pages are display-only (price, gallery, description, comments). No cart / add-to-cart.
- Details gallery: product `images[].url` + thumbnail. Click = lightbox, hover = zoom.
- Details tabs: description (`descriptionHtml`) and comments (`GET /comments?entityType=product&entityId={productId}`). Unauthenticated users see a login box to the customer portal.
## Static image slots
`GET /tenants/{domain}/website/static-images?pageKey=home`. Catalog: `GET /meshkee/static-image-slots` from `STATIC_IMAGE_SLOTS` in `lib/static-images.ts`.
| key | kind | itemCount |
| --- | --- | --- |
| `slider` | list | null |
| `three-icon-image` | list | 3 |
| `categories` | list | null |
| `about-us-image` | single | 1 |
| `five-banner-section` | list | 5 |
| `two-banner-row` | list | 2 |
| `full-row-image` | single | 1 |
| `two-branch-image` | list | 2 |
`url` → img, `linkUrl` → wrap in a link, empty/fail → placeholder. Use `slot.aspectRatio`. If a slot’s size/ratio changes in CSS, update `STATIC_IMAGE_SLOTS` in the same change.
## SEO
- Do **not** ship `public/sitemap.xml` or `public/robots.txt` (nginx proxies to Meshkee API).
- Build generates `lib/sitemap-config.generated.json` (`npm run generate:sitemap-config` / `prebuild`); served at `GET /meshkee/sitemap-config.json`.
- After deploy: business dashboard → Website → Settings → Sync sitemap config.
- Templates omitted (defaults `/products/{slug}`, `/blog/{slug}` match this site).
- Every public page has unique title/description; product/blog prefer CMS fields.
## Original business data (do not invent replacements)
**About:** 30+ years. Sells home appliances, spare parts, and repairs small appliances. Wholesale and retail.
**Branches**
1. قم، خیابان سی متری کیوانفر، روبروی داروخانه الهادی
2. قم، بلوار صدوقی، خیابان امام حسین (ع)، نبش کوچه ۲۱
**Phones:** 0912-309-3407، 0912-651-7619، 025-36604454، 025-32404070، تلفکس 0253-6638866
**Telegram:** https://t.me/borgheeibrothers
**Email:** `alirezaborghei20@gmail.com`
**Map:** 34.6564, 50.8696
## Local fallbacks
- Copy / nav / sample products / local blog: `lib/data.ts`
- Empty catalog art: `/public/placeholders/*.svg`
- Downloaded originals: `public/images/`