// Chrome — nav, footer, drawers, modals
const { useState, useEffect, useRef } = React;
function fmtPrice(p, cur) {
if (cur === 'USD') return '$' + p.toLocaleString();
if (cur === 'EUR') return '€' + p.toLocaleString();
if (cur === 'AED') return 'AED ' + p.toLocaleString();
return p.toLocaleString();
}
function convertPrice(p, fromCur, toCur) {
// illustrative rates only
const toUSD = { USD: 1, EUR: 1.09, AED: 0.272 };
const fromUSD = { USD: 1, EUR: 0.92, AED: 3.67 };
return Math.round(p * toUSD[fromCur] * fromUSD[toCur]);
}
function Logo({ size = 'md', inverse = false }) {
const fz = size === 'lg' ? 36 : size === 'sm' ? 14 : 22;
return (
MRS. KEEPA
);
}
function Mark({ inverse = false, sz = 12 }) {
// a small "·MK·" mark for utility spots
return (
MK
);
}
function UtilityBar({ currency, setCurrency }) {
return (
Complimentary worldwide express over $400
·
Atelier appointments in Dubai Design District
{['USD','EUR','AED'].map(c => (
setCurrency(c)}
className={currency === c ? 'on' : ''}>{c}
))}
·
e.preventDefault()}>EN
);
}
function Nav({ route, setRoute, openBag, bagCount, openAppt, openSearch }) {
const [scrolled, setScrolled] = useState(false);
useEffect(() => {
const on = () => setScrolled(window.scrollY > 8);
window.addEventListener('scroll', on);
return () => window.removeEventListener('scroll', on);
}, []);
const go = (r) => (e) => { e.preventDefault(); setRoute(r); window.scrollTo({top:0,behavior:'instant'}); };
return (
);
}
function Footer({ setRoute, openAppt }) {
const go = (r) => (e) => { e.preventDefault(); setRoute(r); window.scrollTo({top:0}); };
return (
Where Ready to Wear Meets Couture. Dubai · since May 2016.
Atelier
B307, Building 7
Dubai Design District (d3)
Dubai, United Arab Emirates
+971 52 693 3359
Appointments by request — Sat–Thu.
);
}
function BagDrawer({ open, onClose, items, currency, removeItem }) {
const total = items.reduce((s, it) => s + convertPrice(it.price, it.currency, currency) * it.qty, 0);
return (
<>
Your Bag
✕
{items.length === 0 ? (
Your bag is empty.
When you find a piece worth keeping, it lives here.
) : (
<>
{items.map((it, i) => (
{it.name}
Size {it.size} · {it.colorway}
Qty {it.qty}
removeItem(i)}>Remove
{fmtPrice(convertPrice(it.price, it.currency, currency) * it.qty, currency)}
))}
Subtotal
{fmtPrice(total, currency)}
Duties and shipping calculated at checkout.
Checkout
Continue Shopping
>
)}
>
);
}
function AppointmentModal({ open, onClose }) {
const [stage, setStage] = useState('form');
const [form, setForm] = useState({ name: '', email: '', kind: 'Studio / Couture', date: '', time: '14:00', note: '' });
useEffect(() => { if (open) { setStage('form'); setForm({ name: '', email: '', kind: 'Studio / Couture', date: '', time: '14:00', note: '' }); } }, [open]);
const submit = (e) => { e.preventDefault(); setStage('done'); };
return (
<>
✕
{stage === 'form' ? (
Atelier · Dubai Design District
Book an appointment.
A private consultation at the Mrs. Keepa atelier — Ready to Wear fittings, Studio commissions, or a closer look at the Inhale couture collection.
Location
B307, Building 7 Dubai Design District
Hours
By appointment Sat–Thu
Direct
+971 52 693 3359 WhatsApp accepted
) : (
Request received
Thank you, {form.name.split(' ')[0] || 'we have it'}.
A member of the atelier team will reach out within one business day to confirm your appointment on {form.date || 'your requested date'} at {form.time}.
In the meantime, you're welcome to message us directly on WhatsApp.
)}
>
);
}
function SearchOverlay({ open, onClose, allProducts, openProduct }) {
const [q, setQ] = useState('');
const inputRef = useRef(null);
useEffect(() => { if (open) setTimeout(() => inputRef.current && inputRef.current.focus(), 100); }, [open]);
useEffect(() => { if (!open) setQ(''); }, [open]);
const results = q.length > 0
? allProducts.filter(p =>
p.name.toLowerCase().includes(q.toLowerCase()) ||
p.collection.toLowerCase().includes(q.toLowerCase()) ||
p.category.toLowerCase().includes(q.toLowerCase())
).slice(0, 8)
: [];
return (
setQ(e.target.value)}
placeholder="Search a piece, a collection, a colour…" />
Close
{q.length === 0 ? (
Try
{['Dresses','Kimonos','Mushroom Print','The Getaway','Inhale','Evening'].map(s =>
setQ(s)}>{s}
)}
) : (
{results.length === 0 &&
No piece matches that — try a collection name, or write us on WhatsApp.
}
{results.map(p => (
{ openProduct(p); onClose(); }}>
{p.name}
{p.collection} · {p.category}
{fmtPrice(p.price, p.currency)}
))}
)}
);
}
function WhatsAppFab() {
return (
);
}
Object.assign(window, {
Logo, Mark, UtilityBar, Nav, Footer, BagDrawer, AppointmentModal, SearchOverlay, WhatsAppFab,
fmtPrice, convertPrice,
});