// components.jsx — shared UI for Muse Design prototype
const { useState, useEffect, useRef, useMemo, useCallback } = React;
// ---------- Brand mark ----------
function BrandMark({ inverted }) {
return (
);
}
// ---------- Top bar / nav ----------
function Topbar({ route, navigate }) {
const items = [
{ id: "home", label: "Index" },
{ id: "projects", label: "Projects" },
{ id: "sectors", label: "Sectors" },
{ id: "services", label: "Services" },
{ id: "studio", label: "Studio" },
{ id: "contact", label: "Contact" },
];
const [locale, setLocale] = useState("EN");
const active = route.name === "case" ? "projects" : route.name === "sector" ? "sectors" : route.name;
return (
);
}
// ---------- Footer ----------
function Footer({ navigate }) {
return (
);
}
// ---------- WhatsApp FAB ----------
function WhatsappFab({ context }) {
const text = encodeURIComponent(
context === "project"
? "Hi Muse — I'd like to discuss a project similar to the one I just viewed."
: "Hi Muse — I'd like to start a project. Could we set up a call?"
);
return (
);
}
// ---------- Section head ----------
function SectionHead({ roman, title, aside }) {
return (
{roman}
{title}
{aside ?
{aside}
:
}
);
}
// ---------- Process strip (dark) ----------
function ProcessStrip() {
return (
{PROCESS_STEPS.map(s => (
{s.num}
{s.title}
{s.body}
))}
);
}
// ---------- Recognition strip ----------
function RecognitionStrip() {
return (
13th
Fit-Out Powerlist 2024
Design Middle East
Ranked 13th in the regional Fit-Out Powerlist —
a list of practices "elevating luxury living in Dubai".
Project Feature
Jaddaf Barbershop
Commercial Interior Design
Press feature on a Jaddaf barbershop — woodwork, hanging lights, leather upholstery, exposed services.
Since
2007 · Dubai
Established practice
Husband-and-wife studio led by Michael Dudnyk and Stanislava Rudas-Dudnyk.
Headquartered at Dubai Design District.
);
}
// ---------- Lightbox ----------
function Lightbox({ images, startIndex, onClose }) {
const [i, setI] = useState(startIndex || 0);
useEffect(() => {
const onKey = (e) => {
if (e.key === "Escape") onClose();
if (e.key === "ArrowLeft") setI(p => (p - 1 + images.length) % images.length);
if (e.key === "ArrowRight") setI(p => (p + 1) % images.length);
};
window.addEventListener("keydown", onKey);
return () => window.removeEventListener("keydown", onKey);
}, [images.length, onClose]);
return (
Close ✕
{ e.stopPropagation(); setI((i - 1 + images.length) % images.length); }}>‹
{ e.stopPropagation(); setI((i + 1) % images.length); }}>›
e.stopPropagation()} />
{String(i + 1).padStart(2, "0")} / {String(images.length).padStart(2, "0")} · photographer credit pending
);
}
Object.assign(window, { BrandMark, Topbar, Footer, WhatsappFab, SectionHead, ProcessStrip, RecognitionStrip, Lightbox });