function useInView(ref, threshold = 0.15) { const [visible, setVisible] = React.useState(false); React.useEffect(() => { const obs = new IntersectionObserver(([e]) => { if (e.isIntersecting) setVisible(true); }, { threshold }); if (ref.current) obs.observe(ref.current); return () => obs.disconnect(); }, []); return visible; } function ShopPage({ coffees, onSelect }) { const [hovered, setHovered] = React.useState(null); return (
Four single-origin lots. Each sourced above 1,200 metres. Each roasted to the minimum necessary. Nothing added — everything earned by altitude, process, and the farmers who tend them.