/* RENOVAM — shared chrome (nav + footer + WA + reveal) for internal pages */ const { useState, useEffect, useRef, useMemo } = React; window.useScrolled = function (threshold = 24) { const [scrolled, setScrolled] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > threshold); onScroll(); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, [threshold]); return scrolled; }; window.useReveal = function () { useEffect(() => { const els = document.querySelectorAll('.reveal, .reveal-stagger'); const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); } }); }, { threshold: 0.12, rootMargin: '0px 0px -60px 0px' }); els.forEach((el) => io.observe(el)); return () => io.disconnect(); }, []); }; window.SiteNav = function SiteNav({ active }) { const scrolled = window.useScrolled(24); return ( ); }; window.SiteFooter = function SiteFooter() { return ( ); }; window.WaFab = function WaFab() { return ( ); }; window.PageHero = function PageHero({ eyebrow, title, sub }) { return (
{eyebrow}

{title}

{sub &&

{sub}

}
); }; window.Crumb = function Crumb({ items }) { return (
{items.map((it, i) => {it.href ? {it.label} : {it.label}} {i < items.length - 1 && /} )}
); };