/* Pages: Home, Portfolio, CaseStudy, Services, About, Contact */
const TYPE_LABEL = { weddings:"Wedding", luxury:"Private", corporate:"Brand", social:"Social" };
const TYPE_LABEL_AR = { weddings:"عُرس", luxury:"خاص", corporate:"علامة", social:"اجتماعي" };
/* =================== HOME =================== */
const Home = ({ lang, setRoute, setCaseId }) => {
const t = COPY[lang];
const featured = ["white-garden","oceanside-canopy","midnight-garden","brand-activation-01"];
const featuredEvents = featured.map(id => EVENTS.find(e=>e.id===id));
return (
{/* HERO */}
{t.hero.eyebrow} {lang==="en"?"Luxury event design studio":"استوديو فعاليات فاخر"}
{t.hero.tagline_a} {t.hero.tagline_b}
{t.hero.tagline_c} {t.hero.tagline_d}
{lang==="en" ? "Event Chic Designs — Dubai, since 2015." : "Event Chic Designs — دبي، منذ ٢٠١٥."} {t.hero.blurb}
setRoute("portfolio")}>{t.hero.cta_secondary}
setRoute("contact")}>{t.hero.cta_primary}
{t.hero.marquee.map((m,i)=>(· {m} ))}
{/* EVENT TYPE TILES */}
{lang==="en"?"What we design":"ما نُصمّم"}
{t.types.title}
{t.types.lede}
{t.types.items.map(it => (
{ window.__filterType = it.id; setRoute("portfolio"); }}>
{it.num} · {lang==="en"?"Category":"تصنيف"}
{it.title}
{it.desc}
{lang==="en"?"See work":"شاهد"}
))}
{/* FEATURED — editorial grid */}
{t.featured.eyebrow}
{t.featured.title}
setRoute("portfolio")}>{lang==="en"?"All projects":"كل الأعمال"}
{ setCaseId(featuredEvents[0].id); setRoute("case"); }}/>
{ setCaseId(featuredEvents[1].id); setRoute("case"); }}/>
{ setCaseId(featuredEvents[2].id); setRoute("case"); }}/>
{ setCaseId(featuredEvents[3].id); setRoute("case"); }}/>
{/* TAGLINE STRIP */}
Passion
&
perfection
Tagline since 2015 Studio motto
{/* PROCESS */}
{/* PRESS */}
{/* CTA BAND */}
);
};
const FeatBlock = ({ e, cols, h, lang, onOpen }) => (
{lang==="ar"?e.title_ar:e.title}
{lang==="ar"?e.location_ar:e.location} · {e.year}
);
/* =================== PORTFOLIO =================== */
const Portfolio = ({ lang, setRoute, setCaseId }) => {
const t = COPY[lang];
const [filter, setFilter] = React.useState(window.__filterType || "all");
React.useEffect(()=>{ if (window.__filterType) { setFilter(window.__filterType); delete window.__filterType; } }, []);
const filtered = filter === "all" ? EVENTS : EVENTS.filter(e => e.type === filter);
// mosaic layout — alternate spans
const spans = ["span 5","span 7","span 7","span 5","span 6","span 6","span 8","span 4","span 4","span 8","span 6","span 6"];
const heights = [520, 520, 480, 480, 540, 540, 460, 460, 460, 460, 500, 500];
return (
{t.portfolio.eyebrow} {lang==="en"?"All projects":"كل الأعمال"}
{t.portfolio.title}.
{t.portfolio.lede}
{lang==="en"?"Filter":"تصنيف"}:
{Object.entries(t.portfolio.filters).map(([k,lbl])=>(
setFilter(k)}>{lbl}
))}
{filtered.length} {t.portfolio.countSuffix}
{filtered.map((e, i) => (
{ setCaseId(e.id); setRoute("case"); }}>
{lang==="ar" ? TYPE_LABEL_AR[e.type] : TYPE_LABEL[e.type]} · {e.year}
{lang==="ar"?e.title_ar:e.title}
{e.year}
{lang==="ar"?e.location_ar:e.location}
))}
{lang==="en"
? "Each project is published once photographer credit and (for weddings) subject consent are confirmed. New entries are added monthly."
: "تُنشَر كل دراسة حالة عند تأكيد حقوق التصوير وموافقة الأشخاص. تُضاف أعمال جديدة شهرياً."}
Rights gated
);
};
/* =================== CASE STUDY =================== */
const CaseStudy = ({ caseId, lang, setRoute, setCaseId }) => {
const t = COPY[lang];
const e = EVENTS.find(x => x.id === caseId) || EVENTS[0];
const [lb, setLb] = React.useState(-1);
const related = EVENTS.filter(x => x.type === e.type && x.id !== e.id).slice(0, 3);
// gallery span pattern
const gSpans = ["span 7","span 5","span 6","span 6","span 12","span 4","span 8","span 6","span 6"];
const gHeights = [620, 480, 520, 520, 720, 480, 580, 500, 500];
return (
setRoute("portfolio")}>← {lang==="en"?"All projects":"كل الأعمال"}
{lang==="ar"?TYPE_LABEL_AR[e.type]:TYPE_LABEL[e.type]} {e.year} {lang==="ar"?e.location_ar:e.location}
{lang==="ar"?e.title_ar:e.title}
{lang==="en"?"Event type":"النوع"} {lang==="ar"?TYPE_LABEL_AR[e.type]:TYPE_LABEL[e.type]}
{lang==="en"?"Location":"الموقع"} {lang==="ar"?e.location_ar:e.location}
{lang==="en"?"Scope":"النطاق"} {lang==="ar"?e.scope_ar:e.scope}
{lang==="en"?"Year":"السنة"} {e.year}
{lang==="en"
? <>The brief, the build,the day. >
: <>الفكرة، البناء،اليوم. >}
{(lang==="ar"?e.narrative_ar:e.narrative).map((p, i)=>(
{p}
))}
{lang==="en"
? "Photographer credit: [TBC — confirmed per event] · Subject consent on file."
: "حقوق التصوير: [يُؤكَّد لكل حدث] · موافقة الأشخاص محفوظة."}
Credit gated
{e.images.map((src, i)=>(
setLb(i)}>
))}
“{lang==="ar"?e.pull_ar:e.pull}”
— Jardel Silva · {lang==="en"?"Founder & Lead Designer":"المؤسس والمصمم الرئيسي"}
{/* Related */}
{lang==="en"?"Related projects":"أعمال ذات صلة"}
setRoute("portfolio")}>{lang==="en"?"All projects":"كل الأعمال"}
{related.map((re, i)=>(
{ setCaseId(re.id); window.scrollTo({top:0, behavior:"smooth"}); }}>
{lang==="ar"?TYPE_LABEL_AR[re.type]:TYPE_LABEL[re.type]} · {re.year}
{lang==="ar"?re.title_ar:re.title}
{re.year}
))}
{lb >= 0 && (
setLb(-1)}
onPrev={()=>setLb((lb - 1 + e.images.length) % e.images.length)}
onNext={()=>setLb((lb + 1) % e.images.length)}/>
)}
);
};
/* =================== SERVICES =================== */
const Services = ({ lang, setRoute }) => {
const t = COPY[lang];
return (
{t.services.eyebrow} {lang==="en"?"Studio capabilities":"خدمات الاستوديو"}
{t.services.title}
{t.services.lede}
{SERVICES.map((s, i) => (
{String(i+1).padStart(2,"0")} / 0{SERVICES.length}
{lang==="ar"?s.nm_ar:s.nm}
{lang==="ar"?s.ds_ar:s.ds}
{(lang==="ar"?s.bullets_ar:s.bullets).map((b, j)=>({b} ))}
setRoute("contact")} style={{padding:"12px 18px", fontSize:11}}>{t.services.ctaEach}
))}
);
};
/* =================== ABOUT =================== */
const About = ({ lang, setRoute }) => {
const t = COPY[lang];
return (
{t.about.eyebrow} {lang==="en"?"Founder & studio":"المؤسس والاستوديو"}
{t.about.title.split('.').map((part, i, arr)=> i === arr.length - 1 ? part : {part}. )}
{lang==="en" ? "Portrait subject to be confirmed against founder; portrait rights to be cleared." : "تأكيد هوية الصورة وحقوقها مطلوب."}
TBC
{t.about.lede}
{t.about.body.map((p,i)=>(
{p}
))}
{t.about.stats.map((s,i)=>(
))}
{/* International note */}
{lang==="en"?"International":"دولي"}
{lang==="en"?"Beyond the GCC.":"خارج الخليج."}
{lang==="en"
? "The studio has produced events across Angola, London, Paris, the Netherlands, Brazil, Nigeria and India. Destination briefs are taken on a case-by-case basis once the dates, scope and rights position are clear."
: "أنتج الاستوديو فعاليات في أنغولا، لندن، باريس، هولندا، البرازيل، نيجيريا، والهند. تُقبَل مشاريع الوجهات بحسب التواريخ والنطاق والحقوق."}
{lang==="en"
? "Founder-stated; specific events confirmed individually."
: "تصريح من المؤسس؛ تؤكَّد الأحداث فردياً."}
Founder claim
);
};
/* =================== CONTACT =================== */
const Contact = ({ lang, setRoute }) => {
const t = COPY[lang];
const [form, setForm] = React.useState({
name:"", email:"", phone:"", type:"", date:"", guests:"", venue:"", message:""
});
const [sent, setSent] = React.useState(false);
const submit = (e) => { e.preventDefault(); setSent(true); window.scrollTo({top: 0, behavior:"smooth"}); };
const set = (k,v) => setForm(f => ({...f, [k]:v}));
return (
{t.contact.eyebrow} {lang==="en"?"Begin the design":"ابدأ التصميم"}
{t.contact.title.split('.').map((part, i, arr)=>i === arr.length - 1 ? part : {part}. )}
{t.contact.lede}
{sent ? (
{lang==="en"?"Sent":"أُرسِل"}
{t.contact.form.sent}
{ setSent(false); setForm({name:"",email:"",phone:"",type:"",date:"",guests:"",venue:"",message:""}); }}>{lang==="en"?"Send another":"إرسال آخر"}
) : (
)}
{t.contact.info_studio}
{t.contact.info_studio_v}
{t.contact.info_studio_n} Unit TBC
{t.contact.info_phone}
{t.contact.info_phone_n}
{t.contact.info_hours}
{t.contact.info_hours_v}
{lang==="en"?"Follow":"تابعنا"}
{/* Map placeholder */}
Al Quoz Industrial Area 2
Dubai, UAE — {lang==="en"?"exact unit confirmed on appointment":"يُؤكَّد الموقع عند الموعد"}
Coords TBC — to be supplied by client
);
};
Object.assign(window, { Home, Portfolio, CaseStudy, Services, About, Contact });