/* Alchemy website — top navigation (shared) */
const { Button } = window.DS;
// "Ways to Join" groups the membership tiers. Meeting Rooms + Day Passes are their own top-level tabs.
const SPACES_ITEMS = [
{ route: 'join', label: 'Business Club', desc: 'Come and go, from $149/mo' },
{ route: 'desks', label: 'Dedicated Desks', desc: 'A desk to call your own' },
{ route: 'offices', label: 'Private Offices', desc: 'Your turn-key HQ' },
];
const NAV_LINKS = [
['meeting', 'Meeting Rooms'],
['daypass', 'Day Passes'],
];
function SpacesMenu({ light, current, onNavigate }) {
const [open, setOpen] = React.useState(false);
const ref = React.useRef(null);
React.useEffect(() => {
function outside(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }
document.addEventListener('mousedown', outside);
return () => document.removeEventListener('mousedown', outside);
}, []);
const active = SPACES_ITEMS.some((s) => s.route === current);
const trigger = {
all: 'unset', cursor: 'pointer', display: 'inline-flex', alignItems: 'center', gap: 6,
fontFamily: 'var(--font-label)', fontWeight: 600, fontSize: '0.84rem',
letterSpacing: '0.04em', textTransform: 'uppercase', padding: '0.5rem 0.85rem',
color: light ? ((open || active) ? '#fff' : 'rgba(255,255,255,0.8)') : ((open || active) ? 'var(--navy-700)' : 'var(--stone-600)'),
borderBottom: active ? '2px solid var(--slate-500)' : '2px solid transparent',
};
return (
{open && (
{SPACES_ITEMS.map((s) => (
))}
)}
);
}
function Nav({ current, onNavigate, overDark = false }) {
const [scrolled, setScrolled] = React.useState(false);
React.useEffect(() => {
const root = document.getElementById('kit-scroll') || window;
const el = document.getElementById('kit-scroll');
const handler = () => setScrolled((el ? el.scrollTop : window.scrollY) > 12);
handler();
root.addEventListener('scroll', handler);
return () => root.removeEventListener('scroll', handler);
}, []);
// Light (knockout) treatment only when sitting over a dark hero and not scrolled.
const light = overDark && !scrolled;
/* Header CTA destinations come from the shared registry (links.jsx). Blank
values keep the in-app navigation fallback. */
const loginUrl = window.alcLink ? window.alcLink(null, 'partnerLogin') : '';
const tourUrl = window.alcLink ? window.alcLink(null, 'scheduleTour') : '';
return (
onNavigate('home')} style={{ cursor: 'pointer', display: 'flex', flex: 'none', alignItems: 'center' }}>
{loginUrl ? (
Partner Login
) : (
)}
{tourUrl
?
:
}
);
}
window.Nav = Nav;