// Eva — shared UI components const { useState, useEffect, useRef, useMemo } = React; // ---------- Format helpers ---------- function aed(n) { return "AED " + n.toLocaleString("en-AE"); } // ---------- Wordmark ---------- function Wordmark({ size = 22, light = false }) { const color = light ? "var(--ivory)" : "var(--charcoal)"; return (
EVA JEWELLERS · DUBAI
); } // ---------- Diamond glyph (simple svg primitive) ---------- function DiamondGlyph({ size = 14, color = "currentColor" }) { return ( ); } // ---------- Top bar ---------- function TopBar() { return (
{window.EVA_FACTS.hoursShort} · Gold & Diamond Park, Dubai · Free worldwide shipping · Free repair & polish on Eva jewellery
); } // ---------- Nav ---------- function Navbar({ route, go, openConsult }) { const links = [ ["home", "Home"], ["collections", "Collections"], ["bespoke", "Bespoke"], ["education", "Diamond Guide"], ["about", "About"], ["testimonials", "Testimonials"], ["visit", "Visit"], ]; const [scrolled, setScrolled] = useState(false); const [open, setOpen] = useState(false); useEffect(() => { const on = () => setScrolled(window.scrollY > 8); on(); window.addEventListener("scroll", on, { passive: true }); return () => window.removeEventListener("scroll", on); }, []); return (
WhatsApp
{open && (
setOpen(false)}>
e.stopPropagation()}> {links.map(([slug, label]) => ( ))}
)}
); } // ---------- Footer ---------- function Footer({ go }) { return ( ); } // ---------- WhatsApp FAB ---------- function WhatsAppFab() { return ( WhatsApp ); } // ---------- Trust strip ---------- function TrustStrip() { const facts = window.EVA_FACTS; return (
{facts.rating}/5
{facts.reviewCount} verified reviews
Tripadvisor · {facts.ranking}
24h
Bespoke turnaround
Sketch → CAD → set → delivered
GIA · IGI · HRD
Certified diamonds
Natural & lab-grown
1966
Mamiya group heritage
Eva boutique since 2007
); } // ---------- Section title ---------- function SectionEyebrow({ children }) { return
{children}
; } // ---------- Consultation modal ---------- function ConsultationModal({ open, onClose }) { const [mode, setMode] = useState("instore"); const [step, setStep] = useState(1); const [data, setData] = useState({ occasion: "Engagement", date: "", time: "16:00", name: "", phone: "", note: "" }); useEffect(() => { if (open) { setStep(1); } }, [open]); if (!open) return null; const occasions = ["Engagement", "Wedding band", "Anniversary", "Self / gift", "Bespoke remake"]; return (
e.stopPropagation()}> {step === 1 && (
Private consultation

Tell us about the moment.

A 45-minute private appointment in the boutique or by video — with one of our master jewellers.

{occasions.map((o) => ( ))}
setData({ ...data, date: e.target.value })} />
)} {step === 2 && (
Your details

Where shall we reach you?

setData({...data, name: e.target.value})} placeholder="Full name" />
setData({...data, phone: e.target.value})} placeholder="+971 …" />