02 / 07
{t.h_location}
{community} · Dubai
{t.location_body}
{bullets.map(([l,v],i) => (
{l}
{v}
))}
{/* Placeholder map — production wires lazy iframe with confirmed coords */}
25.0700° N · 55.1400° E
Coordinates confirmed at launch
);
}
// ----- Architecture --------------------------------------------------------
function ArchitectureSection({ t, dev }) {
return (
03 / 07
{t.h_arch}
{t.arch_body}
Architecture Studio — confirmed at launch
Interiors Studio — confirmed at launch
Landscape Studio — confirmed at launch
);
}
// ----- Residences (tabs) ----------------------------------------------------
function ResidencesSection({ t, locale }) {
const [active, setActive] = useState(RESIDENCES[1].id);
const r = RESIDENCES.find(x => x.id === active);
const title = locale === "ru" ? r.titleRu : locale === "ar" ? r.titleAr : r.title;
const range = locale === "ru" ? r.rangeRu : locale === "ar" ? r.rangeAr : r.range;
const notes = locale === "ru" ? r.notesRu : locale === "ar" ? r.notesAr : r.notes;
return (
04 / 07
{t.h_residences}
{RESIDENCES.map(rr => {
const lab = locale === "ru" ? rr.titleRu : locale === "ar" ? rr.titleAr : rr.title;
return (
setActive(rr.id)}
>{lab}
);
})}
Indicative plan — replaced at launch with the developer's official drawings.
{title}
{range}
{notes.map((n,i) => {n} )}
{t.cta_selection}
{t.cta_brochure}
);
}
function FloorPlanPlaceholder({ type }) {
// Schematic line drawing — placeholder for developer-supplied floor plans.
const plans = {
"1br": [
{ x: 10, y: 10, w: 50, h: 38, label: "LIVING" },
{ x: 62, y: 10, w: 28, h: 22, label: "KITCH." },
{ x: 62, y: 34, w: 28, h: 14, label: "WC" },
{ x: 10, y: 50, w: 40, h: 38, label: "BED" },
{ x: 52, y: 50, w: 22, h: 18, label: "BATH" },
{ x: 76, y: 50, w: 14, h: 38, label: "WIR" },
],
"2br": [
{ x: 10, y: 10, w: 60, h: 32, label: "LIVING" },
{ x: 72, y: 10, w: 18, h: 32, label: "KITCH." },
{ x: 10, y: 44, w: 30, h: 32, label: "BED 1" },
{ x: 42, y: 44, w: 18, h: 16, label: "WC" },
{ x: 42, y: 62, w: 18, h: 14, label: "STORE" },
{ x: 62, y: 44, w: 28, h: 32, label: "BED 2" },
{ x: 10, y: 78, w: 80, h: 10, label: "BALCONY" },
],
"3br": [
{ x: 10, y: 10, w: 38, h: 28, label: "LIVING" },
{ x: 50, y: 10, w: 24, h: 28, label: "DINE" },
{ x: 76, y: 10, w: 14, h: 28, label: "KITCH." },
{ x: 10, y: 40, w: 26, h: 26, label: "BED 1" },
{ x: 38, y: 40, w: 18, h: 12, label: "WC" },
{ x: 38, y: 54, w: 18, h: 12, label: "WC" },
{ x: 58, y: 40, w: 16, h: 26, label: "BED 2" },
{ x: 76, y: 40, w: 14, h: 26, label: "BED 3" },
{ x: 10, y: 68, w: 80, h: 20, label: "TERRACE" },
],
"ph": [
{ x: 10, y: 10, w: 80, h: 28, label: "GREAT ROOM" },
{ x: 10, y: 40, w: 22, h: 26, label: "STUDY" },
{ x: 34, y: 40, w: 20, h: 26, label: "KITCH." },
{ x: 56, y: 40, w: 20, h: 26, label: "DINE" },
{ x: 78, y: 40, w: 12, h: 26, label: "WC" },
{ x: 10, y: 68, w: 26, h: 20, label: "MASTER" },
{ x: 38, y: 68, w: 22, h: 20, label: "BED 2" },
{ x: 62, y: 68, w: 28, h: 20, label: "ROOFTOP" },
],
};
const set = plans[type] || plans["2br"];
return (
{set.map((r,i) => (
{r.label}
))}
{/* North arrow */}
N
);
}
// ----- Amenities ------------------------------------------------------------
function AmenitiesSection({ t, dev, locale }) {
return (
05 / 07
{t.h_amenities}
{t.amenities_body}
{AMENITIES.map((a,i) => {
const label = locale === "ru" ? a.ru : locale === "ar" ? a.ar : a.en;
return (
{String(i+1).padStart(2,"0")}
{label}
);
})}
);
}
// ----- Gallery + lightbox ---------------------------------------------------
function GallerySection({ t, dev }) {
const [open, setOpen] = useState(-1);
const close = () => setOpen(-1);
const prev = () => setOpen(i => (i - 1 + dev.gallery.length) % dev.gallery.length);
const next = () => setOpen(i => (i + 1) % dev.gallery.length);
useEffect(() => {
if (open < 0) return;
const onKey = (e) => {
if (e.key === "Escape") close();
if (e.key === "ArrowLeft") prev();
if (e.key === "ArrowRight") next();
};
window.addEventListener("keydown", onKey);
return () => window.removeEventListener("keydown", onKey);
}, [open]);
return (
06 / 07
{t.h_gallery}
{dev.gallery.map((src,i) => (
setOpen(i)}
aria-label={"Open gallery image " + (i+1)}
>
))}
{t.gallery_caption}
{open >= 0 && (
{e.stopPropagation();close();}} aria-label="Close">
{e.stopPropagation();prev();}} aria-label="Previous">
{e.stopPropagation();next();}} aria-label="Next">
e.stopPropagation()}>
{String(open+1).padStart(2,"0")} / {String(dev.gallery.length).padStart(2,"0")}
)}
);
}
// ----- Agent ----------------------------------------------------------------
function AgentSection({ t, locale, onBook }) {
const role = locale === "ru" ? AGENT.roleRu : locale === "ar" ? AGENT.roleAr : AGENT.role;
return (
07 / 07
{t.h_agent}
{AGENT.name}
{role}
{t.label_languages} {AGENT.languages}
RERA BRN {AGENT.brn}
Your single point of contact for this launch — selection, reservation, payment plan, DLD registration and post-handover. Replies on WhatsApp within the hour during Dubai working hours.
);
}
// ----- Brochure gate (inline) ----------------------------------------------
function BrochureSection({ t, dev, locale }) {
const [sent, setSent] = useState(false);
const submit = (e) => { e.preventDefault(); setSent(true); };
return (
Brochure
{t.h_brochure}
{t.brochure_body}
Floor plans · {RESIDENCES.length} typologies
Specification schedule
Payment plan
Site plan & community context
Architect & studio credits
);
}
// ----- Book a viewing modal -------------------------------------------------
function BookModal({ t, dev, locale, open, onClose }) {
const [sent, setSent] = useState(false);
useEffect(() => {
if (!open) return;
document.body.style.overflow = "hidden";
const onKey = (e) => { if (e.key === "Escape") onClose(); };
window.addEventListener("keydown", onKey);
return () => {
document.body.style.overflow = "";
window.removeEventListener("keydown", onKey);
};
}, [open]);
if (!open) return null;
const submit = (e) => { e.preventDefault(); setSent(true); };
return (
e.stopPropagation()}>
{t.eyebrow_offplan}
{dev.name}
{dev.community} · Dubai
{t.label_ref} {dev.code}
{t.h_book}
{t.book_body}
{!sent ? (
) : (
)}
);
}
// ----- Other developments ---------------------------------------------------
function OtherDevelopments({ t, devsList, currentDev, setCurrentDev, locale }) {
const others = devsList.filter(d => d.id !== currentDev.id);
return (
{t.h_developments}
{others.map(d => {
const nm = locale === "ru" ? d.nameRu : locale === "ar" ? d.nameAr : d.name;
const cm = locale === "ru" ? d.communityRu : locale === "ar" ? d.communityAr : d.community;
return (
{ setCurrentDev(d.id); window.scrollTo({top:0,behavior:"smooth"}); }}>
{t.eyebrow_offplan}
{nm}
{cm}
{t.other_view}
);
})}
);
}
// ----- FAQs -----------------------------------------------------------------
function FAQSection({ t, locale }) {
const [open, setOpen] = useState(0);
return (
{t.h_faq}
{FAQS.map((f,i) => {
const q = locale === "ru" ? f.qRu : locale === "ar" ? f.qAr : f.q;
const a = locale === "ru" ? f.aRu : locale === "ar" ? f.aAr : f.a;
const isOpen = open === i;
return (
setOpen(isOpen ? -1 : i)} aria-expanded={isOpen}>
{q}
{isOpen &&
}
);
})}
);
}
// ----- Partners -------------------------------------------------------------
function PartnersStrip({ t }) {
return (
{t.h_partners}
{t.partners_disclaimer}
);
}
// ----- Footer ---------------------------------------------------------------
function Footer({ t }) {
return (
{t.footer_rights}
{t.footer_rera}
);
}
// ----- Floating FABs --------------------------------------------------------
function FloatingFabs({ t, onBook }) {
return (
);
}
// ----- Sticky mobile bar ----------------------------------------------------
function StickyMobileBar({ t, onBook }) {
return (
);
}
window.WW_COMPONENTS = {
TopBar, Nav, Hero, FactsStrip, LocationSection, ArchitectureSection,
ResidencesSection, AmenitiesSection, GallerySection, AgentSection,
BrochureSection, BookModal, OtherDevelopments, FAQSection,
PartnersStrip, Footer, FloatingFabs, StickyMobileBar, LOCALES,
};