// Shared UI components
const { useState, useEffect, useRef } = React;
const cx = (...xs) => xs.filter(Boolean).join(' ');
// --- Navigation ---
function Navbar({ t, route, navigate, onEnquire, lang, setLang, dark }) {
const [scrolled, setScrolled] = useState(false);
const [open, setOpen] = useState(false);
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 24);
window.addEventListener('scroll', onScroll);
onScroll();
return () => window.removeEventListener('scroll', onScroll);
}, []);
const links = [
{ k: 'weddings', label: t.nav.weddings },
{ k: 'services', label: t.nav.services },
{ k: 'about', label: t.nav.about },
{ k: 'contact', label: t.nav.contact },
];
const onDark = dark && !scrolled;
return (
navigate('home')} style={{ display: 'flex', alignItems: 'center', gap: 12, cursor: 'pointer' }}>
The Wedding Haven
Dubai · Toronto · Worldwide
);
}
function Logomark({ color = 'currentColor', size = 30 }) {
return (
);
}
// --- Buttons ---
function ButtonPrimary({ children, onClick, dark, large, style }) {
return (
);
}
function ButtonGhost({ children, onClick, dark, large, style }) {
return (
);
}
// --- Section primitives ---
function Section({ children, dark, tone, style, id }) {
const bg = dark ? 'var(--noir)' : tone === 'cream' ? 'var(--cream)' : 'var(--paper)';
const fg = dark ? '#F6F1EA' : 'var(--ink)';
return (
);
}
function Eyebrow({ children, color }) {
return (
{children}
);
}
function H2({ children, style }) {
return (
{children}
);
}
// --- Image placeholder helper ---
function Img({ src, alt, ratio, style, credit, className }) {
return (

{credit ? (
{credit}
) : null}
);
}
// --- Footer ---
function Footer({ t, navigate, onEnquire, lang, setLang }) {
return (
);
}
function FooterCol({ title, items, navigate }) {
return (
);
}
// --- Wedding Card ---
function WeddingCard({ w, lang, t, onOpen }) {
const isPending = w.status === 'pending';
if (isPending) {
return (
{/* Subtle decorative pattern */}
{t.weddings.pending}
{lang === 'ar' ? w.regionAr : w.regionEn}
{lang === 'ar' ? w.seasonAr : w.seasonEn}
);
}
return (
onOpen(w.id)} style={{ cursor: 'pointer' }} className="card-hover">
{w.style}
{lang === 'ar' ? w.locationAr : w.locationEn}
{lang === 'ar' ? w.seasonAr : w.seasonEn}
{lang === 'ar' ? w.blurbAr : w.blurbEn}
{t.weddings.view} →
);
}
// --- Enquiry form ---
function EnquiryForm({ t, lang, compact }) {
const [sent, setSent] = useState(false);
const [form, setForm] = useState({ name: '', email: '', phone: '', date: '', guests: '', where: '', scope: '', message: '', consent: true });
const submit = (e) => { e.preventDefault(); setSent(true); };
if (sent) {
return (
);
}
const Field = ({ id, label, children, span }) => (
{children}
);
const inputStyle = {
width: '100%', background: 'transparent', border: 'none',
borderBottom: '1px solid var(--line)', padding: '10px 0 12px',
fontSize: 16, fontFamily: 'inherit', color: 'var(--ink)',
outline: 'none', transition: 'border-color 200ms',
};
return (
);
}
Object.assign(window, { cx, Navbar, Logomark, ButtonPrimary, ButtonGhost, Section, Eyebrow, H2, Img, Footer, WeddingCard, EnquiryForm });