4.1 KiB
HOM arch studio — AI / Project Context
Persian (fa, RTL) brochure website for استودیو معماری هوم (architecture + interior design). Keep this file current whenever routes, slots, data sources or design rules change.
Source of truth
- Live domain:
https://homgroup.ir(NEXT_PUBLIC_WEBSITE_DOMAIN, defaulthomgroup.ir) - Backend docs: https://api.meshkee.com/docs/website
- API base:
https://api.meshkee.com/api/v1 - Tenant:
GET /tenants/homgroup.ir→ business id53 - Customer portal:
https://customer.homgroup.ir(no storefront login pages) - Business dashboard:
https://business.homgroup.ir - Placeholders prompt:
…/ai-prompts/studio-hom/placeholders/576804987514877ec206af60
Stack
- Next.js 15 App Router + React 19 + TypeScript; styles in
src/app/globals.css(no Tailwind) output: "standalone"required for Meshkee websites VM- Fonts: IranYekan (FA) + Montserrat (EN /
.latin)
Design
- Flat palette: bg
#fff, surface#f4f3f1, fg#111, muted#6b6b6b, line#e2e0dc, accent#e3002b - Sticky header + account menu; dark map band on contact; stats band with pattern
Static image slots (STATIC_IMAGE_SLOTS → /meshkee/static-image-slots)
Fetch: GET /tenants/{domain}/website/static-images?pageKey=…. Match by key. Use all images if kind=list, first if single. url → <img>, linkUrl → wrap link, titleFa / titleEn / subtext per UI. Empty/fail → local placeholder. Prefer API aspectRatio. If a frame’s size or ratio changes in development, update the matching catalog entry in the same change.
| key | pageKey | kind | itemCount | aspectRatio | width | UI |
|---|---|---|---|---|---|---|
slider |
home | list | null | 16:9 |
1920 | Full-viewport HeroSlider |
four-category |
home | list | 4 | 3:4 |
900 | Four hover-expand service panels (titleFa / titleEn / subtext) |
project-images |
home | list | null | 3:4 (masonry free height) |
1200 | Selected projects masonry |
sticky-frame-bg |
home | single | 1 | 16:9 |
1920 | OpeningFrame background |
instagram-row |
home | single | 1 | 9:16 |
720 | InstagramFollow phone frame (also used on contact) |
brands |
home | list | null | 3:2 |
480 | Partner logos row (hidden when empty) |
about-us-image |
about | list | 2 | 16:9 |
1600 | About hero (1st) + secondary (2nd) |
Tags & badges (CMS)
From GET /tenants/{domain}/website/business-info:
metaTags: [{ name, content }]→ root<CmsMeta>+generateMetadata.othertrustBadges: [{ kind, embedHtml }]→ footerdangerouslySetInnerHTML(scripts stripped). Empty → omit. Do not hardcode eNamad/Samandehi.
Auth
Shared cookies meshkee_customer_*; login → customer portal; AccountMenu shows {name} عزیز + پروفایل من / خروج / مدیریت وبسایت (admin + handoff).
Routes
| Route | Notes |
|---|---|
/ |
Slider, intro, four-category, project-images, sticky frame, process, stats, brands, Instagram, CTA |
/portfolio, /portfolio/[slug] |
Meshkee portfolios (+ local fallback); lightbox + zoom + similar |
/projects* |
Redirect → /portfolio |
/blog, /blog/[slug] |
Meshkee blogs (+ local stubs) |
/services* |
Local specialties |
/about |
about-us-image (2), story, values, stats, CTA |
/contact |
Facts + form (API + toast) + Instagram + dark map |
/api/contact, /api/auth/me, /api/auth/handoff |
Proxies |
/meshkee/* |
Slot catalog + sitemap-config |
Components
Header/AccountMenu, Footer, Providers, CmsMeta, SlotImage, SectionTitle, OpeningFrame, HeroSlider, InstagramFollow, MediaGallery, ContactForm
Deploy
Standalone build on Meshkee websites VM; PM2 → .next/standalone/server.js.
Changelog
- 2026-10-12 — Placeholders prompt: remapped slots (
slider,four-category,project-images,sticky-frame-bg,instagram-row,brands,about-us-image); brands row; metaTags →metadata.other. - 2026-10-12 — Backend prompt: auth, portfolio/blog, contact toast, Instagram frame, domain
homgroup.ir. - 2026-10-11 — Initial site scaffold.