- MOBILIZATION-MAPS-LAPTOP.md: every map on the site, DX Life's own home, pray, adopt and country maps
included, uses MapLibre by default (the Driver's rule); NUXT_PUBLIC_MAP_PROVIDER=mapbox with
NUXT_PUBLIC_MAPBOX_TOKEN switches back to Mapbox as doxa.life uses it today. The dropped-in tree is
DX Maps development cff06fb8e.
- DX-MAPS-GALLERY.md: the Map engine paragraph said a token alone selects Mapbox, which stopped being
true when the provider setting came in; now it gives the real switch. It names what comes from
other hosts (the engine from jsDelivr, base-map tiles from OpenFreeMap and VersaTiles, one
dashboard's figures from the World Bank API, the prayer API). The tree sha is cff06fb8e.
- deep-research/index.vue: its comment no longer says "no third-party host" without qualification.
The whole dx-maps output folder, replaced with the tree committed on DX Maps development at
cff06fb8e (1209 files; it contains f0eb33951, the previous refresh). The gallery is now titled Deep
Research, honours the {"experimental": false} this site's /deep-research page passes (the Experimental
folder is hidden), remounts a tab on a live language switch, and every one of its seven tabs has the
"what can this map do for you?" info button. manifest.json does not record the DX Maps commit, so it
is recorded here.
The whole dx-maps output folder, replaced (not merged) with the tree committed on DX Maps
development at f0eb33951 (1209 files), which the DX Maps landing gates keep equal to a fresh build.
It carries the packet export fix (a2809b31f) and 32cf3f235. manifest.json does not record the DX Maps
commit it came from, so it is recorded here.
The embed snippets in this tree are relative to the tree root, so the folder works wherever it is
dropped; the gallery builds its embed URLs at runtime from the page's own origin. Every bundle this
site loads by name is in the tree: doxa-maps-spa, doxa-simple-map, doxa-research-map, country-map, and
the assets the static pages under public/embed and public/research use.
1. The page no longer loads Mapbox GL and the geocoder before the map bundle. They came from
api.mapbox.com, in one try with the bundle, so a slow or blocked Mapbox CDN meant NO map at all,
even with MapLibre, which needs nothing from Mapbox. Each dx-maps map loads its own engine, its CSS
and its geocoder, once, when it is built (ensureEngineScript in dx-maps' useMapInstance.js, which
reuses a loaded engine and never loads it twice). So the page now loads only the map bundle, in its
own try; Mapbox is fetched only when Mapbox is the provider, by the map, after the bundle.
2. The provider is always passed explicitly: 'mapbox' when the site chose it
(NUXT_PUBLIC_MAP_PROVIDER=mapbox with NUXT_PUBLIC_MAPBOX_TOKEN), otherwise 'maplibre'. A token
alone never selects Mapbox in dx-maps, so before this, choosing Mapbox had no effect: the maps ran
MapLibre carrying a token. Fixed in DoxaMapSlot (home, pray, adopt, research, country) and on
/deep-research.
Lineage: the provider handling (app/utils/mapProvider.ts and DoxaMapSlot's use of it) is NOT
production's code; it came with the drop-in lineage (b045200, an ancestor of 9860e78). DX Life
production (github master fc4d622) has no provider setting. The script chain in useDoxaMap is
production's pattern, which production needs for its own /js bundles; this branch loads dx-maps
bundles, which carry their own engine loader. With the default settings (MapLibre), home, pray and
adopt render the same map as before; they only stop downloading the unused Mapbox scripts and CSS.
The token handling matches production: the public token, passed only in Mapbox mode.
The Driver's rule for the Research page: as it is on the production site today, with the gallery off
it. The page file is now byte-identical to production's: the heading, the By Region link, the
research map (bundle research-map) and the UUPG list. The only change a visitor gets is where the map
comes from: DoxaMapSlot loads it from this site's /dx-maps/ tree, and MapLibre is the default engine.
Also corrects two statements that were already stale on the drop-in branch: the page has one
scrollbar and no footer (not a footer below the gallery), and the dropped-in tree is dx-maps
development 1bbc5ff87 (not main 11129455e).
- /deep-research gives the gallery profile-config {"experimental": false}: the curated sections
only, no Experimental folder. Galleries built before the flag ignore it.
- Both pages are now clean under the repo's ESLint config (layout only).
DX Life asked for the gallery under the name Deep Research, on a page of the site rather than a
subdomain, and not on the Research page.
- /deep-research: the gallery, exactly as it ran on the Research page (one scrollbar, no footer,
runtime tree base, MapLibre by default). It is in no menu and tells robots not to index it.
- /research: DX Life's own UUPG page again (the heading, the By Region link and the UUPG list),
with the production simple map (doxa-simple-map) carrying the Engagement, Prayer and Adoption
tabs that the home, pray and adopt pages each show one of.
- /regions: DX Life's own regions index and its menu item are back (LEGACY_REGIONS_PAGE and
USE_LEGACY_REGIONS_PAGE on); /countries goes to it.
- DoxaMapSlot: the map fills its box, not the viewport (--profile-min-h: 0), so the slot no longer
cuts off the map's attribution and bottom controls.
popupHtml() escaped the name, the subtitle, the stats, the description, the photo address and the two
button labels, but put prayUrl and profileUrl into href raw. Both end in the people group's slug,
which comes from the API, so a slug with a double quote would close the attribute. Both now go
through the escapeHtml the popup already uses. Found by the regions plugin, which fixed the same
inherited code in its dx-maps port.
The same page as on the subdomain branch. The CDN route is retired, and its branch is kept
for history. This branch is the default route: PORT=4611 bun run dev, with no setting to
change. To try a newer dx-maps: bun run tree with this site's address, then dx-maps' bun run
dropin.
<doxa-country-map> reads its profile from profile-config, like the manifest's own snippet
({"profile":"country-map",...}) and like this site's other maps (profile: 'doxa-simple-map').
Without it the element drew nothing but 'Profile "" not found' on every country page
(rega, 1440 and 390, en and ar).
The manifests are generated with EMBED_BASE_URL=https://dxlife-dropin.nuxtbase.app, so every
copy-paste snippet loads from this site wherever it is pasted (227 absolute URLs; the tree
generation changed only the two manifests). The tree also brings studio's final round: the
gated key-cities bundle is out of the tree (its data tables stay, the Cities with Internet map
uses them), each Experimental map's own "?" explainer, and the country map's poster legend.
The gallery now gets its own origin on the laptop, as it does on the team's server, while the
maps stay on localhost:4610. Chrome and Firefox send any *.localhost name to this computer;
Safari and command-line tools may need `127.0.0.1 research.localhost` in /etc/hosts.
Checked: the tree server answers research.localhost:4610 (gallery 200, with ?tab= and
&lang=ar; manifest 200; the bare root 404, so the address keeps its /index.html).
The country and region pages already ask for the country-map bundle; this tree
carries it (country-map/country-map.js, in the manifest with its SRI). Taken
from development, not main: the element is not published yet, and the drop-in
carries its own copy of the tree.
NUXT_PUBLIC_DX_MAPS_BASE now defaults to https://maps-dev.nuxtbase.app/cdn/dx-maps (the Plugin Studio
container's /cdn). Set it empty to use this site's own public/dx-maps copy; set it to another tree URL to
use that.
Set, the gallery script and its tree-base come from that URL (e.g. https://maps-dev.nuxtbase.app/cdn/dx-maps).
Unset, the page uses this site's own /dx-maps/ copy exactly as before. Both modes proven on the dev
server: 0 console errors, the gallery tabs draw, and every dx-maps request goes to the chosen host.
public/dx-maps is replaced with the dx-maps build tree from doxa-maps main 9ce04ffea (28 bundles);
the gallery's manifest integrity matches the served doxa-maps-spa.js.
The Research page embeds the whole Research Gallery with the JS embed. Every embed URL is built at
runtime from the origin serving the page (tree-base = window.location.origin + /dx-maps), so the same
build works on a laptop, staging or production.
The previous Research page (the "By Region" link, the single research map and the UUPG list) is NOT
deleted: it is back in the page, switched off by SHOW_LEGACY_RESEARCH = false. The two old scripts
public/js/doxa-simple-map.js and doxa-research-map.js are restored too, unused, so nothing DX-life
relied on is removed.
The home, pray and adopt maps ran Mapbox GL, the geocoder and the map bundle one after
another, so on a cold first visit the slot stayed empty while ~1.8 MB downloaded in series.
Preload hints now fetch all three in parallel (they still run in order), and the slot shows a
quiet spinner (aria-busy) until the map element is defined.
The maps' build tree is now public/dx-maps/ (doxa-maps main 09014f8a), replacing
public/doxa-maps/. The Research gallery, the home, pray and adopt maps, /embed/map/ and
/research/doxa-research-map.html all load from it; the old /js/doxa-simple-map.js and
/js/doxa-research-map.js are removed (no aliases). Mapbox GL moves to v3.24.0, the version
the bundles are built with. With no Mapbox token configured, the home, pray and adopt maps
use the keyless MapLibre engine instead of refusing to start. See DX-MAPS-GALLERY.md.
The Research page now shows the Research Gallery (every research map, dashboard and list)
filling the page below the header, on desktop and phone. It replaces the single research
map, the UUPG list and the By Region link.
public/doxa-maps/ is the doxa-maps build tree (doxa-maps main 196ad168), so this site is
the gallery's CDN. The page loads one script and adds one element. It follows the site
language, and without a Mapbox token it uses the keyless MapLibre engine.
See DX-MAPS-GALLERY.md.
- serve the per-language terminology editions at /about/definitions
with the About sidebar; /terms redirects there
- title every edition "Definitions" to match the sidebar label
- drop the self-referencing link to the Definitions page
- add an Arabic edition built from the Arabic glossary
- point the add-language and sync-language skills at the new route
- delete the bundle loader composable and the unused slot component
- strip the site-wide embed from app.vue, leaving the layout shell
- drop the runtime config keys, custom element tag and env entries
- remove the login opt-in and the preconnect to the feedback host
- site strings, map widget locales and /terms editions for ar, de, es,
fr, hi, it, pt, ro, ru and zh
- patch the standalone map bundle in place (it has no build profile) and
rebuild the two profiled bundles from the updated source locales
- fix defects the sweep surfaced: the ru vision headline read "all
unmarried people will be married by 2033", ro used popor (nation) as
the people-group label including the homepage h1, and ar inverted
"moves from unengaged to engaged"
- correct en.ts, which claimed UUPG and WAGF stay unchanged in every
edition; es ships GENANC/FMAD, pt PNANE and de UVG/VUVG
- render the filter dropdown's empty-state through i18n, so the
no_options translation it already computed reaches the component
- a term with an acronym now yields the acronym as its own pair, so a
bare UUPG in source text takes this language's acronym instead of
whatever the model invents
- sync-language says the wording never carries the acronym, and names
the strings that hold a bare one