// about.jsx — bio, process timeline, values, stats const { useState: useStateAb, useEffect: useEffectAb, useRef: useRefAb } = React; function About({ setRoute }) { return (
{/* ─── intro ─────────────────────────────────────────── */}
— About

One animator,
one obsession.

Hi, I'm Obada— a motion designer working out of US. I've spent the last 11 years putting brand marks into motion. Visimatic is what happened when I stopped freelancing through agencies and started taking commissions directly.

{/* portrait + sidebar */}
{/* ─── stat counters ─────────────────────────────────── */}
{/* ─── process timeline ──────────────────────────────── */} {/* ─── values ────────────────────────────────────────── */} {/* ─── bio long-form ─────────────────────────────────── */} {/* ─── CTA ───────────────────────────────────────────── */}
— Want to work together?

Ready when you are.

Reserve a spot or book a 15-minute call if you want to chat through it first.

); } /* ─── portrait ─── */ function Portrait() { // a stylized, abstract "portrait" — we don't have a real photo so we // make a beautiful glass card with a chromatic gradient avatar + // signature + readout. feels intentional, not placeholder-y. return (
{/* abstract iridescent backdrop */}
{/* large prism silhouette as photographic stand-in */}
{/* film grain on top */}
\")", mixBlendMode: "overlay", opacity: 0.7 }} /> {/* overlay UI */}
WORKING NOW
FOUNDER / ANIMATOR
Obada—
PORTRAIT №01
2026
); } function CornerMark({ pos }) { const map = { tl: { top: 14, left: 14, borderTop: "1px solid rgba(255,255,255,0.6)", borderLeft: "1px solid rgba(255,255,255,0.6)" }, tr: { top: 14, right: 14, borderTop: "1px solid rgba(255,255,255,0.6)", borderRight: "1px solid rgba(255,255,255,0.6)" }, bl: { bottom: 14, left: 14, borderBottom: "1px solid rgba(255,255,255,0.6)", borderLeft: "1px solid rgba(255,255,255,0.6)" }, br: { bottom: 14, right: 14, borderBottom: "1px solid rgba(255,255,255,0.6)", borderRight: "1px solid rgba(255,255,255,0.6)" } }; return
; } /* ─── fact card ─── */ function FactCard({ k, v, subtle }) { return (
{k.toUpperCase()} {v}
); } /* ─── animated stat counter ─── */ function StatCounter({ k, end, suffix = "", decimals = 0 }) { const [val, setVal] = useStateAb(0); const ref = useRefAb(null); useEffectAb(() => { const el = ref.current;if (!el) return; const io = new IntersectionObserver(([e]) => { if (!e.isIntersecting) return; io.disconnect(); const t0 = performance.now(); const dur = 1400; const tick = (t) => { const p = Math.min(1, (t - t0) / dur); const eased = 1 - Math.pow(1 - p, 3); setVal(end * eased); if (p < 1) requestAnimationFrame(tick); }; requestAnimationFrame(tick); }, { threshold: 0.4 }); io.observe(el); return () => io.disconnect(); }, [end]); return (
{k}
{val.toFixed(decimals)}{suffix}
); } /* ─── process timeline ─── */ function ProcessTimeline() { const steps = [ { n: "01", t: "Brief", d: "You drop your logo and a short paragraph on the vibe. I read it twice and ask one or two follow-ups if I need to.", dur: "Day 0" }, { n: "02", t: "Direction", d: "I send back a moodboard and a rough timing plan — about thirty seconds of reference and a hand-drawn timeline.", dur: "Day 1" }, { n: "03", t: "Animate", d: "I build it from scratch in After Effects. No templates, no presets — every curve is drawn by hand.", dur: "Day 2–3" }, { n: "04", t: "Polish", d: "Sound design, motion blur, frame-by-frame timing pass. The little tweaks that make it feel like a million bucks.", dur: "Day 4" }, { n: "05", t: "Deliver", d: "MP4, MOV with alpha, looped versions, and the AE file if you want it. Yours forever, with full commercial rights.", dur: "Day 5" }]; return (
— How a commission flows

Five days from your inbox to mine and back.

{/* vertical spine */}
{steps.map((s, i) =>
{s.n}
{s.t}
{s.d}
{s.dur.toUpperCase()}
)}
); } /* ─── values ─── */ function Values() { const vals = [ { k: "No templates.", d: "Every animation is keyframed from scratch. ", glyph: "noTpl" }, { k: "No subscriptions.", d: "Pay once, get the files, keep them forever. No drip pricing, no licensing wrappers.", glyph: "noSub" }, { k: "No filler frames.", d: "Every keyframe earns its place. No motion for the sake of motion, no extra seconds to pad a deliverable.", glyph: "noAi" }, { k: "No agency middle.", d: "You talk to the person making the thing. Briefs answered in hours, not project-management days.", glyph: "noMid" }]; return (
— How I work

Four non-negotiables.

{vals.map((v, i) =>
{v.k}
{v.d}
)}
); } function ValueGlyph({ kind }) { const c = "var(--ink-2)"; if (kind === "noTpl") return ( ); if (kind === "noSub") return ( $ ); if (kind === "noAi") return ( ); return ( ); } /* ─── long bio ─── */ function LongBio() { return (
— The longer version

Hey there! I'm a Motion Designer & Illustrator with 11+ years of turning caffeine and creativity into explainer videos, logo animations, and everything in between.

After Effects and I have been in a committed relationship for over a decade, and things are still going strong. Detailed keyframe animation? My love language. Audio-driven motion design? Don't even get me started — I could talk about it all day (and sometimes do).

If you need motion that moves people — or at least moves really, really smoothly — Get in touch

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