/* home.jsx — homepage sections for martinharrison.portfolio */ const { Button: HBtn, Card: HCard, Badge: HBadge, GradientSpotlightCard: HGrad } = window.DesignSystem_33e611; /* ---------------- Hero ---------------- */ function HomeHero() { const portraitRef = React.useRef(null); React.useEffect(() => { if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; const el = portraitRef.current; if (!el) return; let raf = 0; const update = () => { raf = 0; if (window.innerWidth <= 760) { el.style.removeProperty("--parallax"); return; } // classic slow parallax: portrait shifts down at a fraction of the scroll, // so it moves slower than the page as you scroll. const y = window.scrollY || 0; el.style.setProperty("--parallax", (y * 0.22).toFixed(1) + "px"); }; const onScroll = () => { if (!raf) raf = requestAnimationFrame(update); }; update(); window.addEventListener("scroll", onScroll, { passive: true }); window.addEventListener("resize", onScroll); return () => { window.removeEventListener("scroll", onScroll); window.removeEventListener("resize", onScroll); if (raf) cancelAnimationFrame(raf); }; }, []); return (
{/* Portrait — right-anchored background, fades into the canvas */}
Senior Product Designer · Bangalore, India

Turning complex systems into products people trust.

14+ years shaping enterprise, GRC, and platform software — the kind of products where clarity isn't a nicety, it's the entire job. Strategy through pixels, systems that scale, outcomes you can measure.

); } /* ---------------- Credibility band ---------------- */ function CredBand() { return (
{STATS.map((s, i) =>
{s.value}
{s.label}
)}
); } /* ---------------- Featured work (staggered gallery) ---------------- */ function WorkCard({ p, aspect }) { return (

{p.name}

{p.year}

{p.summary}

); } function FeaturedWork() { const featured = PROJECTS.slice(0, 5); const leftAspect = ["4 / 5", "5 / 6", "3 / 4"]; const rightAspect = ["4 / 5", "4 / 5"]; const left = featured.filter((_, i) => i % 2 === 0); const right = featured.filter((_, i) => i % 2 === 1); return (

Selected work

All case studies
{left.map((p, i) => )}
{right.map((p, i) => )}
); } /* ---------------- Services grid ---------------- */ function Services() { return (
What I do

Five ways I help teams ship better products.

{SERVICES.map((s) =>
{s.n}

{s.name}

{s.blurb}

)}
06

Not sure which you need?

Tell me the problem and I'll point you to the right engagement — or invent one that fits.

Let's talk
); } /* ---------------- Workspace / studio band ---------------- */ function StudioBand() { return (
Martin's home studio — a warm, plant-filled desk setup with a single monitor
The studio

Where the work happens.

A quiet corner in Bangalore — warm light, a few too many plants, and a single screen. Most of what I ship starts here.

); } /* ---------------- Social proof ---------------- */ function SocialProof() { const [idx, setIdx] = React.useState(0); const count = TESTIMONIALS.length; const t = TESTIMONIALS[idx]; const go = (d) => setIdx((i) => (i + d + count) % count); return (
Testimonials {CLIENT_LOGOS.length > 0 && (
{CLIENT_LOGOS.map((l, i) => {l} )}
)}

“{t.quote}”

{t.name}
{t.role}
{String(idx + 1).padStart(2, "0")} / {String(count).padStart(2, "0")}
); } function HomeApp() { return (