/* ===== screen-jurisdictions.jsx — jurisdictions hub with comparison + DMCC detail ===== */
function JurisdictionsScreen({ locale, setRoute }) {
const [filter, setFilter] = React.useState("All");
const [open, setOpen] = React.useState(null);
const groups = ["All", "Mainland", "Free Zone", "Offshore", "Regional"];
const list = filter === "All" ? DATA.jurisdictions : DATA.jurisdictions.filter(j => j.group === filter);
return (
Jurisdictions
25+ jurisdictions, one honest comparison.
UAE mainland, free zones, offshore and the wider GCC. We compare qualitatively — ownership, scope, visas, activities — and never publish government fees that change without notice.
{/* filter */}
{groups.map(g => (
setFilter(g)} className={"btn btn-sm " + (filter === g ? "btn-primary" : "btn-ghost")}>
{g}
))}
Showing {list.length} of {DATA.jurisdictions.length}
{/* cards */}
{list.map(j => (
setOpen(j)} style={{
textAlign: "left", cursor: "pointer", background: "#fff",
display: "flex", flexDirection: "column", gap: 14, padding: 26,
}}>
{j.group}
{j.icon}
{j.benefit}
See details
))}
{/* deeper comparison */}
{open && setOpen(null)} setRoute={setRoute}/>}
);
}
function CompareTable() {
const rows = [
{ label: "Ownership", values: ["100% foreign (most activities)", "100% foreign", "100% foreign", "100% foreign"] },
{ label: "Trade scope", values: ["UAE-wide + abroad", "Zone + abroad", "International only", "Country-specific"] },
{ label: "Office", values: ["Ejari office", "Flexi-desk → private", "Registered agent", "Varies"] },
{ label: "Visa eligibility", values: ["Tied to office size", "Tied to package", "Generally none", "MISA / Qatari rules"] },
{ label: "Setup speed", values: ["2–4 weeks", "5–10 days", "3–7 days", "4–8 weeks"] },
{ label: "Best for", values: ["UAE-facing retail & services", "Trade, services, tech, finance", "Holding, succession", "GCC market access"] },
{ label: "Examples", values: ["Dubai Mainland", "DMCC · DIFC · IFZA · Meydan", "RAK ICC · BVI · Mauritius", "KSA · Qatar Free Zone"] },
];
const heads = ["Mainland", "Free Zone", "Offshore", "Regional"];
return (
Property
{heads.map((h, i) => (
{h}
{i === 1 &&
MOST FLEXIBLE
}
))}
{rows.map((r, ri) => (
{r.label}
{r.values.map((v, i) => (
{v}
))}
))}
);
}
function JurisdictionDrawer({ j, onClose, setRoute }) {
React.useEffect(() => {
const onKey = (e) => e.key === "Escape" && onClose();
window.addEventListener("keydown", onKey);
return () => window.removeEventListener("keydown", onKey);
}, [onClose]);
return (
e.stopPropagation()} style={{
width: "min(640px, 100vw)", height: "100vh", background: "#fff",
boxShadow: "var(--sh-3)", overflowY: "auto",
animation: "slide-in .3s ease",
}}>
{j.group}
✕
Setting up in {j.name}
{j.suited}
{j.benefit}
Best suited for
{(j.id === "dmcc" ? ["General trading","Commodities","Crypto & blockchain","Professional services","Consulting"]
: j.id === "difc" ? ["Asset management","Fintech","Family offices","Foundations","Holding"]
: j.id === "meydan" ? ["Consulting","Holding","Digital","Remote-first SMEs"]
: ["Trading","Services","Consulting","E-commerce"]).map(t => (
{t}
))}
What's typical (qualitative)
{[
["Ownership", "100% foreign"],
["Office", j.group === "Offshore" ? "Registered agent" : j.id === "meydan" ? "Virtual / flexi" : "Flexi-desk → private"],
["Visa quota", j.group === "Offshore" ? "Generally none" : j.id === "meydan" ? "Up to 3 with virtual office" : "Scales with office size"],
["Setup speed", j.group === "Offshore" ? "3–7 working days" : j.group === "Mainland" ? "2–4 weeks" : "5–10 working days"],
["Renewal cycle", "Annual"],
].map(([k, v], i) => (
))}
No fixed price here. {j.name} fees depend on activity, visas, office and packages. Use the calculator for an indicative range — an advisor confirms.
setRoute("calculator")} style={{ justifyContent: "center" }}>
Estimate cost for {j.name}
Ask on WhatsApp
);
}
Object.assign(window, { JurisdictionsScreen });