import { useState, useEffect, useRef } from "react"; function FadeIn({ children, delay = 0, style = {} }) { const [visible, setVisible] = useState(false); const ref = useRef(null); useEffect(() => { const obs = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { setVisible(true); obs.disconnect(); } }, { threshold: 0.1 } ); if (ref.current) obs.observe(ref.current); return () => obs.disconnect(); }, []); return (
{children}
); } function Nav({ scrolled }) { return ( ); } function Hero() { const [loaded, setLoaded] = useState(false); useEffect(() => { setTimeout(() => setLoaded(true), 100); }, []); return (

About

One guy. A camera.
And a plan.

); } function Story() { return (
{/* Photo placeholder */}
SAM Photo placeholder

The Story

I started Onsite Media because builders deserve better than stock photos and half-arsed social media.

I'm Sam. I run Onsite Media out of Mount Maunganui. For close to four years now, I've been working with builders and trade businesses across New Zealand — shooting their projects, building their brands, and helping them get the recognition their work deserves.

I got into this because I saw a gap. Builders doing incredible work with nothing to show for it online. Websites with stock photos. Instagram feeds that hadn't been touched in six months. And meanwhile, the builder down the road with half the talent but twice the visibility was getting all the calls.

I believe content is infrastructure — it's a long-term asset that works for your business long after the shoot is done. And I believe the person creating that content should understand what they're looking at. I've spent years on construction sites. I know how builds work. I know what makes a builder's audience pay attention. That understanding is what makes the content work.

); } function WhyConstruction() { return (

Why Construction

Because it's real work, and it deserves to be seen.

Construction is physical. It's tangible. You can walk through it, touch it, live in it. That makes it some of the most rewarding content to create — there's a natural story in every build, from raw earth to finished home. But most builders don't have time to capture that story. They're too busy actually building.

That's where I come in. I specialise in construction because I've spent years learning the industry — the language, the process, the milestones that matter. When I show up on site, I'm not a photographer asking "what should I shoot?" I already know. That saves you time and gets better results.

); } function Values() { const values = [ { title: "Content Is Infrastructure", desc: "Every piece of content is a long-term asset. It works for your brand today, tomorrow, and years from now. We treat it that way." }, { title: "Lean Over Bloated", desc: "One person, a smart network, and efficient systems. No agency overhead, no unnecessary layers. You get more value for less waste." }, { title: "Show Up and Deliver", desc: "We do what we say. On time, on brief, no excuses. The construction industry runs on reliability — so do we." }, { title: "Build the Story With You", desc: "We don't arrive with a fixed shot list. We collaborate. We listen. We learn what makes your work special and we capture that." }, ]; return (

How We Work

A few things we believe.

{values.map((v, i) => (
0{i + 1}

{v.title}

{v.desc}

))}
); } function Location() { return (

Based In

Mount Maunganui, NZ.

Based in the Bay of Plenty, working regularly across Tauranga, Hamilton, Auckland, and the wider North Island. For the right project, we'll travel anywhere in New Zealand.

{[ { label: "Email", value: "sam@onsitemedia.co.nz" }, { label: "Phone", value: "027 269 4815" }, { label: "Instagram", value: "@onsitemedia" }, { label: "Location", value: "Girven Road, Mount Maunganui" }, ].map(item => (
{item.label} {item.value}
))}
); } function CTA() { return (

Let's build something great together.

Whether you need a one-off shoot, full project coverage, or a marketing partner in your corner — we're ready.

e.target.style.background = "#333"} onMouseLeave={e => e.target.style.background = "#1C1C1C"} >Get In Touch
); } function Footer() { return ( ); } export default function About() { const [scrolled, setScrolled] = useState(false); useEffect(() => { const h = () => setScrolled(window.scrollY > 60); window.addEventListener("scroll", h); return () => window.removeEventListener("scroll", h); }, []); return (
); }