/* ===================== HERO ===================== */
function Hero() {
const [mouse, setMouse] = React.useState({ x: 0.5, y: 0.5 });
const heroRef = React.useRef(null);
React.useEffect(() => {
const onMove = (e) => {
if (!heroRef.current) return;
const r = heroRef.current.getBoundingClientRect();
setMouse({
x: (e.clientX - r.left) / r.width,
y: (e.clientY - r.top) / r.height
});
};
window.addEventListener("mousemove", onMove);
return () => window.removeEventListener("mousemove", onMove);
}, []);
// animated path progress
const [progress, setProgress] = React.useState(0);
React.useEffect(() => {
const t0 = performance.now();
let raf;
const tick = (t) => {
const e = Math.min(1, (t - t0) / 2200);
const eased = 1 - Math.pow(1 - e, 3);
setProgress(eased);
if (e < 1) raf = requestAnimationFrame(tick);
};
raf = requestAnimationFrame(tick);
return () => cancelAnimationFrame(raf);
}, []);
const tx = (mouse.x - 0.5) * 14;
const ty = (mouse.y - 0.5) * 14;
return (
Beautiful websites, smart admin systems, and useful AI — built for plumbers, florists, schools, and every shop in between. No jargon. No platforms you'll regret.
We help small businesses
sell more,{" "}
stress less.