Update from source 6f20917eb
Some checks are pending
Deploy to GitHub Pages / build (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Blocked by required conditions

This commit is contained in:
Doxa Maps 2026-09-28 02:30:40 +00:00
parent 33ba66e297
commit b253f391c5
54 changed files with 760 additions and 429 deletions

View file

@ -0,0 +1,80 @@
#!/usr/bin/env node
/**
* generate-wagf-region-names.mjs — the WAGF region names, in the reader's language, from vendored CLDR.
*
* ★ THE DEFECT (rega KA3, 3d64bcad, ?lang=ar). Big Picture's region chart labels its bars with the
* prayer API's ENGLISH region names — "Africa", "Asia", "Latin America & Caribbean" — on an Arabic page.
* They are not chrome and no catalogue held them: they are DATA labels, so every i18n gate was green
* while the chart read English to every reader. The regions are a closed set of seven
* (library/colors/wagf-region.js WAGF_REGIONS), which is what makes cataloguing them possible at all.
*
* ★ WHY GENERATED AND NOT HAND-AUTHORED. Ten locales x seven names is seventy strings I cannot write.
* Five of the seven ARE standard UN M49 macro-regions, so CLDR already names them in every locale we
* ship, and Node's own ICU is the same data library/utils/countryName.js already trusts for countries.
* Generating is what keeps a translation out of my hands: the strings are copied from CLDR, committed,
* and reviewable, and re-running this reproduces them byte for byte.
*
* africa -> 002 · asia -> 142 · europe -> 150 · latin_america_&_caribbean -> 419 · oceania -> 009
*
* ★ TWO REGIONS ARE DELIBERATELY NOT WRITTEN, because CLDR has no code that means them:
* · middle_east — M49 145 is "Western Asia", a different set (it includes the Caucasus and excludes
* Egypt). Naming it "Western Asia" in ten locales would silently redraw the region.
* · north_america_&_non-spanish_caribbean — M49 021 is "Northern America", which excludes the
* Caribbean this bucket exists to include.
* Both stay English until the agent rules on a translation source. An English label a reader can
* still match to the map beats a localized label that names the wrong territory.
*
* ★ AND ONE SCOPE NOTE ON 419: CLDR's long name is "Latin America" while our label says
* "Latin America & Caribbean". The ENGLISH entry keeps our wording (it is the authored, authoritative
* one); the other ten take CLDR's, which omits the Caribbean from the NAME while the bucket still holds
* it. Recorded here rather than silently accepted — the alternative was English in ten locales.
*
* node internal/generate-wagf-region-names.mjs # write
* node internal/generate-wagf-region-names.mjs --check # verify the catalogue matches CLDR (CI)
*/
import { readFileSync, writeFileSync } from 'node:fs'
import { resolve, dirname, join } from 'node:path'
import { fileURLToPath } from 'node:url'
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..')
const CHECK = process.argv.includes('--check')
const M49 = { africa: '002', asia: '142', europe: '150', 'latin_america_&_caribbean': '419', oceania: '009' }
const HELD = ['middle_east', 'north_america_&_non-spanish_caribbean']
const LOCALES = ['ar', 'de', 'en', 'es', 'fr', 'hi', 'it', 'pt', 'ro', 'ru', 'zh']
// The English entries stay as the product authored them (see the 419 note above); every other locale
// is CLDR's. Read from the one file that already owns the region set, so a seventh region added there
// shows up here as a missing name rather than as a silent English label.
const { WAGF_REGIONS } = await import(join(ROOT, 'library/colors/wagf-region.js'))
const names = (lc) => {
const dn = new Intl.DisplayNames([lc], { type: 'region' })
const out = {}
for (const [slug, code] of Object.entries(M49)) out[slug] = lc === 'en' ? WAGF_REGIONS[slug] : dn.of(code)
return out
}
let wrote = 0
const drift = []
for (const lc of LOCALES) {
const p = join(ROOT, 'library/i18n/locales', lc, 'dashboard.json')
const cat = JSON.parse(readFileSync(p, 'utf8'))
const want = names(lc)
if (CHECK) {
const have = cat.wagfRegion || {}
for (const [k, v] of Object.entries(want)) if (have[k] !== v) drift.push(`${lc}.wagfRegion.${k}: catalogue ${JSON.stringify(have[k])} vs CLDR ${JSON.stringify(v)}`)
continue
}
cat.wagfRegion = want
writeFileSync(p, JSON.stringify(cat, null, 2) + '\n')
wrote++
}
const unaccounted = Object.keys(WAGF_REGIONS).filter((s) => !M49[s] && !HELD.includes(s))
if (unaccounted.length) {
console.error(`WAGF-REGION-NAMES: FAIL — ${unaccounted.length} region(s) in WAGF_REGIONS have neither a CLDR code nor a recorded reason: ${unaccounted.join(', ')}`)
process.exit(1)
}
if (CHECK) {
if (drift.length) { console.error(`WAGF-REGION-NAMES: FAIL — ${drift.length} catalogue entry(ies) no longer match CLDR:\n ${drift.join('\n ')}`); process.exit(1) }
console.log(`WAGF-REGION-NAMES: PASS — ${Object.keys(M49).length} name(s) x ${LOCALES.length} locale(s) match vendored CLDR; ${HELD.length} held in English on purpose (${HELD.join(', ')}).`)
} else {
console.log(`WAGF-REGION-NAMES: wrote ${Object.keys(M49).length} name(s) into ${wrote} locale catalogue(s); ${HELD.length} held in English (${HELD.join(', ')}).`)
}

View file

@ -45,3 +45,43 @@ export function openPrintFrame(bodyHtml, { autoprint = false } = {}) {
return frame.contentWindow return frame.contentWindow
} }
/**
* Print a rendered poster IMAGE, at its real paper size, through the same in-place frame.
*
* ★ THE DRIVER'S RULE (2026-09-28): an "Export poster" button opens the PRINT DIALOG with a preview.
* It never hands over a file. Simple Research was rendering a PNG and calling a download helper, so
* the reader got doxa-prayer-poster.png in their downloads folder and no preview, no paper size, and
* no way to print it without opening it somewhere else first. The dialog IS the preview: the sheet the
* browser shows is the poster, at the size the spec asked for.
*
* @page carries the spec's own inches so the preview is not letter-shaped by default — a 8.5x11
* poster previewed on A4 is a different document from the one that was rendered. margin:0 because the
* renderer already composed the margins into the image; a second set would scale the poster down.
*
* The object URL is revoked on afterprint AND on the frame's 60s reclaim, since afterprint does not
* fire in every engine when the dialog is dismissed. Revoking early would blank the preview, so the
* image element is kept alive by the frame itself rather than by a timer here.
*
* Returns true when the dialog was opened, false when the host blocked the frame — the caller decides
* what to do about it, because a silent no-op is exactly the failure this replaced.
*/
export function printImageBlob(blob, { widthIn = 8.5, heightIn = 11, title = '', alt = '' } = {}) {
if (!blob || typeof URL === 'undefined' || !URL.createObjectURL) return false
const url = URL.createObjectURL(blob)
const esc = (v) => String(v).replace(/[&<>"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]))
// The image is sized by the PAGE, not by its pixels: object-fit keeps a poster rendered at any DPI
// on its own sheet without cropping. The <img> also gates the print — openPrintFrame's bootstrap
// waits for load, which is what keeps the first page from printing blank.
const html = `<!doctype html><html><head><meta charset="utf-8"><title>${esc(title)}</title>`
+ `<style>@page{size:${widthIn}in ${heightIn}in;margin:0}`
+ 'html,body{margin:0;padding:0;background:#fff}'
+ 'img{display:block;width:100%;height:100%;object-fit:contain}</style></head>'
+ `<body><img src="${url}" alt="${esc(alt || title)}"></body></html>`
const win = openPrintFrame(html, { autoprint: true })
if (!win) { URL.revokeObjectURL(url); return false }
const revoke = () => { try { URL.revokeObjectURL(url) } catch { /* already gone */ } }
try { win.addEventListener('afterprint', () => setTimeout(revoke, 0)) } catch { /* cross-doc guard */ }
setTimeout(revoke, 60000)
return true
}

View file

@ -482,7 +482,6 @@ export function useMapClustering(options = {}) {
} }
_attachClusterClickHandler(map); _attachClusterClickHandler(map);
console.log(`[${mapId}] Clustering: mapbox-native applied (${features.length} features)`);
} }
/** /**
@ -566,10 +565,6 @@ export function useMapClustering(options = {}) {
_setLayerVisibility(map, CLUSTER_LINES_LAYER, true); _setLayerVisibility(map, CLUSTER_LINES_LAYER, true);
} }
console.log(
`[${mapId}] Clustering: ${algorithm} applied — ` +
`${lines.length} lines across ${stats?.totalGroups ?? 0} groups`
);
} }
// ───────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────

View file

@ -78,5 +78,12 @@
"selected_first": "المحدَّدة أولاً", "selected_first": "المحدَّدة أولاً",
"selected_first_hint": "رفع الشعوب المحدَّدة إلى الأعلى مع الإبقاء على ترتيب الأعمدة", "selected_first_hint": "رفع الشعوب المحدَّدة إلى الأعلى مع الإبقاء على ترتيب الأعمدة",
"n_shown": "{n} معروض", "n_shown": "{n} معروض",
"other": "أخرى" "other": "أخرى",
"wagfRegion": {
"africa": "أفريقيا",
"asia": "آسيا",
"europe": "أوروبا",
"latin_america_&_caribbean": "أمريكا اللاتينية",
"oceania": "أوقيانوسيا"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "Ausgewählte zuerst", "selected_first": "Ausgewählte zuerst",
"selected_first_hint": "Die ausgewählten Volksgruppen nach oben holen, die Spaltensortierung bleibt erhalten", "selected_first_hint": "Die ausgewählten Volksgruppen nach oben holen, die Spaltensortierung bleibt erhalten",
"n_shown": "{n} angezeigt", "n_shown": "{n} angezeigt",
"other": "Andere" "other": "Andere",
"wagfRegion": {
"africa": "Afrika",
"asia": "Asien",
"europe": "Europa",
"latin_america_&_caribbean": "Lateinamerika",
"oceania": "Ozeanien"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "Selected first", "selected_first": "Selected first",
"selected_first_hint": "Float the selected people groups to the top, keeping your column sort", "selected_first_hint": "Float the selected people groups to the top, keeping your column sort",
"n_shown": "{n} shown", "n_shown": "{n} shown",
"other": "Other" "other": "Other",
"wagfRegion": {
"africa": "Africa",
"asia": "Asia",
"europe": "Europe",
"latin_america_&_caribbean": "Latin America & Caribbean",
"oceania": "Oceania"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "Los seleccionados primero", "selected_first": "Los seleccionados primero",
"selected_first_hint": "Llevar arriba los grupos de personas seleccionados, manteniendo el orden de las columnas", "selected_first_hint": "Llevar arriba los grupos de personas seleccionados, manteniendo el orden de las columnas",
"n_shown": "{n} mostrados", "n_shown": "{n} mostrados",
"other": "Otros" "other": "Otros",
"wagfRegion": {
"africa": "África",
"asia": "Asia",
"europe": "Europa",
"latin_america_&_caribbean": "Latinoamérica",
"oceania": "Oceanía"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "La sélection en premier", "selected_first": "La sélection en premier",
"selected_first_hint": "Faire remonter les groupes de personnes sélectionnés, en conservant le tri des colonnes", "selected_first_hint": "Faire remonter les groupes de personnes sélectionnés, en conservant le tri des colonnes",
"n_shown": "{n} affichés", "n_shown": "{n} affichés",
"other": "Autres" "other": "Autres",
"wagfRegion": {
"africa": "Afrique",
"asia": "Asie",
"europe": "Europe",
"latin_america_&_caribbean": "Amérique latine",
"oceania": "Océanie"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "चयनित पहले", "selected_first": "चयनित पहले",
"selected_first_hint": "चयनित जनसमूहों को ऊपर लाएँ, आपका कॉलम क्रम बनाए रखते हुए", "selected_first_hint": "चयनित जनसमूहों को ऊपर लाएँ, आपका कॉलम क्रम बनाए रखते हुए",
"n_shown": "{n} दिखाए गए", "n_shown": "{n} दिखाए गए",
"other": "अन्य" "other": "अन्य",
"wagfRegion": {
"africa": "अफ़्रीका",
"asia": "एशिया",
"europe": "यूरोप",
"latin_america_&_caribbean": "लैटिन अमेरिका",
"oceania": "ओशिआनिया"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "Prima i selezionati", "selected_first": "Prima i selezionati",
"selected_first_hint": "Porta in alto i gruppi di persone selezionati, mantenendo l’ordinamento delle colonne", "selected_first_hint": "Porta in alto i gruppi di persone selezionati, mantenendo l’ordinamento delle colonne",
"n_shown": "{n} mostrati", "n_shown": "{n} mostrati",
"other": "Altri" "other": "Altri",
"wagfRegion": {
"africa": "Africa",
"asia": "Asia",
"europe": "Europa",
"latin_america_&_caribbean": "America Latina",
"oceania": "Oceania"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "Os selecionados primeiro", "selected_first": "Os selecionados primeiro",
"selected_first_hint": "Trazer para cima os grupos de pessoas selecionados, mantendo a ordenação das colunas", "selected_first_hint": "Trazer para cima os grupos de pessoas selecionados, mantendo a ordenação das colunas",
"n_shown": "{n} apresentados", "n_shown": "{n} apresentados",
"other": "Outros" "other": "Outros",
"wagfRegion": {
"africa": "África",
"asia": "Ásia",
"europe": "Europa",
"latin_america_&_caribbean": "América Latina",
"oceania": "Oceania"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "Cele selectate primele", "selected_first": "Cele selectate primele",
"selected_first_hint": "Ridică grupurile de oameni selectate în partea de sus, păstrând sortarea coloanelor", "selected_first_hint": "Ridică grupurile de oameni selectate în partea de sus, păstrând sortarea coloanelor",
"n_shown": "{n} afișate", "n_shown": "{n} afișate",
"other": "Altele" "other": "Altele",
"wagfRegion": {
"africa": "Africa",
"asia": "Asia",
"europe": "Europa",
"latin_america_&_caribbean": "America Latină",
"oceania": "Oceania"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "Выбранные сначала", "selected_first": "Выбранные сначала",
"selected_first_hint": "Поднять выбранные народы наверх, сохранив сортировку столбцов", "selected_first_hint": "Поднять выбранные народы наверх, сохранив сортировку столбцов",
"n_shown": "{n} показано", "n_shown": "{n} показано",
"other": "Другое" "other": "Другое",
"wagfRegion": {
"africa": "Африка",
"asia": "Азия",
"europe": "Европа",
"latin_america_&_caribbean": "Латинская Америка",
"oceania": "Океания"
}
} }

View file

@ -78,5 +78,12 @@
"selected_first": "所选优先", "selected_first": "所选优先",
"selected_first_hint": "将所选民族置顶,同时保留您的列排序", "selected_first_hint": "将所选民族置顶,同时保留您的列排序",
"n_shown": "显示 {n} 个", "n_shown": "显示 {n} 个",
"other": "其他" "other": "其他",
"wagfRegion": {
"africa": "非洲",
"asia": "亚洲",
"europe": "欧洲",
"latin_america_&_caribbean": "拉丁美洲",
"oceania": "大洋洲"
}
} }

View file

@ -42,6 +42,7 @@ import countries from '../data/countries.json'
const ALPHA2 = table.map const ALPHA2 = table.map
const ENGLISH = new Map(countries.map((c) => [c.value, c.label])) const ENGLISH = new Map(countries.map((c) => [c.value, c.label]))
const BY_ENGLISH = new Map(countries.map((c) => [String(c.label).trim().toLowerCase(), c.value]))
/** The alpha-2 for an alpha-3 code, or undefined. Exported because callers building URLs and flag /** The alpha-2 for an alpha-3 code, or undefined. Exported because callers building URLs and flag
* assets need the same lookup, and a second copy of it would drift. */ * assets need the same lookup, and a second copy of it would drift. */
@ -49,6 +50,24 @@ export function alpha2Of(iso3) {
return iso3 ? ALPHA2[String(iso3).toUpperCase()] : undefined return iso3 ? ALPHA2[String(iso3).toUpperCase()] : undefined
} }
/**
* The alpha-3 for a canonical ENGLISH country name, or undefined.
*
* ★ FOR LABELS THAT ARRIVE IN ENGLISH WITH NO CODE ATTACHED — the case the header's ✓ names. Big
* Picture's top-countries chart aggregates on the prayer API's English country LABEL, so by the time a
* bar is drawn the alpha-3 is gone and only "India" is in hand. Reversing our own countries.json is
* exact where it matches and silent where it does not, which is the only safe shape here: an unmatched
* name keeps rendering as itself rather than becoming a code or a blank.
*
* Built from the SAME table englishName() reads, so the two can never disagree about which name is
* canonical. Names are compared case-insensitively and trimmed; nothing else is normalized, because a
* looser match is how "Congo" would quietly become the wrong country.
*/
export function iso3ForEnglishName(name) {
if (!name) return undefined
return BY_ENGLISH.get(String(name).trim().toLowerCase())
}
/** The canonical English name, or undefined. */ /** The canonical English name, or undefined. */
export function englishName(iso3) { export function englishName(iso3) {
return iso3 ? ENGLISH.get(String(iso3).toUpperCase()) : undefined return iso3 ? ENGLISH.get(String(iso3).toUpperCase()) : undefined

View file

@ -65,8 +65,8 @@
"check:embedder-keys": "node plugin-designs/regions-dashboard/scripts/check-embedder-keys.mjs", "check:embedder-keys": "node plugin-designs/regions-dashboard/scripts/check-embedder-keys.mjs",
"check:english-leaks": "node internal/check-gospel-english-leaks.mjs", "check:english-leaks": "node internal/check-gospel-english-leaks.mjs",
"check:experimental-shelf": "node internal/check-experimental-shelf.mjs", "check:experimental-shelf": "node internal/check-experimental-shelf.mjs",
"check:export-one-click": "node plugin-designs/doxa-research-map/scripts/check-export-one-click.mjs", "check:export-poster-prints": "node plugin-designs/doxa-research-map/scripts/check-export-poster-prints.mjs",
"check:export-one-click:maplibre": "node plugin-designs/doxa-research-map/scripts/check-export-one-click.mjs --provider maplibre", "check:export-poster-prints:maplibre": "node plugin-designs/doxa-research-map/scripts/check-export-poster-prints.mjs --provider maplibre",
"check:facet-cascade": "node internal/check-facet-cascade.mjs", "check:facet-cascade": "node internal/check-facet-cascade.mjs",
"check:facet-cascade:offline": "node internal/check-facet-cascade.mjs --offline", "check:facet-cascade:offline": "node internal/check-facet-cascade.mjs --offline",
"check:facet-cascade:self-test": "node internal/check-facet-cascade.mjs --self-test", "check:facet-cascade:self-test": "node internal/check-facet-cascade.mjs --self-test",
@ -332,8 +332,8 @@
"check:embedder-keys": "regions-mfe forwards page-scoped config to its nested panes by an explicit key list (INHERITED_PAGE_KEYS). Asserts the documented embedder keys travel (dataSource, tokenUrl among them) AND that profile and instanceId do NOT: the host's would overwrite each pane's own and collapse both tabs into one view.", "check:embedder-keys": "regions-mfe forwards page-scoped config to its nested panes by an explicit key list (INHERITED_PAGE_KEYS). Asserts the documented embedder keys travel (dataSource, tokenUrl among them) AND that profile and instanceId do NOT: the host's would overwrite each pane's own and collapse both tabs into one view.",
"check:english-leaks": "A translated key must not render in English. rega's method: a string is a LEAK when the catalogue has a DIFFERENT value for the locale and the page still shows the English one - a render/wiring fault, not a missing translation. Third-party attributions, data names, placeholder-only strings and the prose this bundle deliberately keeps in English are all excluded, the last by simply not being in the catalogue. Scoped to the LEAF on purpose: six keys were reported leaking in the gallery and the leaf is clean in ar/zh/ru/hi - the gallery builds its iframe src with no lang parameter, so the embed never learns the locale. Embedder defect, not a bundle one.", "check:english-leaks": "A translated key must not render in English. rega's method: a string is a LEAK when the catalogue has a DIFFERENT value for the locale and the page still shows the English one - a render/wiring fault, not a missing translation. Third-party attributions, data names, placeholder-only strings and the prose this bundle deliberately keeps in English are all excluded, the last by simply not being in the catalogue. Scoped to the LEAF on purpose: six keys were reported leaking in the gallery and the leaf is clean in ar/zh/ru/hi - the gallery builds its iframe src with no lang parameter, so the embed never learns the locale. Embedder defect, not a bundle one.",
"check:experimental-shelf": "Every Experimental-folder bundle, leaf + Gallery tab, mapbox + maplibre: mounts with content, 0 errors / failed requests, maps load and DRAW their own data. Self-tests on a deliberately broken bundle first. Run through internal/browser-slot.sh.", "check:experimental-shelf": "Every Experimental-folder bundle, leaf + Gallery tab, mapbox + maplibre: mounts with content, 0 errors / failed requests, maps load and DRAW their own data. Self-tests on a deliberately broken bundle first. Run through internal/browser-slot.sh.",
"check:export-one-click": "the Simple Research 'Export poster' button gives a FILE on ONE click (no menu, no dialog, no second step): leaf AND Research Gallery, en AND ar; the file is a real print PNG (US Letter @200 DPI); 0 page errors. Run inside the shared browser slot. Exit 2 = SKIP, 75 = NOT MEASURED.", "check:export-poster-prints": "the Simple Research 'Export poster' button opens the PRINT DIALOG on the poster in ONE click and downloads NOTHING (the agent's rule, 2026-09-28): leaf AND Research Gallery, en AND ar; the printing document is the 1700x2200 poster on an 8.5in x 11in sheet; no download arrives; 0 page errors. window.print is stubbed, so this measures everything up to the dialog. Replaces check:export-one-click, which asserted the download this rule forbids. Run inside the shared browser slot. Exit 2 = SKIP, 75 = NOT MEASURED.",
"check:export-one-click:maplibre": "the same four one-click exports on the keyless MapLibre engine (OpenFreeMap tiles): the hidden print map must be built with the engine that drew the screen, and the footer must credit the tiles actually printed.", "check:export-poster-prints:maplibre": "the same four one-click prints on the keyless MapLibre engine (OpenFreeMap tiles): the hidden print map must be built with the engine that drew the screen, and the footer must credit the tiles actually printed.",
"check:facet-cascade": "a child facet selection must not outlive its parent: clearing a parent facet must cascade-clear its descendants on EVERY clear path. Asserts on RESULT COUNTS, not DOM — an orphaned child silently ANDs the map to empty. run check:facet-cascade:self-test for the NEGATIVE test (reverts the cascade and requires this gate to FAIL).", "check:facet-cascade": "a child facet selection must not outlive its parent: clearing a parent facet must cascade-clear its descendants on EVERY clear path. Asserts on RESULT COUNTS, not DOM — an orphaned child silently ANDs the map to empty. run check:facet-cascade:self-test for the NEGATIVE test (reverts the cascade and requires this gate to FAIL).",
"check:facet-changes-map": "a facet selection must CHANGE THE DOTS — and the dots must SAY what they mean. Asserts (1) the rd-bubbles feature set changes by count AND identity, (2) every surviving dot satisfies the selected level, (3) while a prayer filter is active circle-color is a DATA-DRIVEN EXPRESSION reading peoplePraying, not a flat literal. Assertion 3 is the one that matters: the prayer filter ALREADY narrowed 2107->689 correctly while the agent reported it broken, because every dot painted the same orange. Browser gate (needs `bun run dev` on 5173, or BASE_URL/PROBE_PATH at a served tree), so NOT in build:unlocked. run the `check:facet-changes-map:self-test` script for the NEGATIVE test.", "check:facet-changes-map": "a facet selection must CHANGE THE DOTS — and the dots must SAY what they mean. Asserts (1) the rd-bubbles feature set changes by count AND identity, (2) every surviving dot satisfies the selected level, (3) while a prayer filter is active circle-color is a DATA-DRIVEN EXPRESSION reading peoplePraying, not a flat literal. Assertion 3 is the one that matters: the prayer filter ALREADY narrowed 2107->689 correctly while the agent reported it broken, because every dot painted the same orange. Browser gate (needs `bun run dev` on 5173, or BASE_URL/PROBE_PATH at a served tree), so NOT in build:unlocked. run the `check:facet-changes-map:self-test` script for the NEGATIVE test.",
"check:facet-changes-map:built": "the SAME gate against the BUILT tree instead of the dev server. Measured 2026-09-24: the dev default is 1 PASS / 3 FAIL in four runs on a busy box (88 unbundled module requests vs the built leaf's 3), while the built tree passes deterministically. Use this when you need a trustworthy answer; use the dev default when checking uncommitted source.", "check:facet-changes-map:built": "the SAME gate against the BUILT tree instead of the dev server. Measured 2026-09-24: the dev default is 1 PASS / 3 FAIL in four runs on a busy box (88 unbundled module requests vs the built leaf's 3), while the built tree passes deterministically. Use this when you need a trustworthy answer; use the dev default when checking uncommitted source.",

View file

@ -1299,16 +1299,17 @@ watch(() => mapStore.selectedRegion, (key) => {
// required getMap, so it mounted invisible; and the old loader called useMapPoster({ sourceMap, … }) // required getMap, so it mounted invisible; and the old loader called useMapPoster({ sourceMap, … })
// with an OBJECT where the shared composable takes a FUNCTION, so a render would have thrown anyway. // with an OBJECT where the shared composable takes a FUNCTION, so a render would have thrown anyway.
// Now the button does the export itself, through the SHARED poster path (useMapPoster → render → // Now the button does the export itself, through the SHARED poster path (useMapPoster → render →
// download), with a sensible print default: the current view on US Letter portrait at 200 DPI, the // print), with a sensible print default: the current view on US Letter portrait at 200 DPI, the
// legend title and rows, and a source/date footer. No dialog, no second step. // legend title and rows, and a source/date footer. One click, one dialog, the poster in the preview.
const posterBusy = ref(false) const posterBusy = ref(false)
async function openPoster() { async function openPoster() {
if (posterBusy.value) return if (posterBusy.value) return
posterBusy.value = true posterBusy.value = true
try { try {
const [{ useMapPoster }, { defaultPosterSpec }] = await Promise.all([ const [{ useMapPoster }, { defaultPosterSpec }, { printImageBlob }] = await Promise.all([
import('@map/composables/poster/useMapPoster.js'), import('@map/composables/poster/useMapPoster.js'),
import('@map/constants/posterDefaults.js'), import('@map/constants/posterDefaults.js'),
import('@map/composables/printInPlace.js'),
]) ])
const exporter = useMapPoster(() => map.value) const exporter = useMapPoster(() => map.value)
const spec = defaultPosterSpec({ widthIn: 8.5, heightIn: 11, dpi: 200, orientation: 'portrait' }) const spec = defaultPosterSpec({ widthIn: 8.5, heightIn: 11, dpi: 200, orientation: 'portrait' })
@ -1333,19 +1334,31 @@ async function openPoster() {
spec.slots.footer = { ...spec.slots.footer, left: 'pray.doxa.life', right: new Date().toISOString().slice(0, 10), spec.slots.footer = { ...spec.slots.footer, left: 'pray.doxa.life', right: new Date().toISOString().slice(0, 10),
attribution: onMaplibre ? '© OpenFreeMap © OpenMapTiles © OpenStreetMap' : '© Mapbox © OpenStreetMap' } attribution: onMaplibre ? '© OpenFreeMap © OpenMapTiles © OpenStreetMap' : '© Mapbox © OpenStreetMap' }
const blob = await exporter.render(spec, 'png') const blob = await exporter.render(spec, 'png')
// File name from the view's id, not its title: an Arabic or Chinese title has no ASCII letters // ★ THE DIALOG, NOT A DOWNLOAD (the agent, 2026-09-28: an export-poster button must open the
// to keep, and every reader's file would otherwise be the same "doxa-map-poster.png". // print dialog with a poster preview, never hand over a file). This used to call _downloadBlob,
const slug = String(activeTab.value?.id || '').replace(/[^a-z0-9]+/gi, '-').replace(/^-+|-+$/g, '').toLowerCase() // so the reader got a PNG in their downloads folder with no preview, no paper size and no way to
_downloadBlob(blob, 'doxa-' + (slug || 'map') + '-poster.png') // print it without opening it somewhere else first. printImageBlob puts the rendered poster on a
// sheet of exactly the spec's size and raises the dialog over the map — the preview IS the poster.
// The same in-place frame the agent's earlier ruling settled on: no pop-up, no blocker, and it
// works when an agent triggers it without a user gesture.
const printed = printImageBlob(blob, {
widthIn: spec.widthIn ?? 8.5,
heightIn: spec.heightIn ?? 11,
title,
alt: title,
})
// An unopenable frame (sandboxed or detached host) is reported, not silently swallowed: a button
// that looks like it worked and did nothing is the defect this whole path has already had once.
if (!printed) console.error('[research-map] poster print: the host blocked the print frame')
} catch (err) { } catch (err) {
console.error('[research-map] poster export failed:', err) console.error('[research-map] poster export failed:', err)
} finally { } finally {
posterBusy.value = false posterBusy.value = false
} }
} }
// The toolbar's export label: the drawer's translated 'Export poster…' WITHOUT the ellipsis — an // The toolbar's export label, WITH its ellipsis. The ellipsis was stripped while this button handed
// ellipsis promises a dialog, and this button hands over the file directly. // over a file directly; it now opens the print dialog, which is exactly what an ellipsis promises.
const exportPosterLabel = computed(() => String(t('controls.export_poster') || 'Export poster').replace(/\s*…\s*$/, '')) const exportPosterLabel = computed(() => String(t('controls.export_poster') || 'Export poster…'))
// ─── Export menu router (SemanticTreeLegend @export) ───────────────────────── // ─── Export menu router (SemanticTreeLegend @export) ─────────────────────────
// EXPERIMENTAL — dormant behind the shared kill-switch (SHOW_EXPORT_BUTTON). // EXPERIMENTAL — dormant behind the shared kill-switch (SHOW_EXPORT_BUTTON).

View file

@ -1,118 +0,0 @@
#!/usr/bin/env node
/**
* check-export-one-click.mjs — the Simple Research "Export poster" button gives you a FILE on ONE
* click, with no menu, dialog or second step, in its own leaf AND inside the Research Gallery, in
* en AND ar.
*
* WHY (card BUILD-SIMPLE-RESEARCH-EXPORT-ZERO-CLICK; the agent: "there's an export button on the
* simple dashboard ... get it working"). Measured 2026-09-25 before the fix: one click produced
* NOTHING — no dialog, no file within 60s, no error — in both hosts. A silent dead button reads as
* "the export is slow" to a reader, never as "it is broken", so no other gate could see it.
*
* WHAT IT ASSERTS, per host × language:
* 1. exactly ONE click on the ALWAYS-VISIBLE export button in the map toolbar (button.export-poster-btn).
* The drawer's "Export poster…" does not count: the drawer is CLOSED by default (translated off
* screen), so it costs an extra click to reach — measured 2026-09-25, and in Arabic the button
* could not be clicked at all. The toolbar button must be on screen with no preparation;
* 2. a download arrives within 120s, WITHOUT any further click;
* 3. the file is a real PNG (signature) of the print size (US Letter at 200 DPI = 1700x2200);
* 4. 0 page errors.
*
* Runs through internal/browser-slot.sh like every browser gate. Starts its own servers on
* OS-assigned ports and proves the server is THIS checkout's tree before measuring.
* --provider maplibre runs the same four on the keyless engine.
* EXPORT_SAVE_DIR=<dir> keeps each downloaded poster (<host>-<lang>-<file>) so a person can look at it.
* Exit: 0 pass · 1 fail · 2 SKIP (no built tree / no playwright) · 75 NOT MEASURED (server identity)
*/
import { createServer } from 'node:http'
import { spawn } from 'node:child_process'
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
import { resolve, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..')
// The tree's name comes from the build config, never a literal: the doxa-maps -> dx-maps rename
// turned the literal into a silent SKIP (exit 2) that measured nothing.
const { TREE_NAME } = await import(resolve(ROOT, 'internal/_tree-name.mjs'))
if (!existsSync(resolve(ROOT, `public/${TREE_NAME}/research-map-plus-grid/research-map-plus-grid.js`))) {
console.log('SKIP check-export-one-click: no built research-map-plus-grid'); process.exit(2)
}
let chromium
try { ({ chromium } = await import('playwright')) } catch { console.log('SKIP check-export-one-click: playwright not installed'); process.exit(2) }
const freePort = () => new Promise(ok => { const s = createServer().listen(0, '127.0.0.1', () => { const p = s.address().port; s.close(() => ok(p)) }) })
const PROVIDER = process.argv.includes('--provider') ? process.argv[process.argv.indexOf('--provider') + 1] : '' // maplibre = the keyless engine
const TP = await freePort(), HP = await freePort()
const TREE = `http://127.0.0.1:${TP}/${TREE_NAME}`
let lang = 'en'
const srv = spawn(process.execPath, ['internal/serve-strict.mjs', '--port', String(TP)], { cwd: ROOT, stdio: 'ignore' })
const host = createServer((_, r) => { r.writeHead(200, { 'content-type': 'text/html' }); r.end(`<!doctype html><html lang="${lang}"><body style="margin:0"><script src="${TREE}/doxa-maps-spa/doxa-maps-spa.js"></script><doxa-maps-spa tab="research-map-plus-grid"${PROVIDER ? ` provider="${PROVIDER}"` : ''} style="height:900px"></doxa-maps-spa></body></html>`) }).listen(HP, 'localhost')
const cleanup = () => { try { srv.kill() } catch {} try { host.close() } catch {} }
await new Promise(r => setTimeout(r, 800))
// Server identity by CONTENT: the served manifest must be this checkout's.
{
const disk = readFileSync(resolve(ROOT, `public/${TREE_NAME}/manifest.json`), 'utf8')
let served = ''
for (let i = 0; i < 20 && !served; i++) {
try { const r = await fetch(`${TREE}/manifest.json`); if (r.ok) served = await r.text() } catch { /* not up yet */ }
if (!served) await new Promise(r => setTimeout(r, 300))
}
if (served !== disk) { console.log(`NOT MEASURED: :${TP} is not serving this checkout's tree. Re-run.`); cleanup(); process.exit(75) }
}
const b = await chromium.launch({ args: ['--use-angle=swiftshader', '--enable-unsafe-swiftshader'] })
const fails = []
try {
for (lang of ['en', 'ar']) for (const where of ['leaf', 'gallery']) {
const url = where === 'leaf' ? `${TREE}/research-map-plus-grid/research-map-plus-grid/index.html?lang=${lang}${PROVIDER ? `&provider=${PROVIDER}` : ''}` : `http://localhost:${HP}/`
const ctx = await b.newContext({ acceptDownloads: true, viewport: { width: 1400, height: 900 } })
const p = await ctx.newPage(); const errs = []
p.on('pageerror', e => errs.push(String(e).slice(0, 160)))
// A failed export is CAUGHT and logged (console.error), never thrown: read the console, or a dead
// button reports "no file" with no reason.
const consoleErrs = []; p.on('console', m => { if (m.type() === 'error' || m.type() === 'warning') consoleErrs.push(m.text().slice(0, 200)) })
const downloads = []; p.on('download', d => downloads.push(d))
await p.goto(url); await p.waitForTimeout(12000)
const btn = p.locator('button.export-poster-btn').first()
const onScreen = await btn.evaluate(el => { const r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0 && r.left >= 0 && r.top >= 0 && r.right <= innerWidth && r.bottom <= innerHeight }).catch(() => false)
if (!onScreen) errs.push('the export button is not on screen without a prior click')
const label = ((await btn.getAttribute('title', { timeout: 20000 }).catch(() => '')) || '').trim()
let clicks = 0
// ONE PHYSICAL CLICK at the button's centre, as a reader makes it. Not locator.click(): that
// re-checks its hit target and RETRIES, and by the retry the button is already disabled (the
// export is running), so it reported "timeout" on exports whose file then arrived — measured
// 2026-09-25 in gallery-ar and leaf-en. What the click achieved is judged by the file below.
try {
const box = await btn.boundingBox({ timeout: 20000 })
if (!box) throw new Error('the export button has no box')
await p.mouse.click(box.x + box.width / 2, box.y + box.height / 2); clicks = 1
} catch (e) { errs.push('could not click: ' + String(e.message || e).split('\n')[0]) }
for (let i = 0; i < 120 && !downloads.length; i++) await p.waitForTimeout(1000)
let file = null, info = ''
if (downloads.length) {
file = downloads[0].suggestedFilename()
const path = await downloads[0].path()
const buf = readFileSync(path)
if (process.env.EXPORT_SAVE_DIR) writeFileSync(resolve(process.env.EXPORT_SAVE_DIR, `${where}-${lang}${PROVIDER ? '-' + PROVIDER : ''}-${file}`), buf) // to LOOK at the poster
const png = buf.length > 24 && buf.slice(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))
const w = png ? buf.readUInt32BE(16) : 0, h = png ? buf.readUInt32BE(20) : 0
info = `${png ? 'PNG' : 'NOT-PNG'} ${w}x${h} ${Math.round(buf.length / 1024)}KB`
if (!png || w < 1600 || h < 2100) errs.push(`file is not the expected print PNG (${info})`)
}
if (!file) {
for (const c of consoleErrs.filter(c => /poster|useMapPoster/i.test(c)).slice(-2)) errs.push(c)
// SLOW or DEAD? A button still busy at the deadline is a render still running; an idle one is an
// export that ended without a file. The verdict is FAIL either way; the reason says which.
const busy = await btn.evaluate(el => el.disabled || el.getAttribute('aria-busy') === 'true').catch(() => null)
errs.push(busy ? 'still rendering at the deadline (button busy)' : 'the export ended with no file (button idle)')
}
const ok = clicks === 1 && !!file && !errs.length
console.log(`${ok ? 'PASS' : 'FAIL'} [${where} ${lang}${PROVIDER ? ' ' + PROVIDER : ''}] "${label}" · 1 click → ${file ? `${file} (${info})` : 'NO FILE within 120s'}${errs.length ? ' · ' + [...new Set(errs)].slice(0, 3).join(' | ') : ' · 0 errors'}`)
if (!ok) fails.push(`${where} ${lang}`)
await ctx.close()
}
} finally { await b.close(); cleanup() }
if (fails.length) { console.log(`\ncheck-export-one-click: FAIL (${fails.join(', ')})`); process.exit(1) }
console.log('\ncheck-export-one-click: PASS — one click on Export poster gives a print PNG, leaf and gallery, en and ar')

View file

@ -0,0 +1,156 @@
#!/usr/bin/env node
/**
* check-export-poster-prints.mjs — the Simple Research "Export poster" button opens the PRINT DIALOG
* with the poster in it, on ONE click, in its own leaf AND inside the Research Gallery, in en AND ar.
* It must NEVER hand over a file.
*
* ★ THE RULE CHANGED, AND THIS GATE ASSERTED THE OLD ONE (the agent, 2026-09-28: "an export-poster
* button must open the print dialog with a poster preview, never a direct download"). It was
* check-export-one-click, and it passed while the button did exactly what the agent has now ruled
* against: render a PNG and drop it in the downloads folder. A gate that encodes a superseded ruling
* is worse than no gate — it defends the defect. The earlier history is still why the click path is
* measured so carefully: before 2026-09-25 one click produced NOTHING, no dialog, no file, no error.
*
* WHAT IT ASSERTS, per host × language:
* 1. exactly ONE click on the ALWAYS-VISIBLE export button in the map toolbar
* (button.export-poster-btn). The drawer's "Export poster…" does not count: the drawer is CLOSED
* by default (translated off screen), so it costs an extra click to reach — measured 2026-09-25,
* and in Arabic the button could not be clicked at all;
* 2. within 120s and with no further click, some frame calls window.print();
* 3. the printing document IS the poster: an <img> at the print size (US Letter at 200 DPI =
* 1700x2200) on an @page sized 8.5in x 11in. A dialog over a blank or letter-defaulted sheet is
* not a preview of what was rendered;
* 4. NO download arrives. This is the half that encodes the new rule, and it is asserted for the
* whole run rather than at a moment, because a download that lands late is still a download;
* 5. 0 page errors.
*
* ★ window.print IS STUBBED, not called through. The native dialog is modal and would hang the run
* forever, so the init script records the call and returns. That makes this a test of everything up to
* the dialog — the frame, the sheet size and the image — and not of the browser's own chrome, which is
* the correct boundary for a headless gate.
*
* Runs through internal/browser-slot.sh like every browser gate. Starts its own servers on
* OS-assigned ports and proves the server is THIS checkout's tree before measuring.
* --provider maplibre runs the same four on the keyless engine.
* Exit: 0 pass · 1 fail · 2 SKIP (no built tree / no playwright) · 75 NOT MEASURED (server identity)
*/
import { createServer } from 'node:http'
import { spawn } from 'node:child_process'
import { existsSync, readFileSync } from 'node:fs'
import { resolve, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..')
// The tree's name comes from the build config, never a literal: the doxa-maps -> dx-maps rename
// turned the literal into a silent SKIP (exit 2) that measured nothing.
const { TREE_NAME } = await import(resolve(ROOT, 'internal/_tree-name.mjs'))
if (!existsSync(resolve(ROOT, `public/${TREE_NAME}/research-map-plus-grid/research-map-plus-grid.js`))) {
console.log('SKIP check-export-poster-prints: no built research-map-plus-grid'); process.exit(2)
}
let chromium
try { ({ chromium } = await import('playwright')) } catch { console.log('SKIP check-export-poster-prints: playwright not installed'); process.exit(2) }
const freePort = () => new Promise(ok => { const s = createServer().listen(0, '127.0.0.1', () => { const p = s.address().port; s.close(() => ok(p)) }) })
const PROVIDER = process.argv.includes('--provider') ? process.argv[process.argv.indexOf('--provider') + 1] : '' // maplibre = the keyless engine
const TP = await freePort(), HP = await freePort()
const TREE = `http://127.0.0.1:${TP}/${TREE_NAME}`
let lang = 'en'
const srv = spawn(process.execPath, ['internal/serve-strict.mjs', '--port', String(TP)], { cwd: ROOT, stdio: 'ignore' })
const host = createServer((_, r) => { r.writeHead(200, { 'content-type': 'text/html' }); r.end(`<!doctype html><html lang="${lang}"><body style="margin:0"><script src="${TREE}/doxa-maps-spa/doxa-maps-spa.js"></script><doxa-maps-spa tab="research-map-plus-grid"${PROVIDER ? ` provider="${PROVIDER}"` : ''} style="height:900px"></doxa-maps-spa></body></html>`) }).listen(HP, 'localhost')
const cleanup = () => { try { srv.kill() } catch {} try { host.close() } catch {} }
await new Promise(r => setTimeout(r, 800))
// Server identity by CONTENT: the served manifest must be this checkout's.
{
const disk = readFileSync(resolve(ROOT, `public/${TREE_NAME}/manifest.json`), 'utf8')
let served = ''
for (let i = 0; i < 20 && !served; i++) {
try { const r = await fetch(`${TREE}/manifest.json`); if (r.ok) served = await r.text() } catch { /* not up yet */ }
if (!served) await new Promise(r => setTimeout(r, 300))
}
if (served !== disk) { console.log(`NOT MEASURED: :${TP} is not serving this checkout's tree. Re-run.`); cleanup(); process.exit(75) }
}
const b = await chromium.launch({ args: ['--use-angle=swiftshader', '--enable-unsafe-swiftshader'] })
const fails = []
try {
for (lang of ['en', 'ar']) for (const where of ['leaf', 'gallery']) {
const url = where === 'leaf' ? `${TREE}/research-map-plus-grid/research-map-plus-grid/index.html?lang=${lang}${PROVIDER ? `&provider=${PROVIDER}` : ''}` : `http://localhost:${HP}/`
const ctx = await b.newContext({ acceptDownloads: true, viewport: { width: 1400, height: 900 } })
// Every frame, because the poster prints from an iframe the app creates (printInPlace.js). The
// override lives on the WINDOW, which survives the document.open()/write() that fills that frame.
// acceptDownloads stays TRUE on purpose: a download must be observable to be failed on.
await ctx.addInitScript(() => {
window.__printed = []
window.print = function () {
const img = document.querySelector('img')
const style = document.querySelector('style')
window.__printed.push({
imgW: img ? img.naturalWidth : 0,
imgH: img ? img.naturalHeight : 0,
page: style ? (String(style.textContent).match(/@page\{size:([^;}]+)/) || [])[1] || '' : '',
})
}
})
const p = await ctx.newPage(); const errs = []
p.on('pageerror', e => errs.push(String(e).slice(0, 160)))
// A failed export is CAUGHT and logged (console.error), never thrown: read the console, or a dead
// button reports "no file" with no reason.
const consoleErrs = []; p.on('console', m => { if (m.type() === 'error' || m.type() === 'warning') consoleErrs.push(m.text().slice(0, 200)) })
const downloads = []; p.on('download', d => downloads.push(d))
await p.goto(url); await p.waitForTimeout(12000)
const btn = p.locator('button.export-poster-btn').first()
const onScreen = await btn.evaluate(el => { const r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0 && r.left >= 0 && r.top >= 0 && r.right <= innerWidth && r.bottom <= innerHeight }).catch(() => false)
if (!onScreen) errs.push('the export button is not on screen without a prior click')
const label = ((await btn.getAttribute('title', { timeout: 20000 }).catch(() => '')) || '').trim()
let clicks = 0
// ONE PHYSICAL CLICK at the button's centre, as a reader makes it. Not locator.click(): that
// re-checks its hit target and RETRIES, and by the retry the button is already disabled (the
// export is running), so it reported "timeout" on exports whose file then arrived — measured
// 2026-09-25 in gallery-ar and leaf-en. What the click achieved is judged by the file below.
try {
const box = await btn.boundingBox({ timeout: 20000 })
if (!box) throw new Error('the export button has no box')
await p.mouse.click(box.x + box.width / 2, box.y + box.height / 2); clicks = 1
} catch (e) { errs.push('could not click: ' + String(e.message || e).split('\n')[0]) }
// Poll every frame: the print call happens in the iframe printInPlace creates, which is not
// attached when the click is made. A frame that has gone away is skipped rather than failing the
// poll — the app reclaims its print frame, and a reclaimed frame is a completed print, not an error.
const readPrints = async () => {
const out = []
for (const f of p.frames()) {
const got = await f.evaluate(() => window.__printed || []).catch(() => [])
out.push(...got)
}
return out
}
let prints = []
for (let i = 0; i < 120 && !prints.length; i++) { await p.waitForTimeout(1000); prints = await readPrints() }
let info = ''
if (prints.length) {
const pr = prints[0]
info = `${pr.imgW}x${pr.imgH} on @page ${pr.page || '(none)'}`
// The poster, at the size it was rendered, on the sheet it was rendered for.
if (pr.imgW < 1600 || pr.imgH < 2100) errs.push(`the printed document is not the poster (${info})`)
if (!/8\.5in\s+11in/.test(pr.page || '')) errs.push(`the sheet is not the poster's page size (@page ${pr.page || 'missing'})`)
} else {
for (const c of consoleErrs.filter(c => /poster|print|useMapPoster/i.test(c)).slice(-2)) errs.push(c)
// SLOW or DEAD? A button still busy at the deadline is a render still running; an idle one is an
// export that ended without opening anything. The verdict is FAIL either way; the reason says which.
const busy = await btn.evaluate(el => el.disabled || el.getAttribute('aria-busy') === 'true').catch(() => null)
errs.push(busy ? 'still rendering at the deadline (button busy)' : 'the export ended with no print dialog (button idle)')
}
// ★ THE NEW RULE'S OTHER HALF. A button that opens the dialog AND saves a file still breaks it.
if (downloads.length) errs.push(`the button downloaded a file (${downloads[0].suggestedFilename()}) instead of only printing`)
const ok = clicks === 1 && prints.length === 1 && !downloads.length && !errs.length
// Exactly one dialog: two print frames would mean the click was handled twice, which a reader sees
// as a second dialog appearing behind the first.
if (clicks === 1 && prints.length > 1) errs.push(`${prints.length} print dialogs opened on one click`)
console.log(`${ok ? 'PASS' : 'FAIL'} [${where} ${lang}${PROVIDER ? ' ' + PROVIDER : ''}] "${label}" · 1 click → ${prints.length ? `print dialog (${info})` : 'NO PRINT DIALOG within 120s'}${errs.length ? ' · ' + [...new Set(errs)].slice(0, 3).join(' | ') : ' · 0 errors, 0 downloads'}`)
if (!ok) fails.push(`${where} ${lang}`)
await ctx.close()
}
} finally { await b.close(); cleanup() }
if (fails.length) { console.log(`\ncheck-export-poster-prints: FAIL (${fails.join(', ')})`); process.exit(1) }
console.log('\ncheck-export-poster-prints: PASS — one click opens the print dialog on the poster and downloads nothing, leaf and gallery, en and ar')

View file

@ -2,7 +2,7 @@
/** /**
* region-dashboards.vue — Tab 2 ("Region Dashboards") of the regions-dashboard bundle. * region-dashboards.vue — Tab 2 ("Region Dashboards") of the regions-dashboard bundle.
* *
* @description The dashboard half of the agent's 2-tab Regions element: given a region (or a * @description The dashboard half of the 2-tab Regions element: given a region (or a
* single country inside one), it summarises that selection — headline stats plus a comparison * single country inside one), it summarises that selection — headline stats plus a comparison
* of its countries — using the SAME live people-groups endpoint and the SAME rollup fields as * of its countries — using the SAME live people-groups endpoint and the SAME rollup fields as
* regions-list.vue (tab 1), so the two tabs can never disagree about a number. * regions-list.vue (tab 1), so the two tabs can never disagree about a number.

View file

@ -2,7 +2,7 @@
/** /**
* regions-mfe.vue — the regions-dashboard NESTED-ELEMENTS MFE (the 2-tab Regions element). * regions-mfe.vue — the regions-dashboard NESTED-ELEMENTS MFE (the 2-tab Regions element).
* *
* @description The composite the agent asked for: ONE element carrying the SELECT VIEW switcher * @description The composite: ONE element carrying the SELECT VIEW switcher
* over two panes — tab 1 "Regions List" (regions-list) and tab 2 "Region Dashboards" * over two panes — tab 1 "Regions List" (regions-list) and tab 2 "Region Dashboards"
* (region-dashboards). Clicking a region or a country on tab 1 swaps to tab 2 with that * (region-dashboards). Clicking a region or a country on tab 1 swaps to tab 2 with that
* selection already applied. * selection already applied.

View file

@ -1,6 +1,8 @@
<script setup> <script setup>
import { religionFamilyLabel } from '@map/colors/religion.js' import { religionFamilyLabel } from '@map/colors/religion.js'
import { tStatic } from '@map/i18n/index.js' import { WAGF_REGIONS } from '@map/colors/wagf-region.js'
import countryName, { iso3ForEnglishName } from '@map/utils/countryName.js'
import { tStatic, getRuntimeLocale } from '@map/i18n/index.js'
/** /**
* ChartsRail — RDASH phase 5: cross-filtered charts rail. Religion donut + Region donut (doxa-region * ChartsRail — RDASH phase 5: cross-filtered charts rail. Religion donut + Region donut (doxa-region
* palette) + Top-country bar, all re-aggregating on filterSet and brushable back into it (click a * palette) + Top-country bar, all re-aggregating on filterSet and brushable back into it (click a
@ -98,9 +100,45 @@ const isActive = (facet, key) => bus.isFilterActive(facet, key)
// Two projections, one function, and both follow the same rule: the key crosses, the label is read. // Two projections, one function, and both follow the same rule: the key crosses, the label is read.
// OTHER_KEY is the rollup sentinel aggregate() produces; it must stay English on the wire (this // OTHER_KEY is the rollup sentinel aggregate() produces; it must stay English on the wire (this
// component refuses to filter on it by testing `key === 'Other'`) and be localized for a reader. // component refuses to filter on it by testing `key === 'Other'`) and be localized for a reader.
// ★ TWO MORE FACETS CARRY ENGLISH DATA LABELS, and rega read both on ?lang=ar (KA3, 3d64bcad).
// They are not chrome: no catalogue held them, so every i18n gate passed while the chart spoke English.
// · wagf_region — the prayer API's seven region names. A closed set, so they are CATALOGUED, five of
// them from vendored CLDR (internal/generate-wagf-region-names.mjs); middle_east and
// north_america_&_non-spanish_caribbean have no CLDR code that means them and stay English.
// · country_code — the API's English country name. The alpha-3 is gone by aggregation time, so
// library/utils/countryName.js reverses its own table and then asks CLDR, per the ✓ case in that
// file's header: a label that arrives in English regardless of the reader.
// English is left EXACTLY as authored: at locale 'en' both projections return the key untouched, which
// also keeps the 42 countries whose CLDR name differs from ours (see countryName.js) reading as before.
// The five keys are written out rather than assembled from the slug: a template-literal key is
// invisible to check:i18n-keys-exist (it counts such expressions as dynamic and will not guess at
// them), and these entries are generated, so the gate is the only thing standing between a regenerated
// catalogue and a chart silently back in English. Written out, deleting one fails the build.
const REGION_SLUG = new Map(Object.entries(WAGF_REGIONS).map(([slug, label]) => [label, slug]))
const REGION_KEY = {
africa: 'dashboard.wagfRegion.africa',
asia: 'dashboard.wagfRegion.asia',
europe: 'dashboard.wagfRegion.europe',
'latin_america_&_caribbean': 'dashboard.wagfRegion.latin_america_&_caribbean',
oceania: 'dashboard.wagfRegion.oceania',
}
const regionLabel = (key) => {
const slug = REGION_SLUG.get(key)
const k = slug && REGION_KEY[slug]
return (k && tStatic(k)) || key
}
const countryLabel = (key) => {
const lc = getRuntimeLocale()
if (!lc || lc === 'en') return key
const iso3 = iso3ForEnglishName(key)
return iso3 ? countryName(iso3, lc) : key
}
const legendLabel = (facet, key) => { const legendLabel = (facet, key) => {
if (key === OTHER_KEY) return otherLabel() if (key === OTHER_KEY) return otherLabel()
return facet === 'religion_family' ? religionFamilyLabel(key) : key if (facet === 'religion_family') return religionFamilyLabel(key)
if (facet === 'wagf_region') return regionLabel(key)
if (facet === 'country_code') return countryLabel(key)
return key
} }
// true when this chart's own facet has an active selection → drives the pop-out / dim-others state. // true when this chart's own facet has an active selection → drives the pop-out / dim-others state.
const hasSelection = (facet) => filterSet[facet] != null // any selection, scalar or array const hasSelection = (facet) => filterSet[facet] != null // any selection, scalar or array
@ -372,7 +410,11 @@ useShadowStyles(`
<div class="rd-bars"> <div class="rd-bars">
<div v-for="b in chart.geometry" :key="b.key" class="rd-bar" :class="{ on: isActive(chart.facet, b.key) }" <div v-for="b in chart.geometry" :key="b.key" class="rd-bar" :class="{ on: isActive(chart.facet, b.key) }"
:data-facet="chart.facet" :data-key="b.key"> :data-facet="chart.facet" :data-key="b.key">
<span class="rd-bl">{{ b.key }}</span> <!-- ★ THE BAR LABEL WAS THE ONE CHART SURFACE STILL PRINTING THE RAW KEY. The donut, its
legend and both tooltips already read legendLabel(); the bar list did not, which is why
the top-countries and region charts stayed English after the donut was fixed. Same
projector, so the two charts cannot disagree about a name again. -->
<span class="rd-bl">{{ legendLabel(chart.facet, b.key) }}</span>
<span class="rd-bt"><span class="rd-bf" :style="{ width: (b.frac * 100) + '%', background: b.color }"></span></span> <span class="rd-bt"><span class="rd-bf" :style="{ width: (b.frac * 100) + '%', background: b.color }"></span></span>
<span class="rd-bv">{{ b.value }}</span> <span class="rd-bv">{{ b.value }}</span>
</div> </div>

View file

@ -919,7 +919,13 @@ useShadowStyles(`
<div class="rd-td chk"></div> <div class="rd-td chk"></div>
<div v-for="(col, i) in COLUMNS" :key="'f-' + col.key" class="rd-td" <div v-for="(col, i) in COLUMNS" :key="'f-' + col.key" class="rd-td"
:class="{ num: col.type === 'num' }" :style="colFlex(col)"> :class="{ num: col.type === 'num' }" :style="colFlex(col)">
<template v-if="i === 0">Σ {{ fmt(rowCount) }} groups</template> <!-- ★ "groups" WAS THE LAST ENGLISH WORD IN THIS TABLE (rega KA3, ?lang=ar): the footer read
"Σ 2,107 groups" on an Arabic page. dashboard.groups already ships in all eleven locales
(ar "مجموعة"), so this is a call site that never read its own catalogue -- no new
string, no new key. Singular/plural is written the same way as the header count at
L794 -- the two say the same thing about the same number and would otherwise disagree at
one row. Σ and the numeral stay as they are: NUMERALS ARE HELD. -->
<template v-if="i === 0">Σ {{ fmt(rowCount) }} {{ rowCount === 1 ? T('dashboard.group', 'group') : T('dashboard.groups', 'groups') }}</template>
<template v-else-if="col.key === 'population'">{{ fmt(sumPop) }}</template> <template v-else-if="col.key === 'population'">{{ fmt(sumPop) }}</template>
</div> </div>
</div> </div>

View file

@ -1384,6 +1384,12 @@ function applyProjection() {
// the engine by trial instead of by identity. The helper instance-tests instead (C2). // the engine by trial instead of by identity. The helper instance-tests instead (C2).
setProjectionOn(m, projection.value) setProjectionOn(m, projection.value)
} }
// The pill's accessible name: the action, from the catalogue, in the reader's language. Both keys
// ship in all eleven locales, so this never falls back to English.
const projName = computed(() => (projection.value === 'globe'
? T('mapui.disableGlobe', 'Disable globe')
: T('mapui.enableGlobe', 'Enable globe')))
function toggleProjection() { projection.value = projection.value === 'globe' ? 'mercator' : 'globe'; applyProjection() } function toggleProjection() { projection.value = projection.value === 'globe' ? 'mercator' : 'globe'; applyProjection() }
// ── RDASH-ENHANCE: fly-to on selection. Any facet brush (tree node / chart slice / region / row) // ── RDASH-ENHANCE: fly-to on selection. Any facet brush (tree node / chart slice / region / row)
@ -1590,7 +1596,10 @@ useShadowStyles(`
the media query meant phones passed at 34px while desktop stayed at 73.5x23, the same one-pixel the media query meant phones passed at 34px while desktop stayed at 73.5x23, the same one-pixel
failure, now invisible to a phone sweep. Measured again at 1440x900 by upg100 (2a2ea36e). One failure, now invisible to a phone sweep. Measured again at 1440x900 by upg100 (2a2ea36e). One
rule, every width, no query to be right about. */ rule, every width, no query to be right about. */
.rd-proj{ min-height:24px; display:inline-flex; align-items:center; } /* ★ AND min-WIDTH now that the word is gone. The 24 used to come for free from the text
("🌐 Globe" measured 74px wide); a glyph-only pill is about 29px with its padding, which passes,
but only by accident of the font. Stating both axes keeps 2.5.8 AA true if the glyph changes. */
.rd-proj{ min-height:24px; min-width:24px; display:inline-flex; align-items:center; justify-content:center; }
/* Zoom cluster. MapToolbar defaults to top:6px on the inline-end edge, which is exactly where /* Zoom cluster. MapToolbar defaults to top:6px on the inline-end edge, which is exactly where
the Globe/Flat pill already sits, so drop this instance below it. 34px clears the pill the Globe/Flat pill already sits, so drop this instance below it. 34px clears the pill
(top:8px + roughly 22px tall) with a small breathing gap. (top:8px + roughly 22px tall) with a small breathing gap.
@ -1691,8 +1700,20 @@ useShadowStyles(`
<ZoomInButton :map="map" :disabled="!canZoomIn" /> <ZoomInButton :map="map" :disabled="!canZoomIn" />
<ZoomOutButton :map="map" :disabled="!canZoomOut" /> <ZoomOutButton :map="map" :disabled="!canZoomOut" />
</MapToolbar> </MapToolbar>
<span class="rd-proj" role="button" tabindex="0" data-proj-toggle @click="toggleProjection"> <!-- ★ THE ICON IS THE LABEL, because the word could not be translated without inventing one.
{{ projection === 'globe' ? '🌐 Globe' : '▭ Flat' }} rega saw "🌐 Globe" in Arabic on ?lang=ar (KA3, 3d64bcad): hardcoded English chrome on a
localized map. "Globe" has no catalogue entry and "Flat" has none in any of the eleven
locales, so translating the visible text meant either authoring ten new strings for a
two-state toggle or leaving nine locales reading English. The catalogue DOES already ship
mapui.enableGlobe / mapui.disableGlobe in all eleven — as the ACTION, which is what a button
should announce anyway — so the accessible name and the tooltip come from there and the
visible pill carries the glyph alone. A reader now sees no English, and a screen reader hears
the action in their own language rather than the state in someone else's.
The label names what the click DOES, not where you are: in globe mode the button turns the
globe off. -->
<span class="rd-proj" role="button" tabindex="0" data-proj-toggle @click="toggleProjection"
:title="projName" :aria-label="projName">
<span aria-hidden="true">{{ projection === 'globe' ? '🌐' : '▭' }}</span>
</span> </span>
<div class="rd-legend-map" data-map-legend :aria-label="T('aria.upgCountLegend', 'UPG count legend')"> <div class="rd-legend-map" data-map-legend :aria-label="T('aria.upgCountLegend', 'UPG count legend')">
<!-- ★ COMPOSED FROM TWO EXISTING CATALOGUE ENTRIES, not from new wording. This legend title <!-- ★ COMPOSED FROM TWO EXISTING CATALOGUE ENTRIES, not from new wording. This legend title

File diff suppressed because one or more lines are too long

View file

@ -43,7 +43,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <bp-big-picture> custom element. --> <!-- Bundle IIFE — registers the <bp-big-picture> custom element. -->
<script src="../../big-picture.js" integrity="sha384-vq5/y8EkBMQyCQFvBmoWBZhBX73c4vln8KD5tuMyMdhzMDf25zyUTdUx4XRAEibP" crossorigin="anonymous"></script> <script src="../../big-picture.js" integrity="sha384-ok/EhX34F4Novw0CMxEoYa69SLQmXtc4QzI1zPW1KV9t5bKlnxsoMxSNO68ea29O" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -43,7 +43,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <bp-big-picture> custom element. --> <!-- Bundle IIFE — registers the <bp-big-picture> custom element. -->
<script src="../../big-picture.js" integrity="sha384-vq5/y8EkBMQyCQFvBmoWBZhBX73c4vln8KD5tuMyMdhzMDf25zyUTdUx4XRAEibP" crossorigin="anonymous"></script> <script src="../../big-picture.js" integrity="sha384-ok/EhX34F4Novw0CMxEoYa69SLQmXtc4QzI1zPW1KV9t5bKlnxsoMxSNO68ea29O" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -43,7 +43,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <bp-big-picture> custom element. --> <!-- Bundle IIFE — registers the <bp-big-picture> custom element. -->
<script src="../big-picture.js" integrity="sha384-vq5/y8EkBMQyCQFvBmoWBZhBX73c4vln8KD5tuMyMdhzMDf25zyUTdUx4XRAEibP" crossorigin="anonymous"></script> <script src="../big-picture.js" integrity="sha384-ok/EhX34F4Novw0CMxEoYa69SLQmXtc4QzI1zPW1KV9t5bKlnxsoMxSNO68ea29O" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. --> <!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx" crossorigin="anonymous"></script> <script src="../country-posters.js" integrity="sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -32,7 +32,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. --> <!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx" crossorigin="anonymous"></script> <script src="../country-posters.js" integrity="sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -47,7 +47,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. --> <!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx" crossorigin="anonymous"></script> <script src="../country-posters.js" integrity="sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -47,7 +47,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <dashboard-plus-grid> custom element. --> <!-- Bundle IIFE — registers the <dashboard-plus-grid> custom element. -->
<script src="../../dashboard-plus-grid.js" integrity="sha384-nr6tMv3MzTLdSlvOzIeG2D/HWyjrT2O2VWT9GqYcFt5Hifgo1IT+y8hPAdhncmEr" crossorigin="anonymous"></script> <script src="../../dashboard-plus-grid.js" integrity="sha384-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -47,7 +47,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <dashboard-plus-grid> custom element. --> <!-- Bundle IIFE — registers the <dashboard-plus-grid> custom element. -->
<script src="../dashboard-plus-grid.js" integrity="sha384-nr6tMv3MzTLdSlvOzIeG2D/HWyjrT2O2VWT9GqYcFt5Hifgo1IT+y8hPAdhncmEr" crossorigin="anonymous"></script> <script src="../dashboard-plus-grid.js" integrity="sha384-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -40,7 +40,7 @@
"bundle": "big-picture", "bundle": "big-picture",
"scriptUrl": "./big-picture/big-picture.js", "scriptUrl": "./big-picture/big-picture.js",
"output": "dx-maps/big-picture/big-picture.js", "output": "dx-maps/big-picture/big-picture.js",
"integrity": "sha384-vq5/y8EkBMQyCQFvBmoWBZhBX73c4vln8KD5tuMyMdhzMDf25zyUTdUx4XRAEibP", "integrity": "sha384-ok/EhX34F4Novw0CMxEoYa69SLQmXtc4QzI1zPW1KV9t5bKlnxsoMxSNO68ea29O",
"elements": [ "elements": [
"bp-big-picture", "bp-big-picture",
"bp-research-header", "bp-research-header",
@ -64,7 +64,7 @@
"scriptUrl": "./big-picture/big-picture.js", "scriptUrl": "./big-picture/big-picture.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./big-picture/big-picture/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./big-picture/big-picture/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./big-picture/big-picture.js\" integrity=\"sha384-vq5/y8EkBMQyCQFvBmoWBZhBX73c4vln8KD5tuMyMdhzMDf25zyUTdUx4XRAEibP\" crossorigin=\"anonymous\"></script>\n<bp-big-picture profile-config='{\"profile\":\"big-picture\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></bp-big-picture>" "script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./big-picture/big-picture.js\" integrity=\"sha384-ok/EhX34F4Novw0CMxEoYa69SLQmXtc4QzI1zPW1KV9t5bKlnxsoMxSNO68ea29O\" crossorigin=\"anonymous\"></script>\n<bp-big-picture profile-config='{\"profile\":\"big-picture\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></bp-big-picture>"
}, },
"instances": [ "instances": [
{ {
@ -165,7 +165,7 @@
"bundle": "country-posters", "bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js", "scriptUrl": "./country-posters/country-posters.js",
"output": "dx-maps/country-posters/country-posters.js", "output": "dx-maps/country-posters/country-posters.js",
"integrity": "sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx", "integrity": "sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+",
"elements": [ "elements": [
"country-posters-map" "country-posters-map"
], ],
@ -187,7 +187,7 @@
"scriptUrl": "./country-posters/country-posters.js", "scriptUrl": "./country-posters/country-posters.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
} }
}, },
{ {
@ -202,7 +202,7 @@
"scriptUrl": "./country-posters/country-posters.js", "scriptUrl": "./country-posters/country-posters.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>" "script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
} }
}, },
{ {
@ -217,7 +217,7 @@
"scriptUrl": "./country-posters/country-posters.js", "scriptUrl": "./country-posters/country-posters.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
} }
} }
] ]
@ -226,7 +226,7 @@
"bundle": "dashboard-plus-grid", "bundle": "dashboard-plus-grid",
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js", "scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js", "output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
"integrity": "sha384-nr6tMv3MzTLdSlvOzIeG2D/HWyjrT2O2VWT9GqYcFt5Hifgo1IT+y8hPAdhncmEr", "integrity": "sha384-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ",
"elements": [ "elements": [
"dashboard-plus-grid" "dashboard-plus-grid"
], ],
@ -248,7 +248,7 @@
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js", "scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-nr6tMv3MzTLdSlvOzIeG2D/HWyjrT2O2VWT9GqYcFt5Hifgo1IT+y8hPAdhncmEr\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
}, },
"instances": [ "instances": [
{ {
@ -371,7 +371,7 @@
"bundle": "doxa-research-map", "bundle": "doxa-research-map",
"scriptUrl": "./doxa-research-map/doxa-research-map.js", "scriptUrl": "./doxa-research-map/doxa-research-map.js",
"output": "dx-maps/doxa-research-map/doxa-research-map.js", "output": "dx-maps/doxa-research-map/doxa-research-map.js",
"integrity": "sha384-cQVeAPfZSSKvTROI4UEGhwW5uPIgiuGMEKyxzFku8gEvk8NY7hePH69n1quJmwfy", "integrity": "sha384-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH",
"elements": [ "elements": [
"doxa-research-map" "doxa-research-map"
], ],
@ -389,7 +389,7 @@
"scriptUrl": "./doxa-research-map/doxa-research-map.js", "scriptUrl": "./doxa-research-map/doxa-research-map.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-cQVeAPfZSSKvTROI4UEGhwW5uPIgiuGMEKyxzFku8gEvk8NY7hePH69n1quJmwfy\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
}, },
"instances": [ "instances": [
{ {
@ -604,7 +604,7 @@
"bundle": "gospel-internet", "bundle": "gospel-internet",
"scriptUrl": "./gospel-internet/gospel-internet.js", "scriptUrl": "./gospel-internet/gospel-internet.js",
"output": "dx-maps/gospel-internet/gospel-internet.js", "output": "dx-maps/gospel-internet/gospel-internet.js",
"integrity": "sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U", "integrity": "sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX",
"elements": [ "elements": [
"gospel-internet-board" "gospel-internet-board"
], ],
@ -623,7 +623,7 @@
"scriptUrl": "./gospel-internet/gospel-internet.js", "scriptUrl": "./gospel-internet/gospel-internet.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./gospel-internet/board/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./gospel-internet/board/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-internet/gospel-internet.js\" integrity=\"sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-internet/gospel-internet.js\" integrity=\"sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
}, },
"instances": [ "instances": [
{ {
@ -1051,7 +1051,7 @@
"bundle": "regions-dashboard", "bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js", "scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "dx-maps/regions-dashboard/regions-dashboard.js", "output": "dx-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm", "integrity": "sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0",
"elements": [ "elements": [
"regions-dashboard" "regions-dashboard"
], ],
@ -1065,7 +1065,7 @@
"profile": "region-dashboards", "profile": "region-dashboards",
"stage": "experimental", "stage": "experimental",
"file": "region-dashboards.vue", "file": "region-dashboards.vue",
"description": "The dashboard half of the agent's 2-tab Regions element: given a region (or a", "description": "The dashboard half of the 2-tab Regions element: given a region (or a",
"element": "regions-dashboard", "element": "regions-dashboard",
"type": "single", "type": "single",
"isMap": true, "isMap": true,
@ -1073,7 +1073,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js", "scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
} }
}, },
{ {
@ -1088,14 +1088,14 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js", "scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>" "script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
} }
}, },
{ {
"profile": "regions-mfe", "profile": "regions-mfe",
"stage": "production", "stage": "production",
"file": "regions-mfe.vue", "file": "regions-mfe.vue",
"description": "The composite the agent asked for: ONE element carrying the SELECT VIEW switcher", "description": "The composite: ONE element carrying the SELECT VIEW switcher",
"element": "regions-dashboard", "element": "regions-dashboard",
"type": "nested-elements-mfe", "type": "nested-elements-mfe",
"isMap": true, "isMap": true,
@ -1103,7 +1103,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js", "scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
} }
} }
] ]
@ -1112,7 +1112,7 @@
"bundle": "research-dashboard", "bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js", "scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "dx-maps/research-dashboard/research-dashboard.js", "output": "dx-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-v1ANust7p1qPj7c+/ECO6iSqCibufc5jeWljbyVOq1LySUkFy3bYoPNU57iw7TI5", "integrity": "sha384-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY",
"elements": [ "elements": [
"research-dashboard-map" "research-dashboard-map"
], ],
@ -1130,7 +1130,7 @@
"scriptUrl": "./research-dashboard/research-dashboard.js", "scriptUrl": "./research-dashboard/research-dashboard.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-v1ANust7p1qPj7c+/ECO6iSqCibufc5jeWljbyVOq1LySUkFy3bYoPNU57iw7TI5\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
}, },
"bundle": "research-dashboard" "bundle": "research-dashboard"
} }

File diff suppressed because one or more lines are too long

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-research-map> custom element. --> <!-- Bundle IIFE — registers the <doxa-research-map> custom element. -->
<script src="../doxa-research-map.js" integrity="sha384-cQVeAPfZSSKvTROI4UEGhwW5uPIgiuGMEKyxzFku8gEvk8NY7hePH69n1quJmwfy" crossorigin="anonymous"></script> <script src="../doxa-research-map.js" integrity="sha384-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -33,7 +33,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-research-map> custom element. --> <!-- Bundle IIFE — registers the <doxa-research-map> custom element. -->
<script src="../../doxa-research-map.js" integrity="sha384-cQVeAPfZSSKvTROI4UEGhwW5uPIgiuGMEKyxzFku8gEvk8NY7hePH69n1quJmwfy" crossorigin="anonymous"></script> <script src="../../doxa-research-map.js" integrity="sha384-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-internet-board> custom element. --> <!-- Bundle IIFE — registers the <gospel-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U" crossorigin="anonymous"></script> <script src="../../gospel-internet.js" integrity="sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-internet-board> custom element. --> <!-- Bundle IIFE — registers the <gospel-internet-board> custom element. -->
<script src="../gospel-internet.js" integrity="sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U" crossorigin="anonymous"></script> <script src="../gospel-internet.js" integrity="sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-internet-board> custom element. --> <!-- Bundle IIFE — registers the <gospel-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U" crossorigin="anonymous"></script> <script src="../../gospel-internet.js" integrity="sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-internet-board> custom element. --> <!-- Bundle IIFE — registers the <gospel-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U" crossorigin="anonymous"></script> <script src="../../gospel-internet.js" integrity="sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-internet-board> custom element. --> <!-- Bundle IIFE — registers the <gospel-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U" crossorigin="anonymous"></script> <script src="../../gospel-internet.js" integrity="sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-internet-board> custom element. --> <!-- Bundle IIFE — registers the <gospel-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U" crossorigin="anonymous"></script> <script src="../../gospel-internet.js" integrity="sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-internet-board> custom element. --> <!-- Bundle IIFE — registers the <gospel-internet-board> custom element. -->
<script src="../../gospel-internet.js" integrity="sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U" crossorigin="anonymous"></script> <script src="../../gospel-internet.js" integrity="sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -40,7 +40,7 @@
"bundle": "big-picture", "bundle": "big-picture",
"scriptUrl": "./big-picture/big-picture.js", "scriptUrl": "./big-picture/big-picture.js",
"output": "dx-maps/big-picture/big-picture.js", "output": "dx-maps/big-picture/big-picture.js",
"integrity": "sha384-vq5/y8EkBMQyCQFvBmoWBZhBX73c4vln8KD5tuMyMdhzMDf25zyUTdUx4XRAEibP", "integrity": "sha384-ok/EhX34F4Novw0CMxEoYa69SLQmXtc4QzI1zPW1KV9t5bKlnxsoMxSNO68ea29O",
"elements": [ "elements": [
"bp-big-picture", "bp-big-picture",
"bp-research-header", "bp-research-header",
@ -64,7 +64,7 @@
"scriptUrl": "./big-picture/big-picture.js", "scriptUrl": "./big-picture/big-picture.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./big-picture/big-picture/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./big-picture/big-picture/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./big-picture/big-picture.js\" integrity=\"sha384-vq5/y8EkBMQyCQFvBmoWBZhBX73c4vln8KD5tuMyMdhzMDf25zyUTdUx4XRAEibP\" crossorigin=\"anonymous\"></script>\n<bp-big-picture profile-config='{\"profile\":\"big-picture\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></bp-big-picture>" "script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./big-picture/big-picture.js\" integrity=\"sha384-ok/EhX34F4Novw0CMxEoYa69SLQmXtc4QzI1zPW1KV9t5bKlnxsoMxSNO68ea29O\" crossorigin=\"anonymous\"></script>\n<bp-big-picture profile-config='{\"profile\":\"big-picture\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></bp-big-picture>"
}, },
"instances": [ "instances": [
{ {
@ -165,7 +165,7 @@
"bundle": "country-posters", "bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js", "scriptUrl": "./country-posters/country-posters.js",
"output": "dx-maps/country-posters/country-posters.js", "output": "dx-maps/country-posters/country-posters.js",
"integrity": "sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx", "integrity": "sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+",
"elements": [ "elements": [
"country-posters-map" "country-posters-map"
], ],
@ -187,7 +187,7 @@
"scriptUrl": "./country-posters/country-posters.js", "scriptUrl": "./country-posters/country-posters.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
} }
}, },
{ {
@ -202,7 +202,7 @@
"scriptUrl": "./country-posters/country-posters.js", "scriptUrl": "./country-posters/country-posters.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>" "script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
} }
}, },
{ {
@ -217,7 +217,7 @@
"scriptUrl": "./country-posters/country-posters.js", "scriptUrl": "./country-posters/country-posters.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-oCIW3mXn1tRcFCIBCh0/waP5p9gEN8Z7RGCqmwgnny/MvwvLFnEQ0FdMbP1WGUGx\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-JfaqlOly5w+73pYBc42u+ney1XZzNm+McZoabWsSzJtrP0mJRINP9Cx0YS6F7qM+\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
} }
} }
] ]
@ -226,7 +226,7 @@
"bundle": "dashboard-plus-grid", "bundle": "dashboard-plus-grid",
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js", "scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
"output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js", "output": "dx-maps/dashboard-plus-grid/dashboard-plus-grid.js",
"integrity": "sha384-nr6tMv3MzTLdSlvOzIeG2D/HWyjrT2O2VWT9GqYcFt5Hifgo1IT+y8hPAdhncmEr", "integrity": "sha384-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ",
"elements": [ "elements": [
"dashboard-plus-grid" "dashboard-plus-grid"
], ],
@ -248,7 +248,7 @@
"scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js", "scriptUrl": "./dashboard-plus-grid/dashboard-plus-grid.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./dashboard-plus-grid/dashboard-plus-grid/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-nr6tMv3MzTLdSlvOzIeG2D/HWyjrT2O2VWT9GqYcFt5Hifgo1IT+y8hPAdhncmEr\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./dashboard-plus-grid/dashboard-plus-grid.js\" integrity=\"sha384-+CKECgEuJ5pKzR11N0RMEEAEvBKz+F1S3xbVub8k0RAF+tSEV8fW6W2CVCTdJ1lZ\" crossorigin=\"anonymous\"></script>\n<dashboard-plus-grid profile-config='{\"profile\":\"dashboard-plus-grid\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></dashboard-plus-grid>"
}, },
"instances": [ "instances": [
{ {
@ -371,7 +371,7 @@
"bundle": "doxa-research-map", "bundle": "doxa-research-map",
"scriptUrl": "./doxa-research-map/doxa-research-map.js", "scriptUrl": "./doxa-research-map/doxa-research-map.js",
"output": "dx-maps/doxa-research-map/doxa-research-map.js", "output": "dx-maps/doxa-research-map/doxa-research-map.js",
"integrity": "sha384-cQVeAPfZSSKvTROI4UEGhwW5uPIgiuGMEKyxzFku8gEvk8NY7hePH69n1quJmwfy", "integrity": "sha384-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH",
"elements": [ "elements": [
"doxa-research-map" "doxa-research-map"
], ],
@ -389,7 +389,7 @@
"scriptUrl": "./doxa-research-map/doxa-research-map.js", "scriptUrl": "./doxa-research-map/doxa-research-map.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-cQVeAPfZSSKvTROI4UEGhwW5uPIgiuGMEKyxzFku8gEvk8NY7hePH69n1quJmwfy\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-r6XtfVHAKnNx8l2Ee4o7OfeC+E3QZIxx8nfKe7ShKPf6rlsZM3T/b1fgzvfjvjZH\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
}, },
"instances": [ "instances": [
{ {
@ -604,7 +604,7 @@
"bundle": "gospel-internet", "bundle": "gospel-internet",
"scriptUrl": "./gospel-internet/gospel-internet.js", "scriptUrl": "./gospel-internet/gospel-internet.js",
"output": "dx-maps/gospel-internet/gospel-internet.js", "output": "dx-maps/gospel-internet/gospel-internet.js",
"integrity": "sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U", "integrity": "sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX",
"elements": [ "elements": [
"gospel-internet-board" "gospel-internet-board"
], ],
@ -623,7 +623,7 @@
"scriptUrl": "./gospel-internet/gospel-internet.js", "scriptUrl": "./gospel-internet/gospel-internet.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./gospel-internet/board/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./gospel-internet/board/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-internet/gospel-internet.js\" integrity=\"sha384-qnCqwfYQGF8v4uMLnMn7+/XdVomUT71pJuy48PzBkuubKegi35eJCSO4hA7oWe8U\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-internet/gospel-internet.js\" integrity=\"sha384-rJnN+qmCkokPGSCgbIMnEE/Dj/l8KQi9hEI9bl0aWxpuxtsDQMkZ35tBccFbwVLX\" crossorigin=\"anonymous\"></script>\n<gospel-internet-board profile-config='{\"profile\":\"board\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-internet-board>"
}, },
"instances": [ "instances": [
{ {
@ -1051,7 +1051,7 @@
"bundle": "regions-dashboard", "bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js", "scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "dx-maps/regions-dashboard/regions-dashboard.js", "output": "dx-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm", "integrity": "sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0",
"elements": [ "elements": [
"regions-dashboard" "regions-dashboard"
], ],
@ -1065,7 +1065,7 @@
"profile": "region-dashboards", "profile": "region-dashboards",
"stage": "experimental", "stage": "experimental",
"file": "region-dashboards.vue", "file": "region-dashboards.vue",
"description": "The dashboard half of the agent's 2-tab Regions element: given a region (or a", "description": "The dashboard half of the 2-tab Regions element: given a region (or a",
"element": "regions-dashboard", "element": "regions-dashboard",
"type": "single", "type": "single",
"isMap": true, "isMap": true,
@ -1073,7 +1073,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js", "scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
} }
}, },
{ {
@ -1088,14 +1088,14 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js", "scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>" "script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
} }
}, },
{ {
"profile": "regions-mfe", "profile": "regions-mfe",
"stage": "production", "stage": "production",
"file": "regions-mfe.vue", "file": "regions-mfe.vue",
"description": "The composite the agent asked for: ONE element carrying the SELECT VIEW switcher", "description": "The composite: ONE element carrying the SELECT VIEW switcher",
"element": "regions-dashboard", "element": "regions-dashboard",
"type": "nested-elements-mfe", "type": "nested-elements-mfe",
"isMap": true, "isMap": true,
@ -1103,7 +1103,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js", "scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
} }
} }
] ]
@ -1112,7 +1112,7 @@
"bundle": "research-dashboard", "bundle": "research-dashboard",
"scriptUrl": "./research-dashboard/research-dashboard.js", "scriptUrl": "./research-dashboard/research-dashboard.js",
"output": "dx-maps/research-dashboard/research-dashboard.js", "output": "dx-maps/research-dashboard/research-dashboard.js",
"integrity": "sha384-v1ANust7p1qPj7c+/ECO6iSqCibufc5jeWljbyVOq1LySUkFy3bYoPNU57iw7TI5", "integrity": "sha384-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY",
"elements": [ "elements": [
"research-dashboard-map" "research-dashboard-map"
], ],
@ -1130,7 +1130,7 @@
"scriptUrl": "./research-dashboard/research-dashboard.js", "scriptUrl": "./research-dashboard/research-dashboard.js",
"embed": { "embed": {
"iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>", "iframe": "<iframe src=\"./research-dashboard/research-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-v1ANust7p1qPj7c+/ECO6iSqCibufc5jeWljbyVOq1LySUkFy3bYoPNU57iw7TI5\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>" "script": "<!-- Mapbox engine, fetched early. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./research-dashboard/research-dashboard.js\" integrity=\"sha384-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY\" crossorigin=\"anonymous\"></script>\n<research-dashboard-map profile-config='{\"profile\":\"research-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></research-dashboard-map>"
}, },
"bundle": "research-dashboard" "bundle": "research-dashboard"
} }

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. --> <!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm" crossorigin="anonymous"></script> <script src="../regions-dashboard.js" integrity="sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -32,7 +32,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. --> <!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm" crossorigin="anonymous"></script> <script src="../regions-dashboard.js" integrity="sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -47,7 +47,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. --> <!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-vmJclvZFkmiCOCwOllpGRzO+M6RWiFFp0h0vq/op07Y0isgHtWHTwyJDVc8JyvSm" crossorigin="anonymous"></script> <script src="../regions-dashboard.js" integrity="sha384-RzaQXGS9scN0JgUpCh0F/qmYqkpgDJeKsJNIzokXb4AZmecuJvBUC2wYDa5D9Eg0" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script> <script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <research-dashboard-map> custom element. --> <!-- Bundle IIFE — registers the <research-dashboard-map> custom element. -->
<script src="../research-dashboard.js" integrity="sha384-v1ANust7p1qPj7c+/ECO6iSqCibufc5jeWljbyVOq1LySUkFy3bYoPNU57iw7TI5" crossorigin="anonymous"></script> <script src="../research-dashboard.js" integrity="sha384-lCPbIXqgOa+ild8uqL5d03PLoYBDtZca5QLvSlSzeJT4TTonWf2U0dev7N53kvwY" crossorigin="anonymous"></script>
<script> <script>
// Mapbox token resolution — the A3 ladder, in precedence order: // Mapbox token resolution — the A3 ladder, in precedence order: