/** * Pages — Home, About (What We Do), Why (Services), Clients, Contact */ const { useState } = React; const A = window.BFM_ASSETS; // './assets/' const SERVICES = [ { id: 'social', label: 'Social Media', sub: 'Management', icon: 'social-media', body: 'Keeping your channels active with consistent posting, planning and engagement.' }, { id: 'content', label: 'Content', sub: 'Creation', icon: 'content-creation', body: 'Photography and visual content designed around your brand.' }, { id: 'video', label: 'Video &', sub: 'Reels', icon: 'video-reels', body: 'Short-form content built to capture attention and drive engagement.' }, { id: 'brand', label: 'Brand', sub: 'Visibility', icon: 'brand-visibility', body: 'Helping businesses strengthen their presence and get noticed.' }, ]; /* ════════════════════════════════════════════════════════════════════════ HOME ════════════════════════════════════════════════════════════════════════ */ function HomePage({ onNav, showToast }) { return ( <>
Our Focus

What We Do

Four services, one job: bring your brand into focus. Pick one or stack them — we tailor the engagement to where your business needs the most lift.

{SERVICES.map(s => ( onNav('why')}>

{s.label} {s.sub}

{s.body}

))}
Because being good at what
you do isn't always enough.
People need to see it.
); } /* ════════════════════════════════════════════════════════════════════════ ABOUT / WHAT WE DO ════════════════════════════════════════════════════════════════════════ */ function AboutPage({ onNav }) { const steps = [ { num: '01', h: 'Listen', b: "We start with a conversation. What's working, what isn't, who you're talking to, and what you actually want from this." }, { num: '02', h: 'Plan', b: 'A content calendar built around your business — not a generic template. Pillars, posting cadence, channels, KPIs.' }, { num: '03', h: 'Create', b: "Photo, video, copy, graphics — produced in batches so your channels stay full and consistent." }, { num: '04', h: 'Publish', b: "We handle posting, community management, and the weekly check-ins so you can stay in your business." }, ]; return ( <>
The Studio

We're a small studio for businesses that want their social presence handled properly — not posted to when there's a spare minute on a Friday afternoon.

Our work sits in the space where content and strategy meet. We make the photos, the reels, the captions, the calendar; we manage the channels day-to-day; and we measure what actually moves the needle for your business.

One job: bring your brand into focus.

Our Approach

A simple four-step rhythm.

No 14-page onboarding decks. We listen, plan, create, publish — then repeat with what we learned.

{steps.map(s => (
{s.num}

{s.h}

{s.b}

))}
Because being good at what
you do isn't always enough.
People need to see it.
); } /* ════════════════════════════════════════════════════════════════════════ WHY / SERVICES ════════════════════════════════════════════════════════════════════════ */ function WhyPage({ onNav }) { const pillars = [ { icon: 'social-media', num: '01', title: 'Social Media', alt: 'Management', lede: 'We keep your channels active with consistent posting, planning and community management — so your audience never wonders if you\'re still around.', delivers: [ 'Monthly content calendar tailored to your channels', 'Daily posting across IG, TikTok, LinkedIn or wherever you live', 'Community management and DM response', 'Monthly reporting on what moved and what didn\'t', ], }, { icon: 'content-creation', num: '02', title: 'Content', alt: 'Creation', lede: 'Photography and visual content designed around your brand. On-site shoot days, edited assets, ready to roll for weeks.', delivers: [ 'Half-day or full-day shoot on location', 'Edited photo + short-form video assets', 'Caption + copy library written to your voice', 'Branded templates you can reuse forever', ], }, { icon: 'video-reels', num: '03', title: 'Video &', alt: 'Reels', lede: 'Short-form content built to capture attention and drive engagement. We script, shoot, edit and deliver vertical-first.', delivers: [ 'Reel concept + script direction', 'Hands-on shoot, in our studio or yours', 'Vertical-first edit with motion graphics + captions', 'Reusable assets across IG, TikTok, YouTube Shorts', ], }, { icon: 'brand-visibility', num: '04', title: 'Brand', alt: 'Visibility', lede: 'Helping businesses strengthen their presence and get noticed. Strategy work for when more posting isn\'t the answer.', delivers: [ 'Audit of current presence + competitor scan', 'Brand voice and visual identity sweep', 'Channel + audience strategy', 'PR and partnership outreach where it fits', ], }, ]; const reasons = [ { num: '01', h: 'Consistency over heroics', b: 'A great post every six months loses to a steady drumbeat. We show up every week so you don\'t have to.' }, { num: '02', h: 'On-brand, never templated', b: 'Every asset is composed for your brand — not pulled from a stock library and recolored. The work looks like you.' }, { num: '03', h: 'Measured by results', b: 'Visibility, engagement, brand recall — and the conversations they spark with real customers. We report what moved.' }, ]; return ( <>
Services

Pick one, or stack them.

Most clients start with one pillar — usually content creation or social media management — and add the others as their channels grow. We scale up or down with your business.

{pillars.map(p => (
{p.num}

{p.title} {p.alt}

{p.lede}

What you get
    {p.delivers.map((d, i) =>
  • {d}
  • )}
))}
The Why

Three things we commit to.

The pillars are the what. These are the how.

{reasons.map(r => (
{r.num}

{r.h}

{r.b}

))}
); } /* ════════════════════════════════════════════════════════════════════════ CLIENTS — Meet our clients ════════════════════════════════════════════════════════════════════════ */ function ClientsPage({ onNav, showToast }) { const [tab, setTab] = useState('all'); const tabs = [ { id: 'all', label: 'All' }, { id: 'social', label: 'Social' }, { id: 'content', label: 'Content' }, { id: 'video', label: 'Video' }, { id: 'brand', label: 'Brand' }, ]; const tiles = [ { id: 0, kind: 'brand', tone: 'navy', meta: 'New Client · Just Signed', title: ['ABC', 'SSG'], sub: 'Football & sports centre — full-service partnership', stat: ['NEW', 'Client'], isNew: true, hero: 'clients/abc-ssg-logo.png' }, ]; const visible = tab === 'all' ? tiles : tiles.filter(t => t.kind === tab); const testimonials = [ { who: 'EM', name: 'Esther Marlow', role: 'Founder · Bramble & Co.', body: 'Black Frame took our channels from sporadic to consistent in about three weeks. The content actually looks like us — and the engagement followed.' }, { who: 'TR', name: 'Tom Reece', role: 'Director · Heron Studio', body: 'They produce more in a half-day shoot than we used to manage in a month. Worth every minute.' }, ]; return ( <>
Selected Work

Recent projects.

{tabs.map(t => ( ))}
{visible.map(t => (
showToast(`Case Study — ${t.title.join(' ')}`)}> {t.isNew &&
New
} {t.hero &&
}
{t.meta}
{t.title[0]} {t.title[1]}
{t.sub}
{t.stat[0]} {t.stat[1]}
))}
What Clients Say

Words from the work.

Real notes from real clients — names changed where they prefer the quiet life.

{testimonials.map((t, i) => (
"

{t.body}

{t.who}
{t.name}
{t.role}
))}
); } /* ════════════════════════════════════════════════════════════════════════ CONTACT ════════════════════════════════════════════════════════════════════════ */ function ContactPage({ onNav, showToast }) { const [vals, setVals] = useState({ name: '', email: '', co: '', budget: '', timeline: '', msg: '' }); const [interests, setInterests] = useState([]); const [sent, setSent] = useState(false); const set = (k, v) => setVals(s => ({ ...s, [k]: v })); const toggleInterest = (id) => { setInterests(arr => arr.includes(id) ? arr.filter(x => x !== id) : [...arr, id]); }; const submit = (e) => { e.preventDefault(); if (!vals.email || !vals.name) { showToast('Add your name and email to continue'); return; } setSent(true); showToast(`Sent — we'll reply to ${vals.email}`); }; return ( <>

Let's go live.

The fastest way to start is a 20-minute call. Drop your details and we'll book a slot that works for both of us.

Phone / WhatsApp
Response time
One business day, usually faster
{sent ? (

Message received.

Thanks {vals.name.split(' ')[0]}. We'll be in touch at {vals.email} within one business day — usually a lot sooner.

) : (
set('name', e.target.value)} placeholder="Jordan Smith" required />
set('email', e.target.value)} placeholder="you@brand.com" required />
set('co', e.target.value)} placeholder="Brand or business name" />
{SERVICES.map(s => ( ))}
By submitting you agree we may contact you about your enquiry.
We don't share details with third parties.
)}
); } /* expose */ Object.assign(window, { HomePage, AboutPage, WhyPage, ClientsPage, ContactPage });