Wire CMS routes and account UI, match the original header icons, and publish sitemap-config with unique page metadata. Co-authored-by: Cursor <cursoragent@cursor.com>
5.7 KiB
5.7 KiB
Khiyal Studio Website Context
Project
- English LTR architecture studio site for Khiyal Architecture Studio (Mostafa Heydarhoseini).
- Next.js 16 App Router, React 19, TypeScript, Tailwind 4,
src/app. - Apex domain:
khiyalstudio.com. - Language:
en, direction:ltr. - Local images live in
public/images; local fonts live inpublic/fonts(Antonio + Plus Jakarta Sans, matching the source site). - Public routes:
/,/about-us,/contact-us,/portfolios,/portfolios/{id}/{slug},/blog,/blog/{id}/{slug}. - Homepage project/news cards still use local placeholders when Meshkee lists are empty.
Source clone
- Visual language cloned from
https://khiyalstudio.com/(Crafto Architecture theme: dark gray#191919, accent#efff02, Antonio headings, Plus Jakarta Sans body). - Logo, banners, project photos, about/contact heroes, and partner marks were downloaded from the live theme/storage.
- Color tokens:
--base-color: #efff02,--dark-gray: #191919,--nero-grey: #1F1F1F,--medium-gray: #737373,--charcoal-grey: #3E3E3E. - Footer bottom credit row matches
https://safeteb.com/(Meshkee animated frame + white logo + “Designed And Developed By Meshkee E-Commerce Team”).
Meshkee API
- Canonical docs:
https://api.meshkee.com/docs/website - API base:
https://api.meshkee.com/api/v1 - Tenant domain:
khiyalstudio.com(SITE_DOMAINinsrc/lib/site.ts) - Enabled modules currently include
portfolioandblog. This site does not use workshops. - All public GET fetches go through
src/lib/meshkee.ts. - Empty or failed static-image slots keep local placeholders.
- Do not invent dashboard/CMS/upload endpoints.
- Do not add
public/sitemap.xml,public/robots.txt,app/sitemap.ts, orapp/robots.ts; nginx proxies these URLs to Meshkee.
Customer account
- Login / user icon goes to
https://customer.khiyalstudio.com. - Logged-in header shows
{firstName} عزیزwith dropdown:پروفایل من,خروج, andمدیریت وبسایتwhen the user is an admin (https://business.khiyalstudio.com). - Auth check:
GET /auth/mewith localStorage token (accessToken/meshkee_access_token) or credentials cookie.
Content routes
| Kind | List | Detail | API |
|---|---|---|---|
| Portfolio | /portfolios |
/portfolios/{id}/{slug} |
GET /tenants/{domain}/portfolios, .../portfolios/by-id/{id} |
| Blog | /blog |
/blog/{id}/{slug} |
GET /tenants/{domain}/blogs, .../blogs/by-id/{id} |
- Portfolio/blog details use Meshkee canonical
{id}/{slug}URLs and redirect if the slug is stale. - Portfolio details: lightbox gallery, hover zoom, similar-projects row.
- Detail galleries prefer
titleImageUrlplusgalleryURLs.
Homepage static-image slots
Dashboard import catalog: GET /meshkee/static-image-slots.
| Key | Kind | itemCount | Aspect | Width | Used on |
|---|---|---|---|---|---|
slider |
list | null | 16:9 | 1920 | Hero (HeroSlider) |
signature |
single | 1 | 16:5 | 480 | Intro signature |
partners |
list | 4 | 3:2 | 320 | Partner / video logos |
video-cover |
single | 1 | 16:9 | 1200 | Watch-video cover |
recent-projects |
list | 3 | 16:8 | 1600 | Recent projects slider |
news |
list | 3 | 4:5 | 800 | Projects under construction |
about-hero |
single | 1 | 16:6 | 1920 | About header |
about-gallery |
list | 3 | 3:4 | 720 | About photos |
about-owner |
single | 1 | 16:9 | 1400 | Founder portrait |
contact-hero |
single | 1 | 16:6 | 1920 | Contact header |
If a rendered image size or crop ratio changes, update the catalog in src/app/meshkee/static-image-slots/route.ts (and STATIC_IMAGE_SLOT_CATALOG).
Sitemap and SEO
- Do not add
public/sitemap.xml,public/robots.txt,app/sitemap.ts, orapp/robots.ts. Nginx proxies/sitemap.xmland/robots.txtto Meshkee. - Live sitemap index:
/sitemap.xml→/sitemap-main.xmlplus module sitemaps (/sitemap-portfolios.xml,/sitemap-blogs.xml). GET /meshkee/sitemap-config.jsonis generated at build time by scanning public staticsrc/app/**/page.*routes (/,/about-us,/contact-us,/portfolios,/blog). CORS*is set so the business dashboard can sync it (Website → Settings → Sync sitemap config).- Dynamic
{id}/{slug}pages are omitted from that static list; Meshkee fills them from CMS. URL templates are omitted because this site uses Meshkee defaults (/blog/{id}/{titleSlug},/portfolios/{id}/{titleFaSlug}). - Public slugs are built with
slugify()(letters/numbers kept, spaces →-, punctuation stripped). Do not use the legacy DBslugfield in public URLs. Portfolio slugs prefertitleFa; blog slugs prefertitle. - Auth, admin, checkout, cart, and Meshkee integration routes are excluded.
- Sitemap base URL uses
NEXT_PUBLIC_SITE_URL, thenSITE_URL, withhttps://khiyalstudio.comas the fallback. - Every crawlable page has unique title + meta description (CMS fields on details), exactly one H1, H2/H3 for real sections, Open Graph, and meaningful image alt text (CMS
titleEn/title/titleFawhen available). 404 isnoindex. - Shared helper:
src/lib/seo.ts(pageMetadata).
Contact
- Phone:
0912 252 50 08(09122525008) - Email:
Mostafa.eng@live.com - Instagram:
mostafa_heydar_hoseini - WhatsApp / Telegram / Bale links live in
src/lib/site.ts - Contact form is client-side (success state only) until a Meshkee contact endpoint is connected.
Verification
- Run
npm run lintandnpm run build. - Verify
/meshkee/static-image-slotsreturns the slot catalog. - Verify
/meshkee/sitemap-config.jsonlists/,/about-us,/contact-us,/portfolios,/blog. - Check homepage, about, contact, and empty states for portfolios/blog. Header user icon should open the customer portal when logged out.