Resolve pages via by-id APIs, slugify Farsi titles for public paths, and redirect legacy slug-only URLs to the canonical form. Co-authored-by: Cursor <cursoragent@cursor.com>
124 lines
5.6 KiB
Markdown
124 lines
5.6 KiB
Markdown
# 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` | Catalog / store items list |
|
||
| `/products/[id]/[slug]` | Product detail via `GET .../products/by-id/{id}` |
|
||
| `/blog` | Blog list |
|
||
| `/blog/[id]/[slug]` | Blog detail via `GET .../blogs/by-id/{id}` |
|
||
| `/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.
|
||
- Detail URLs (Meshkee defaults — omit `templates` unless customized):
|
||
- Product: `/products/{id}/{nameFaSlug}` — slugify `nameFa` (Farsi kept, spaces → `-`); resolve with `products/by-id/{id}`. Never use legacy DB slug in public URLs.
|
||
- Blog: `/blog/{id}/{titleSlug}` — `blogs/by-id/{id}`.
|
||
- Legacy `/products/{slug}` and `/blog/{slug}` redirect to the canonical `{id}/{slug}` form.
|
||
- 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/`
|