/* ===================== 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 (
Small business tech, done properly

We help small businesses
sell more,{" "} stress less.

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.

new visitors won
new enquiries delivered
admin saved per week
Scroll
); } function HeroChart({ progress }) { // Path that echoes the logo: dip then sharp climb up to the right const w = 560,h = 460; const pts = [ [40, 360], [120, 380], [200, 330], [260, 280], [320, 200], [380, 130], [460, 70], [520, 30]]; const path = pts.map((p, i) => i === 0 ? `M${p[0]},${p[1]}` : `L${p[0]},${p[1]}`).join(" "); const totalLen = 720; // approx const dashOffset = totalLen * (1 - progress); // Arrow position at end const last = pts[pts.length - 1]; const prev = pts[pts.length - 2]; const angle = Math.atan2(last[1] - prev[1], last[0] - prev[0]) * (180 / Math.PI); // dots along path that bloom in const dots = [ { p: pts[1], delay: 0.2 }, { p: pts[3], delay: 0.45 }, { p: pts[5], delay: 0.7 }]; return (
Your business · last 12 months
Growth, in one place
Live
{/* grid */} {[0, 1, 2, 3, 4].map((i) => )} {/* fill under path */} {/* main path */} {/* dots */} {dots.map((d, i) => { const op = Math.max(0, Math.min(1, (progress - d.delay) * 4)); return ( ); })} {/* end arrow */} {progress > 0.92 && }
+412%
visitors
£40k
won in 90d
5/day
enquiries
{/* floating chips */}
New enquiry from Sarah
AI drafted 3 quotes
Invoice paid · £840
); } window.Hero = Hero;