// sections.jsx — Hero, Gallery, Detail overlay, Process spread, Commission, Contact const { useState, useMemo, useEffect } = React; // ── Hero ────────────────────────────────────────────────────────────── function Masthead() { return (
Vol. VII · Spring/Summer 2026
); } function Hero({ onNav }) { return (

Olena
& the graphite
portrait.

Pencil portraits drawn from the photographs you send me. Of someone you love. Of someone you have lost. Made slowly, by hand, on paper. Currently open for commissions.

In this issue ↓
Featured portrait
Fig. 01 — Featured

Solenne

Year
2025
Medium
Graphite, Paper
Size
40 × 50 cm
From
A single photograph
Note
Past commission, not for sale
); } // ── Gallery ─────────────────────────────────────────────────────────── function FilterBar({ filters, set, count }) { return (
{Object.keys(window.FILTERS).map((k) => (
{k}
{window.FILTERS[k].map((opt) => ( ))}
))} {count} {count === 1 ? 'work' : 'works'}
); } function WorkCard({ w, onOpen }) { return (
onOpen(w.id)}>
{`${w.title},
Open ↗
Fig. {w.no}

{w.titleIt ? {w.title} : w.title}

{w.year} · {w.size}
); } function Gallery({ layout, onOpen }) { const [filters, setFilters] = useState({ subject: 'All', size: 'All', year: 'All' }); const set = (k, v) => setFilters((f) => ({ ...f, [k]: v })); const works = useMemo(() => window.WORKS.filter((w) => ( (filters.size === 'All' || w.size === filters.size) && (filters.subject === 'All' || w.subject === filters.subject) && (filters.year === 'All' || String(w.year) === filters.year) )), [filters]); const cls = layout === 'masonry' ? 'gallery-masonry' : layout === 'strip' ? 'gallery-strip' : 'gallery-grid'; return (
§ 02

Past commissions

{window.WORKS.length} drawings · 2023–2025 · archive only
{works.map((w) => )}
{works.length === 0 && (

No works match these filters.

)}
); } // ── Spread (removed — quote treatment was too heavy) ────────────────── function Spread() { return null; } // ── Process ─────────────────────────────────────────────────────────── function Process() { return (
§ 03

The studio

A portrait, end to end

From a photograph. Drawn the old way.

Every portrait begins with a conversation and the photographs you send me. A wedding, a christening, a last birthday, a quiet morning at the kitchen table. The image you choose matters as much as the drawing that follows.

From there, pencils. Grades 2H through 6B, kneaded eraser, cotton paper, hours. I work between four and eight weeks depending on scale, sending one progress photograph at the halfway mark. Most drawings take six to ten weeks in total.

01 · Brief

The first letter

You write to me. Who is this for, who is in the photograph, what should I know.

02 · Photographs

Choosing the reference

You send me what you have. Together we choose the image, or piece one together from several.

03 · Drawing

Long, quiet hours

Worked in the studio over four to twelve weeks. One progress photograph by post or email.

04 · Delivery

Signed and shipped

Archival framing on request, otherwise rolled or boxed flat. Insured worldwide.

Studio — wall of drawings
Pencils, kneaded eraser
Detail, in progress
); } // ── Commission ──────────────────────────────────────────────────────── function CommissionForm({ preselected, onPick }) { const [sent, setSent] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [form, setForm] = useState({ name: '', email: '', subject: 'One person', tier: preselected || 'M', timeline: 'Within 3 months', notes: '', }); useEffect(() => { if (preselected) setForm((f) => ({ ...f, tier: preselected })); }, [preselected]); const update = (k) => (e) => setForm((f) => ({ ...f, [k]: e.target.value })); const submit = async (e) => { e.preventDefault(); setLoading(true); setError(null); try { const res = await fetch('/api/commission', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(form), }); if (!res.ok) { const json = await res.json().catch(() => ({})); throw new Error(json.detail || 'Something went wrong — please try again.'); } setSent(true); } catch (err) { setError(err.message); } finally { setLoading(false); } }; if (sent) { return (
✓ Letter received

Thank you, {form.name || 'friend'}.

I read every commission inquiry myself. You will hear from me within a week, usually sooner. If it is urgent, write again — sometimes the post sleeps.

); } return (

Tell me about the person you'd like drawn.