Merge main into bundler-2/work
Some checks are pending
build-gate / build (push) Waiting to run

# Conflicts:
#	public/doxa-maps/index.html
#	public/doxa-maps/manifest.json
#	public/doxa-maps/regions-dashboard/region-dashboards/index.html
#	public/doxa-maps/regions-dashboard/regions-dashboard.js
#	public/doxa-maps/regions-dashboard/regions-list/index.html
#	public/doxa-maps/regions-dashboard/regions-mfe/index.html
This commit is contained in:
doxa-maps-88655c70 2026-09-24 20:26:59 +00:00
commit 460ccb564b
20 changed files with 278 additions and 129 deletions

View file

@ -61,5 +61,9 @@
"WAGF Block": "كتلة WAGF",
"WAGF Region": "منطقة WAGF",
"people groups adopted": "الشعوب المنتمية",
"people groups engaged": "مجموعات بشرية مُنخرِطة"
"people groups engaged": "مجموعات بشرية مُنخرِطة",
"Outside this region": "خارج هذه المنطقة",
"Pray": "صلّي",
"Loading region dashboards…": "جارٍ تحميل لوحات المناطق…",
"No regions found.": "لم يتم العثور على مناطق."
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "WAGF-Block",
"WAGF Region": "WAGF-Region",
"people groups adopted": "adoptierte Volksgruppen",
"people groups engaged": "engagierte Volksgruppen"
"people groups engaged": "engagierte Volksgruppen",
"Outside this region": "Außerhalb dieser Region",
"Pray": "Ich bete",
"Loading region dashboards…": "Regions-Dashboards werden geladen…",
"No regions found.": "Keine Regionen gefunden."
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "WAGF Block",
"WAGF Region": "WAGF Region",
"people groups adopted": "people groups adopted",
"people groups engaged": "people groups engaged"
"people groups engaged": "people groups engaged",
"Outside this region": "Outside this region",
"Pray": "Pray",
"Loading region dashboards…": "Loading region dashboards…",
"No regions found.": "No regions found."
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "Bloque WAGF",
"WAGF Region": "Región de la WAGF",
"people groups adopted": "grupos de personas adoptados",
"people groups engaged": "grupos étnicos comprometidos"
"people groups engaged": "grupos étnicos comprometidos",
"Outside this region": "Fuera de esta región",
"Pray": "Oración",
"Loading region dashboards…": "Cargando los paneles de regiones…",
"No regions found.": "No se encontraron regiones."
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "Bloc WAGF",
"WAGF Region": "Région WAGF",
"people groups adopted": "peuples adoptés",
"people groups engaged": "peuples engagés"
"people groups engaged": "peuples engagés",
"Outside this region": "Hors de cette région",
"Pray": "Prier",
"Loading region dashboards…": "Chargement des tableaux de bord des régions…",
"No regions found.": "Aucune région trouvée."
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "WAGF ब्लॉक",
"WAGF Region": "डब्ल्यूएजीएफ क्षेत्र",
"people groups adopted": "लोगों के समूहों ने अपनाया",
"people groups engaged": "प्रवेशित लोगों के समूह"
"people groups engaged": "प्रवेशित लोगों के समूह",
"Outside this region": "इस क्षेत्र के बाहर",
"Pray": "प्रार्थना करें",
"Loading region dashboards…": "क्षेत्र डैशबोर्ड लोड हो रहे हैं…",
"No regions found.": "कोई क्षेत्र नहीं मिला।"
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "Blocco WAGF",
"WAGF Region": "Regione WAGF",
"people groups adopted": "popoli adottati",
"people groups engaged": "popoli coinvolti"
"people groups engaged": "popoli coinvolti",
"Outside this region": "Fuori da questa regione",
"Pray": "Prega",
"Loading region dashboards…": "Caricamento delle dashboard delle regioni…",
"No regions found.": "Nessuna regione trovata."
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "Bloco WAGF",
"WAGF Region": "Região da WAGF",
"people groups adopted": "grupos étnicos adotados",
"people groups engaged": "grupos étnicos engajados"
"people groups engaged": "grupos étnicos engajados",
"Outside this region": "Fora desta região",
"Pray": "Ore",
"Loading region dashboards…": "Carregando os painéis das regiões…",
"No regions found.": "Nenhuma região encontrada."
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "Bloc WAGF",
"WAGF Region": "Regiune WAGF",
"people groups adopted": "popoare adoptate",
"people groups engaged": "popoare implicate"
"people groups engaged": "popoare implicate",
"Outside this region": "În afara acestei regiuni",
"Pray": "Roagă-te",
"Loading region dashboards…": "Se încarcă panourile regiunilor…",
"No regions found.": "Nu au fost găsite regiuni."
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "Блок WAGF",
"WAGF Region": "Регион WAGF",
"people groups adopted": "принятые группы людей",
"people groups engaged": "вовлечённые группы людей"
"people groups engaged": "вовлечённые группы людей",
"Outside this region": "За пределами этого региона",
"Pray": "Молиться",
"Loading region dashboards…": "Загрузка панелей по регионам…",
"No regions found.": "Регионы не найдены."
}

View file

@ -61,5 +61,9 @@
"WAGF Block": "WAGF 板块",
"WAGF Region": "WAGF 区域",
"people groups adopted": "已认领的民族",
"people groups engaged": "已参与的民族"
"people groups engaged": "已参与的民族",
"Outside this region": "在此区域之外",
"Pray": "祷告",
"Loading region dashboards…": "正在加载区域面板…",
"No regions found.": "未找到区域。"
}

View file

@ -69,6 +69,10 @@ const cfg = computed(() => {
try { return JSON.parse(props.profileConfig) || {} } catch { return {} }
})
const prayBaseUrl = computed(() => props.prayBaseUrl || cfg.value.prayBaseUrl || 'https://pray.doxa.life')
// Their popup's second button. RegionDetail passes CountryMap `:research-url="localePath('/research') + '/'"`;
// we have no router, so it comes from profile-config with their public site as the default —
// the same ladder and the same default UupgsList.vue:74 already uses.
const researchUrl = computed(() => cfg.value.researchUrl || 'https://doxa.life/research/')
// The prayer API localises its LABELS from ?lang= — country names, region names, religion
// names. MEASURED: with locale=ar the UI translated but every country in the table stayed
// English, because this read only cfg.languageCode while the locale arrives as
@ -131,7 +135,13 @@ const sel = ref({
// identically -- the extra fields are read by the map, never by addToStats().
// Their PEOPLE_GROUP_LIST_FIELDS plus the two this tab's map needs (name, slug) — derived
// from the shared list so the two can never drift apart.
const FIELDS = 'name,slug,' + PEOPLE_GROUP_LIST_FIELDS
// ★ PLUS THEIR FIVE POPUP FIELDS. CountryMap.vue:89 fetches
// name,slug,country_code,rop1,religion,population,location_description,image_url,has_photo,
// latitude,longitude,people_committed
// and their pin popup renders every one of them. Ours fetched neither rop1, religion,
// location_description nor the photo, so the popup COULD NOT have been a clone however it was
// written — the data was not on the page. Same one request, five more columns.
const FIELDS = 'name,slug,rop1,religion,location_description,image_url,has_photo,' + PEOPLE_GROUP_LIST_FIELDS
function formatNumber(n) {
// THEIRS, RegionDetail.vue:16: `n.toLocaleString(`${locale.value}-u-nu-latn`)` — locale
@ -594,6 +604,12 @@ async function loadRegions() {
region: p.wagf_region?.value || '',
lng: parseFloat(p.longitude), lat: parseFloat(p.latitude),
committed: toNumber(p.people_committed), population: toNumber(p.population),
// Their popup's fields, mapped exactly as CountryMap.vue:107-115 maps them — including the
// has_photo GATE on the image, which is theirs: a row can carry an image_url that is a
// placeholder, and they only show it when the flag says there is a real photo.
rop1: p.rop1?.label || '', religion: p.religion?.label || '',
description: p.location_description || '',
imageUrl: (p.has_photo && p.image_url) ? p.image_url : '',
})).filter((p) => Number.isFinite(p.lng) && Number.isFinite(p.lat))
} catch (error) {
console.error('[region-dashboards] fetch error:', error)
@ -900,7 +916,7 @@ useShadowStyles(
<!-- a landmark, so a screen reader can jump to the dashboard body; the app probe
measured none on the page and it costs nothing to name the region. -->
<main class="rd-scroll" :aria-label="t('Region dashboard')">
<div v-if="loading" class="rd-status">Loading region dashboards…</div>
<div v-if="loading" class="rd-status">{{ t('Loading region dashboards…') }}</div>
<div v-else-if="loadFailed" class="rd-status rd-failed" role="status">
Region data could not be loaded. This is a connection problem, not a filter.
</div>
@ -991,6 +1007,8 @@ useShadowStyles(
:color-mode="mapColorMode"
:highlight-region="hoveredRegion"
:select-on-pin-click="isAll"
:pray-base-url="prayBaseUrl"
:research-url="researchUrl"
@pick-country="onPickFromMap"
/>
</div>

View file

@ -530,7 +530,7 @@ useShadowStyles(
<div v-else-if="loadFailed" class="rl-status rl-failed" role="status">
Region data could not be loaded. This is a connection problem, not a filter.
</div>
<div v-else-if="!regions.length" class="rl-status">No regions found.</div>
<div v-else-if="!regions.length" class="rl-status">{{ t('No regions found.') }}</div>
<template v-else>
<div

View file

@ -34,8 +34,14 @@ import { useShadowStyles } from '@map/composables/useShadowStyles.js'
// check:one-palette exists because a private palette in a consumer is what once made two
// surfaces disagree about what a colour meant.
import { applyColor as regionColorExpression, PALETTE as REGION_PALETTE, getColor as regionColorFor } from '@map/colors/wagf-region.js'
// ★ THIS FILE HAD NO t() AT ALL. Its legend rendered four hardcoded English strings on a page
// whose every other word is translated into eleven languages, and three of those four were
// ALREADY in the catalogue — translated for the Prayer Coverage card and hardcoded here.
// Their CountryMap.vue calls t() for the same strings (:268-272).
import { useRegionsI18n } from './useRegionsI18n.js'
const { t, locale } = useRegionsI18n()
const emit = defineEmits(['pick-country'])
const props = defineProps({
// ISO-3 codes to highlight, e.g. ['IND'] for a country or every code in a region.
@ -56,6 +62,10 @@ const props = defineProps({
zoom: { type: Number, default: 2 },
// [[west, south], [east, north]] — takes precedence over center/zoom, as theirs does.
bounds: { type: Array, default: null },
// Their popup's two buttons (CountryMap.vue:156-158): Pray -> prayBaseUrl/<slug>?source=doxalife,
// Full Profile -> researchUrl<slug>.
prayBaseUrl: { type: String, default: 'https://pray.doxa.life' },
researchUrl: { type: String, default: 'https://doxa.life/research/' },
})
// The token ladder: ProfileLoader provides it (the same seam every map bundle uses). A nested
@ -100,6 +110,9 @@ const geojson = computed(() => {
inCountry: focus.has(p.code), committed: Number(p.committed) || 0,
region: p.region || '', code: p.code || '',
population: Number(p.population) || 0,
// Their popup's four (CountryMap.vue:107-115). Primitives only, as their own comment says.
rop1: p.rop1 || '', religion: p.religion || '',
description: p.description || '', imageUrl: p.imageUrl || '',
},
})),
}
@ -298,19 +311,54 @@ function onPinClick(e) {
const g = window.mapboxgl
if (!g) return
const p = f.properties || {}
const pop = Number(p.population) || 0
const html = '<div style="font:14px/1.45 Poppins,sans-serif;color:#2a332a">' +
'<div style="font-weight:600;margin-bottom:2px">' + esc(p.name) + '</div>' +
(p.country ? '<div style="color:#6d766e">' + esc(p.country) + '</div>' : '') +
(pop ? '<div style="color:#6d766e">Population ' + pop.toLocaleString('en-US') + '</div>' : '') +
'<div style="color:#6d766e">' + (Number(p.committed) || 0).toLocaleString('en-US') + ' praying</div>' +
'</div>'
const html = popupHtml(p)
if (popup) popup.remove()
popup = new g.Popup({ closeButton: true, maxWidth: '264px', offset: 12 })
.setLngLat(f.geometry.coordinates).setHTML(html).addTo(map.value)
}
// THEIR escape, not a shorter one: CountryMap.vue:122-125 also escapes the two quote characters,
// and this string is interpolated into href="" and alt="" attributes below, where omitting them is
// the difference between an escape and a hole.
function esc(s) {
return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
.replace(/"/g, '&quot;').replace(/'/g, '&#39;')
}
// ★ THEIR PIN POPUP, PORTED — CountryMap.vue:130-161. Ours was a four-line stub: a bold name, the
// country, "Population 12,345" and "678 praying", in English, with no photo, no religion, no
// description and no way to act on it. Theirs is a card: the people group's photo, the name, the
// country and its primary ethnolinguistic group, a definition list of Population / Religion /
// Intercessors-out-of-100, up to three lines of the location description, and two buttons — Pray,
// which is the entire point of the site, and Full Profile.
// It could not have been ported before this pass because the DATA was not being fetched: rop1,
// religion, location_description and the photo were missing from our field list.
function popupHtml(p) {
const name = esc(p.name || '')
const subtitle = [p.country, p.rop1].filter(Boolean).map(esc).join(' · ')
// Their formatPopulation: toLocaleString(languageCode), NOT a hardcoded 'en'. Ours printed
// 'en-US' grouping in every one of the eleven locales.
const pop = Number(p.population) > 0 ? Number(p.population).toLocaleString(locale.value || 'en') : ''
const profileUrl = `${props.researchUrl}${p.slug || ''}`
const prayUrl = `${String(props.prayBaseUrl).replace(/\/+$/, '')}/${p.slug || ''}?source=doxalife`
const rows = []
if (pop) rows.push(`<div><dt>${esc(t('Population'))}</dt><dd>${pop}</dd></div>`)
if (p.religion) rows.push(`<div><dt>${esc(t('Religion'))}</dt><dd>${esc(p.religion)}</dd></div>`)
rows.push(`<div><dt>${esc(t('Intercessors'))}</dt><dd>${Number(p.committed) || 0}/${FULL_PRAYER_COVERAGE_COUNT}</dd></div>`)
return `<div class="cm-popup">
${p.imageUrl ? `<img class="cm-popup__img" src="${esc(p.imageUrl)}" alt="${name}" loading="lazy">` : ''}
<div class="cm-popup__body">
<div class="cm-popup__name">${name}</div>
${subtitle ? `<div class="cm-popup__sub">${subtitle}</div>` : ''}
${rows.length ? `<dl class="cm-popup__stats">${rows.join('')}</dl>` : ''}
${p.description ? `<p class="cm-popup__desc">${esc(p.description)}</p>` : ''}
<div class="cm-popup__actions">
<a class="cm-popup__btn cm-popup__btn--primary" href="${prayUrl}">${esc(t('Pray'))}</a>
<a class="cm-popup__btn" href="${profileUrl}">${esc(t('Full Profile'))}</a>
</div>
</div>
</div>`
}
// Re-frame and re-source on a new selection instead of tearing the map down: a rebuilt map
@ -474,7 +522,34 @@ useShadowStyles(
' flex-direction:column; gap:4px; padding:8px 10px; border-radius:8px;' +
' background:rgba(255,255,255,0.92); font-size:12.5px; font-weight:600; color:#2a332a; }' +
'.rcm__legend span{ display:inline-flex; align-items:center; gap:6px; }' +
'.rcm__legend i{ width:10px; height:10px; border-radius:100px; flex:0 0 auto; }',
'.rcm__legend i{ width:10px; height:10px; border-radius:100px; flex:0 0 auto; }' +
// ── THEIR PIN POPUP'S CSS, ported verbatim from CountryMap.vue's scoped block ──────────────
// Mapbox builds the popup inside the map container, which is inside this shadow root, so these
// reach it. The var() fallbacks are theirs and resolve to the same bytes here as there:
// --color-brand is #3b463d and --color-brand-lighter #6d766e on live, identical to the
// fallbacks, and --color-black is not defined on either side so #1f1f1f applies to both.
'.mapboxgl-popup-content:has(.cm-popup){ padding:12px; border-radius:10px;' +
' box-shadow:0 4px 16px rgba(0,0,0,0.18); }' +
'.cm-popup{ width:240px; }' +
'.cm-popup__img{ display:block; width:150px; aspect-ratio:4/5; object-fit:cover;' +
' border-radius:8px; margin:0 auto 8px; }' +
'.cm-popup__body{ padding:0; }' +
'.cm-popup__name{ font-weight:700; font-size:15px; line-height:1.25;' +
' color:var(--color-black, #1f1f1f); }' +
'.cm-popup__sub{ margin-top:2px; font-size:12px; color:var(--color-brand-lighter, #6d766e); }' +
'.cm-popup__stats{ margin:8px 0 0; display:flex; flex-direction:column; gap:3px; }' +
'.cm-popup__stats > div{ display:flex; justify-content:space-between; gap:10px; font-size:12px; }' +
'.cm-popup__stats dt{ margin:0; color:var(--color-brand-lighter, #6d766e); }' +
'.cm-popup__stats dd{ margin:0; text-align:right; font-weight:600;' +
' color:var(--color-black, #1f1f1f); }' +
'.cm-popup__desc{ margin:8px 0 0; font-size:12px; line-height:1.45; color:#555;' +
' display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden; }' +
'.cm-popup__actions{ display:flex; gap:6px; margin-top:10px; }' +
'.cm-popup__btn{ flex:1; padding:6px 8px; border-radius:6px; font-size:12px; font-weight:600;' +
' text-align:center; text-decoration:none; background:#ecf0f1;' +
' color:var(--color-black, #1f1f1f); }' +
'.cm-popup__btn--primary{ background:var(--color-brand, #3b463d); color:#fff; }',
'region-country-map'
)
</script>
@ -495,10 +570,10 @@ useShadowStyles(
figures above are unaffected.
</p>
<div v-if="colorMode === 'prayer' && !mapFailed" class="rcm__legend">
<span><i :style="{ background: C.prayerFull }" />100+ People Praying</span>
<span><i :style="{ background: C.prayerPartial }" />1+ People Praying</span>
<span><i :style="{ background: C.prayerNone }" />No One Praying</span>
<span><i :style="{ background: C.outside }" />Outside this region</span>
<span><i :style="{ background: C.prayerFull }" />{{ t('100+ People Praying') }}</span>
<span><i :style="{ background: C.prayerPartial }" />{{ t('1+ People Praying') }}</span>
<span><i :style="{ background: C.prayerNone }" />{{ t('No One Praying') }}</span>
<span><i :style="{ background: C.outside }" />{{ t('Outside this region') }}</span>
</div>
</div>
</template>

File diff suppressed because one or more lines are too long

View file

@ -879,7 +879,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "doxa-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-QDVP+aABJKCOcB8Yww7Q5dISU0TNhWAXYeE1PiuN2eGOSF8Oxb180bnyA2+Wsxyr",
"integrity": "sha384-SMzVAlqv9vLi6EPAx+hA0Vt+xEpZoGfc7UI48Ny/ama/FCA+Tji5PWHH2YSCuYTP",
"elements": [
"regions-dashboard"
],
@ -899,7 +899,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"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>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-QDVP+aABJKCOcB8Yww7Q5dISU0TNhWAXYeE1PiuN2eGOSF8Oxb180bnyA2+Wsxyr\" 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": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-SMzVAlqv9vLi6EPAx+hA0Vt+xEpZoGfc7UI48Ny/ama/FCA+Tji5PWHH2YSCuYTP\" 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>"
}
},
{
@ -913,7 +913,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"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>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-QDVP+aABJKCOcB8Yww7Q5dISU0TNhWAXYeE1PiuN2eGOSF8Oxb180bnyA2+Wsxyr\" 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-SMzVAlqv9vLi6EPAx+hA0Vt+xEpZoGfc7UI48Ny/ama/FCA+Tji5PWHH2YSCuYTP\" 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>"
}
},
{
@ -927,7 +927,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"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>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-QDVP+aABJKCOcB8Yww7Q5dISU0TNhWAXYeE1PiuN2eGOSF8Oxb180bnyA2+Wsxyr\" 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": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-SMzVAlqv9vLi6EPAx+hA0Vt+xEpZoGfc7UI48Ny/ama/FCA+Tji5PWHH2YSCuYTP\" 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>"
}
}
]

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-QDVP+aABJKCOcB8Yww7Q5dISU0TNhWAXYeE1PiuN2eGOSF8Oxb180bnyA2+Wsxyr" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-SMzVAlqv9vLi6EPAx+hA0Vt+xEpZoGfc7UI48Ny/ama/FCA+Tji5PWHH2YSCuYTP" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-QDVP+aABJKCOcB8Yww7Q5dISU0TNhWAXYeE1PiuN2eGOSF8Oxb180bnyA2+Wsxyr" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-SMzVAlqv9vLi6EPAx+hA0Vt+xEpZoGfc7UI48Ny/ama/FCA+Tji5PWHH2YSCuYTP" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -40,7 +40,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-QDVP+aABJKCOcB8Yww7Q5dISU0TNhWAXYeE1PiuN2eGOSF8Oxb180bnyA2+Wsxyr" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-SMzVAlqv9vLi6EPAx+hA0Vt+xEpZoGfc7UI48Ny/ama/FCA+Tji5PWHH2YSCuYTP" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: