);
}
/* ─── guarantee strip icons ─── */
function GuaranteeStrip({ icon, k, v }) {
const I = ({ kind }) => {
if (kind === "check") return ;
if (kind === "hand") return ;
if (kind === "lock") return ;
if (kind === "bolt") return ;
return null;
};
return (
{k}
{v}
);
}
/* ─── add-ons ─── */
function Addons({ setRoute }) {
const mobile = useMobile();
return (
— Optional extras
Mix and match. No upsell, no pressure.
Add anything below to any package.
Prices are flat — what you see is what you pay.
{VM_ADDONS.map((a, i) =>
)}
);
}
function AddonCard({ a }) {
const descs = {
transparency: "Transparent MOV file. Paste your logo over any background, including video.",
soundfx: "Layered sound design that hits with the animation. Whooshes, impacts, the works.",
loop: "Seamless loop, so it can play in the background of your homepage forever.",
revision: "An extra round of tweaks after the second cut — change anything, no questions.",
rush: "Move your project to the top of the queue. Delivered in 24 hours.",
vectorize: "Don't have a clean SVG? I'll redraw your logo as vectors before animating.",
source: "The .aep project file. For agencies that want to keep tweaking internally."
};
return (
{a.label}
+${a.price}
{descs[a.id]}
{a.excludes.length > 0 &&
INCLUDED IN: {a.excludes.map((x) => x.toUpperCase()).join(", ")}
);
}
function Cell({ v }) {
if (v === true) return (
);
if (v === false) return —;
if (v === "add-on") return ADD-ON;
return {v};
}
/* ─── custom project ─── */
function CustomProject({ setRoute }) {
const mobile = useMobile();
return (
{/* prism background */}
— Bigger than a logo?
Custom projects start at $500
Explainer animations, intros and outros for a content series. Anything that isn't a single logo reveal. Quoted per project.
);
}
/* ─── pricing FAQ ─── */
function PricingFAQ() {
const items = [
{ q: "What if I don't like the first cut?",
a: "You get one round of revisions in every package, and Pro gets two. If the first cut is genuinely off-brief, I'll redo it — and if it still isn't right after that, you get a full refund within seven days. No drama." },
{ q: "Do you take rush jobs?",
a: "Yes, for an extra $50 — bumped to the top of the queue and delivered in 24 hours. Subject to whether I have a slot open that week; I'll tell you yes/no within an hour of getting the brief." },
{ q: "Can I commission something outside the listed packages?",
a: "Of course. Custom projects start at $1,500. Drop me a note via the contact form with what you're imagining and I'll quote it within a day." },
{ q: "Do you charge in EUR?",
a: "Prices are USD because most of my clients are US-based, but Stripe converts at checkout so you can pay in your local currency. The total in EUR/GBP/etc. matches what you see, give or take the FX spread." },
{ q: "Will you sign an NDA?",
a: "Always happy to. Send me yours before the brief, or I'll send mine — a standard mutual NDA, no surprises." }];
return (