A rolling cut of the last 24 logos. Watch with sound — the SFX is half the magic.
);
}
/* ─── SELECTED WORK ────────────────────────────────────────────────── */
function SelectedWork({ setRoute }) {
const mobile = useMobile();
const items = VM_PORTFOLIO.slice(0, 4);
return (
— 002 / Work
Recent work.
{mobile ? (
) : (
<>
>
)}
);
}
/* ─── PROCESS STRIP ────────────────────────────────────────────────── */
function ProcessStrip() {
const mobile = useMobile();
const steps = [
{ n: "01", t: "Brief", d: "You drop your logo + a paragraph on the vibe.", meta: "5 min" },
{ n: "02", t: "Direction", d: "I send back a moodboard and a rough timing plan.", meta: "next day" },
{ n: "03", t: "Animate", d: "I build it from scratch in After Effects, no templates.", meta: "2–4 days" },
{ n: "04", t: "Deliver", d: "MP4, MOV, transparent, looped. Yours forever.", meta: "+ 1 revision" }];
return (
— 003 / How it works
Four steps. No agency overhead.
{steps.map((s, i) =>
{s.n}
{s.meta.toUpperCase()}
{s.t}
{s.d}
{/* mini diagram */}
)}
);
}
function ProcessGlyph({ kind }) {
const c = "rgba(255,255,255,0.45)";
if (kind === "01") return (
);
if (kind === "02") return (
);
if (kind === "03") return (
);
return (
);
}
/* ─── REVIEWS ──────────────────────────────────────────────────────── */
function Reviews() {
const mobile = useMobile();
return (
— 004 / What clients say
4.98 / 5 · across 147 commissions.
{[1, 2, 3, 4, 5].map((i) =>
)}
{VM_REVIEWS.map((r, i) =>
)}
);
}
function ReviewCard({ r }) {
return (
{[1, 2, 3, 4, 5].map((i) =>
)}
“
{r.text}
”
{r.name}
{r.role}
DELIVERED IN {r.delivery.toUpperCase()}
);
}
/* ─── PRICING SNAPSHOT ─────────────────────────────────────────────── */
function PricingSnapshot({ setRoute }) {
const mobile = useMobile();
return (