// Builders Lab, Founder, Join, Footer const { useEffect: useE5, useState: useS5, useRef: useR5 } = React; function BuildersLab({ t }) { const ref = useR5(null); const [inView, setInView] = useS5(false); useE5(() => { const io = new IntersectionObserver(([e]) => e.isIntersecting && setInView(true), { threshold: 0.15 }); if (ref.current) io.observe(ref.current); return () => io.disconnect(); }, []); return ( {/* giant backing circle */} NEW — {t.lab.eyebrow} The Builders Lab {t.lab.sub} {t.lab.part} · Equigent {/* Three-circle diagram */} {[ { label: t.lab.bubble1.t, sub: t.lab.bubble1.s, c: '#f4a8b8', x: 25, y: 50, size: 0.56 }, { label: t.lab.bubble2.t, sub: t.lab.bubble2.s, c: '#f06b8f', x: 50, y: 30, size: 0.56 }, { label: t.lab.bubble3.t, sub: t.lab.bubble3.s, c: '#e85a5a', x: 50, y: 68, size: 0.56 }, ].map((b, i) => ( {b.label} {b.sub} ))} {t.lab.overlap} {t.lab.cta1} → {t.lab.cta2} ); } function Founder({ t }) { const ref = useR5(null); const [inView, setInView] = useS5(false); useE5(() => { const io = new IntersectionObserver(([e]) => e.isIntersecting && setInView(true), { threshold: 0.15 }); if (ref.current) io.observe(ref.current); return () => io.disconnect(); }, []); return ( e.currentTarget.style.transform = 'scale(1.04)'} onMouseLeave={(e) => e.currentTarget.style.transform = 'scale(1)'} /> Founder Lund · Stockholm {t.founder.eyebrow} “ {t.founder.quote} Sol Michaela Dominique {t.founder.role} {(t.founder.stats || []).map((s, i) => ( {s.n} {s.l} ))} ); } function Join({ t }) { const ref = useR5(null); const [inView, setInView] = useS5(false); const [email, setEmail] = useS5(''); const [sent, setSent] = useS5(false); const [consent, setConsent] = useS5(false); useE5(() => { const io = new IntersectionObserver(([e]) => e.isIntersecting && setInView(true), { threshold: 0.2 }); if (ref.current) io.observe(ref.current); return () => io.disconnect(); }, []); return ( {/* ambient */} {t.join.eyebrow} {t.join.l1} {t.join.l2}. {t.join.sub} { e.preventDefault(); if (!consent) return; // Formspree endpoint — replace this URL with the one from formspree.io // The account should be set up with solmichaela@femquity.com const FORMSPREE = 'https://formspree.io/f/REPLACE_WITH_YOUR_FORMSPREE_ID'; if (FORMSPREE.includes('REPLACE_WITH')) { // Fallback: open user's email client window.location.href = `mailto:solmichaela@femquity.com?subject=Cohort%2003%20application%20request&body=${encodeURIComponent('Hi Sol,\n\nI\'d like to request the application for Cohort 03.\n\nEmail: ' + email + '\n\n— Sent from femquity.com')}`; setSent(true); return; } fetch(FORMSPREE, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ email, consent: true, source: 'femquity.com — join form' }), }).then(() => setSent(true)).catch(() => setSent(true)); }} className={`reveal d3 ${inView ? 'in' : ''}`} style={{ display: 'flex', flexDirection: 'column', gap: 12, maxWidth: 500, margin: '0 auto', }} > setEmail(e.target.value)} style={{ flex: 1, background: 'transparent', border: 0, padding: '12px 20px', color: 'var(--ivory)', fontSize: 14, outline: 'none', fontFamily: 'var(--sans)', }} /> {sent ? '✓ ' + t.join.sent : t.join.cta} setConsent(e.target.checked)} style={{ accentColor: 'var(--pink)', marginTop: 2, flexShrink: 0, width: 14, height: 14, }} /> {t.join.consent} {t.join.privacyLink}. {t.join.fineprint} ); } function Footer({ t }) { return ( ); } window.BuildersLab = BuildersLab; window.Founder = Founder; window.Join = Join; window.Footer = Footer;
{t.lab.sub}
“ {t.founder.quote}
{t.join.sub}