Update from source eb07fe9e
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-26 07:14:57 +00:00
parent 3cd8a8cd30
commit 1d27e792b6
18 changed files with 1853 additions and 183 deletions

View file

@ -0,0 +1,670 @@
{
"meta": {
"title": "Gospel access by province — India and China",
"why": "These two countries hold 47.9% of Doxa's roster (855 + 154 of 2,107). No other country is close; the third is Sudan at 105. A national fill cannot answer \"where would a team go\" for half the map.",
"generated": "2026-09-26",
"provinces_with_groups": 44,
"provinces_available": 46,
"groups_assigned": 998,
"groups_unassigned": 11,
"china_note": "China's ADM1 file carries 12 provinces, not 31+. Measured rather than assumed: 152 of 154 Chinese groups fall inside them and all twelve are used, so the file is cut to the provinces where the unreached peoples are.",
"ways_in_are_country_level": "The ways in are chosen for the COUNTRY, and going below the border is what exposes the cost of that. Arunachal Pradesh, in the far north-east, is offered TELUGU — a South Indian language — because the curated bridge table names it for those groups and a curated bridge outranks the computed one. India's computed default is Hindi (41%, official), which is defensible nationally and still wrong for much of the north-east. This table does not fix that: it makes it visible. Until a bridge can be chosen per province, read the ways-in column as \"a language with Scripture and film somewhere in this country\", not as a recommendation for this place.",
"approximate": "A province is assigned by point-in-polygon on the group's coordinate, and that coordinate marks where a PEOPLE is found, not a settlement — 108 groups across the roster even share a coordinate with another group. Near a border the point can fall on the wrong side. Every row is flagged approximate and the unassigned are counted, never dropped. No surface may present a province as a fact about a group."
},
"columns": [
{
"title": "Country",
"field": "country",
"type": "string"
},
{
"title": "Province",
"field": "province",
"type": "string"
},
{
"title": "People groups",
"field": "groups",
"type": "number"
},
{
"title": "People",
"field": "people",
"type": "number"
},
{
"title": "Groups with nothing",
"field": "zero_access_groups",
"type": "number"
},
{
"title": "People with nothing",
"field": "zero_access_people",
"type": "number"
},
{
"title": "Largest with nothing",
"field": "zero_access_examples",
"type": "string"
},
{
"title": "Ways in",
"field": "ways_in",
"type": "string"
},
{
"title": "Placement approximate",
"field": "approximate",
"type": "string"
}
],
"rows": [
{
"country": "China",
"iso3": "CHN",
"province": "Yunnan Province",
"groups": 61,
"people": 3524875,
"zero_access_groups": 14,
"zero_access_people": 602850,
"zero_access_examples": "Hongjin Tai; Wenma Zhuang; Mosuo",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Guizhou Province",
"groups": 34,
"people": 3302000,
"zero_access_groups": 7,
"zero_access_people": 488900,
"zero_access_examples": "Huishui Miao; Yanghuang; Cai",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Sichuan Province",
"groups": 12,
"people": 1621700,
"zero_access_groups": 7,
"zero_access_people": 105700,
"zero_access_examples": "Ersu; Minyak; Namuyi",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Andaman and Nicobar Islands",
"groups": 7,
"people": 81900,
"zero_access_groups": 2,
"zero_access_people": 500,
"zero_access_examples": "Jarawas; Onge",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Arunāchal Pradesh",
"groups": 7,
"people": 13550,
"zero_access_groups": 2,
"zero_access_people": 600,
"zero_access_examples": "Khamba; Na",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Xinjiang Uyghur Autonomous Region",
"groups": 7,
"people": 284125,
"zero_access_groups": 2,
"zero_access_people": 31500,
"zero_access_examples": "Sarikoli Tajiks; Ainu",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Hunan Province",
"groups": 5,
"people": 2405000,
"zero_access_groups": 2,
"zero_access_people": 150000,
"zero_access_examples": "Eastern Xiangxi Miao; Wunai",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Qinghai Province",
"groups": 3,
"people": 55700,
"zero_access_groups": 2,
"zero_access_people": 12700,
"zero_access_examples": "Tongren Bonan; Wutun",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Kerala",
"groups": 72,
"people": 2804375,
"zero_access_groups": 1,
"zero_access_people": 8600,
"zero_access_examples": "Malai Pandaram",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Jhārkhand",
"groups": 9,
"people": 957400,
"zero_access_groups": 1,
"zero_access_people": 5000,
"zero_access_examples": "Jadupetia",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Guangxi Zhuang Autonomous Region",
"groups": 6,
"people": 121150,
"zero_access_groups": 1,
"zero_access_people": 750,
"zero_access_examples": "Yerong",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Manipur",
"groups": 5,
"people": 321400,
"zero_access_groups": 1,
"zero_access_people": 1700,
"zero_access_examples": "Koiren",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Inner Mongolia Autonomous Region",
"groups": 3,
"people": 206900,
"zero_access_groups": 1,
"zero_access_people": 170000,
"zero_access_examples": "Buryat",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Gujarāt",
"groups": 90,
"people": 3164770,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Andhra Pradesh",
"groups": 81,
"people": 4858130,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Karnātaka",
"groups": 81,
"people": 4610175,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Tamil Nādu",
"groups": 64,
"people": 2760850,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Odisha",
"groups": 64,
"people": 1304500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Mahārāshtra",
"groups": 53,
"people": 2858050,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Rājasthān",
"groups": 48,
"people": 1731500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Madhya Pradesh",
"groups": 33,
"people": 2922600,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Jammu and Kashmīr",
"groups": 33,
"people": 520515,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "West Bengal",
"groups": 30,
"people": 2211000,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Telangāna",
"groups": 26,
"people": 1665800,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Chhattīsgarh",
"groups": 24,
"people": 1916750,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Uttar Pradesh",
"groups": 23,
"people": 836550,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Himāchal Pradesh",
"groups": 20,
"people": 114970,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Bihār",
"groups": 18,
"people": 430100,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Assam",
"groups": 15,
"people": 2377400,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Tibet Autonomous Region",
"groups": 13,
"people": 208750,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Tripura",
"groups": 11,
"people": 698500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Uttarākhand",
"groups": 7,
"people": 111875,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Ladākh",
"groups": 6,
"people": 183000,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Goa",
"groups": 5,
"people": 337600,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Haryāna",
"groups": 4,
"people": 69500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Punjab",
"groups": 4,
"people": 10100,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Gansu Province",
"groups": 3,
"people": 21400,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Hainan Province",
"groups": 3,
"people": 1096500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Meghālaya",
"groups": 2,
"people": 17150,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Heilongjiang Province",
"groups": 2,
"people": 5000,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Delhi",
"groups": 1,
"people": 1200,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Chandīgarh",
"groups": 1,
"people": 34000,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Puducherry",
"groups": 1,
"people": 20500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Sikkim",
"groups": 1,
"people": 7400,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
}
],
"unassigned": [
{
"country": "India",
"iso3": "IND",
"people_group": "Bharwad",
"lat": 20.322175,
"lng": 72.968458
},
{
"country": "India",
"iso3": "IND",
"people_group": "Great Andamanese",
"lat": 12.211728,
"lng": 92.833491
},
{
"country": "India",
"iso3": "IND",
"people_group": "Indo-French",
"lat": 11.930182,
"lng": 79.797144
},
{
"country": "India",
"iso3": "IND",
"people_group": "Indo-Vietnamese",
"lat": 11.912456,
"lng": 79.815389
},
{
"country": "India",
"iso3": "IND",
"people_group": "Laccadive",
"lat": 10.0675,
"lng": 73.6422
},
{
"country": "India",
"iso3": "IND",
"people_group": "Sagharias",
"lat": 20.71815,
"lng": 70.988939
},
{
"country": "India",
"iso3": "IND",
"people_group": "Sentinelese",
"lat": 11.557662,
"lng": 92.267154
},
{
"country": "India",
"iso3": "IND",
"people_group": "Vettalaikarans",
"lat": 11.916308,
"lng": 79.807019
},
{
"country": "India",
"iso3": "IND",
"people_group": "Vettiyan",
"lat": 11.91386,
"lng": 79.814472
},
{
"country": "China",
"iso3": "CHN",
"people_group": "Jing",
"lat": 21.577774,
"lng": 108.126828
},
{
"country": "China",
"iso3": "CHN",
"people_group": "Pana",
"lat": 21.246492,
"lng": 101.27182
}
]
}

View file

@ -183,12 +183,36 @@ const activeBands = computed(() => (mode.value === 'gap' ? BANDS : COVER_BANDS))
// COUNT of Doxa groups in a country, a pin is what ONE group HAS. Indexing a count ramp by
// a tier would have painted "nothing found" in the colour of "1-4 groups" — two different
// facts wearing one colour, which is the disagreement that comment was written to prevent.
// Dark green reads as complete, sage as partial, oxblood as empty; all three sit apart from
// the clay country ramp in hue and in lightness, so a pin never dissolves into its country.
/**
* ═══ THE GAP IS A HOLE IN THE MAP ════════════════════════════════════════════════════════
*
* The claim above — "all three sit apart from the clay ramp" — was false for the one that
* matters. Tier 0 was #7d3b30 and the darkest country fill is #7d3b30: THE SAME COLOUR. So in
* exactly the countries with 40+ groups having nothing, the pins that matter most dissolved
* into their own country. Reported by the agent; confirmed by reading the two tables.
*
* Hue alone cannot fix this, because a choropleth and its pins compete for the same range at
* every zoom. So the states differ in FORM, which survives any background:
*
* nothing found a HOLE — white centre, thick oxblood rim. Reads as absence, and carries
* both a light and a dark component, so it separates on pale fills and on
* the darkest one. Largest, and drawn on top.
* some resource a solid sage dot
* Scripture+film a small solid dark dot, quiet, receding
*
* A white under-halo sits beneath every pin as well, so a dot never touches its fill directly.
* Size carries urgency, form carries state, colour agrees with both: at a glance the map reads
* as holes where the gospel is not, and the eye goes to them first.
*/
const PIN_COLOR = {
2: '#3b463d', // Scripture AND film in their own language
1: '#92b195', // one of the two
0: '#7d3b30', // nothing found in the pools checked — the pin that matters most
0: '#ffffff', // nothing found — a WHITE CORE, rimmed oxblood by the stroke below
}
const PIN_RIM = {
2: '#ffffff',
1: '#ffffff',
0: '#7d3b30', // the rim carries the alarm; the hole carries the meaning
}
@ -283,12 +307,19 @@ function setPinFilter(v) {
pinFilter.value = v
const m = mapRef.value
if (!m || !m.getLayer('gr-pins')) return
m.setFilter('gr-pins',
/* Both layers, always. A halo left behind by a filtered-out pin is a ghost dot, and the
reader has no way to tell it from a real one. */
/* ONE expression, applied to both layers. Written twice, the halo and the pin would drift
and a filtered-out pin would leave its halo behind as a ghost dot the reader cannot tell
from a real one. */
const expr =
v === 'all' ? null
: v === 'none' ? ['==', ['get', 'tier'], 0]
: v === 'some' ? ['==', ['get', 'tier'], 1]
: v === 'hnr' ? ['==', ['get', 'hnr'], true]
: ['==', ['get', 'tier'], 2])
: ['==', ['get', 'tier'], 2]
if (m.getLayer('gr-pins-halo')) m.setFilter('gr-pins-halo', expr)
m.setFilter('gr-pins', expr)
}
// THE RANKED GAP. "Where is the gap" is answered by the filter; "which gap is biggest"
@ -733,6 +764,7 @@ function groupAt(i) {
population: r[5],
countries: byIso.value[r[3]]?.country || r[3],
_iso3: r[3] || '',
lat: r[1], lng: r[2],
scripture_url: c.s || '',
film_url: c.f || '',
/* Empty except where the JESUS component does not carry this language and another
@ -811,6 +843,37 @@ const withoutResources = computed(() => groupsForCountry.value.filter((r) => !ha
* Third time this exact flag has under-reported: the pins builder and the access builder were
* both corrected the same way. Same three signals here, so the four surfaces agree.
*/
/**
* ═══ WHAT A DOT IS, AND WHAT IT IS NOT ════════════════════════════════════════════════════
*
* A pin is a locality marker for a PEOPLE, not the location of a settlement, and the data says
* so if you look at it. MEASURED over the 2,107 placed groups: 2,048 distinct coordinates, so
* 49 coordinates carry more than one group and 108 groups sit on a point they share with
* another — 41 pairs, 6 triples and 2 quadruples. Four groups share 12.843781, 75.247906 in
* coastal Karnataka; four more share a second point a few kilometres away.
*
* The coordinates also carry FALSE PRECISION: 1,274 of them are given to six decimal places,
* which is metre resolution on a figure that describes where a people is found. Rendering that
* without comment invites a reader to treat a dot as an address.
*
* So the sheet says what the dot is, and where a point is shared it says how many share it.
* "Approximate" alone is not the honest word — it hides that some dots are literally the same
* dot, which is the part a reader would otherwise never discover.
*/
const sharedPoints = computed(() => {
const at = {}
for (const r of pinRows.value) {
const k = `${r[1]},${r[2]}`
;(at[k] = at[k] || []).push(r[0])
}
return at
})
const sharedWith = (g) => {
if (!g || g.lat == null || g.lng == null) return []
const names = sharedPoints.value[`${g.lat},${g.lng}`] || []
return names.filter((n) => n !== g.people_group)
}
const isDeafGroup = (code, name) => {
const c = pinCodes.value[code]
return (c && c.sg === 1) || /sign language/i.test((c && c.l) || '') || /\bDeaf\b/i.test(name || '')
@ -1039,7 +1102,7 @@ function pinFC() {
type: 'Feature',
// hnr is baked so the filter stays a GL-side predicate like the others: recomputing it
// per toggle would re-upload 12,379 features to answer a yes/no already known here.
properties: { i, tier: p[6], color: PIN_COLOR[p[6]], hnr: hnrFor(p[4]) },
properties: { i, tier: p[6], color: PIN_COLOR[p[6]], rim: PIN_RIM[p[6]], hnr: hnrFor(p[4]) },
geometry: { type: 'Point', coordinates: [p[2], p[1]] },
}
}
@ -1073,6 +1136,23 @@ function paintPins(map) {
if (!pinRows.value.length) return
if (map.getSource('gr-pin-src')) { map.getSource('gr-pin-src').setData(pinFC()); return }
map.addSource('gr-pin-src', { type: 'geojson', data: pinFC() })
/* A neutral halo UNDER every pin, so a dot never touches its fill directly. This is what
makes the encoding survive a choropleth that shares its colour range — form and hue both
fail on a near-match, a gap of background does not. Separate layer, because a circle has
one stroke and the pin above needs its own for the rim. */
map.addLayer({
id: 'gr-pins-halo', type: 'circle', source: 'gr-pin-src',
paint: {
'circle-color': 'rgba(255,255,255,0.85)',
'circle-radius': ['interpolate', ['linear'], ['zoom'],
0, ['match', ['get', 'tier'], 0, 4.0, 2.7],
4, ['match', ['get', 'tier'], 0, 6.0, 4.0],
8, ['match', ['get', 'tier'], 0, 9.4, 6.6],
12, ['match', ['get', 'tier'], 0, 13, 9.4]],
'circle-blur': 0.35,
'circle-opacity': 0.55,
},
})
map.addLayer({
id: 'gr-pins', type: 'circle', source: 'gr-pin-src',
// circle-sort-key is a LAYOUT property. Mapbox tolerates it in `paint`; MapLibre
@ -1088,11 +1168,21 @@ function paintPins(map) {
},
paint: {
'circle-color': ['get', 'color'],
'circle-stroke-color': '#ffffff',
'circle-stroke-width': ['interpolate', ['linear'], ['zoom'], 0, 0.4, 6, 0.8, 12, 1.1],
'circle-stroke-opacity': 0.85,
'circle-radius': ['interpolate', ['linear'], ['zoom'], 0, 1.8, 4, 3, 8, 5.5, 12, 8],
'circle-opacity': 0.92,
'circle-stroke-color': ['get', 'rim'],
// The hole needs a rim thick enough to be a rim and not an outline: at world zoom a
// 0.4px stroke on a 1.8px dot is invisible, which is how the old one disappeared.
'circle-stroke-width': ['interpolate', ['linear'], ['zoom'],
0, ['match', ['get', 'tier'], 0, 1.1, 0.5],
6, ['match', ['get', 'tier'], 0, 1.8, 0.9],
12, ['match', ['get', 'tier'], 0, 2.6, 1.2]],
'circle-stroke-opacity': 1,
// Size is urgency. A group with nothing is the largest dot on the map at every zoom.
'circle-radius': ['interpolate', ['linear'], ['zoom'],
0, ['match', ['get', 'tier'], 0, 2.6, 1.6],
4, ['match', ['get', 'tier'], 0, 4.2, 2.6],
8, ['match', ['get', 'tier'], 0, 7, 4.8],
12, ['match', ['get', 'tier'], 0, 10, 7]],
'circle-opacity': 1,
},
})
// TAP, not hover — same reason as the choropleth: hover never fires on a phone.
@ -1414,7 +1504,15 @@ useShadowStyles(
// again — a geometric guarantee, not a tuned z-index.
// KEEP THIS BYTE-IDENTICAL to cities-internet/connectivity-map.vue: they are
// clones and the whole point of fixing them together is that they not diverge.
/* ═══ THE LEGEND MUST NEVER RUN OFF THE MAP ═══════════════════════════════════════════
Reported by the agent: it overlapped the bottom of the page. It is absolutely
positioned inside the map, so its height was whatever its content happened to be — on a
short viewport that is taller than the map itself, and the overflow simply escaped.
Capped to the map's own height and scrolled inside. The cap is the CONTAINER's height,
not the viewport's, because this leaf is embedded and the two are not the same thing —
using vh here would break on every partner page that gives the map a fixed box. */
'.gm-legend{position:absolute;top:8px;left:8px;width:var(--map-legend-width,380px);' +
'max-height:calc(100% - 16px);overflow-y:auto;overscroll-behavior:contain;' +
'max-width:calc(100% - 16px);box-sizing:border-box;z-index:4;padding:8px 10px;' +
'border-radius:10px;background:rgba(255,255,255,.94);color:#0f1419;' +
"font:12px/1.35 -apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;box-shadow:0 2px 10px rgba(0,0,0,.16)}" +
@ -1445,6 +1543,13 @@ useShadowStyles(
'padding:3px 8px;border-radius:6px;cursor:pointer;margin-left:4px;min-height:24px}' +
'.gm-pinkey-h{font-size:14px;font-weight:600;margin-bottom:4px}' +
'.gm-caveat{margin-top:5px;font-size:13.5px;opacity:.72;line-height:1.4}' +
'.gm-dot-hole{border:2.5px solid #7d3b30;box-sizing:border-box}' +
'.gm-why{margin-top:6px}' +
'.gm-why-sum{cursor:pointer;font-weight:600;opacity:.9;list-style:none;padding:2px 0}' +
'.gm-why-sum::-webkit-details-marker{display:none}' +
'.gm-why-sum::before{content:"\\25B8 "}' +
'details[open]>.gm-why-sum::before{content:"\\25BE "}' +
'.gm-why-body{margin-top:4px;opacity:.9}' +
/* Quiet enough that the gap itself still reads first: the row is about what is MISSING, and
the way in is the footnote to it, not the headline. */
'.gm-pg-way{display:block;font-size:12.5px;color:#3b463d;opacity:.8;margin-top:2px}' +
@ -1683,7 +1788,10 @@ useShadowStyles(
<button type="button" class="gm-key gm-kbtn" :class="{ on: pinFilter === 'none' }"
@click="setPinFilter(pinFilter === 'none' ? 'all' : 'none')"
:aria-pressed="pinFilter === 'none'">
<i class="gm-dot" :style="{ background: PIN_COLOR[0] }"></i>{{ t('gospel.legend.tier0') }}
<!-- The swatch must BE the mark it explains. Tier 0 is a hole on the map — white
core, oxblood rim — so a plain filled dot here would teach the wrong symbol,
and a white one would vanish against this panel. -->
<i class="gm-dot gm-dot-hole" :style="{ background: PIN_COLOR[0], borderColor: PIN_RIM[0] }"></i>{{ t('gospel.legend.tier0') }}
<b>{{ fmt(pinTally.none) }}</b>
</button>
<!-- ═══ THE NUMBER BESIDE THE GAP IS THE ONE A MOBILISER CAME FOR ══════════════════
@ -1735,23 +1843,28 @@ useShadowStyles(
<div v-show="!narrow || legendOpen" v-if="!isEnglish" class="gm-caveat gm-prose-note">
{{ t('gospel.prose.english') }}
</div>
<div v-show="!narrow || legendOpen" class="gm-caveat" dir="ltr">
<!-- The colour and the dots are now computed from the SAME index. They used to be
two datasets: the fill came from a curated set that had one group for Papua New
Guinea while the map drew 831 pins there, so 135 of 170 countries were coloured
by something the dots on top of them contradicted. -->
<!-- The three SHORT instruction lines are translated; the long prose around them stays
English by decision. They are what a reader needs to use the map at all — what a
dot is, what "none found" does not mean, and that a country is tappable — so
leaving them English made the map unusable rather than merely untranslated. -->
<b>{{ t('gospel.guide.dotVsCountry') }}</b>
<span dir="ltr"> A country is a COUNT of those groups — how many of
<!-- ═══ BOTTOM LINE UP FRONT ═══════════════════════════════════════════════════════
The three bold lines are the whole instruction set: what a dot is, what "none
found" does not mean, and that a country is tappable. They are short, translated,
and they are what a mobiliser opens this map for.
Behind them sat 232 words of English prose — every word true and load-bearing, and
none of it needed before you act. It was also half the reason the legend overflowed
the page. Folded, not deleted: the basis is one click away, it stays English by the
standing decision on prose, so folding costs nothing to translate and removes 232
words from first sight. -->
<div v-show="!narrow || legendOpen" class="gm-caveat" dir="ltr">
<b>{{ t('gospel.guide.dotVsCountry') }}</b>
<br><b>{{ t('gospel.guide.noneFoundShort') }}</b>
<br><b>{{ t('gospel.guide.tapCountry') }}</b>
<details class="gm-why">
<summary class="gm-why-sum">How these numbers are made</summary>
<div class="gm-why-body">
<span dir="ltr"> A country is a COUNT of those groups — how many of
Doxa's are there with nothing found — never a percentage: 106 of these 175 countries hold
one or two groups, and a share over a denominator of two says nothing. A country Doxa does
not work is left UNCOLOURED rather than drawn as covered, because this dataset has no
finding about it either way.</span>
<br><b>{{ t('gospel.guide.noneFoundShort') }}</b>
<span dir="ltr">The pools checked are eBible, PNG.Bible, JESUS Film, Door43,
<span dir="ltr">The pools checked are eBible, PNG.Bible, JESUS Film, Door43,
Faith Comes By Hearing, Scripture Earth and Global Recordings Network). GRN is reached
through their 5fish site, and that sweep is now <b>finished for every group in the gap</b>
— every language with nothing else was asked for, at the ten-second crawl delay they
@ -1762,8 +1875,9 @@ useShadowStyles(
<template v-if="mode === 'coverage'">
A “found” colour is equally bounded: it counts what these pools list, not everything that exists.
</template></span>
<br><b>{{ t('gospel.guide.tapCountry') }}</b>
</div>
</div>
</details>
</div>
</div>
<div v-if="err" class="gm-err">{{ err }}</div>
@ -1932,6 +2046,22 @@ useShadowStyles(
<div class="gm-stat"><span>{{ t('gospel.stat.population') }}</span><b>{{ fmt(selectedGroup.population) }}</b></div>
<div class="gm-stat"><span>{{ t('gospel.stat.countries') }}</span><b>{{ selectedGroup.countries }}</b></div>
<!-- ═══ WHAT THE DOT MEANS, SAID ON THE SHEET THAT THE DOT OPENED ══════════════════
A pin marks where a PEOPLE is found, not a settlement, and the data shows it: 108
of the 2,107 placed groups sit on a coordinate they share with another group. Where
this one does, it names them, because "approximate" on its own hides the part a
reader would never otherwise discover — that some dots are literally the same dot.
English prose in a dir="ltr" block, per the standing decision on caveats. -->
<p class="gm-note" dir="ltr" style="margin:6px 0 0">
The dot marks where this people is found, not a town or a boundary.
<template v-if="sharedWith(selectedGroup).length">
It sits on the same point as
<b>{{ sharedWith(selectedGroup).join(', ') }}</b> — {{ sharedWith(selectedGroup).length + 1 }}
groups share this coordinate, so the position tells you the locality and not which
group is where.
</template>
</p>
<div class="gm-sec">
<div class="gm-sec-h">{{ t('gospel.sheet.ownLanguage') }}</div>
<div class="gm-chips">

View file

@ -0,0 +1,186 @@
/**
* build-gospel-by-province.mjs — gospel access BELOW the national border, for the two countries
* that hold half the roster.
*
* WHY ONLY INDIA AND CHINA. 855 of Doxa's 2,107 groups are in India and 154 in China: 47.9% of
* everything this map draws, rendered until now as two flat fills. A mobiliser choosing between
* Bihar and Tamil Nadu got nothing from the map. No other country comes close — the third is
* Sudan at 105 — so this is not the start of a worldwide ADM1 project, it is the two countries
* where a national border is useless.
*
* ⚠ CHINA'S ADM1 FILE IS A SUBSET AND THAT TURNS OUT TO BE THE RIGHT SUBSET. It carries 12
* provinces, not China's 31+ — Yunnan, Guizhou, Tibet, Sichuan, Xinjiang, Guangxi, Hainan,
* Hunan, Qinghai, Gansu, Inner Mongolia, Heilongjiang. I expected that to lose groups and
* measured instead: 152 of 154 Chinese groups fall inside them, and ALL TWELVE are used. The
* file was cut to the provinces where the unreached peoples actually are.
*
* ⚠ AND THE ASSIGNMENT IS ONLY AS GOOD AS THE PIN. A group's province comes from a
* point-in-polygon test on a coordinate that marks where a PEOPLE is found, not a settlement —
* 108 groups even share a coordinate with another group. Near a border that point can fall on
* the wrong side. So every row carries `approximate: true`, the unassigned are COUNTED rather
* than dropped, and no surface may present a province as a fact about a group.
* Measured: 9 of 855 Indian groups and 2 of 154 Chinese ones land outside every polygon.
* They are reported, not hidden.
*/
import { readFileSync } from 'node:fs'
import { resolve, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
import { writeSnapshot } from './_snapshot-guard.mjs'
const HERE = dirname(fileURLToPath(import.meta.url))
const REPO = resolve(HERE, '../../..')
const OUT = resolve(REPO, 'data/tables/gospel-by-province.json')
const T = (f) => JSON.parse(readFileSync(resolve(REPO, 'data/tables', f), 'utf8'))
const BOUND = (f) => JSON.parse(readFileSync(resolve(REPO, 'public/dx-maps/assets/boundaries', f), 'utf8'))
const { tiers = {}, codes = {}, bridges = {}, bridgeCandidates = {}, sun } = T('people-group-pins.json')
const roster = T('doxa-people-groups.json').rows || []
/* Ray casting, with holes honoured: a point inside an inner ring is outside the polygon. */
const ringHas = (ring, x, y) => {
let inside = false
for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
const xi = ring[i][0], yi = ring[i][1], xj = ring[j][0], yj = ring[j][1]
if (((yi > y) !== (yj > y)) && (x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)) inside = !inside
}
return inside
}
const polyHas = (poly, x, y) => {
if (!ringHas(poly[0], x, y)) return false
for (let k = 1; k < poly.length; k++) if (ringHas(poly[k], x, y)) return false
return true
}
const featHas = (f, x, y) => {
const g = f.geometry
if (!g) return false
if (g.type === 'Polygon') return polyHas(g.coordinates, x, y)
if (g.type === 'MultiPolygon') return g.coordinates.some((p) => polyHas(p, x, y))
return false
}
/* A bbox pre-filter: without it this is 1,009 groups x 46 polygons of full ray casting. */
const bboxOf = (f) => {
const m = [180, 90, -180, -90]
const walk = (a) => {
if (typeof a[0] === 'number') {
m[0] = Math.min(m[0], a[0]); m[1] = Math.min(m[1], a[1])
m[2] = Math.max(m[2], a[0]); m[3] = Math.max(m[3], a[1])
} else a.forEach(walk)
}
walk(f.geometry.coordinates)
return m
}
/* The same Deaf test the leaf and both builders use — three signals, never the sg flag alone. */
const isDeaf = (code, name) => {
const c = codes[code]
return (c && c.sg === 1) || /sign language/i.test((c && c.l) || '') || /\bDeaf\b/i.test(name || '')
}
const wayIn = (code, iso3, name) => {
if (!code || !iso3) return ''
if (isDeaf(code, name)) return sun ? 'SUN (signed)' : ''
const b = bridges[`${code}|${iso3}`] || bridgeCandidates[`${code}|${iso3}`]
return b ? b.l : ''
}
const COUNTRIES = [
{ iso3: 'IND', file: 'gb-IND-ADM1.geojson', country: 'India' },
{ iso3: 'CHN', file: 'gb-CHN-ADM1.geojson', country: 'China' },
]
const rows = []
const unassigned = []
let provincesAvailable = 0
for (const c of COUNTRIES) {
const feats = BOUND(c.file).features.map((f) => ({ f, b: bboxOf(f), name: f.properties.shapeName }))
provincesAvailable += feats.length
const groups = roster.filter((r) => r.iso3 === c.iso3 && r.mapped && r.lat != null && r.lng != null)
const by = new Map()
for (const r of groups) {
const x = r.lng, y = r.lat
let hit = null
for (const cand of feats) {
if (x < cand.b[0] || x > cand.b[2] || y < cand.b[1] || y > cand.b[3]) continue
if (featHas(cand.f, x, y)) { hit = cand.name; break }
}
if (!hit) { unassigned.push({ country: c.country, iso3: c.iso3, people_group: r.name, lat: r.lat, lng: r.lng }); continue }
if (!by.has(hit)) by.set(hit, [])
by.get(hit).push(r)
}
for (const [province, list] of by) {
const zero = list.filter((r) => (tiers[r.iso639_3] ?? r.tier ?? 0) === 0)
rows.push({
country: c.country,
iso3: c.iso3,
province,
groups: list.length,
people: list.reduce((n, r) => n + (r.population || 0), 0),
zero_access_groups: zero.length,
zero_access_people: zero.reduce((n, r) => n + (r.population || 0), 0),
/* Named so a reader of the CSV can act without opening the map. */
zero_access_examples: zero.sort((a, b) => (b.population || 0) - (a.population || 0))
.slice(0, 3).map((r) => r.name).join('; '),
ways_in: [...new Set(zero.map((r) => wayIn(r.iso639_3, r.iso3, r.name)).filter(Boolean))].join('; '),
approximate: true,
})
}
}
rows.sort((a, b) => b.zero_access_groups - a.zero_access_groups || b.groups - a.groups)
const assigned = rows.reduce((n, r) => n + r.groups, 0)
if (!assigned || assigned < 900) {
console.error(`GOSPEL-BY-PROVINCE: REFUSING TO WRITE — only ${assigned} group(s) assigned.`)
console.error(' India and China hold 1,009 mapped groups; a collapse this large means the')
console.error(' geometry or the coordinates changed shape, not that the answer moved.')
process.exitCode = 1
} else {
writeSnapshot(
OUT,
`${JSON.stringify({
meta: {
title: 'Gospel access by province — India and China',
why: 'These two countries hold 47.9% of Doxa\'s roster (855 + 154 of 2,107). No other ' +
'country is close; the third is Sudan at 105. A national fill cannot answer "where would ' +
'a team go" for half the map.',
generated: new Date().toISOString().slice(0, 10),
provinces_with_groups: rows.length,
provinces_available: provincesAvailable,
groups_assigned: assigned,
groups_unassigned: unassigned.length,
china_note: 'China\'s ADM1 file carries 12 provinces, not 31+. Measured rather than ' +
'assumed: 152 of 154 Chinese groups fall inside them and all twelve are used, so the ' +
'file is cut to the provinces where the unreached peoples are.',
ways_in_are_country_level: 'The ways in are chosen for the COUNTRY, and going below the ' +
'border is what exposes the cost of that. Arunachal Pradesh, in the far north-east, is ' +
'offered TELUGU — a South Indian language — because the curated bridge table names it ' +
'for those groups and a curated bridge outranks the computed one. India\'s computed ' +
'default is Hindi (41%, official), which is defensible nationally and still wrong for ' +
'much of the north-east. This table does not fix that: it makes it visible. Until a ' +
'bridge can be chosen per province, read the ways-in column as "a language with ' +
'Scripture and film somewhere in this country", not as a recommendation for this place.',
approximate: 'A province is assigned by point-in-polygon on the group\'s coordinate, and ' +
'that coordinate marks where a PEOPLE is found, not a settlement — 108 groups across the ' +
'roster even share a coordinate with another group. Near a border the point can fall on ' +
'the wrong side. Every row is flagged approximate and the unassigned are counted, never ' +
'dropped. No surface may present a province as a fact about a group.',
},
columns: [
{ title: 'Country', field: 'country', type: 'string' },
{ title: 'Province', field: 'province', type: 'string' },
{ title: 'People groups', field: 'groups', type: 'number' },
{ title: 'People', field: 'people', type: 'number' },
{ title: 'Groups with nothing', field: 'zero_access_groups', type: 'number' },
{ title: 'People with nothing', field: 'zero_access_people', type: 'number' },
{ title: 'Largest with nothing', field: 'zero_access_examples', type: 'string' },
{ title: 'Ways in', field: 'ways_in', type: 'string' },
{ title: 'Placement approximate', field: 'approximate', type: 'string' },
],
rows,
unassigned,
}, null, 1)}\n`,
(j) => (j.rows || []).length,
'province row(s)',
)
console.log(`gospel-by-province: ${rows.length} province(s) with groups, ${assigned} assigned, ${unassigned.length} unassigned`)
console.log(` zero-access provinces: ${rows.filter((r) => r.zero_access_groups).length}`)
console.log(`wrote ${OUT}`)
}

View file

@ -193,15 +193,6 @@ function formatNumber(n) {
try { return v.toLocaleString(`${locale.value || 'en'}-u-nu-latn`) } catch (_) { return v.toLocaleString('en-US') }
}
// Which size step a stat value needs so it is never CUT OFF. Their 47.68px fits up to 10
// characters in the 240px card at Bebas's width; our condensed fallback is wider, so the step
// down starts at 10. Only ever shrinks -- every value DX-life itself renders keeps their size.
function lenBucket(v) {
const n = String(v).length
if (n >= 12) return 'xlong'
if (n >= 10) return 'long'
return ''
}
// ── the selected subject ────────────────────────────────────────────────────
const selectedRegion = computed(() =>
@ -856,8 +847,16 @@ useShadowStyles(
'.rd-stats{ display:grid; grid-template-columns:repeat(auto-fit, minmax(180px, 1fr));' +
' gap:var(--spacing-md); }' +
'.rd-stat{ text-align:center; }' +
'.rd-stat__value[data-len="long"]{ font-size:var(--font-size-2xl); }' +
'.rd-stat__value[data-len="xlong"]{ font-size:var(--font-size-xl); }' +
// ★ THE data-len SHRINK IS GONE, AND ITS OWN COMMENT SHOWED WHY. Their .region-stat__value is
// font-family-heading + font-size-3xl + line-height:1 and nothing else -- no such attribute exists
// in their markup. Ours was a shrink-to-fit workaround whose stated premise was "our condensed
// fallback is wider" than Bebas. That is STALE: Bebas is vendored now (assets/fonts/bebas-neue,
// glyph oracle 279 = 279 SAME), so there is no wider fallback to compensate for.
// Its other claim -- "every value DX-life itself renders keeps their size" -- was FALSIFIED by
// measurement: rega found "43,045,275" (10 chars, so it hit the 'long' bucket) rendered at
// 38.15px against their 47.68px on the same-width card, while the other three stats matched
// exactly. A rule whose own invariant is violated in practice is not protecting anything.
// Deleted WITH its mechanism -- the binding and lenBucket() too, not just the rules.
'.rd-stat__value{ margin:0; font-size:var(--font-size-3xl); line-height:1;' +
' font-family:"Bebas Neue","Arial Narrow",BlinkMacSystemFont,"Segoe UI","Helvetica Neue",Arial,sans-serif;' +
' font-weight:400; }' +
@ -1154,7 +1153,7 @@ useShadowStyles(
<!-- RegionDetail.vue:53-70 — four stat cards. CountryDetail has none. -->
<div v-if="subject.kind !== 'country'" class="rd-stats">
<div v-for="st in stats" :key="st.label" class="rd-card rd-card--small rd-stat">
<p class="rd-stat__value" :data-len="lenBucket(st.value)">{{ st.value }}</p>
<p class="rd-stat__value">{{ st.value }}</p>
<p class="rd-stat__label">{{ st.label }}</p>
</div>
</div>

View file

@ -344,7 +344,22 @@ useShadowStyles(
'.search-icon{ position:absolute; inset-inline-start:1em; top:0; bottom:0; margin:auto 0;' +
' width:1em; height:1em; fill:none; stroke:var(--dx-muted); stroke-width:2; pointer-events:none; }' +
// .filters__toggle — centred, chevron rotates when expanded
'.filters__toggle{ background:none; border:0; cursor:pointer; font:inherit; font-size:var(--font-size-sm);' +
// ★ THEIRS IS .button.compact.link, NOT A BARE BUTTON, and ours was missing four of its
// declarations. rega measured the gap on /regions/ethiopia: ours 25.44px tall against their 37.63.
// Their numbers reconcile exactly once the right rules are applied -- _buttons.scss gives
// .button { border:1px solid var(--button-border-color, transparent); line-height:
// var(--line-height-none); border-radius:100px } and .button.compact { padding: var(--spacing-xs)
// var(--spacing-2xl) }, with .button.link setting --button-border-color: transparent:
// line-height 15.63 (font-size-sm x 1) + 2x10 padding + 2x1 border = 37.63
// Ours declared NO padding (so the UA's 1px showed) and border:0, and font:inherit pulled the
// base line-height 1.5 through as 23.44. All four are portable, so all four are ported.
// THE ONE SUBSTITUTION, documented rather than silently skipped: their .button also sets
// font-family: var(--font-family-buttons), which resolves to Brandon Grotesque. That face is
// commercial and BLOCKED ON THE DRIVER, so this button keeps our stand-in and the family remains
// the one measured difference here. Everything geometric now matches.
'.filters__toggle{ background:none; cursor:pointer; font:inherit; font-size:var(--font-size-sm);' +
' padding:var(--spacing-xs) var(--spacing-2xl); border:1px solid transparent; border-radius:100px;' +
' line-height:var(--line-height-none);' +
' display:inline-flex; align-items:center; gap:var(--spacing-2xs); margin-inline:auto; color:var(--dx-text); }' +
'.filters__toggle svg{ transition:transform 200ms ease; }' +
'.filters__toggle[aria-expanded="true"] svg{ transform:rotate(180deg); }' +

View file

@ -0,0 +1,670 @@
{
"meta": {
"title": "Gospel access by province — India and China",
"why": "These two countries hold 47.9% of Doxa's roster (855 + 154 of 2,107). No other country is close; the third is Sudan at 105. A national fill cannot answer \"where would a team go\" for half the map.",
"generated": "2026-09-26",
"provinces_with_groups": 44,
"provinces_available": 46,
"groups_assigned": 998,
"groups_unassigned": 11,
"china_note": "China's ADM1 file carries 12 provinces, not 31+. Measured rather than assumed: 152 of 154 Chinese groups fall inside them and all twelve are used, so the file is cut to the provinces where the unreached peoples are.",
"ways_in_are_country_level": "The ways in are chosen for the COUNTRY, and going below the border is what exposes the cost of that. Arunachal Pradesh, in the far north-east, is offered TELUGU — a South Indian language — because the curated bridge table names it for those groups and a curated bridge outranks the computed one. India's computed default is Hindi (41%, official), which is defensible nationally and still wrong for much of the north-east. This table does not fix that: it makes it visible. Until a bridge can be chosen per province, read the ways-in column as \"a language with Scripture and film somewhere in this country\", not as a recommendation for this place.",
"approximate": "A province is assigned by point-in-polygon on the group's coordinate, and that coordinate marks where a PEOPLE is found, not a settlement — 108 groups across the roster even share a coordinate with another group. Near a border the point can fall on the wrong side. Every row is flagged approximate and the unassigned are counted, never dropped. No surface may present a province as a fact about a group."
},
"columns": [
{
"title": "Country",
"field": "country",
"type": "string"
},
{
"title": "Province",
"field": "province",
"type": "string"
},
{
"title": "People groups",
"field": "groups",
"type": "number"
},
{
"title": "People",
"field": "people",
"type": "number"
},
{
"title": "Groups with nothing",
"field": "zero_access_groups",
"type": "number"
},
{
"title": "People with nothing",
"field": "zero_access_people",
"type": "number"
},
{
"title": "Largest with nothing",
"field": "zero_access_examples",
"type": "string"
},
{
"title": "Ways in",
"field": "ways_in",
"type": "string"
},
{
"title": "Placement approximate",
"field": "approximate",
"type": "string"
}
],
"rows": [
{
"country": "China",
"iso3": "CHN",
"province": "Yunnan Province",
"groups": 61,
"people": 3524875,
"zero_access_groups": 14,
"zero_access_people": 602850,
"zero_access_examples": "Hongjin Tai; Wenma Zhuang; Mosuo",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Guizhou Province",
"groups": 34,
"people": 3302000,
"zero_access_groups": 7,
"zero_access_people": 488900,
"zero_access_examples": "Huishui Miao; Yanghuang; Cai",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Sichuan Province",
"groups": 12,
"people": 1621700,
"zero_access_groups": 7,
"zero_access_people": 105700,
"zero_access_examples": "Ersu; Minyak; Namuyi",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Andaman and Nicobar Islands",
"groups": 7,
"people": 81900,
"zero_access_groups": 2,
"zero_access_people": 500,
"zero_access_examples": "Jarawas; Onge",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Arunāchal Pradesh",
"groups": 7,
"people": 13550,
"zero_access_groups": 2,
"zero_access_people": 600,
"zero_access_examples": "Khamba; Na",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Xinjiang Uyghur Autonomous Region",
"groups": 7,
"people": 284125,
"zero_access_groups": 2,
"zero_access_people": 31500,
"zero_access_examples": "Sarikoli Tajiks; Ainu",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Hunan Province",
"groups": 5,
"people": 2405000,
"zero_access_groups": 2,
"zero_access_people": 150000,
"zero_access_examples": "Eastern Xiangxi Miao; Wunai",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Qinghai Province",
"groups": 3,
"people": 55700,
"zero_access_groups": 2,
"zero_access_people": 12700,
"zero_access_examples": "Tongren Bonan; Wutun",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Kerala",
"groups": 72,
"people": 2804375,
"zero_access_groups": 1,
"zero_access_people": 8600,
"zero_access_examples": "Malai Pandaram",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Jhārkhand",
"groups": 9,
"people": 957400,
"zero_access_groups": 1,
"zero_access_people": 5000,
"zero_access_examples": "Jadupetia",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Guangxi Zhuang Autonomous Region",
"groups": 6,
"people": 121150,
"zero_access_groups": 1,
"zero_access_people": 750,
"zero_access_examples": "Yerong",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Manipur",
"groups": 5,
"people": 321400,
"zero_access_groups": 1,
"zero_access_people": 1700,
"zero_access_examples": "Koiren",
"ways_in": "Telugu",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Inner Mongolia Autonomous Region",
"groups": 3,
"people": 206900,
"zero_access_groups": 1,
"zero_access_people": 170000,
"zero_access_examples": "Buryat",
"ways_in": "Chinese, Mandarin",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Gujarāt",
"groups": 90,
"people": 3164770,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Andhra Pradesh",
"groups": 81,
"people": 4858130,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Karnātaka",
"groups": 81,
"people": 4610175,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Tamil Nādu",
"groups": 64,
"people": 2760850,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Odisha",
"groups": 64,
"people": 1304500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Mahārāshtra",
"groups": 53,
"people": 2858050,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Rājasthān",
"groups": 48,
"people": 1731500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Madhya Pradesh",
"groups": 33,
"people": 2922600,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Jammu and Kashmīr",
"groups": 33,
"people": 520515,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "West Bengal",
"groups": 30,
"people": 2211000,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Telangāna",
"groups": 26,
"people": 1665800,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Chhattīsgarh",
"groups": 24,
"people": 1916750,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Uttar Pradesh",
"groups": 23,
"people": 836550,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Himāchal Pradesh",
"groups": 20,
"people": 114970,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Bihār",
"groups": 18,
"people": 430100,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Assam",
"groups": 15,
"people": 2377400,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Tibet Autonomous Region",
"groups": 13,
"people": 208750,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Tripura",
"groups": 11,
"people": 698500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Uttarākhand",
"groups": 7,
"people": 111875,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Ladākh",
"groups": 6,
"people": 183000,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Goa",
"groups": 5,
"people": 337600,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Haryāna",
"groups": 4,
"people": 69500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Punjab",
"groups": 4,
"people": 10100,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Gansu Province",
"groups": 3,
"people": 21400,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Hainan Province",
"groups": 3,
"people": 1096500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Meghālaya",
"groups": 2,
"people": 17150,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "China",
"iso3": "CHN",
"province": "Heilongjiang Province",
"groups": 2,
"people": 5000,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Delhi",
"groups": 1,
"people": 1200,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Chandīgarh",
"groups": 1,
"people": 34000,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Puducherry",
"groups": 1,
"people": 20500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Sikkim",
"groups": 1,
"people": 7400,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
}
],
"unassigned": [
{
"country": "India",
"iso3": "IND",
"people_group": "Bharwad",
"lat": 20.322175,
"lng": 72.968458
},
{
"country": "India",
"iso3": "IND",
"people_group": "Great Andamanese",
"lat": 12.211728,
"lng": 92.833491
},
{
"country": "India",
"iso3": "IND",
"people_group": "Indo-French",
"lat": 11.930182,
"lng": 79.797144
},
{
"country": "India",
"iso3": "IND",
"people_group": "Indo-Vietnamese",
"lat": 11.912456,
"lng": 79.815389
},
{
"country": "India",
"iso3": "IND",
"people_group": "Laccadive",
"lat": 10.0675,
"lng": 73.6422
},
{
"country": "India",
"iso3": "IND",
"people_group": "Sagharias",
"lat": 20.71815,
"lng": 70.988939
},
{
"country": "India",
"iso3": "IND",
"people_group": "Sentinelese",
"lat": 11.557662,
"lng": 92.267154
},
{
"country": "India",
"iso3": "IND",
"people_group": "Vettalaikarans",
"lat": 11.916308,
"lng": 79.807019
},
{
"country": "India",
"iso3": "IND",
"people_group": "Vettiyan",
"lat": 11.91386,
"lng": 79.814472
},
{
"country": "China",
"iso3": "CHN",
"people_group": "Jing",
"lat": 21.577774,
"lng": 108.126828
},
{
"country": "China",
"iso3": "CHN",
"people_group": "Pana",
"lat": 21.246492,
"lng": 101.27182
}
]
}

View file

@ -578,7 +578,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "dx-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj",
"integrity": "sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS",
"elements": [
"gospel-resources-map"
],
@ -598,7 +598,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-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
},
{
@ -612,7 +612,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-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
},
{
@ -626,7 +626,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. 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-resources/gospel-resources.js\" integrity=\"sha384-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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. 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-resources/gospel-resources.js\" integrity=\"sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
},
{
@ -640,7 +640,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-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
},
{
@ -654,7 +654,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. 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-resources/gospel-resources.js\" integrity=\"sha384-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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. 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-resources/gospel-resources.js\" integrity=\"sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
}
]
@ -887,7 +887,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6",
"integrity": "sha384-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ",
"elements": [
"regions-dashboard"
],
@ -907,7 +907,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": "<!-- 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-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6\" 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-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ\" 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>"
}
},
{
@ -921,7 +921,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-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6\" 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-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ\" 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>"
}
},
{
@ -935,7 +935,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": "<!-- 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-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6\" 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-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ\" 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

@ -32,7 +32,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-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS" crossorigin="anonymous"></script>
<script>
// 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>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS" crossorigin="anonymous"></script>
<script>
// 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>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS" 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

@ -32,7 +32,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-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS" crossorigin="anonymous"></script>
<script>
// 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>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -578,7 +578,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "dx-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj",
"integrity": "sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS",
"elements": [
"gospel-resources-map"
],
@ -598,7 +598,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-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
},
{
@ -612,7 +612,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-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
},
{
@ -626,7 +626,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. 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-resources/gospel-resources.js\" integrity=\"sha384-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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. 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-resources/gospel-resources.js\" integrity=\"sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
},
{
@ -640,7 +640,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-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
},
{
@ -654,7 +654,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. 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-resources/gospel-resources.js\" integrity=\"sha384-zF2FOzM+D5ivct5nosg4UhaVmVf8p6ukkI+ARXrpWgbL9dc1vrgHjfyd0A0u88Tj\" 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. 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-resources/gospel-resources.js\" integrity=\"sha384-cZU1Cw8MbYFPD8keWQ8q+LgMCkXDihd9UvXZoEtrravoxAfPQenQuErMIYUGIYfS\" 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>"
}
}
]
@ -887,7 +887,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "dx-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6",
"integrity": "sha384-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ",
"elements": [
"regions-dashboard"
],
@ -907,7 +907,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": "<!-- 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-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6\" 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-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ\" 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>"
}
},
{
@ -921,7 +921,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-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6\" 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-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ\" 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>"
}
},
{
@ -935,7 +935,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": "<!-- 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-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6\" 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-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ\" 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

@ -36,7 +36,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-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ" 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

@ -32,7 +32,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-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ" crossorigin="anonymous"></script>
<script>
// 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>
<!-- Bundle IIFE — registers the <regions-dashboard> custom element. -->
<script src="../regions-dashboard.js" integrity="sha384-f0Fph0nml8ygkSAz9y+Z9IElpwHrzsS25MyhVw3csv7UbMaFu4dO5tDfNk0+iUQ6" crossorigin="anonymous"></script>
<script src="../regions-dashboard.js" integrity="sha384-p3OwJ38WP4LzT1Bu38EwBYic+bbo+3N8EMIG6DQcRHDe7E2JERlDreBRUMzOW7AZ" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: