/* JAM — shared components: Nav, Footer, Logo, Lotus, ConsentNote, etc. */
const { useState, useEffect, useMemo, useRef } = React;
// Logo — small isometric heart mark + wordmark, redrawn original (per brief: brand redraw OK,
// client to replace with true vector). Not copying the actual company logo file directly into nav;
// using a tasteful interpretation.
function JamLogo({ size = 30, tag = true, light = false }) {
const ink = light ? "#FBF6F2" : "var(--text)";
const muted = light ? "rgba(251,246,242,0.6)" : "var(--muted)";
const accent = "var(--primary)";
return (
{/* tiny lotus mark before wordmark */}
Jam.
{tag && (
Weddings · Events · Entertainment
)}
);
}
function Lotus({ size = 22, color = "var(--accent)" }) {
return (
);
}
function LotusDivider({ width = "100%" }) {
return (
);
}
function ConsentNote({ text = "Consent + photographer credit gated — demo imagery" }) {
return {text};
}
function Nav({ route, setRoute, locale, setLocale }) {
const links = [
{ id: "real-weddings", label: "Real Weddings" },
{ id: "services", label: "Services" },
{ id: "venues", label: "Venues" },
{ id: "about", label: "About" },
{ id: "testimonials", label: "Stories" },
{ id: "contact", label: "Contact" }
];
const locales = ["EN", "AR", "DE", "RU", "ZH"];
return (
);
}
function Footer({ setRoute }) {
const b = window.JAM.brand;
return (
);
}
function WhatsAppFAB() {
const b = window.JAM.brand;
return (
);
}
function Lightbox({ images, index, onClose, onPrev, onNext }) {
useEffect(() => {
const k = (e) => {
if (e.key === "Escape") onClose();
if (e.key === "ArrowRight") onNext();
if (e.key === "ArrowLeft") onPrev();
};
window.addEventListener("keydown", k);
return () => window.removeEventListener("keydown", k);
}, [onClose, onPrev, onNext]);
if (index == null) return null;
const img = images[index];
return (

e.stopPropagation()} />
{index+1} / {images.length} · Photography credit gated — client to confirm
);
}
Object.assign(window, { JamLogo, Lotus, LotusDivider, ConsentNote, Nav, Footer, WhatsAppFAB, Lightbox });