/* global React, SectionHead, I, LawyerCard, RANKINGS, SERVICES, INDUSTRIES, HUBS, PEOPLE, OFFICES, INSIGHTS, AWARDS */
const { useState: useStateP, useMemo: useMemoP } = React;
// ─── Page banner ──────────────────────────────────────────────────────
function PageBanner({ eyebrow, title, sub, dark }) {
return (
{eyebrow}
{title}
{sub &&
{sub}
}
);
}
// ─── Expertise page ───────────────────────────────────────────────────
function ExpertisePage({ navigate, onEnquire, t }) {
const [tab, setTab] = useStateP("services");
const tabs = { services: t.services, industries: t.industries, hubs: t.hubs };
const data = {
services: SERVICES.map((s) => ({ name: s.name, slug: s.slug, flagship: s.flagship })),
industries: INDUSTRIES.map((i) => ({ name: i })),
hubs: HUBS.map((h) => ({ name: h })),
}[tab];
// Mock practice blurbs (capability language only, no guarantees)
const blurb = (name) => {
const m = {
"Arbitration & ADR": "Domestic and international arbitration before DIAC, DIFC-LCIA, ICC, LCIA and ad-hoc panels.",
"Litigation": "Onshore litigation before the UAE Courts and onshore counterparts across the GCC.",
"DIFC / ADGM Litigation": "Common-law dispute resolution before the DIFC Courts and ADGM.",
"Corporate & M&A": "Cross-border M&A, joint ventures, restructurings and local IPOs.",
"Banking & Finance": "Conventional and Islamic finance for sponsors, lenders and arrangers.",
"Technology, Media & Telecoms": "Regulatory, contracting and data work for TMT operators and platforms.",
};
return m[name] || "Capability across the firm's regional footprint — UAE, KSA, Oman, Lebanon and Iraq.";
};
return (
{/* Tab control */}
{Object.entries(tabs).map(([k, v]) => (
setTab(k)}
style={{
padding: "20px 32px 22px", background: "transparent", border: 0,
borderBottom: tab === k ? "2px solid var(--accent)" : "2px solid transparent",
color: tab === k ? "var(--ink)" : "var(--muted)",
fontFamily: "var(--serif)", fontSize: 28, fontWeight: 400, fontStyle: tab === k ? "normal" : "italic",
cursor: "pointer", marginBottom: -1,
}}>
{v}
{String(data.length).padStart(2, "0")}
))}
{data.map((item, i) => (
{ e.currentTarget.style.background = "var(--paper-2)"; e.currentTarget.querySelector("[data-arr]").style.transform = "translateX(6px)"; }}
onMouseLeave={(e) => { e.currentTarget.style.background = "transparent"; e.currentTarget.querySelector("[data-arr]").style.transform = "none"; }}
>
{String(i + 1).padStart(2, "0")}
{item.flagship && Flagship }
{item.name}
{blurb(item.name)}
))}
{/* Rankings panel */}
{RANKINGS.map((r, i) => (
{r.tier}
{r.jurisdiction}
{r.practice}
{r.directory}
))}
);
}
// ─── People directory page ────────────────────────────────────────────
function PeoplePage({ openLawyer, navigate, onEnquire, t }) {
const [office, setOffice] = useStateP("All");
const [practice, setPractice] = useStateP("All");
const [role, setRole] = useStateP("All");
const offices = ["All", ...new Set(PEOPLE.map((p) => p.office))];
const practices = ["All", ...new Set(PEOPLE.flatMap((p) => p.practices))].sort();
const roles = ["All", "Senior Partner", "Managing Partner", "Partner", "Of Counsel", "Senior Associate"];
const filtered = useMemoP(() => PEOPLE.filter((p) =>
(office === "All" || p.office === office) &&
(practice === "All" || p.practices.includes(practice)) &&
(role === "All" || p.role === role)
), [office, practice, role]);
const ChipRow = ({ label, value, set, options }) => (
{label}
{options.map((o) => (
set(o)}
style={{
padding: "5px 12px", fontFamily: "var(--mono)", fontSize: 11, letterSpacing: "0.08em", textTransform: "uppercase",
background: value === o ? "var(--ink)" : "transparent",
color: value === o ? "var(--paper)" : "var(--ink-2)",
border: "1px solid " + (value === o ? "var(--ink)" : "var(--line-2)"),
cursor: "pointer",
}}>
{o}
))}
);
return (
Showing {String(filtered.length).padStart(2, "0")} of {String(PEOPLE.length).padStart(2, "0")}
{ setOffice("All"); setPractice("All"); setRole("All"); }}
style={{ background: "transparent", border: 0, fontFamily: "var(--mono)", fontSize: 11, color: "var(--muted)", letterSpacing: "0.1em", textTransform: "uppercase", cursor: "pointer", borderBottom: "1px solid var(--line-2)", paddingBottom: 4 }}>
Reset filters
{filtered.length === 0 ? (
No people match those filters. { setOffice("All"); setPractice("All"); setRole("All"); }} style={{ background: "transparent", border: 0, color: "var(--accent)", textDecoration: "underline", cursor: "pointer" }}>Reset
) : (
{filtered.map((p) => )}
)}
);
}
// ─── Offices page ─────────────────────────────────────────────────────
function OfficesPage({ onEnquire, t }) {
return (
{OFFICES.map((o, i) => (
{o.headquarters ? "Headquarters · " : ""}{o.country}
{o.city}
{o.entity}
{o.address}
{o.note && (
{o.note}
)}
))}
);
}
// ─── Insights page ────────────────────────────────────────────────────
function InsightsPage({ navigate, t }) {
const [cat, setCat] = useStateP("All");
const cats = ["All", ...new Set(INSIGHTS.map((i) => i.category))];
const filtered = INSIGHTS.filter((i) => cat === "All" || i.category === cat);
const featured = filtered[0];
const rest = filtered.slice(1);
return (
{cats.map((c) => (
setCat(c)}
style={{
padding: "10px 18px", fontFamily: "var(--mono)", fontSize: 11, letterSpacing: "0.1em", textTransform: "uppercase",
background: cat === c ? "var(--ink)" : "transparent",
color: cat === c ? "var(--paper)" : "var(--ink)",
border: "1px solid " + (cat === c ? "var(--ink)" : "var(--line-2)"),
cursor: "pointer",
}}>
{c}
))}
{featured && (
Featured · {featured.category}
{featured.title}
{featured.authors[0]}
{featured.date} · {featured.readTime}
{featured.excerpt}
Read briefing
{featured.practice}
)}
{rest.map((ins, i) => (
{ins.category}
{ins.date}
{ins.title}
{ins.excerpt}
{ins.authors[0]}
{ins.readTime}
))}
);
}
// ─── About page ───────────────────────────────────────────────────────
function AboutPage({ onEnquire, navigate, t }) {
return (
{/* Story */}
Heritage
Founded in Dubai. Built across the region.
In 2001 the firm opened in Dubai. Five years later, in 2006, it became the first local law firm to incorporate inside the Dubai International Financial Centre — a quiet first that has shaped the firm's posture ever since.
The Senior Partner, Dr. Ahmad Bin Hezeem, is a former Director General of the Dubai Courts and Vice Chairman of the Dubai International Arbitration Centre. The Managing Partner, Jimmy Haoula, helped develop Dubai's real-estate and Strata regulatory framework. The senior bench is, in our experience, the practice.
Eight offices now span the UAE, Saudi Arabia, Oman, Lebanon and Iraq. Across the network, the firm operates as a single partnership — local entity names where the law requires them, one practice in substance.
{/* Timeline */}
Timeline
{[
{ y: 2001, e: "Firm founded in Dubai" },
{ y: 2006, e: "First local firm in the DIFC" },
{ y: 2021, e: "20 years in the Middle East" },
{ y: 2024, e: "Rebrand to BSA LAW (Oct 8)" },
{ y: 2026, e: "Eight offices, five countries" },
].map((m, i) => (
0 ? 24 : 0 }}>
{m.y}
{m.e}
))}
{/* Values */}
What drives us
{["Client-Centricity", "Fairness", "Authenticity", "Responsibility", "Mutuality"].map((v, i) => (
{String(i + 1).padStart(2, "0")}
{v}
))}
What defines us
{["Precursors", "Progressive", "Driven", "Bold", "Responsive"].map((v, i) => (
{String(i + 1).padStart(2, "0")}
{v}
))}
{/* Awards */}
Awards · firm-supplied; attributed
{AWARDS.map((a, i) => (
{a.year}
{a.name}
{a.issuer}
))}
);
}
// ─── Contact page ─────────────────────────────────────────────────────
function ContactPage({ onEnquire, t }) {
return (
Enquiry form
Tell us about the matter.
Direct contact
{OFFICES.map((o) => (
{o.city}{o.headquarters && HQ }
{o.country}
{o.phone}
))}
);
}
// Compact, inline version of EnquiryForm without the modal chrome.
function EnquiryFormInline({ t }) {
const [submitted, setSubmitted] = useStateP(false);
if (submitted) {
return (
Received
Thank you.
Your enquiry has been routed. We typically respond within one business day.
setSubmitted(false)}>New enquiry
);
}
return (
);
}
// ─── Careers (lightweight placeholder) ────────────────────────────────
function CareersPage({ onEnquire, t }) {
return (
Open roles
{[
["Senior Associate — Banking & Finance", "Dubai"],
["Associate — Dispute Resolution", "Dubai"],
["Associate — Corporate & M&A", "Riyadh"],
["Paralegal — Real Estate", "Dubai"],
["Of Counsel — Construction Disputes", "Abu Dhabi"],
].map(([t, loc]) => (
{t}
{loc}
))}
Register interest.
If you don't see a role that matches, write to us with a brief note on your practice area, qualifications and preferred office.
careers@bsalaw.com
);
}
Object.assign(window, { PageBanner, ExpertisePage, PeoplePage, OfficesPage, InsightsPage, AboutPage, ContactPage, CareersPage });