8.4 KiB
8.4 KiB
FarrokhWin — AI / Project Context
Source of truth
- Live reference: https://www.farrokhwin.com/
- Backend / Meshkee Website API: https://api.meshkee.com/docs/website
- Domain:
farrokhwin.com(NEXT_PUBLIC_WEBSITE_DOMAIN) - Tenant business id:
28(GET /tenants/farrokhwin.com) enabledModules: products, portfolio, blog, finance- Customer portal (login / profile / cart):
https://customer.farrokhwin.com - Business dashboard:
https://business.farrokhwin.com - Language:
fa, direction:rtl
Stack
- Next.js 15 (App Router) + React 19 + TypeScript
- Tailwind CSS v4 (utility import) + custom CSS in
src/app/globals.css - Fonts (downloaded from the live Meshkee CDN into
public/fonts/):morabba— default UI / headingsiran-yekan— numbers / accent figuresMontserratvianext/font/google(English labels, class.en)
Color palette (from live site :root)
- Primary:
#19377d - Secondary / accent:
#34ace0 - Header:
#23242D - Page background:
#1F2128/#23262D - Muted text:
#8F8F8F - White:
#FFFFFF
Pages
| Route | Purpose |
|---|---|
/ |
Homepage (hero, stats, intro, Aparat video, glass article, window types, why us, features, latest blogs carousel, CTA, latest products carousel, brands) |
/about |
درباره ما |
/contact |
تماس با ما (info + FAQ + Meshkee contact form) |
/products |
Meshkee product catalog (GET /tenants/{domain}/products) |
/products/category/{id}/{nameFaSlug} |
Product category (GET /tenants/{domain}/categories/by-id/{id}) |
/products/{id}/{nameFaSlug} |
Product details (gallery, zoom, tabs, comments, similar products) |
/blog |
Meshkee blog list (GET /tenants/{domain}/blogs) |
/blog/{id}/{titleSlug} |
Blog details (body HTML + comments) |
/portfolio |
Meshkee portfolio list (GET /tenants/{domain}/portfolios) |
/portfolios/{id}/{titleFaSlug} |
Portfolio details (GET /tenants/{domain}/portfolios/by-id/{id}) |
/videos |
Placeholder — videos from Meshkee later |
Header: logo + phones + AccountMenu + hamburger overlay (image panel + RTL menu). Cart still in the hamburger.
Auth / account menu
- Login / user icon →
https://customer.farrokhwin.com(customerPortalUrlinsrc/lib/config.ts) - Shared session cookies:
src/lib/shared-auth-cookie.ts+src/lib/session.tsx GET /api/auth/meproxies Meshkee/auth/me- Logged in: show
{name} عزیزwith dropdown پروفایل من, خروج, and if website admin مدیریت وبسایت - Admin handoff:
POST /api/auth/handoff→business.farrokhwin.com?handoff=… - Admin = super_admin or membership on business id
28(isOwnerorteamRole) - Comments: form only when authenticated; otherwise a login box linking to the customer portal.
POST /api/comments→ Meshkee tenant comments
Meshkee API
Base: {NEXT_PUBLIC_MESHKEE_API_BASE}/tenants/{domain}/...
Helpers: src/lib/meshkee.ts → meshkeeGet, meshkeeGetOrNull, tenantPath, getTenant, getBusinessId
| Resource | List | Detail |
|---|---|---|
| Products | GET /tenants/{domain}/products (src/lib/products.ts) |
GET /tenants/{domain}/products/by-id/{id} + /technical-info |
| Blogs | GET /tenants/{domain}/blogs (src/lib/blog.ts) |
GET /tenants/{domain}/blogs/by-id/{id} |
| Comments | GET /tenants/{domain}/comments?entityType=&entityId= |
POST via /api/comments |
| Portfolio | GET /tenants/{domain}/portfolios |
not wired yet |
| Contact | POST /tenants/{domain}/contact-submissions via POST /api/contact |
Body: { title, name, text, email?, cellNumber? } |
Canonical URLs:
- Product:
/products/{id}/{nameFaSlug}(productHref/slugifyForUrl) - Blog:
/blog/{id}/{titleSlug}(blogHref)
Product details:
- Lightbox gallery + hover zoom (
src/components/ProductGallery.tsx) - Tabs: توضیحات / مشخصات فنی / نظرات (
src/components/ProductTabs.tsx) - Similar products from
relatedProducts, else other catalog items
Homepage carousels (src/components/MediaCarousel.tsx): latest blogs and latest products, max 12 each. API items are primary; static slot images overlay by index when present.
Static image slots
API: GET /tenants/{domain}/website/static-images?pageKey=home|about|contact
Catalog: GET /meshkee/static-image-slots → STATIC_IMAGE_SLOTS in src/lib/static-images.ts
| key | kind | itemCount | aspectRatio | recommendedWidth | section |
|---|---|---|---|---|---|
slider |
list | null | 1920:1080 |
1920 | Homepage hero banners |
home-video-poster |
single | 1 | 16:9 |
1280 | Homepage video |
home-windows |
list | 4 | 12:17 |
720 | Window type cards |
home-why-image |
single | 1 | 1:1 |
640 | Why Farrokh graphic |
home-blog |
list | 12 | 1:1 |
720 | Homepage latest-blog carousel (square overlay cards) |
home-products |
list | 12 | 4:3 |
640 | Homepage latest-products carousel (equal 4:3 boxes, contain) |
home-clients |
list | 4 | 3:2 |
320 | Brand logos |
about-hero |
single | 1 | 1920:480 |
1440 | About hero (currently CSS navy band) |
about-photo |
single | 1 | 4:3 |
800 | About photo |
contact-hero |
single | 1 | 1920:480 |
1440 | Contact hero band |
contact-faq-image |
single | 1 | 4:3 |
960 | Contact FAQ photo |
Rules:
- Use
slot.images(all ifkind=list, first ifkind=single) url→ image src;linkUrl→ wrap in link- Empty / fail → local fallbacks from
src/data/site.ts/public/images/ - Homepage blog/product carousels keep Meshkee API items (ids, titles, hrefs); slot images only replace
imageat the same index - If a slot’s on-page size or aspect ratio changes in CSS, update
STATIC_IMAGE_SLOTSin the same change
Content & assets
- Site copy, phones, addresses, FAQs:
src/data/site.ts - Logo:
public/images/logo/logo.png(from livekC9gmfo7ef.png) - Hero banners:
public/images/hero/slide-1.jpg…slide-3.jpg - Favicon:
/favicon.png - Meshkee footer credit (same as safeteb.com):
public/images/footer/MeshkeeLogo-White.png - Contact:
02538203597·09002032333·02533342698 - Office: قم، بلوار امام رضا(ع)، مجتمع فردوس، واحد ۱۳۸
- Factory: قم، شهرک صنعتی شکوهیه، فاز دو، خیابان فکوری، کوچه ۲، پلاک KH214
- Social: Instagram / Telegram
@farrokhwin, WhatsApp989002032333 - Homepage video: Aparat
w21jpe0via official embed script (src/components/AparatVideo.tsx)
Important paths
- Layout / shell:
src/app/layout.tsx,src/components/Header.tsx,src/components/Footer.tsx,src/components/Providers.tsx - Account:
src/components/AccountMenu.tsx,src/lib/session.tsx - Home:
src/app/page.tsx,src/components/HeroSlider.tsx,src/components/MediaCarousel.tsx - Products:
src/app/products/page.tsx,src/app/products/[id]/[slug]/page.tsx - Blog:
src/app/blog/page.tsx,src/app/blog/[id]/[slug]/page.tsx - About / contact:
src/app/about/page.tsx,src/app/contact/page.tsx - Config:
src/lib/config.ts
Env
NEXT_PUBLIC_WEBSITE_DOMAIN=farrokhwin.com
NEXT_PUBLIC_MESHKEE_API_BASE=https://api.meshkee.com/api/v1
NEXT_PUBLIC_CUSTOMER_PORTAL_URL=https://customer.farrokhwin.com
NEXT_PUBLIC_BUSINESS_ORIGIN=https://business.farrokhwin.com
Commands
npm install
npm run dev
npm run build
Sitemap + robots
- Do not add
public/sitemap.xmlorpublic/robots.txt(nginx proxies both to the Meshkee API) - Publish
GET /meshkee/sitemap-config.json(generated at build from app routes) - Generated at build:
scripts/generate-sitemap-config.mjs→src/lib/sitemap-config.generated.json - Run manually:
npm run generate:sitemap-config - After deploy: business dashboard → Website → Settings → Sync sitemap config
- Dynamic
/products/{id}/{slug},/products/category/{id}/{slug},/blog/{id}/{slug}, and/portfolios/{id}/{slug}are not listed in the static sitemap config; Meshkee CMS syncs those URLs
On-page SEO rules
- Unique
<title>+ meta description on every crawlable page (src/lib/seo.ts→pageMetadata) - Exactly one
<h1>per page; section headings use<h2>/<h3> - Content images have meaningful
alt - Footer bottom Meshkee credit must stay in the safeteb.com style (animated frame + white logo + “Designed And Developed By Meshkee E-Commerce Team”)