// home.jsx — the showpiece const { useState: useStateH, useEffect: useEffectH, useRef: useRefH } = React; function Home({ setRoute, tweaks }) { const [lightbox, setLightbox] = useStateH(false); return (
setLightbox(true)} /> setLightbox(true)} /> {lightbox && setLightbox(false)} />}
); } /* ─── HERO ─────────────────────────────────────────────────────────── */ function Hero({ tweaks, setRoute }) { const prismRef = useRefH(null); const heroRef = useRefH(null); const [mouse, setMouse] = useStateH({ x: 0, y: 0 }); const [clock, setClock] = useStateH(""); const mobile = useMobile(); // gentle parallax on prism following cursor useEffectH(() => { const onMove = (e) => { const r = heroRef.current?.getBoundingClientRect(); if (!r) return; const x = (e.clientX - r.left - r.width / 2) / (r.width / 2); const y = (e.clientY - r.top - r.height / 2) / (r.height / 2); setMouse({ x: Math.max(-1, Math.min(1, x)), y: Math.max(-1, Math.min(1, y)) }); }; window.addEventListener("mousemove", onMove); return () => window.removeEventListener("mousemove", onMove); }, []); useEffectH(() => { const tick = () => { const d = new Date(); const hh = String(d.getUTCHours()).padStart(2, "0"); const mm = String(d.getUTCMinutes()).padStart(2, "0"); const ss = String(d.getUTCSeconds()).padStart(2, "0"); setClock(`${hh}:${mm}:${ss}`); }; tick();const id = setInterval(tick, 1000); return () => clearInterval(id); }, []); const animStyle = tweaks?.heroAnim || "dispersion"; return (
{/* top status row */}
AVAILABLE
STUDIO TIME — {clock} UTC
{/* MAIN — big type with prism nested inline-flow */}
{/* prism floating large — desktop only */} {!mobile && (
)}

Logo animations crafted with care

{/* sub & CTA */}

A one-person motion studio. I take your static logo and animate it in After Effects — bespoke, never templated — and deliver in two to five days.

FROM $150 · NO TEMPLATES · 3-DAY MONEY-BACK
{/* technical readout strip at base */}
{[ { k: "AVG DELIVERY", v: "3 days" }, { k: "LOGOS ANIMATED", v: "147" }, { k: "REPEAT RATE", v: "62%" }, { k: "RATING", v: "4.98 / 5" }]. map((it, i) =>
0) ? "1px solid var(--line)" : "none", borderTop: mobile && i >= 2 ? "1px solid var(--line)" : "none", display: "flex", flexDirection: "column", gap: 6 }}>
{it.k}
{it.v}
)}
); } /* ─── prism hero with multiple animation modes ─────────────────────── */ function PrismHero({ animation }) { const style = (() => { switch (animation) { case "spin":return { animation: "prismSpin 14s linear infinite" }; case "tilt":return { animation: "prismTilt 6s ease-in-out infinite" }; case "pulse":return { animation: "prismPulse 3.6s ease-in-out infinite" }; case "dispersion": default:return { animation: "prismFloat 7s ease-in-out infinite" }; } })(); return ( <>
prism
); } /* ─── BRAND MARQUEE ────────────────────────────────────────────────── */ function BrandMarquee() { const brands = ["Embark", "Ganymede", "Helvetik", "On Path", "GOkaido", "Grippi", "Northstack", "Nimbus"]; return (
); } /* ─── SHOWREEL ─────────────────────────────────────────────────────── */ function ShowreelSection({ onPlay }) { return (
— 001 / Reel

Two minutes of motion
that has paid for itself.

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 (
— 005 / Pricing

Three packages. One promise:
animated by hand.

Pay once, get the files, keep them forever.

{VM_PACKAGES.map((p, i) => setRoute("order")} /> )}
); } function PackageCard({ p, onClick }) { const [hover, setHover] = useStateH(false); return (
setHover(true)} onMouseLeave={() => setHover(false)} onClick={onClick} className="glass" style={{ padding: "32px 28px 28px", cursor: "pointer", transition: "transform 240ms cubic-bezier(.2,.7,.2,1), border-color 240ms", transform: hover ? "translateY(-4px)" : "translateY(0)", borderColor: p.popular ? "var(--line-2)" : hover ? "var(--line-2)" : "var(--line)", background: p.popular ? "linear-gradient(180deg, rgba(138,77,255,0.06), rgba(255,255,255,0.02))" : "var(--glass)", minHeight: 480, display: "flex", flexDirection: "column", position: "relative", overflow: "hidden" }}> {p.popular &&
MOST PICKED
}
{p.name}
{p.delivery.toUpperCase()}
${p.price} once
    {p.includes.map((it, i) =>
  • {it}
  • )}
{p.revisions} REVISION{p.revisions > 1 ? "S" : ""} · COMMERCIAL RIGHTS
); } /* ─── CLOSER ───────────────────────────────────────────────────────── */ function Closer({ setRoute }) { const mobile = useMobile(); return (
{/* prism background bloom */}
— ready when you are

Your logo deserves a second life.

Drop your file in, pay once, get a hand-animated MP4 in your inbox.

); } Object.assign(window, { Home });