World Map

Loading map…
/* All styles are scoped to #wm-root so they can’t leak into your theme. */ #wm-root{ –wm-ink:#12231f; –wm-muted:#5d6b67; –wm-ocean:#f4f6f6; –wm-land:#dedbd4; –wm-line:#ffffff; –wm-active:#1c7a72; –wm-hover:#12615a; –wm-select:#0a3e39; –wm-rule:#e2e0da; –wm-radius:6px; font-family:inherit; color:var(–wm-ink); line-height:1.55; max-width:1180px; margin:0 auto; } #wm-root *{box-sizing:border-box;} #wm-root .wm-stage{display:grid;grid-template-columns:1fr;gap:22px;align-items:start;} @media (min-width:900px){ #wm-root .wm-stage{grid-template-columns:minmax(0,1fr) 320px;gap:28px;} } #wm-root .wm-mapwrap{position:relative;background:var(–wm-ocean);border-radius:var(–wm-radius);overflow:hidden;} #wm-root .wm-svg{display:block;width:100%;height:auto;touch-action:none;} #wm-root .wm-loading{ position:absolute;inset:0;display:flex;align-items:center;justify-content:center; font-size:.9rem;color:var(–wm-muted); } #wm-root .wm-country{fill:var(–wm-land);stroke:var(–wm-line);stroke-width:.4px;vector-effect:non-scaling-stroke;} #wm-root .wm-country.is-active{fill:var(–wm-active);cursor:pointer;transition:fill .15s ease;} #wm-root .wm-country.is-active:hover{fill:var(–wm-hover);} #wm-root .wm-country.is-active:focus-visible{outline:none;stroke:var(–wm-select);stroke-width:2.5px;} #wm-root .wm-country.is-selected{fill:var(–wm-select);} #wm-root .wm-sphere{fill:var(–wm-ocean);} #wm-root .wm-grid{fill:none;stroke:#d9dedd;stroke-width:.5px;vector-effect:non-scaling-stroke;} #wm-root .wm-tip{ position:absolute;pointer-events:none;opacity:0;transform:translate(-50%,-140%); background:var(–wm-select);color:#fff;font-size:.8rem;padding:4px 9px;border-radius:4px;white-space:nowrap; } #wm-root .wm-tip.is-on{opacity:1;} #wm-root .wm-zoom{position:absolute;left:10px;bottom:10px;display:flex;gap:6px;} #wm-root .wm-zoom button{ font:inherit;font-size:.85rem;line-height:1;padding:8px 10px;min-width:34px; background:#fff;color:var(–wm-ink);border:1px solid var(–wm-rule);border-radius:4px;cursor:pointer; } #wm-root .wm-zoom button:hover{border-color:var(–wm-active);color:var(–wm-active);} #wm-root .wm-panel{border-top:3px solid var(–wm-active);padding-top:14px;min-height:120px;} #wm-root .wm-panel h3{margin:0 0 .4em;font-size:1.35rem;line-height:1.2;} #wm-root .wm-panel p{margin:0 0 .8em;font-size:.95rem;color:var(–wm-muted);max-width:60ch;} #wm-root .wm-panel img{width:100%;height:auto;border-radius:4px;margin-bottom:12px;display:block;} #wm-root .wm-panel a.wm-cta{ display:inline-block;font-size:.9rem;text-decoration:none;color:#fff;background:var(–wm-active); padding:9px 15px;border-radius:4px; } #wm-root .wm-panel a.wm-cta:hover{background:var(–wm-select);color:#fff;} #wm-root .wm-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:22px;padding-top:16px;border-top:1px solid var(–wm-rule);} #wm-root .wm-chips button{ font:inherit;font-size:.85rem;padding:6px 12px;border-radius:100px;cursor:pointer; background:#fff;color:var(–wm-ink);border:1px solid var(–wm-rule); } #wm-root .wm-chips button:hover{border-color:var(–wm-active);color:var(–wm-active);} #wm-root .wm-chips button[aria-pressed=”true”]{background:var(–wm-active);border-color:var(–wm-active);color:#fff;} @media (prefers-reduced-motion:reduce){ #wm-root *{transition:none !important;} } (function () { /* ============================================================ 1. YOUR CONTENT — edit this block only. Key = country name. Text accepts basic HTML (,
). image / link / linkText are optional: leave “” to hide them. ============================================================ */ var WM_DATA = { “United Kingdom”: { text: “Head office in London, opened 2016. Our largest team, covering client work across Europe.”, image: “”, link: “”, linkText: “Read more” }, “France”: { text: “Partner studio in Lyon handling French-language projects.”, image: “”, link: “”, linkText: “” }, “United States of America”: { text: “Two bases — New York and Austin — serving clients across North America.”, image: “”, link: “”, linkText: “” }, “Brazil”: { text: “Regional hub in São Paulo since 2021.”, image: “”, link: “”, linkText: “” }, “Kenya”: { text: “Field programmes run from Nairobi with local partners.”, image: “”, link: “”, linkText: “” }, “India”: { text: “Engineering and support team in Bengaluru.”, image: “”, link: “”, linkText: “” }, “Japan”: { text: “Tokyo office, focused on manufacturing clients.”, image: “”, link: “”, linkText: “” }, “Australia”: { text: “Melbourne studio covering Australia and New Zealand.”, image: “”, link: “”, linkText: “” } }; /* Shown in the side panel before anything is clicked. */ var WM_INTRO = { title: “Where we work”, text: “Select any highlighted country on the map to see what we do there.” }; /* ========================= END OF EDITABLE CONTENT ========================= */ /* Common names → the names used in the map file. Add your own if needed. */ var ALIASES = { “usa”: “United States of America”, “us”: “United States of America”, “united states”: “United States of America”, “america”: “United States of America”, “uk”: “United Kingdom”, “great britain”: “United Kingdom”, “britain”: “United Kingdom”, “england”: “United Kingdom”, “scotland”: “United Kingdom”, “wales”: “United Kingdom”, “uae”: “United Arab Emirates”, “south korea”: “South Korea”, “korea”: “South Korea”, “russia”: “Russia”, “czech republic”: “Czechia”, “holland”: “Netherlands”, “ivory coast”: “Côte d’Ivoire”, “drc”: “Dem. Rep. Congo”, “democratic republic of the congo”: “Dem. Rep. Congo”, “bosnia”: “Bosnia and Herz.”, “dominican republic”: “Dominican Rep.”, “central african republic”: “Central African Rep.”, “south sudan”: “S. Sudan”, “north macedonia”: “Macedonia”, “myanmar”: “Myanmar”, “burma”: “Myanmar”, “eswatini”: “Swaziland”, “cape verde”: “Cabo Verde” }; var root = document.getElementById(“wm-root”); if (!root) return; var svgEl = root.querySelector(“.wm-svg”); var panel = root.querySelector(“.wm-panel”); var chips = root.querySelector(“.wm-chips”); var tip = root.querySelector(“.wm-tip”); var loading = root.querySelector(“.wm-loading”); var W = 900, H = 470; var current = null; function norm(s) { return String(s).toLowerCase() .normalize(“NFD”).replace(/[\u0300-\u036f]/g, “”) .replace(/[^a-z]/g, “”); } /* Build a lookup that tolerates spelling and alias differences. */ var LOOKUP = {}; Object.keys(WM_DATA).forEach(function (key) { var canonical = ALIASES[key.toLowerCase().trim()] || key; var entry = WM_DATA[key]; entry._label = key; LOOKUP[norm(canonical)] = entry; LOOKUP[norm(key)] = entry; }); function loadScript(src) { return new Promise(function (resolve, reject) { var s = document.createElement(“script”); s.src = src; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }); } function ready() { return (window.d3 ? Promise.resolve() : loadScript(“https://cdn.jsdelivr.net/npm/d3@7”)) .then(function () { return window.topojson ? null : loadScript(“https://cdn.jsdelivr.net/npm/topojson-client@3”); }); } function showIntro() { current = null; panel.innerHTML = “

“; panel.querySelector(“h3”).textContent = WM_INTRO.title; panel.querySelector(“p”).innerHTML = WM_INTRO.text; chips.querySelectorAll(“button”).forEach(function (b) { b.setAttribute(“aria-pressed”, “false”); }); } function select(name, entry) { current = name; var html = “”; if (entry.image) html += ‘‘; html += “

” + (entry._label || name) + “

“; if (entry.text) html += “

” + entry.text + “

“; if (entry.link) html += ‘‘ + (entry.linkText || “Read more”) + ““; panel.innerHTML = html; d3.selectAll(“#wm-root .wm-country”).classed(“is-selected”, function (d) { return d && d.properties && norm(d.properties.name) === norm(name); }); chips.querySelectorAll(“button”).forEach(function (b) { b.setAttribute(“aria-pressed”, String(b.dataset.name === name)); }); } ready().then(function () { return fetch(“https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json”).then(function (r) { if (!r.ok) throw new Error(“map data”); return r.json(); }); }).then(function (world) { loading.remove(); var features = topojson.feature(world, world.objects.countries).features .filter(function (f) { return f.properties.name !== “Antarctica”; }); var svg = d3.select(svgEl) .attr(“viewBox”, “0 0 ” + W + ” ” + H) .attr(“preserveAspectRatio”, “xMidYMid meet”); var projection = d3.geoNaturalEarth1().fitExtent([[6, 6], [W – 6, H – 6]], { type: “Sphere” }); var path = d3.geoPath(projection); var g = svg.append(“g”); g.append(“path”).attr(“class”, “wm-sphere”).attr(“d”, path({ type: “Sphere” })); g.append(“path”).attr(“class”, “wm-grid”).attr(“d”, path(d3.geoGraticule10())); var matched = {}; g.append(“g”).selectAll(“path”).data(features).join(“path”) .attr(“d”, path) .attr(“class”, function (d) { var e = LOOKUP[norm(d.properties.name)]; if (e) { matched[norm(d.properties.name)] = true; return “wm-country is-active”; } return “wm-country”; }) .attr(“tabindex”, function (d) { return LOOKUP[norm(d.properties.name)] ? 0 : null; }) .attr(“role”, function (d) { return LOOKUP[norm(d.properties.name)] ? “button” : null; }) .attr(“aria-label”, function (d) { return LOOKUP[norm(d.properties.name)] ? “Show details for ” + d.properties.name : null; }) .on(“click”, function (event, d) { var e = LOOKUP[norm(d.properties.name)]; if (e) select(d.properties.name, e); }) .on(“keydown”, function (event, d) { if (event.key !== “Enter” && event.key !== ” “) return; event.preventDefault(); var e = LOOKUP[norm(d.properties.name)]; if (e) select(d.properties.name, e); }) .on(“pointerenter”, function (event, d) { if (event.pointerType === “touch” || !LOOKUP[norm(d.properties.name)]) return; tip.textContent = d.properties.name; tip.classList.add(“is-on”); }) .on(“pointermove”, function (event) { var b = svgEl.getBoundingClientRect(); tip.style.left = (event.clientX – b.left) + “px”; tip.style.top = (event.clientY – b.top) + “px”; }) .on(“pointerleave”, function () { tip.classList.remove(“is-on”); }); /* Country buttons under the map — useful on phones and for keyboard users. */ Object.keys(WM_DATA).sort().forEach(function (key) { var canonical = ALIASES[key.toLowerCase().trim()] || key; var b = document.createElement(“button”); b.type = “button”; b.textContent = key; b.dataset.name = canonical; b.setAttribute(“aria-pressed”, “false”); b.addEventListener(“click”, function () { select(canonical, WM_DATA[key]); }); chips.appendChild(b); }); var zoom = d3.zoom().scaleExtent([1, 8]) .translateExtent([[0, 0], [W, H]]) .on(“zoom”, function (event) { g.attr(“transform”, event.transform); }); svg.call(zoom); root.querySelector(“.wm-zin”).addEventListener(“click”, function () { svg.transition().duration(250).call(zoom.scaleBy, 1.6); }); root.querySelector(“.wm-zout”).addEventListener(“click”, function () { svg.transition().duration(250).call(zoom.scaleBy, 0.625); }); root.querySelector(“.wm-zreset”).addEventListener(“click”, function () { svg.transition().duration(300).call(zoom.transform, d3.zoomIdentity); showIntro(); }); showIntro(); var missing = Object.keys(WM_DATA).filter(function (k) { var c = ALIASES[k.toLowerCase().trim()] || k; return !matched[norm(c)]; }); if (missing.length) console.warn(“World map: no country found on the map for — ” + missing.join(“, “)); }).catch(function () { if (loading) loading.textContent = “The map couldn’t load. Check the page’s internet connection and try again.”; }); })();

Feature is an online magazine made by culture lovers. We offer weekly reflections, reviews, and news on art, literature, and music.

Please subscribe to our newsletter to let us know whenever we publish new content. We send no spam, and you can unsubscribe at any time.

← Back

Thank you for your response. ✨

Designed with WordPress.