// Shared page primitives — hero, prose, reveal hook const useReveal = () => { React.useEffect(() => { if (!window.gsap || !window.ScrollTrigger) return; const els = document.querySelectorAll("[data-reveal]"); window.gsap.from(els, { y: 28, opacity: 0, duration: 0.9, stagger: 0.06, ease: "expo.out", }); const scrollEls = document.querySelectorAll("[data-reveal-scroll]"); scrollEls.forEach(el => { window.gsap.from(el, { scrollTrigger: { trigger: el, start: "top 85%" }, y: 32, opacity: 0, duration: 0.9, ease: "expo.out", }); }); }, []); }; window.useReveal = useReveal; const PageHero = ({ eyebrow, title, lead, tint = "var(--cobalt-700)" }) => (
{/* subtle brand glow */}
{eyebrow}

{title}

{lead && (

{lead}

)}
); window.PageHero = PageHero; const Prose = ({ children, maxw = 760 }) => (
{children}
); window.Prose = Prose; const H2 = ({ children }) => (

{children}

); window.H2 = H2; const P = ({ children }) => (

{children}

); window.P = P; const Meta = ({ items = [] }) => (
{items.map(([label, value]) => (
{label} {value}
))}
); window.Meta = Meta; const UL = ({ items = [] }) => ( ); window.UL = UL; // Pill button — solid + outline variants used across the site const Btn = ({ href, children, variant = "primary", target, rel, onClick, type }) => { const styles = { primary: { background: "var(--ink-900)", color: "var(--paper)", border: "1px solid var(--ink-900)", }, accent: { background: "var(--brand-gradient)", color: "var(--paper)", border: "1px solid transparent", }, ghost: { background: "transparent", color: "var(--ink-900)", border: "1px solid var(--border-strong)", }, invert: { background: "var(--paper)", color: "var(--ink-900)", border: "1px solid var(--paper)", }, }[variant]; const Tag = href ? "a" : "button"; return ( { e.currentTarget.style.transform = "translateY(-1px)"; e.currentTarget.style.boxShadow = "0 10px 24px rgba(46,91,255,0.20)"; }} onMouseLeave={e => { e.currentTarget.style.transform = "translateY(0)"; e.currentTarget.style.boxShadow = "none"; }} > {children} ); }; window.Btn = Btn;