/* ===== screen-calculator.jsx ===== */ // Indicative cost coefficients — clearly typed, NOT a fixed price list. // All values are illustrative ranges (AED) for design demonstration only. const CALC_RANGES = (() => { // jurisdiction base ranges const J = { "dubai-mainland": [18000, 32000], "dmcc": [22000, 38000], "difc": [48000, 92000], "jafza": [28000, 46000], "meydan": [12500, 22000], "dubai-south": [18000, 30000], "ifza-d3": [14000, 26000], "adgm": [44000, 86000], "rakez": [10500, 19000], "rak-icc": [9500, 16000], "bvi": [14000, 24000], "ksa": [42000, 78000], "qatar": [38000, 72000], }; // activity multiplier const A = { "trading": 1.0, "consulting": 0.92, "ecommerce": 0.98, "tech": 1.05, "fnb": 1.18, "financial": 1.55, }; // office multiplier const O = { "flexi": 1.0, "shared": 1.18, "private": 1.55, "warehouse":2.1, }; // visa cost (per visa) const visa = [4800, 7600]; function estimate({ zone, activity, visas, office, shareholders }) { const base = J[zone] || [15000, 28000]; const am = A[activity] || 1; const om = O[office] || 1; const lo = Math.round((base[0] * am * om + visa[0] * visas) / 100) * 100; const hi = Math.round((base[1] * am * om + visa[1] * visas) / 100) * 100; return { low: lo, high: hi }; } return { estimate, J, A, O }; })(); window.CALC_RANGES = CALC_RANGES; function CalculatorScreen({ locale, setRoute }) { const s = STR[locale]; const [step, setStep] = React.useState(0); const [form, setForm] = React.useState({ zone: "dmcc", activity: "trading", visas: 2, shareholders: 1, office: "flexi", name: "", email: "", phone: "", }); const update = (k, v) => setForm(f => ({ ...f, [k]: v })); const r = CALC_RANGES.estimate(form); const steps = ["Jurisdiction", "Activity", "Visas & team", "Office", "See estimate", "Talk to an advisor"]; return (
Cost calculator

Indicative setup cost, in about two minutes.

We show a range — never a fixed number. Government fees move, packages bundle, and your specific activity matters. An advisor confirms the exact figure on a free call.

{/* stepper */} {/* form panel */}
{steps.map((_, i) => (
))}
Indicative
{step === 0 && } {step === 1 && } {step === 2 && } {step === 3 && } {step === 4 && } {step === 5 && }
{STR[locale].indicative}
{step > 0 && } {step < 5 && } {step === 5 && form.email && ( )}
); } function FieldGrid({ children, cols = 2 }) { return
{children}
; } function CardOption({ active, onClick, title, sub, icon }) { return ( ); } function StepJurisdiction({ form, update }) { const groups = [ { label: "Free zones (most flexible)", items: ["dmcc", "meydan", "ifza-d3", "dubai-south", "jafza", "difc", "adgm", "rakez"] }, { label: "Mainland", items: ["dubai-mainland"] }, { label: "Offshore & international", items: ["rak-icc", "bvi"] }, { label: "Regional", items: ["ksa", "qatar"] }, ]; return (

Where do you want to set up?

Pick the jurisdiction — we'll adjust the rest of the form to its rules.

{groups.map(g => (
{g.label}
{g.items.map(id => { const j = DATA.jurisdictions.find(x => x.id === id); if (!j) return null; const active = form.zone === id; return ( ); })}
))}
); } function StepActivity({ form, update }) { const items = [ { id: "trading", title: "Trading / general", sub: "Buy & sell goods, retail, wholesale", icon: "T" }, { id: "consulting", title: "Consulting & services", sub: "Advisory, agency, professional services", icon: "C" }, { id: "ecommerce", title: "E-commerce", sub: "Online retail, fulfilment, dropship", icon: "e" }, { id: "tech", title: "Tech & software", sub: "SaaS, platforms, IT consulting", icon: "{}" }, { id: "fnb", title: "F&B / cloud kitchen", sub: "Restaurants, cloud kitchens, catering", icon: "♨" }, { id: "financial", title: "Financial services", sub: "Asset mgmt, fintech, brokerage (DIFC/ADGM)", icon: "$" }, ]; return (

What will the company do?

Activity selection shapes which licence and approvals we'll need.

{items.map(it => ( update("activity", it.id)} title={it.title} sub={it.sub} icon={it.icon}/> ))}
); } function StepVisas({ form, update }) { return (

How many people on visas?

This drives visa quotas, office-size requirements and PRO scope.

Total visas
{form.visas}
Partners, employees, family
update("visas", +e.target.value)} style={{ width: "100%", accentColor: "var(--accent)" }}/>
015+
Shareholders
{form.shareholders}
Individuals + corporate
update("shareholders", +e.target.value)} style={{ width: "100%", accentColor: "var(--accent)" }}/>
17+
Visa quotas vary by jurisdiction. The estimate widens the range to keep the figure honest until an advisor confirms.
); } function StepOffice({ form, update }) { const items = [ { id: "flexi", title: "Flexi-desk", sub: "Co-working — most cost-efficient", icon: "▤" }, { id: "shared", title: "Shared office", sub: "Shared address, dedicated desks", icon: "◫" }, { id: "private", title: "Private office", sub: "Your own locked office", icon: "■" }, { id: "warehouse", title: "Warehouse / industrial", sub: "Storage + commercial space", icon: "▥" }, ]; return (

Where will you operate from?

Office type ties to your visa quota and licence package.

{items.map(it => ( update("office", it.id)} title={it.title} sub={it.sub} icon={it.icon}/> ))}
); } function StepEstimate({ form, r }) { const j = DATA.jurisdictions.find(x => x.id === form.zone); return (
Your indicative estimate
Setup year one (indicative)
AED {r.low.toLocaleString()}{r.high.toLocaleString()}
Jurisdiction
{j ? j.name : ""}
Activity
{form.activity}
Visas
{form.visas}
Office
{form.office}
{[ { l: "Licence & registration", v: "Government fee + zone licence" }, { l: "Visa & immigration", v: form.visas + " × employee / partner" }, { l: "Workspace year one", v: form.office === "flexi" ? "Flexi-desk package" : form.office === "shared" ? "Shared office" : form.office === "private" ? "Private office" : "Warehouse" }, ].map(b => (
{b.l}
{b.v}
))}
This is an indicative range, not a quote. Government fees change without notice; activity-specific approvals can add or reduce cost. Your advisor will confirm the exact figure and lock it on a proposal.
); } function StepLead({ form, update, r }) { const [submitted, setSubmitted] = React.useState(false); if (submitted) { return (

Thanks {form.name.split(" ")[0] || "there"} — your estimate is on its way.

An advisor will reach out within 30 minutes during UAE business hours (Mon–Fri 09:00–18:00, GMT+4). Want to chat now?

WhatsApp now Call advisor
); } return (

Where should we send your estimate?

We'll email you a PDF and put you on a free 30-minute call with an advisor.

update("name", e.target.value)} placeholder="Jane Carter"/>
update("email", e.target.value)} placeholder="jane@company.com"/>
update("phone", e.target.value)} placeholder="+971 …"/>