// Hi-Fi B — Top components (Header, Hero, Categories, Ticker)
// Reads from window.Store
const { useState, useEffect, useRef } = React;
function useReveal() {
useEffect(() => {
const obs = new IntersectionObserver((entries) => {
entries.forEach((e) => { if (e.isIntersecting) e.target.classList.add('in'); });
}, { threshold: 0.12 });
document.querySelectorAll('.reveal').forEach((el) => obs.observe(el));
return () => obs.disconnect();
}, []);
}
function useStoreData() {
const [data, setData] = useState({
settings: window.Store.getSettings(),
categories: window.Store.getCategories(),
products: window.Store.getProducts(),
testimonials: window.Store.getTestimonials().filter((t) => t.published),
differentials: window.Store.getDifferentials(),
processSteps: window.Store.getProcessSteps(),
instagram: window.Store.getInstagram(),
});
useEffect(() => window.Store.subscribe(() => setData({
settings: window.Store.getSettings(),
categories: window.Store.getCategories(),
products: window.Store.getProducts(),
testimonials: window.Store.getTestimonials().filter((t) => t.published),
differentials: window.Store.getDifferentials(),
processSteps: window.Store.getProcessSteps(),
instagram: window.Store.getInstagram(),
})), []);
return data;
}
function Header() {
const [scrolled, setScrolled] = useState(false);
const s = window.Store.getSettings();
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 40);
window.addEventListener('scroll', onScroll);
return () => window.removeEventListener('scroll', onScroll);
}, []);
return (
{s.heroBody}