// shared.jsx — Reusable UI primitives, header, footer, menu (IA V2)
function Arrow() {
return ;
}
function Cta({ children, href, onClick, large, target }) {
const cls = "cta" + (large ? " cta-large" : "");
const Tag = href ? "a" : "button";
const props = href ? { href, target, rel: target === "_blank" ? "noreferrer" : undefined } : { type: "button", onClick };
return (
{children}
);
}
function MenuToggle({ onClick }) {
return (
);
}
function Header({ onDark, onMenuOpen, navigate }) {
const nav = (e, path, hash) => { e.preventDefault(); navigate(path, hash); };
return (
);
}
function MenuOverlay({ open, onClose, navigate }) {
const [sub, setSub] = React.useState(null);
const go = (path, hash) => { onClose(); setSub(null); setTimeout(() => navigate(path, hash), 50); };
return (
AMVZ — Etterbeek, Bruxelles
Praticienne indépendante en kinésiologie de la santé, Reiki et soins par les bols de cristal. Cercles de femmes mensuels.
« Le corps sait avant la tête. »
);
}
function Footer({ navigate }) {
const nav = (e, path) => { e.preventDefault(); navigate(path); };
return (
);
}
// Reveal-on-scroll wrapper
function Reveal({ children, as: Tag = 'div', className = '', ...rest }) {
const ref = React.useRef(null);
const [visible, setVisible] = React.useState(false);
React.useEffect(() => {
const el = ref.current;
if (!el) return;
const obs = new IntersectionObserver((entries) => {
entries.forEach(e => { if (e.isIntersecting) { setVisible(true); obs.disconnect(); } });
}, { threshold: 0.12 });
obs.observe(el);
return () => obs.disconnect();
}, []);
return {children};
}
Object.assign(window, { Arrow, Cta, MenuToggle, Header, MenuOverlay, Footer, Reveal });