/* 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 (
{sub}{title}
{sub &&