Gospel map: ask what the country speaks, not what the unreached speak

The bridge candidate — the "possibly a way in" offered to a group with nothing —
was chosen from Doxa's own pins: the biggest language among the UNREACHED groups
in that country that has Scripture and the film. That is not the language a
community shares with its neighbours. For Syenara Senufo in Mali it proposed
Minianka, one people group. Mali's vehicular language is Bambara.

The number beside it was worse than the pick. "8.8% of this country's mapped
population" is a share of Doxa's unreached pins, and a reader takes a percentage
for a share of the country. A percentage measured against a denominator nobody
can see is not a caveat, it is a wrong number.

CLDR publishes what each territory speaks and by what share, joined to ISO 639-3
through SIL's own Part1 column, and pinned rather than tracked from a moving
branch. 1,161 of 1,175 candidates now come from it; the remaining 14 keep the old
proxy and say on the row that their count is of this map's groups and not of the
country. Mali now reads French at 46% and official.

Where two languages are within five points the map names BOTH and says it will
not choose. Mali is exactly that: French 46% and official, Bambara 46% and not —
one is the administrative language and the other is what people share in a
market, and which bridges better depends on whether you are handing over a
booklet or starting a conversation. A tie-break would have quietly answered a
question nobody asked it. Both carry their own links, for the same reason the
first one does.

Two field lists were a field short, the same shape twice. The candidate filter
and the link resolver both read c.s for "has a readable Scripture" and forgot
that Faith Comes By Hearing carries text on the audio record — which excluded
Bambara from Mali's candidates entirely, and then, once it was named, offered it
the film while a full 66-book text sat one field away. There is now one
predicate.

The RTL gate read a hardcoded tree path. It reads the build config instead, and
was re-run against its baseline before the result was trusted.
This commit is contained in:
doxa-maps-88655c70 2026-09-25 21:34:38 +00:00
parent ca548b37ba
commit 56dffd1af8
16 changed files with 19202 additions and 49 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -32,13 +32,17 @@
*/
import { chromium } from 'playwright'
import { serveReaped } from './_serve-reaped.mjs'
import { TREE_NAME } from './_tree-name.mjs'
import { resolve, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..')
const PORT = Number(process.env.RTL_SHAPE_PORT || 5393)
const POISON = process.argv.includes('--poison')
const LEAF = 'doxa-maps/gospel-resources/resources-map/index.html'
/* ⚠ READ THE TREE NAME, NEVER SPELL IT. The tree was renamed doxa-maps -> dx-maps and every
hardcoded /doxa-maps/ path began 404ing; a probe that reports "0 problems" against a 404 reads
exactly like success. The build config is the one place that knows. */
const LEAF = `${TREE_NAME}/gospel-resources/resources-map/index.html`
/* Arabia: the densest concentration of rendered Arabic on the basemap. */
const RTL_VIEW = { center: [39.2, 24.5], zoom: 5 }

View file

@ -1160,11 +1160,17 @@ const bridgeResources = (b) => {
if (!b || !b.c) return null
const c = pinCodes.value[b.c]
if (!c) return null
/* ⚠ c.s IS NOT THE ONLY PLACE A READABLE SCRIPTURE LIVES, and reading only it lost the very
language this fix exists for: Bambara's text Bible is carried on the Faith Comes By Hearing
record (au.m names the media it holds), so the panel offered Bambara the film alone while a
full 66-book text sat one field away. Same field-list-goes-stale shape as the build script,
so the fallback is spelled out here rather than assumed. */
const fcbhText = c.au && /text/.test(c.au.m || '') ? c.au : null
return {
iso: b.c,
language: c.l || b.l || '',
scripture_url: c.s || '',
scripture_title: c.sv || '',
scripture_url: c.s || (fcbhText ? fcbhText.u : ''),
scripture_title: c.sv || (fcbhText ? fcbhText.n : ''),
film_url: c.f || '',
film_title: c.fT || '',
}
@ -1192,6 +1198,11 @@ const deafBridge = computed(() => {
/* Resolved once per selection rather than on every reference in the template. */
const curatedBridgeRes = computed(() => bridgeResources(selectedGroup.value?.bridge))
const candidateBridgeRes = computed(() => bridgeResources(selectedGroup.value?.bridge_candidate))
/* The runner-up on a near-tie is named in the sentence above, so it needs links for exactly the
reason the primary does: a bridge nobody can follow is not a way in. Naming two languages and
linking one would make the second look like the lesser option when the whole point is that the
map will not choose between them. */
const altBridgeRes = computed(() => bridgeResources(selectedGroup.value?.bridge_candidate?.alt))
const tableLink = (q) => {
const p = new URLSearchParams({ tab: 'links', ...q })
@ -1913,11 +1924,41 @@ useShadowStyles(
&& !selectedGroup.audio && !selectedGroup.gospel_audio && !selectedGroup.scripture_earth"
class="gm-sign" style="border-left-color:#d1d4cd" dir="ltr">
<b>Possibly a way in — worth checking locally.</b>
<br>Nothing was found in {{ selectedGroup.language || 'their language' }}. The largest
language in this country that does have Scripture and the JESUS Film is
<b>{{ selectedGroup.bridge_candidate.l }}</b>, spoken by
{{ selectedGroup.bridge_candidate.n }} people group<template v-if="selectedGroup.bridge_candidate.n !== 1">s</template>
here ({{ selectedGroup.bridge_candidate.pct }}% of this country's mapped population).
<br>Nothing was found in {{ selectedGroup.language || 'their language' }}.
<!-- TWO DIFFERENT DENOMINATORS, SAID PLAINLY. A CLDR candidate's percentage is a
share of the COUNTRY, which is what a reader assumes a percentage means. The
fallback's is a share of the PINNED population — a much smaller and invisible
denominator — so it is never printed as a bare percentage. -->
<template v-if="selectedGroup.bridge_candidate.src === 'cldr'">
<b>{{ selectedGroup.bridge_candidate.l }}</b> is spoken by
{{ selectedGroup.bridge_candidate.pct }}% of this country<template
v-if="selectedGroup.bridge_candidate.official"> and is an official language</template>,
and has Scripture and the JESUS Film.
<!-- A tie is not a ranking. Where a second language is within five points, both
are named rather than one being chosen by a rule the reader cannot see. -->
<template v-if="selectedGroup.bridge_candidate.alt">
So is <b>{{ selectedGroup.bridge_candidate.alt.l }}</b>, at
{{ selectedGroup.bridge_candidate.alt.pct }}%<template
v-if="selectedGroup.bridge_candidate.alt.official"> and official</template> —
the two are close enough that this map will not choose between them.
</template>
<div v-if="altBridgeRes && (altBridgeRes.scripture_url || altBridgeRes.film_url)" class="gm-chips">
<a v-if="altBridgeRes.scripture_url" class="gm-chip ok wrap"
:href="altBridgeRes.scripture_url" target="_blank" rel="noopener">
{{ altBridgeRes.language }} · {{ altBridgeRes.scripture_title || t('gospel.res.scripture') }} ↗</a>
<a v-if="altBridgeRes.film_url" class="gm-chip ok wrap"
:href="altBridgeRes.film_url" target="_blank" rel="noopener">
{{ altBridgeRes.language }} · {{ altBridgeRes.film_title || t('gospel.res.jesusFilm') }} ↗</a>
<a class="gm-chip wrap" :href="tableLink({ iso: altBridgeRes.iso, label: altBridgeRes.language })">
{{ t('gospel.sheet.everyResource') }} {{ altBridgeRes.language }} →</a>
</div>
</template>
<template v-else>
The largest language among the people groups mapped here that does have Scripture
and the JESUS Film is <b>{{ selectedGroup.bridge_candidate.l }}</b>, spoken by
{{ selectedGroup.bridge_candidate.n }} of them. That is a count of THIS MAP's
groups, not of the country — no published figure for the country was available.
</template>
<br><em>Not ranked and not recommended</em> — whether it actually reaches this group
is a local question, and the gap in their own language is unchanged.

View file

@ -760,6 +760,26 @@ for (const p of slim) {
* reason GRN is skipped for them above.
*/
const bridgeCandidates = {}
/**
* ONE definition of "this language has a readable Scripture", used by both pickers below.
*
* ⚠ WRITTEN OUT TWICE FIRST, AND THE SECOND COPY WAS A FIELD SHORT — it checked s, se and d and
* forgot that Faith Comes By Hearing carries TEXT on the audio record (au.m says so). MEASURED:
* Bambara has the JESUS Film and a 66-book FCBH text Bible, and was filtered out of Mali's
* bridge candidates for lack of Scripture, handing the recommendation to French. Bambara is
* Mali's vehicular language. That is the field-list-goes-stale bug the surfaces gate exists for,
* reproduced inside a build script where no gate was watching.
*/
const hasReadableScripture = (c) =>
!!c && (!!c.s || !!c.se || !!(c.au && /text/.test(c.au.m || '')) ||
(c.d || []).some((d) => !/^Open Bible Stories/.test(d.s || '')))
/* What each country actually speaks, with each language's share OF THE COUNTRY. Absent input is
not fatal: every candidate then falls back to the pinned-population proxy, as before. */
let countryLangs = {}
try {
countryLangs = JSON.parse(readFileSync(resolve(REPO, 'data/tables/country-languages.json'), 'utf8')).byCountry || {}
} catch { /* no CLDR table in this tree */ }
{
const pool = {}
const cpop = {}
@ -773,7 +793,7 @@ const bridgeCandidates = {}
const slot = (e[code] ||= { n: 0, pop: 0, l: c.l || '', s: false, f: false })
slot.n += 1
slot.pop += pop
slot.s = slot.s || !!c.s || !!c.se || (c.d || []).some((d) => !/^Open Bible Stories/.test(d.s || ''))
slot.s = slot.s || hasReadableScripture(c)
slot.f = slot.f || !!c.f
}
for (const p of pins) {
@ -782,6 +802,42 @@ const bridgeCandidates = {}
if (codes[code] && codes[code].sg === 1) continue
const key = `${code}|${iso3}`
if (bridges[key] || bridgeCandidates[key]) continue
/* ═══ ASK WHAT THE COUNTRY SPEAKS, NOT WHAT THE UNREACHED SPEAK ═══════════════════════
* The pin-derived pick below answers "the biggest language among Doxa's UNREACHED groups
* here", which is not the language a community shares with its neighbours. For Syenara
* Senufo in Mali it proposed Minianka — one people group — while Mali's vehicular language
* is Bambara at 46% of the country. CLDR is asked first, and only it can supply a share OF
* THE COUNTRY, which is the denominator a reader assumes when they see a percentage.
* Still filtered by what this index can actually offer: a bridge with no Scripture and no
* film behind it is a name, not a way in. */
const spoken = (countryLangs[iso3] || [])
.filter((x) => x.c !== code && codes[x.c] && !!codes[x.c].f && hasReadableScripture(codes[x.c]))
/* Official status breaks a tie between equal shares — Mali's French and Bambara are both
46% — because the official one is the likelier second language to already be taught. */
const ranked = spoken.sort((a, b) => (b.pct - a.pct) || (b.official - a.official))
const cldrBest = ranked[0]
if (cldrBest) {
/* ⚠ WHEN TWO LANGUAGES ARE TIED, PICKING ONE IS AN EDITORIAL ACT, NOT A MEASUREMENT.
* Mali is exactly this: French 46% and official, Bambara 46% and not. French is the
* administrative language, Bambara is what people actually share in a market or a
* village, and which one bridges better depends on whether the reader is handing over
* a booklet or starting a conversation. The panel already says the choice is a local
* question; so where a runner-up is within five points, BOTH are shipped and the reader
* decides. A tie-break here would have quietly answered a question nobody asked it. */
const alt = ranked[1] && (cldrBest.pct - ranked[1].pct) <= 5 ? ranked[1] : null
bridgeCandidates[key] = {
l: codes[cldrBest.c]?.l || cldrBest.l,
c: cldrBest.c,
pct: cldrBest.pct,
official: cldrBest.official,
src: 'cldr',
...(alt ? { alt: { l: codes[alt.c]?.l || alt.l, c: alt.c, pct: alt.pct, official: alt.official } } : {}),
}
continue
}
/* FALLBACK, and it says so on the row. CLDR lists no language here that this index can
offer, so the old proxy is better than nothing — but its percentage is a share of the
PINNED population, a different denominator, and the surfaces read `src` to say which. */
const best = Object.entries(pool[iso3] || {})
.filter(([cc, s]) => cc !== code && s.s && s.f)
.sort((a, b) => b[1].pop - a[1].pop)[0]
@ -790,6 +846,7 @@ const bridgeCandidates = {}
bridgeCandidates[key] = {
l: best[1].l, c: best[0], n: best[1].n,
pct: tot ? Math.round((1000 * best[1].pop) / tot) / 10 : 0,
src: 'pins',
}
}
}

View file

@ -0,0 +1,123 @@
/**
* fetch-country-languages.mjs — which languages are actually SPOKEN in a country, and by what
* share of it.
*
* WHY THIS EXISTS. The bridge CANDIDATE — the "possibly a way in" offered to a group with
* nothing — was chosen from Doxa's own pins: the language with the largest pinned population in
* that country that has Scripture and the film. Doxa's roster is 2,107 UNREACHED groups, so that
* is the biggest language among the unreached, which is not the language a community actually
* shares with its neighbours. Measured: for Syenara Senufo in Mali it proposed MINIANKA, one
* people group. Mali's actual vehicular language is Bambara, spoken by most of the country.
*
* Worse, the number shipped beside it read "8.8% of this country's mapped population" — a share
* of Doxa's unreached PINS, which a reader will take for a share of the country. A percentage
* measured against a denominator nobody can see is not a caveat, it is a wrong number.
*
* WHAT THIS USES. CLDR's territoryInfo, which carries, per territory, each language's share of
* the population and whether it is official. That is the published answer to "what is spoken
* here", maintained by Unicode, and it is the right denominator: the country.
*
* ⚠ PINNED, NOT `main`. cldr-json's main branch moves; a bridge recommendation changing because
* an upstream branch advanced is not something anyone would think to look for.
*
* THE JOIN. CLDR speaks BCP-47, this build speaks ISO 639-3, and the two meet through the Part1
* column of SIL's own iso-639-3 table — 184 languages carry a 639-1 code. A CLDR tag with no
* 639-3 equivalent is dropped rather than guessed; a guess here would put a language in a
* country on no authority at all.
*/
import { writeFileSync } from 'node:fs'
import { resolve, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const HERE = dirname(fileURLToPath(import.meta.url))
const REPO = resolve(HERE, '../../..')
const OUT = resolve(REPO, 'data/tables/country-languages.json')
const UA = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36'
const CLDR = 'https://cdn.jsdelivr.net/npm/cldr-core@46.0.0/supplemental/territoryInfo.json'
const ISO = 'https://iso639-3.sil.org/sites/iso639-3/files/downloads/iso-639-3.tab'
/* Keyed by ISO3 on the way out, so the pin builder joins on the code it already has. The
mapping comes from the SAME pinned CLDR release as the language data, rather than a second
host with its own release cycle. */
const CODES = 'https://cdn.jsdelivr.net/npm/cldr-core@46.0.0/supplemental/codeMappings.json'
const get = async (url) => {
const r = await fetch(url, { headers: { 'user-agent': UA }, signal: AbortSignal.timeout(90000) })
if (!r.ok) throw new Error(`${url} -> ${r.status}`)
return r.text()
}
/* Part1 (639-1) -> Id (639-3), plus the reference name, from SIL's own table. */
const tab = await get(ISO)
const toIso3 = {}
const refName = {}
for (const line of tab.split('\n').slice(1)) {
const f = line.split('\t')
if (f.length < 7) continue
const [id, , , part1, , , name] = f
if (!id) continue
refName[id] = (name || '').trim()
if (part1 && part1.trim()) toIso3[part1.trim()] = id.trim()
}
const codeMap = JSON.parse(await get(CODES)).supplemental.codeMappings
const alpha3 = {}
for (const [terr, v] of Object.entries(codeMap)) {
if (/^[A-Z]{2}$/.test(terr) && v && v._alpha3) alpha3[terr] = v._alpha3
}
const cldr = JSON.parse(await get(CLDR)).supplemental.territoryInfo
const byCountry = {}
let dropped = 0
let noAlpha3 = 0
for (const [terr, info] of Object.entries(cldr)) {
/* Two-letter territories only: CLDR also carries numeric macro-regions like 001 (World),
which are not countries and would put "spoken in the World" into a bridge recommendation. */
if (!/^[A-Z]{2}$/.test(terr)) continue
const langs = []
for (const [tag, lp] of Object.entries(info.languagePopulation || {})) {
/* A tag like en_GB or zh_Hans carries a script or region; the base language is what a
speaker shares with a neighbour, so it is taken and the variant dropped. */
const base = tag.split(/[-_]/)[0]
const iso3 = toIso3[base] || (base.length === 3 ? base : null)
if (!iso3) { dropped++; continue }
const pct = Number(lp._populationPercent)
if (!Number.isFinite(pct)) continue
langs.push({
c: iso3,
l: refName[iso3] || base,
pct: Math.round(pct * 10) / 10,
official: !!lp._officialStatus,
})
}
if (!langs.length) continue
/* Largest share first: that is the order a reader would want to judge a bridge in. */
langs.sort((a, b) => b.pct - a.pct)
const key = alpha3[terr]
if (!key) { noAlpha3++; continue }
byCountry[key] = langs
}
const countries = Object.keys(byCountry).length
if (countries < 150) {
console.error(`COUNTRY-LANGUAGES: REFUSING TO WRITE — only ${countries} countries parsed.`)
console.error(' A thin file would silently narrow every bridge recommendation that reads it.')
process.exitCode = 1
} else {
writeFileSync(OUT, `${JSON.stringify({
meta: {
title: 'Languages spoken per country, with each share of the country',
sources: [CLDR, ISO],
generated: new Date().toISOString().slice(0, 10),
countries,
note: 'CLDR territoryInfo joined to ISO 639-3 through SIL\'s Part1 column. Percentages are ' +
'of the COUNTRY\'s population, which is the denominator a reader assumes. A CLDR tag ' +
'with no ISO 639-3 equivalent is dropped, never guessed.',
cldr_tags_dropped_no_iso639_3: dropped,
territories_dropped_no_alpha3: noAlpha3,
},
byCountry,
}, null, 1)}\n`)
console.log(`country-languages: ${countries} countries (keyed by ISO3), ${dropped} CLDR tag(s) dropped for having no ISO 639-3, ${noAlpha3} territory(ies) with no alpha-3`)
console.log(`wrote ${OUT}`)
}

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -579,7 +579,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "doxa-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW",
"integrity": "sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4",
"elements": [
"gospel-resources-map"
],
@ -599,7 +599,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/charts/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -613,7 +613,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/data-tables/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -627,7 +627,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -641,7 +641,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -655,7 +655,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
}
]

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4" 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 <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4" 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

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -579,7 +579,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "doxa-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW",
"integrity": "sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4",
"elements": [
"gospel-resources-map"
],
@ -599,7 +599,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/charts/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -613,7 +613,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/data-tables/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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -627,7 +627,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -641,7 +641,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-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=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -655,7 +655,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-iD78CF92PmluebYnLiMI+EiWcp+fah+Kdt5y+cimHhszO7SM80FOnkftGUkvECcW\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-3CcsR+Gwp+5Y8m2X/YRhMSfy8e12RDy42KbVFrlEQI26RBVo5PgCkea5KOzetkR4\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
}
]