/* FORUM website — content sections. Exports window.ForumSections = {...}. */ function Reveal({ children, delay = 0, as = 'div', style = {} }) { const ref = React.useRef(null); const [shown, setShown] = React.useState(false); React.useEffect(() => { const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (reduce) { setShown(true); return; } const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { setShown(true); io.disconnect(); } }); }, { threshold: 0.16 }); if (ref.current) io.observe(ref.current); return () => io.disconnect(); }, []); const Tag = as; return ( {children} ); } const wrap = { maxWidth: 'var(--container-max)', margin: '0 auto', padding: '0 32px' }; /* Photo placeholder with optional data-point overlay (per wireframe) */ function PhotoPlate({ label = 'Flagship photo', stat, dark = true }) { const { StatBlock } = window.FORUMDesignSystem_982c6d; return (
{/* faint colonnade motif */} ); } function PillarBand() { const { SectionHeading, PillarCard } = window.FORUMDesignSystem_982c6d; return (
Welcome to Forum
GovCon rewards the proven, which are companies that know the work and deliver.
Forum sharpens that edge: the connections to open doors, the advisors to call the right plays, and the insight to see the deal first.} style={{ marginBottom: 'var(--space-8)' }} />
{[ { p: 'Events', t: 'The right room is everything.', c: Forum puts you face to face with key
decision-makers through our award galas, leadership summits, BD roundtables, procurement matchmaker sessions, and our nationwide road shows.
, cta: 'See upcoming events' }, { p: 'Advisory', t: "Let's build your winning playbook.", c: "Forum brings decades of frontline experience and an unorthodox approach to strategy, branding, capture and teaming that sharpens your positioning and accelerates your path to growth.", cta: 'Explore advisory' }, { p: 'Platform', t: 'The intel you need to win.', c: "We give you insight to vital company data, market signals, and competitive intelligence all in one view. This level of clarity is the game changer that you need to win and win big.", cta: 'Request a demo' }, ].map((x, i) => ( ))}
); } function PillarTile({ pillar, title, copy, cta, href = '#' }) { const [hover, setHover] = React.useState(false); return ( setHover(true)} onMouseLeave={() => setHover(false)} style={{ display: 'flex', flexDirection: 'column', height: '100%', textAlign: 'center', textDecoration: 'none', background: 'linear-gradient(to bottom, #ffffff 0%, #e8e9ea 100%)', border: '1px solid var(--color-border)', borderRadius: 'var(--radius-lg)', padding: 'var(--space-6)', boxShadow: hover ? 'var(--shadow-sm)' : 'var(--shadow-xs)', transform: hover ? 'translateY(-3px)' : 'translateY(0)', transition: 'box-shadow var(--duration-base) var(--ease-standard), transform var(--duration-base) var(--ease-standard)', }}> {pillar}

{title}

{copy}

{cta}
); } /* Rotating image plate — cycles images on an interval (per request: every 2s) */ function RotatingPlate({ images, interval = 3000, stat, badge, accent = 'var(--forum-royal)' }) { const { StatBlock } = window.FORUMDesignSystem_982c6d; const [i, setI] = React.useState(0); React.useEffect(() => { const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (reduce || images.length < 2) return; const id = setInterval(() => setI((p) => (p + 1) % images.length), interval); return () => clearInterval(id); }, [images.length, interval]); return (
{images.map((src, idx) => ( ))} ); } function MetaRow({ icon, text, accent, onDark = false }) { const paths = { calendar: , pin: , }; return (
{text}
); } function FeatureRow({ pillar, verb, title, copy, cta, ctaHref, ctaVariant = 'secondary', cta2, cta2Href, stat, flip, photoLabel, images, accent, kicker, kickerColor, meta, flushTop, onDark = false }) { const { Button } = window.FORUMDesignSystem_982c6d; const text = (
{pillar}
{kicker && (
{kicker}
)}

{title}

{meta && (
{meta.map((m) => )}
)}

{copy}

{cta2 && ( )}
); const photo = ( {images && images.length ? : } ); return (
{text}{photo}
); } function CountStat({ n, prefix = '', suffix = '', comma = false, label }) { const ref = React.useRef(null); const [val, setVal] = React.useState(0); React.useEffect(() => { const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; let started = false; const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting && !started) { started = true; if (reduce) { setVal(n); io.disconnect(); return; } const dur = 1700, t0 = performance.now(); const tick = (now) => { const p = Math.min(1, (now - t0) / dur); const eased = 1 - Math.pow(1 - p, 3); setVal(n * eased); if (p < 1) requestAnimationFrame(tick); else setVal(n); }; requestAnimationFrame(tick); io.disconnect(); } }); }, { threshold: 0.25, rootMargin: '0px 0px -10% 0px' }); if (ref.current) io.observe(ref.current); return () => io.disconnect(); }, [n]); const display = comma ? Math.round(val).toLocaleString('en-US') : String(Math.round(val)); return (
{prefix}{display}{suffix}
{label}
); } function FeatureDivider() { return (