// ====== DIMORA — main app ======
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accent": "#9C7C4E",
"displayFont": "Cormorant Garamond",
"darkHero": false
}/*EDITMODE-END*/;
// ---------- Nav ----------
function Nav({ page, goto, lang, setLang, scrolled, openEnquire, t }) {
return (
);
}
// ---------- Enquiry Modal ----------
function EnquireModal({ open, close, t, lang }) {
const [submitted, setSubmitted] = React.useState(false);
const [form, setForm] = React.useState({ name: '', email: '', phone: '', interest: t.enq.interests[0], message: '', channel: t.enq.channels[0] });
React.useEffect(() => {
if (!open) { setSubmitted(false); setForm(f => ({ ...f, interest: t.enq.interests[0], channel: t.enq.channels[0] })); }
}, [open, t]);
React.useEffect(() => {
if (!open) return;
const onKey = (e) => { if (e.key === 'Escape') close(); };
window.addEventListener('keydown', onKey);
document.body.style.overflow = 'hidden';
return () => { window.removeEventListener('keydown', onKey); document.body.style.overflow = ''; };
}, [open, close]);
if (!open) return null;
const onSubmit = (e) => { e.preventDefault(); setSubmitted(true); };
const upd = (k) => (e) => setForm({ ...form, [k]: e.target.value });
return (
{ if (e.target.classList.contains('modal-backdrop')) close(); }}>
{submitted ? (
—
{t.enq.success}
{t.enq.success_body}
) : (
— {t.nav.contact} —
{t.enq.title1} {t.enq.title_em}
{t.enq.sub}
{lang === 'ar' ? 'الهاتف' : 'Direct'}+971 52 154 1499
{lang === 'ar' ? 'البريد' : 'Email'}Dimoradubai@gmail.com
{lang === 'ar' ? 'الصالة' : 'Showroom'}Art of Living Mall · Unit 1c/1
{lang === 'ar' ? 'نموذج الاستفسار' : 'Enquiry Form'}
)}
);
}
// ---------- Tweaks ----------
function Tweaks({ tweaks, setTweak }) {
return (
setTweak('accent', v)}
options={['#9C7C4E', '#2C3B33', '#211C18', '#7A2E2E']}
/>
setTweak('displayFont', v)}
options={['Cormorant Garamond', 'Fraunces', 'Playfair Display']}
/>
setTweak('darkHero', v)}
/>
);
}
// ---------- Home ----------
function HomePage({ t, lang, goto, openEnquire, heroIdx, setHeroIdx }) {
return (
);
}
// ---------- App ----------
function App() {
const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
const [page, setPage] = React.useState('home');
const [lang, setLang] = React.useState('en');
const [enqOpen, setEnqOpen] = React.useState(false);
const [scrolled, setScrolled] = React.useState(false);
const [heroIdx, setHeroIdx] = React.useState(0);
React.useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 80);
window.addEventListener('scroll', onScroll, { passive: true });
return () => window.removeEventListener('scroll', onScroll);
}, []);
React.useEffect(() => {
document.documentElement.style.setProperty('--bronze', tweaks.accent);
document.documentElement.style.setProperty('--display', `'${tweaks.displayFont}', 'Canela', Georgia, serif`);
document.body.classList.toggle('hero-dark', !!tweaks.darkHero);
}, [tweaks.accent, tweaks.displayFont, tweaks.darkHero]);
React.useEffect(() => {
document.body.dir = lang === 'ar' ? 'rtl' : 'ltr';
document.documentElement.lang = lang;
}, [lang]);
React.useEffect(() => { window.scrollTo({ top: 0, behavior: 'instant' }); }, [page]);
const t = COPY[lang];
const goto = (p) => setPage(p);
const openEnquire = () => setEnqOpen(true);
return (
{page === 'home' && }
{page === 'collections' && }
{page === 'looks' && }
{page === 'showroom' && }
{page === 'about' && }
{page === 'contact' && }
{page !== 'home' && page !== 'contact' && (
)}
setEnqOpen(false)} t={t} lang={lang} />
{/* Sticky enquire FAB */}
Demo · prototype · build-from-scratch
);
}
ReactDOM.createRoot(document.getElementById('root')).render();