Product pages emit crawler-readable meta, public URLs use id plus Farsi slugs, and the homepage catalog matches the dashboard slot keys. Co-authored-by: Cursor <cursoragent@cursor.com>
48 lines
2.6 KiB
Markdown
48 lines
2.6 KiB
Markdown
# Salar Store — AI context
|
||
|
||
Persian RTL storefront for **salarstore.com**. Next.js App Router. Do not invent Meshkee admin/upload APIs.
|
||
|
||
## Meshkee
|
||
|
||
- Apex domain: `salarstore.com`
|
||
- API: `https://api.meshkee.com/api/v1` (`NEXT_PUBLIC_API_BASE_URL`)
|
||
- Tenant: `GET /tenants/salarstore.com` → `businessId`
|
||
- Public content: `/tenants/salarstore.com/...` (no auth)
|
||
- Customer app: `https://customer.salarstore.com`
|
||
- Business app: `https://business.salarstore.com`
|
||
|
||
Docs: https://api.meshkee.com/docs/website
|
||
|
||
## Static image slots
|
||
|
||
Dashboard-replaceable homepage images. Fetch `GET /tenants/salarstore.com/website/static-images?pageKey=home`. Empty/fail → keep local placeholders.
|
||
|
||
The business dashboard **Refresh** button imports keys from:
|
||
|
||
`GET https://salarstore.com/meshkee/static-image-slots`
|
||
|
||
Source of truth: `lib/static-images.ts` (`STATIC_IMAGE_SLOT_CATALOG`).
|
||
|
||
| key | kind | itemCount | aspectRatio | where |
|
||
| --- | --- | --- | --- | --- |
|
||
| `slider` | list (duplicatable) | unbounded | `21:8` | Homepage hero. Overlay `titleFa` / `titleEn` / `subtext` when set. |
|
||
| `two-banner-below-slider` | list | 2 | `13:5` | Two tiles under the slider. Overlay `titleFa`, `titleEn`, `subtext` like the original UI. |
|
||
| `categories` | list (duplicatable) | unbounded | `1:1` | Category row. `titleFa` + `titleEn` beside the icon. |
|
||
| `four-banner` | list | 4 | `21:9` | 2×2 banner grid. Overlay `titleFa` / `titleEn` / `subtext` when set. |
|
||
| `two-banner-row` | list | 2 | `12:5` | Two-up row after top-selling. |
|
||
| `brands` | list (duplicatable) | unbounded | `2:1` | Brand logo carousel. |
|
||
| `about-us-image` | list | 2 | `8:5` | Home about uses image 1. `/aboutus` uses image 1 as hero and image 2 as the side portrait. |
|
||
|
||
Previous keys (`banners-below-slider`, `four-banner-section`, `three-banner-row`) are still read as aliases until the dashboard Refresh imports the catalog again.
|
||
|
||
Rules:
|
||
|
||
- Use `slot.images` (all if `kind=list`, first if `kind=single`). `url` → `<img src>`. `linkUrl` → wrap in `<a>`.
|
||
- Apply `slot.aspectRatio` from the API on the rendered frame.
|
||
- **If a slot’s on-page size or aspect ratio changes, update `STATIC_IMAGE_SLOT_CATALOG` (`aspectRatio` + `recommendedWidth`) in the same change** so the dashboard cropper stays in sync.
|
||
- Do not add upload/CMS endpoints on this website.
|
||
|
||
## Cart + customer session
|
||
|
||
Guest cart key `meshkee-guest-cart` (localStorage + cookie on `.salarstore.com`). Line `id` is the **store item variant id**. Continue hands off to `https://customer.salarstore.com/checkout/cart#guestCart=...` (guests go via login with that hash inside `redirect`). Shared cookies: `meshkee_customer_access_token` / `meshkee_customer_refresh_token`.
|