/* Components for Allsopp & Allsopp — Darren Murphy microsite.
All components attach to window for global scope sharing. */
const { useState, useEffect, useRef, useMemo, useCallback } = React;
// ============================================================
// SVG icons — minimal stroke set
// ============================================================
const Icon = {
Menu: (p) => ,
X: (p) => ,
Arrow: (p) => ,
Phone: (p) => ,
WA: (p) => ,
Calendar: (p) => ,
Star: (p) => ,
Check: (p) => ,
Bed: (p) => ,
Bath: (p) => ,
Ruler: (p) => ,
MapPin: (p) => ,
Award: (p) => ,
};
window.Icon = Icon;
// ============================================================
// Ampersand mark (extracted from logo SVG)
// ============================================================
function Ampersand({ size = 32, color = "currentColor" }) {
return (
);
}
window.Ampersand = Ampersand;
// ============================================================
// Brand logo (inline allsopp wordmark)
// ============================================================
function BrandMark({ color = "var(--navy)" }) {
return (
);
}
window.BrandMark = BrandMark;
// ============================================================
// Top navigation
// ============================================================
function TopNav({ t, lang, onLangToggle, onBook, dark = false }) {
const [open, setOpen] = useState(false);
const [scrolled, setScrolled] = useState(false);
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 12);
window.addEventListener('scroll', onScroll);
return () => window.removeEventListener('scroll', onScroll);
}, []);
return (
{t.heroSub}
{ctas}
{t.heroSub}
{ctas}{t.heroSub}
{ctas}
{AGENT.bio}
{a.b}
{t.listingsSub}
{t.communitiesSub}
{t.pressSub}
research/reviews-ratings.md. Logo rights to be cleared with each issuer before public display.
{t.testimonialsSub}
{tm.q}
{t.bookSub}
Darren confirms every appointment by phone — you'll never get a silent calendar invite.
Darren will call {form.phone || "your number"} within the hour during working hours. You'll also get a confirmation at {form.email}.
Demo flow — production submits to Formspree/Netlify + mirrors to the CRM webhook so the lead lands in Darren's pipeline.
A RERA-registered consultant who actually knows your community will come back with a realistic range — no bots, no guesswork, no instant-quote nonsense.
We'll come back with a realistic range — never a machine-generated figure.
> ) : (Expect a call within the hour. In the meantime, WhatsApp him directly if it's urgent.