first commit
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
export const navigation = [ ['/', 'خانه'], ['/portfolios/', 'نمونهکارها'], ['/blog/', 'بلاگ'], ['/ourservices/', 'خدمات ما'], ['/aboutus/', 'دربارهٔ ما'], ['/contactus/', 'تماس با ما'] ];
|
||||
export const services = [
|
||||
{id:'residential', title:'ویلایی و آپارتمانی', en:'Villas & Apartments', image:'/img/slider/2.jpg', description:'مؤثرترین عامل در طراحی خانهٔ ویلایی، پلان معماری ویلا است؛ طرحی به دست یک معمار خلاق و خوشذوق که در کنار زیبایی، به مسائل اجرایی و اقلیم توجه داشته باشد.', details:['موقعیت قرارگیری، ابعاد و نوع بازشوها تأثیر بسزایی در تهویه و نورگیری فضای داخلی ویلا دارد. دو پنجرهٔ روبهرو با فاصلهٔ مناسب، امکان گردش هوا و تهویهٔ فضای میان آنها را فراهم میکنند.','با بهکارگیری اصول چیدمان و همراهی طراحان متخصص، میتوان دکوراسیونی کاربردی و زیبا در بخشهای مختلف خانهٔ ویلایی یا آپارتمانی ایجاد کرد.']},
|
||||
{id:'beauty', title:'سالنهای زیبایی', en:'Beauty Salons', image:'/img/slider/3.jpg', description:'طراحی دکوراسیون داخلی سالن زیبایی نقش مهمی در انجام صحیح کارها و بهبود شرایط داخلی سالن دارد. توجه به نیازها و اصول چیدمان این فضا، نقطهٔ شروع یک طراحی مناسب است.',details:['انتخاب دکور مناسب و شیک در جذب و رضایت مشتری اهمیت زیادی دارد. دکوراسیون باید در کنار پاسخگویی به نیازهای کارکنان، مورد پسند مشتری نیز باشد.','آشنایی با انواع دکوراسیون سالن زیبایی به شما کمک میکند فضای فعلی را ارتقا دهید یا برای تأسیس سالن جدید از ایدههای مناسب بهره بگیرید.']},
|
||||
{id:'commercial', title:'اداری و تجاری', en:'Office And Commercial', image:'/img/slider/4.jpg', description:'در طراحی داخلی ساختمان اداری، توجه به افرادی که ساعتهای روز خود را در آن سپری میکنند اهمیت دارد. فضای خلاقانه و الهامبخش میتواند به نشاط کارکنان و افزایش کیفیت کار کمک کند.',details:['هدف از طراحی داخلی واحد اداری تنها زیبایی محیط نیست؛ توجه به عملکردهای ضروری ساختمان و تأمین نیازهای کارفرما نیز اهمیت بسیار زیادی دارد.','محیط کار جذاب، کارکنان را به همکاری و فعالیت ترغیب میکند و زمینه را برای ارائهٔ کاری با کیفیت بالاتر فراهم میسازد.']},
|
||||
{id:'landscape', title:'طراحی فضای سبز', en:'Landscape Designer', image:'/img/slider/5.jpg', description:'فضای سبز بخشی از فضای باز محیط ساختمان یا شهر است که با درختان، درختچهها، گلها و سایر گیاهان شکل میگیرد؛ فضایی برای بهبود شرایط زیستی و رفاه ساکنان.',details:['طراحی، احداث و نگهداری این فضا با در نظر گرفتن ضوابط، شرایط محیطی و نیازهای استفادهکنندگان انجام میشود.']},
|
||||
{id:'facade', title:'طراحی نما', en:'Facade Design', image:'/img/slider/6.jpg', description:'نمای ساختمان اولین تصویر از معماری آن است. در طراحی نما، اقلیم، سبک معماری منطقه، ساختمانهای مجاور، ضوابط شهری و شرایط جغرافیایی و فرهنگی را در نظر میگیریم.',details:['نمای مدرن با ریتمهای عمودی، افقی و زاویهدار، مصالح نوین و فناوریهای جدید، به ساختمان پویایی میبخشد.','در نمای کلاسیک یا رومی، تقارن یکی از اصول اصلی طراحی است. نمای نئوکلاسیک با الهام از معماری روم و یونان باستان، رنسانس و باروک، برداشت تازهای از این سبک ارائه میکند.']}
|
||||
];
|
||||
export const offices = [
|
||||
{city:'تهران', address:'سعادتآباد، خیابان سیوهفتم، پلاک ۴'},
|
||||
{city:'کیش', address:'شهرک صدف، فاز یک، عرفان سوم، پلاک ۱۲۳، واحد ۳'},
|
||||
{city:'قم', address:'میدان ارتش، بلوار غدیر، کوچهٔ یازدهم، ساختمان ایرانزمین، طبقهٔ ۴'},
|
||||
{city:'ازمیر', address:'ترکیه، شهر ازمیر', latin:'Turkey — sok 8291, d12, Çiğil, Ataşehir mah, Izmir'}
|
||||
];
|
||||
export const phones = [{label:'۰۹۱۲ ۲۵۲ ۶۳۶۰',value:'+989122526360'},{label:'۰۲۵ ۳۲۸۵ ۰۶۹۰',value:'+982532850690'},{label:'۰۲۵ ۳۲۸۵ ۰۲۰۵',value:'+982532850205'}];
|
||||
export const emails = ['goodarzi.sanaz@gmail.com','supercoyest@yahoo.com'];
|
||||
export const instagram = 'https://www.instagram.com/sanaz.goodarzi_arch/';
|
||||
export const aboutParagraphs = [
|
||||
'زمینهٔ فعالیت گروه معماری و دکوراسیون ساناز گودرزی، طراحی تخصصی، نظارت و اجرای کامل پروژه، طراحی دکوراسیون داخلی، طراحی تخصصی سالنهای زیبایی، پروژههای لوکس مسکونی، اداری و تجاری و مراکز مؤسسات آموزش و پژوهش است.',
|
||||
'مدیریت این مجموعه را مهندس ساناز گودرزی بر عهده دارد. ایشان تحصیلات معماری خود را تا مقطع کارشناسی ارشد مهندسی معماری در دانشگاه تهران به انجام رسانده و بهعنوان بنیانگذار و طراح اصلی مجموعه فعالیت میکند. مقالات علمی ایشان در زمینهٔ فضای معماری در سطح بینالمللی منتخب شده و در مسیر چاپ در مجلات و ژورنالهای معتبر بینالمللی قرار دارد.',
|
||||
'طراحان، ایدهپردازان و مجریان پروژههای این مجموعه از فارغالتحصیلان دانشگاه تهران و اساتید مجرب دانشگاه هستند. طراحی و اجرای پروژههای مسکونی، سالنهای زیبایی، مؤسسهٔ آموزش عالی، فضاهای اداری، طراحی داخلی و تجهیز هتل در کارنامهٔ این گروه قرار دارد.',
|
||||
'این مجموعه در راستای رسیدن به اهداف خود در حال گسترش آتلیههای معماری و فعالیت در طراحی و ساخت بناهای معماری در ایران و خارج از کشور است.'
|
||||
];
|
||||
export const faqs = [
|
||||
['اطلاعات در مورد مشاوره','مشاورهٔ مجموعه بهصورت آنلاین و حضوری انجام میشود. هزینهٔ مشاوره متناسب با هر پروژه متفاوت است و جلسات بهصورت تخصصی با طراحان اصلی مجموعه برگزار میشوند.'],
|
||||
['رسیدگی به موارد اضطراری','همکاران گروه با بررسی و تحلیل شرایط پروژه، نحوهٔ مناسب پاسخگویی را انتخاب میکنند. خواستههای کارفرما و پیگیری مسائل تا رسیدن به نتیجهٔ رضایتبخش در اولویت قرار دارد.'],
|
||||
['اطلاعات در مورد پرسنل','پرسنل طراحی دارای مدارک کارشناسی ارشد معماری هستند و مهندسان عمران، سازه و تأسیسات نیز مجموعه را همراهی میکنند. روزهای کاری آتلیهها شنبه تا پنجشنبه، ساعت ۸ صبح تا ۵ عصر است. احترام به مراجعان و تلاش برای تأمین خواستههای آنان از اصول مجموعه است.']
|
||||
];
|
||||
@@ -0,0 +1,73 @@
|
||||
const API_BASE = 'https://api.meshkee.com/api/v1';
|
||||
export const SITE_DOMAIN = 'sanazgoodarzi.ir';
|
||||
export const CUSTOMER_URL = `https://customer.${SITE_DOMAIN}`;
|
||||
export const BUSINESS_URL = `https://business.${SITE_DOMAIN}`;
|
||||
|
||||
async function request(path, options = {}) {
|
||||
try {
|
||||
const response = await fetch(`${API_BASE}${path}`, {
|
||||
...options,
|
||||
headers: { Accept: 'application/json', ...options.headers },
|
||||
cache: options.cache ?? 'no-store',
|
||||
signal: options.signal ?? AbortSignal.timeout(8000),
|
||||
});
|
||||
if (!response.ok) return null;
|
||||
return await response.json();
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export function apiUrl(path) { return `${API_BASE}${path}`; }
|
||||
export async function getBranding() {
|
||||
return (await request(`/tenants/${SITE_DOMAIN}/website/favicon`, { cache: 'force-cache' })) ?? {};
|
||||
}
|
||||
export async function getBusinessInfo() {
|
||||
return (await request(`/tenants/${SITE_DOMAIN}/website/business-info`, { cache: 'force-cache' })) ?? {};
|
||||
}
|
||||
export async function getBlogs() {
|
||||
const data = await request(`/tenants/${SITE_DOMAIN}/blogs?page=1&pageSize=100`);
|
||||
return Array.isArray(data?.items) ? data.items : [];
|
||||
}
|
||||
export async function getBlog(slug) {
|
||||
const data = await request(`/tenants/${SITE_DOMAIN}/blogs/${encodeURIComponent(slug)}`);
|
||||
return data?.blog ?? null;
|
||||
}
|
||||
export async function getBlogById(id) {
|
||||
const data = await request(`/tenants/${SITE_DOMAIN}/blogs/by-id/${encodeURIComponent(id)}`);
|
||||
return data?.blog ?? null;
|
||||
}
|
||||
export async function getPortfolios() {
|
||||
const data = await request(`/tenants/${SITE_DOMAIN}/portfolios?page=1&pageSize=100`);
|
||||
return Array.isArray(data?.items) ? data.items : [];
|
||||
}
|
||||
export async function getPortfolio(slug) {
|
||||
const data = await request(`/tenants/${SITE_DOMAIN}/portfolios/${encodeURIComponent(slug)}`);
|
||||
return data?.portfolio ?? null;
|
||||
}
|
||||
export async function getPortfolioById(id) {
|
||||
const data = await request(`/tenants/${SITE_DOMAIN}/portfolios/by-id/${encodeURIComponent(id)}`);
|
||||
return data?.portfolio ?? null;
|
||||
}
|
||||
|
||||
export function titleOf(item, fallback = '') {
|
||||
return item?.titleFa || item?.title || item?.titleEn || fallback;
|
||||
}
|
||||
export function imageUrlOf(item) {
|
||||
return item?.titleImageUrl || item?.imageUrl || item?.coverImageUrl || item?.thumbnailUrl || '';
|
||||
}
|
||||
export function galleryOf(item) {
|
||||
const values = Array.isArray(item?.gallery) ? item.gallery : [];
|
||||
return values.map((entry, index) => ({
|
||||
id: entry?.id ?? index,
|
||||
url: typeof entry === 'string' ? entry : entry?.url || entry?.imageUrl || entry?.fileUrl,
|
||||
alt: typeof entry === 'string' ? titleOf(item) : entry?.alt || entry?.titleFa || titleOf(item),
|
||||
})).filter((entry) => entry.url);
|
||||
}
|
||||
|
||||
export function plainText(value = '') {
|
||||
return value.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim();
|
||||
}
|
||||
export function faSlug(value = '') {
|
||||
return plainText(value).normalize('NFKC').replace(/[^\p{L}\p{N}\s-]/gu, '').trim().replace(/[\s_-]+/g, '-').replace(/^-+|-+$/g, '') || 'بدون-عنوان';
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import { services } from './content';
|
||||
import { getPortfolios, imageUrlOf, titleOf } from './meshkee-api';
|
||||
// Adapter boundary: replace these explicit placeholders with the supplied API contract.
|
||||
// Images are category thumbnails from the original site, not verified individual projects.
|
||||
export const portfolioItems = services.map((service, index) => ({
|
||||
id: `preview-${index + 1}`, slug: service.id, category: service.id,
|
||||
title: service.title, image: service.image, isPlaceholder: true,
|
||||
description: 'اطلاعات و تصاویر اختصاصی پروژههای این بخش بهزودی تکمیل میشود.'
|
||||
}));
|
||||
export async function getPortfolioItems() {
|
||||
const remote = await getPortfolios();
|
||||
if (!remote.length) return portfolioItems;
|
||||
return remote.map((item) => ({
|
||||
...item,
|
||||
title: titleOf(item, 'نمونهکار معماری'),
|
||||
image: imageUrlOf(item) || '/img/subheader/bg.jpg',
|
||||
category: item.categoryId || item.categoryName || 'all',
|
||||
isPlaceholder: false,
|
||||
}));
|
||||
}
|
||||
Reference in New Issue
Block a user