// calc-flow.jsx — the hook (hero) + the guided quote flow + the live quote panel. function Hero({ onStart, sampleSel, margin }) { const q = window.quotePrice(sampleSel, margin); return (
One video · no subscription

What does an AI video cost? Make one — no subscription.

Answer a few quick questions and get an instant price. Buy a single video, your script, your voice — ready in minutes. Subscribe later only if you want to.

Free to quote · no card to see your price
Ready in minutes, not days No subscription required One clear price + VAT
Example
A 1-minute video, your voice
{window.fmt(q.render)} + VAT
{q.oneTime > 0 ?
+ {window.fmt(q.oneTime)} one-time twin setup — reused forever
: null}
Your own digital twin, reusable
Narrated in your cloned voice
Rendered and ready in minutes
); } function Opt({ sel, onClick, icon, title, desc, add, incl, lockedMsg }) { const locked = !!lockedMsg; return ( ); } function ModeToggle({ mode, setMode }) { return (
); } function BudgetMode({ budget, setBudget, margin }) { const opt = window.optimizeForBudget(budget, margin); const cfg = opt.sel; const next = window.nextUnlock(budget, margin); const MIN = 3, MAX = 120; const pct = ((budget - MIN) / (MAX - MIN)) * 100; const L = window.PRICE.length[cfg.length].label; const minPrice = window.quotePrice(window.BASE_SEL, margin).total; return (
Name your budget

What can I make for…?

Drag your budget — we build the best possible video that fits. No account needed to see it.

{window.fmt(budget)}my budget
setBudget(Number(e.target.value))} style={{ background: `linear-gradient(to right, var(--lime) 0%, var(--lime) ${pct}%, var(--panel-hi) ${pct}%, var(--panel-hi) 100%)` }} />
{window.fmt(MIN)}{window.fmt(MAX)}+
{opt.affordable ? (
Best video for {window.fmt(budget)}
A {L.toLowerCase()} {cfg.style === 'cinematic' ? cinematic : 'talking-head'} video {cfg.avatar === 'twin' ? with your own digital twin : with a ready-made avatar} {cfg.voice === 'cloned' ? , in your cloned voice : null} {cfg.music ? , plus music : null}.
{L} {cfg.style === 'cinematic' ? 'Cinematic' : 'Talking-head'} {cfg.avatar === 'twin' ? 'Your digital twin' : 'Ready avatar'} {cfg.voice === 'cloned' ? 'Your cloned voice' : 'Stock voice'} {cfg.music ? Music : null}
Uses {window.fmt(opt.price.total)} of your {window.fmt(budget)}{budget - opt.price.total > 0 ? · {window.fmt(budget - opt.price.total)} to spare : null}.
{next ? (
Add {window.fmt(next.at - budget)} → unlock {next.label}
) : (
That's the highest quality we make — you've maxed it out.
)}
) : (
The minimum is {window.fmt(minPrice)} for a 10-second video. Nudge your budget up a touch.
)}
); } function QuoteFlow({ sel, set, onBuy, margin, mode, setMode, budget, setBudget }) { const answeredCount = (sel.avatar ? 1 : 0) + (sel.length ? 1 : 0) + (sel.style ? 1 : 0) + (sel.voice ? 1 : 0) + 1; const pct = Math.min(100, (answeredCount / 6) * 100); return (
{mode === 'budget' ? ( ) : (
Build your quote

A few quick taps

Each choice updates your price on the right. No account needed to see it.

1Who's in the video?
set({ avatar: 'ready', voice: sel.voice === 'cloned' ? 'stock' : sel.voice })} icon="user" title="Ready-made avatar" desc="Pick a polished presenter from our library." incl="Included" /> set({ avatar: 'twin' })} icon="user-plus" title="My own digital twin" desc="A lifelike twin of you, set up once and reused forever." add={'+ ' + window.fmt(window.twinSetupPrice(margin)) + ' one-time setup'} />
2How long?
{Object.entries(window.PRICE.length).map(([k, v]) => ( set({ length: k })} title={v.label} desc={v.hint} /> ))}
3What style?
set({ style: 'talking' })} icon="user" title="Simple talking-head" desc="Clean, direct presenter to camera. Great for most posts." incl="Standard" /> set({ style: 'cinematic' })} icon="film" title="Cinematic" desc="B-roll, scenes and motion — a richer, produced look." add="Premium render" />
4Whose voice?
set({ voice: 'stock' })} icon="microphone" title="Stock voice" desc="A natural, professional voice from our library." incl="Included" /> sel.avatar === 'twin' && set({ voice: 'cloned' })} icon="microphone" title="My cloned voice" desc="Sounds like you — comes with your digital twin." lockedMsg={sel.avatar !== 'twin' ? 'Choose “My own digital twin” to unlock' : null} incl={sel.avatar === 'twin' ? 'Included with your twin' : null} />
5Add background music?
set({ music: true })} icon="music" title="Yes, add music" desc="A licensed track that fits the mood." add={'+ ' + window.fmt(window.musicPrice(margin))} /> set({ music: false })} icon="music-off" title="No music" desc="Just the voice." incl="—" />
6Your script — or just describe the idea
{sel.script.trim() ? sel.script.trim().split(/\s+/).length + ' words' : 'Optional to quote'} Help me write it
)}
); } function LiveQuote({ sel, onBuy, margin, budgetCap }) { const q = window.quotePrice(sel, margin); const incl = window.included(sel); return (
Your video
{window.fmt(q.render)} + VAT at checkout
{q.oneTime > 0 ? (
+ {window.fmt(q.oneTime)} one-time — build your digital twin, reused on every future video
) : null}
What's included
{incl.map((it, i) => (
{it.text}
))}
{budgetCap ? Fits your {window.fmt(budgetCap)} budget : null} Ready in minutes after checkout No subscription · pay once for this video
One clear price. VAT is added at checkout for your country.
); } Object.assign(window, { Hero, ModeToggle, BudgetMode, QuoteFlow, LiveQuote });