// Shared — Nav, Footer, Icons, utility components // Exposes to window for cross-script use const { useState, useEffect, useRef } = React; // ---------- Icons (inline SVG, lucide-style 1.5 stroke) ---------- const Ico = { Calendar: (p) => , FileText: (p) => , Inbox: (p) => , AlertTriangle: (p) => , Shield: (p) => , Users: (p) => , ArrowRight: (p) => , ArrowLeft: (p) => , Download: (p) => , Plus: (p) => , Check: (p) => , Linkedin: (p) => , Instagram: (p) => , Layers: (p) => , Clipboard: (p) => , User: (p) => , BarChart: (p) => , GitBranch: (p) => , }; // ---------- Logo ---------- function Logo({ link = true }) { const body = (
ImmiHub for Institutions
); return link ? {body} : body; } // ---------- Nav ---------- function Nav({ active = 'product' }) { const [scrolled, setScrolled] = useState(false); const [menuOpen, setMenuOpen] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 8); window.addEventListener('scroll', onScroll, { passive: true }); onScroll(); return () => window.removeEventListener('scroll', onScroll); }, []); useEffect(() => { const onResize = () => { if (window.innerWidth > 900) setMenuOpen(false); }; window.addEventListener('resize', onResize); return () => window.removeEventListener('resize', onResize); }, []); const links = [ { id: 'product', label: 'Product', href: 'index.html' }, { id: 'features', label: 'Features', href: 'features.html' }, { id: 'deployment', label: 'Deployment', href: 'deployment.html' }, { id: 'demo', label: 'Demo', href: 'demo.html' }, { id: 'leadership', label: 'Leadership', href: 'leadership.html' }, ]; return (
Join the waitlist
); } // ---------- Footer ---------- function Footer() { return ( ); } // ---------- Waitlist Form ---------- function WaitlistForm({ variant = 'landing' }) { const [submitted, setSubmitted] = useState(false); const [data, setData] = useState({ institution: '', name: '', role: '', email: '', type: '', enrollment: '' }); const [errors, setErrors] = useState({}); const submit = (e) => { e.preventDefault(); const err = {}; if (!data.institution) err.institution = 'Required'; if (!data.name) err.name = 'Required'; if (!data.email) err.email = 'Required'; else if (!/^[^@]+@[^@]+\.[^@]+$/.test(data.email)) err.email = 'Please enter a valid email'; if (!data.role) err.role = 'Required'; setErrors(err); if (Object.keys(err).length === 0) setSubmitted(true); }; const set = (k) => (e) => setData(d => ({...d, [k]: e.target.value})); if (submitted) { return (

You're on the list.

We'll be in touch within a week with an alpha-access schedule and a short call to understand {data.institution || 'your institution'}'s SEVIS tooling situation. In the meantime, the institutional overview is on its way to {data.email}.

); } return (
{errors.institution &&
{errors.institution}
}
{errors.name &&
{errors.name}
}
{errors.role &&
{errors.role}
}
{errors.email &&
{errors.email}
}

We won't share your details. No pilot calls unless you ask for one.

); } // ---------- Download modal ---------- function DownloadModal({ open, onClose, title = 'Institutional overview' }) { const [email, setEmail] = useState(''); const [done, setDone] = useState(false); useEffect(() => { if (!open) { setDone(false); setEmail(''); } }, [open]); const submit = (e) => { e.preventDefault(); if (/^[^@]+@[^@]+\.[^@]+$/.test(email)) setDone(true); }; return (
e.stopPropagation()}> {!done ? ( <>

{title}

The document is being finalized ahead of launch. Drop your work email and we'll send it as soon as it's ready — typically within 48 hours.

setEmail(e.target.value)} placeholder="you@institution.edu" autoFocus />
) : ( <>

Sent.

{title} will arrive at {email} within 48 hours. If you'd like, you can also join the institutional waitlist.

)}
); } Object.assign(window, { Nav, Footer, Logo, Ico, WaitlistForm, DownloadModal });