Update from source ded4b3c1
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 12:34:34 +00:00
parent 93ca8dab91
commit 14922b0529
31 changed files with 358 additions and 236 deletions

View file

@ -3,10 +3,12 @@
"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,
"provinces_with_groups": 46,
"provinces_available": 48,
"groups_assigned": 1005,
"groups_unassigned": 4,
"india_note": "India is read from the COMPLETE ADM1 (36 states, geoBoundaries via DataMeet India, CC BY 2.5 IN). The first build of this table read gb-IND-ADM1.geojson, which is the UPG-100 list's curated 34-unit partition, and eleven groups came out with no province because they stood in states that partition does not draw. Switching the file moved 998 assigned to 1,005 and 44 province rows to 46, and turned the province names into India's own states.",
"unassigned_note": "Four remain, each one legible rather than lost. Great Andamanese and the Sentinelese sit on small islands whose simplified coastline the point falls just outside — Andaman and Nicobar IS in the file, so this is geometry precision, not a missing province. Jing and Pana are on China's Vietnam and Laos borders, outside the twelve-province subset. They are listed in `unassigned` with their coordinates.",
"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."
@ -279,8 +281,8 @@
"country": "India",
"iso3": "IND",
"province": "Mahārāshtra",
"groups": 53,
"people": 2858050,
"groups": 54,
"people": 2860150,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
@ -467,6 +469,18 @@
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Puducherry",
"groups": 5,
"people": 41625,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
@ -566,9 +580,21 @@
{
"country": "India",
"iso3": "IND",
"province": "Puducherry",
"province": "Lakshadweep",
"groups": 1,
"people": 20500,
"people": 74500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Dādra and Nagar Haveli and Damān and Diu",
"groups": 1,
"people": 125,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
@ -589,13 +615,6 @@
}
],
"unassigned": [
{
"country": "India",
"iso3": "IND",
"people_group": "Bharwad",
"lat": 20.322175,
"lng": 72.968458
},
{
"country": "India",
"iso3": "IND",
@ -603,34 +622,6 @@
"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",
@ -638,20 +629,6 @@
"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",

View file

@ -234,6 +234,46 @@ snippets (leave it empty for relative URLs that work wherever the folder is drop
---
## Hosting the dx-maps folder: caching, compression, CORS
**Why it matters.** On a cold load a map's layers draw about 10–17 s after the page opens (measured
on the UPG-100 list page). The bundle and the map engine take under 2 s of that; the rest is basemap
tiles and data files such as the country-boundary file (1,866 KB raw, 597 KB gzipped). Compression
cuts every visit; caching means a returning reader doesn't download the same files again.
**Every file in `dx-maps/` has a fixed name today.** Nothing is content-hashed, so a new release
overwrites files in place: bundles (`<bundle>/<bundle>.js`), their pages (`index.html`) and
`manifest.json` change whenever the build changes them. Images, fonts and data files change rarely,
but under the same names.
| Files | `Cache-Control` | Why |
|---|---|---|
| everything in `dx-maps/`, as it ships today | `public, max-age=86400, stale-while-revalidate=604800`, with an `ETag` | a revisit revalidates cheaply and never re-downloads unchanged bytes, and a release shows up within a day |
| content-hashed names, if you add them (e.g. `world-adm0.3f9a1c2e.geojson`) | `public, max-age=31536000, immutable` | a changed file gets a new name, so a year-long cache is always safe |
**Never send `immutable` for a fixed name**: an update would stay invisible for a year.
**Compress:** serve `br` or `gzip`, and give data files a JSON content type (`application/json`, or
`application/geo+json` for `.geojson`) so CDNs compress them. Many servers send `.geojson` as
`application/octet-stream`, which CDNs don't compress.
**CORS for script embeds:** every `embed.script` snippet loads the bundle with an `integrity` hash
and `crossorigin="anonymous"`. For that to work on another site, the host must send
`Access-Control-Allow-Origin: *`; without it the browser can't check the hash across origins and refuses
the script. iframe embeds need no CORS.
On Cloudflare Pages or Netlify, a `_headers` file at the folder's root sets the CORS and cache headers:
```
/*
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=86400, stale-while-revalidate=604800
```
Check the content type your host gives `.geojson` files (`curl -sI <url>`) before relying on compression.
---
## Compose maps into a SPA (the app shell)
Several maps + one layout = a single-page app, served from the same `public/` tree.

View file

@ -81,6 +81,24 @@ for (const rel of wanted) {
console.log(` ok ${rel.padEnd(42)} ${String(bytes).padStart(9)} bytes`)
}
/* ★ THE MAP AND THE TABLE MUST READ THE SAME GEOMETRY (2026-09-26). The province layer is
coloured in the leaf and counted by scripts/build-gospel-by-province.mjs, from two independent
mentions of the same filenames — so a change to one silently draws provinces that disagree with
the rows describing them. It already happened in the other direction: both read
gb-IND-ADM1.geojson, the UPG-100 list's curated 34-unit partition, when what this table means
by "province" is a state. Staging alone cannot catch it; both files are staged. */
const boundaryMentions = (src, re) => [...src.matchAll(re)].map((m) => m[m.length - 1]).sort()
try {
const leafSrc = readFileSync(LEAF, 'utf8')
const buildSrc = readFileSync(resolve(ROOT, 'plugin-designs/gospel-resources/scripts/build-gospel-by-province.mjs'), 'utf8')
const inLeaf = boundaryMentions(leafSrc, /(?:IND|CHN): '(gb-[A-Z]{3}-ADM1[^']*\.geojson)'/g)
const inBuild = boundaryMentions(buildSrc, /file: '(gb-[A-Z]{3}-ADM1[^']*\.geojson)'/g)
if (!inLeaf.length || !inBuild.length) missing.push('province boundary filenames not found in the leaf or the builder — this arm would pass vacuously')
else if (JSON.stringify(inLeaf) !== JSON.stringify(inBuild)) {
missing.push(`the map draws provinces from [${inLeaf.join(', ')}] while the table counts them from [${inBuild.join(', ')}]`)
} else console.log(` ok province geometry agrees ${inLeaf.join(', ')}`)
} catch (e) { missing.push(`could not compare province geometry: ${e.message}`) }
if (missing.length) {
console.error(`GOSPEL-TABLES-STAGED: FAIL — ${missing.length} of ${wanted.length} asset(s) the map fetches are not in the tree:`)
for (const m of missing) console.error(` ${m}`)

View file

@ -920,6 +920,45 @@ const countryStats = computed(() => {
}
})
/**
* ═══ PRAYER IS A MOVE, NOT A STATISTIC ════════════════════════════════════════════════════
*
* A country click ended in numbers. Every one of them describes work somebody else has to fund,
* staff or translate — and the one thing the reader of a country can do THIS MINUTE was reachable
* only by guessing which pin to tap. So the country sheet now ends in a move: the largest group
* here that has nothing AND nobody praying, with its prayer page one tap away.
*
* ⚠ THE DENOMINATOR IS STATED BECAUSE IT IS NOT THE COUNTRY. doxa.life publishes a page for
* 1,723 of the 12,379 groups on this map, so "nobody praying" can only ever be said of the
* groups that HAVE a page — never of the country. Rendering a bare count would read as "14 groups
* in this country have nobody praying", which this data cannot support. It is shown as N of M.
*
* ⚠ ZERO IS ZERO ON doxa.life's COUNTER, which is what the gap tab already says in full. It is
* not a claim that nobody in the world prays for these people — an unknowable thing.
*/
const countryPrayer = computed(() => {
const g = groupsForCountry.value
let pages = 0, noPray = 0, noPrayPeople = 0
let firstMove = null, firstMovePop = -1
for (const r of g) {
const e = prayIndex.value[prayKey(r.people_group, r._iso3 || selected.value?.iso3 || '')]
if (!e) continue
pages++
if (e.praying > 0) continue
noPray++
noPrayPeople += r.population || 0
/* NEED FIRST, THEN SIZE, and India shows what that costs: of its 601 groups with nobody
praying only FIVE have nothing at all, so this offers Malai Pandaram at 8,700 people ahead
of Badhai at 851,000 — who already have Scripture and film. That is the map's own ladder
applied to prayer rather than a second, quieter ranking, and the sub-label says "nothing
found" so the reader can see which rung they were handed. Where every unprayed-for group
here has something, the largest of those is offered instead. */
const rank = (hasAny(r) ? 0 : 1e12) + (r.population || 0)
if (rank > firstMovePop) { firstMovePop = rank; firstMove = { ...e, group: r } }
}
return { pages, noPray, noPrayPeople, firstMove }
})
/* ITEM 2 — resources in a group's OWN language, joined on the EXACT ISO 639-3 code.
* Never a name match: language names collide and drift ("Arabic" is dozens of
* distinct codes), and a fuzzy hit here would put the wrong scripture in someone's
@ -1141,7 +1180,7 @@ async function ensureProvinceTable() {
return provinceRows.value
}
const PROVINCE_FILE = { IND: 'gb-IND-ADM1.geojson', CHN: 'gb-CHN-ADM1.geojson' }
const PROVINCE_FILE = { IND: 'gb-IND-ADM1-full.geojson', CHN: 'gb-CHN-ADM1.geojson' }
async function ensureProvinces(iso3) {
const map = mapRef.value
@ -2630,6 +2669,12 @@ useShadowStyles(
rows underneath already showed the third. -->
<div class="gm-stat"><span>{{ t('gospel.stat.haveAudio') }}</span><b>{{ fmt(countryStats.audio) }}</b></div>
<div class="gm-stat" v-if="countryStats.sign"><span>{{ t('gospel.stat.signLanguages') }}</span><b>{{ fmt(countryStats.sign) }}</b></div>
<!-- N of M, never a bare N: the denominator is the groups doxa.life publishes a prayer
page for, not the country. See countryPrayer. -->
<div class="gm-stat" v-if="countryPrayer.pages">
<span>{{ t('gospel.tabs.noprayer') }}</span>
<b>{{ fmt(countryPrayer.noPray) }} / {{ fmt(countryPrayer.pages) }}</b>
</div>
<!-- These two are NOT derivable from the pins: they come from the curated country
analysis, over its own narrower set of groups. Labelled so the different basis is
visible rather than implied.
@ -2648,6 +2693,18 @@ useShadowStyles(
</p>
</template>
<!-- ═══ THE MOVE ═══════════════════════════════════════════════════════════════════
Everything above this line is work for somebody else to fund, staff or translate.
This is the one a reader can do before closing the tab, and it names the group
rather than making them choose: the largest here with nothing and nobody praying. -->
<a v-if="countryPrayer.firstMove" class="gm-pray" :href="countryPrayer.firstMove.u"
target="_blank" rel="noopener noreferrer"
:title="'Open the prayer page for ' + countryPrayer.firstMove.n + ' on doxa.life.'">
{{ t('gospel.sheet.pray') }} {{ countryPrayer.firstMove.n }}
<span class="gm-pray-n" dir="ltr">{{ fmt(countryPrayer.firstMove.group.population || 0) }}
people<template v-if="!countryPrayer.firstMove.group._tier">, nothing found</template></span>
</a>
<!-- Same split as the language link above: a filter when the tables are already on
screen beneath this map, a link when they are not. This is the brief's SECOND
requirement — click a country, see its resources — and in the composite it was

View file

@ -82,8 +82,14 @@ const wayIn = (code, iso3, name) => {
return b ? b.l : ''
}
/* ⚠ INDIA READS THE -full FILE, NOT gb-IND-ADM1.geojson. The unsuffixed file is the UPG-100
list's own curated partition — 34 listId-tagged units — and this table was built on it for one
build, which is why eleven groups had no province: they were standing in states the partition
does not draw. gb-IND-ADM1-full.geojson is the complete ADM1 (36 states, geoBoundaries via
DataMeet India, CC BY 2.5 IN). A partition of somebody else's list is not a country's states,
even when the filename looks like it is. */
const COUNTRIES = [
{ iso3: 'IND', file: 'gb-IND-ADM1.geojson', country: 'India' },
{ iso3: 'IND', file: 'gb-IND-ADM1-full.geojson', country: 'India' },
{ iso3: 'CHN', file: 'gb-CHN-ADM1.geojson', country: 'China' },
]
@ -146,6 +152,17 @@ if (!assigned || assigned < 900) {
provinces_available: provincesAvailable,
groups_assigned: assigned,
groups_unassigned: unassigned.length,
india_note: 'India is read from the COMPLETE ADM1 (36 states, geoBoundaries via DataMeet ' +
'India, CC BY 2.5 IN). The first build of this table read gb-IND-ADM1.geojson, which is ' +
'the UPG-100 list\'s curated 34-unit partition, and eleven groups came out with no ' +
'province because they stood in states that partition does not draw. Switching the file ' +
'moved 998 assigned to 1,005 and 44 province rows to 46, and turned the province names ' +
'into India\'s own states.',
unassigned_note: 'Four remain, each one legible rather than lost. Great Andamanese and ' +
'the Sentinelese sit on small islands whose simplified coastline the point falls just ' +
'outside — Andaman and Nicobar IS in the file, so this is geometry precision, not a ' +
'missing province. Jing and Pana are on China\'s Vietnam and Laos borders, outside the ' +
'twelve-province subset. They are listed in `unassigned` with their coordinates.',
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.',

View file

@ -434,6 +434,11 @@ onMounted(async () => {
map.value.addControl(new FullscreenToggleControl(profileRoot.value), 'bottom-right')
}
map.value.on('load', async () => {
// The constructor's projection:'mercator' is only a request: on Mapbox the style's own projection
// (globe) wins, so the map booted as a globe while this view's state and button said Mercator, and
// the first "Switch to Globe" click did nothing (rega, C2). The style is ready here, on both
// engines, so apply the state to the map.
setProjectionFor(map.value, projection.value)
try {
// Shift logical center right of the 380px legend so the globe / pin
// density isn't hidden behind the column.

View file

@ -252,6 +252,11 @@ onMounted(async () => {
map.value.addControl(new FullscreenToggleControl(profileRoot.value), 'bottom-right')
}
map.value.on('load', async () => {
// The constructor's projection:'mercator' is only a request: on Mapbox the style's own projection
// (globe) wins, so the map booted as a globe while this view's state and button said Mercator, and
// the first "Switch to Globe" click did nothing (rega, C2). The style is ready here, on both
// engines, so apply the state to the map.
setProjectionFor(map.value, projection.value)
try {
// Legend now sits top-left under the search bar (~320px wide). Shift the
// logical center right of that column so the world / globe isn't drawn

View file

@ -410,6 +410,11 @@ onMounted(async () => {
treeData.value = await treeResp.json()
map.value.on('load', async () => {
// The constructor's projection:'mercator' is only a request: on Mapbox the style's own projection
// (globe) wins, so the map booted as a globe while this view's state and button said Mercator, and
// the first "Switch to Globe" click did nothing (rega, C2). The style is ready here, on both
// engines, so apply the state to the map.
setProjectionFor(map.value, projection.value)
try {
// Globe centering: shift the map's logical center right of the legend
// so the globe doesn't render beneath the 380px legend column.

View file

@ -33,6 +33,7 @@ import langFamilyByLanguage from '@map/data/langFamilyByLanguage.json'
import bakedReached from '../data/reached-neighbors.json'
import { useNeighborT } from '../composables/useNeighborT.js'
import { setProjectionOn } from '@map/composables/useMapProvider.js'
import { whenStyleReady } from '../whenStyleReady.js'
const nt = useNeighborT()
const C_RED = '#e11d48', C_RED_DK = '#9f1239', C_NAVY = '#002e6e', C_GOLD = '#f59e0b'
@ -279,7 +280,8 @@ async function fetchDoxa() {
onMounted(async () => {
await initializeMap()
const m = map.value
setProjectionOn(m, 'mercator') // flat mercator, never globe (the agent); per-engine shape via C2 helper
// flat mercator, never globe (the agent); applied once the style is ready (MapLibre throws before)
whenStyleReady(m, () => setProjectionOn(m, 'mercator'))
try { doxaFeatures.value = await fetchDoxa() }
catch (e) { statusMsg.value = 'Live doxa API unreachable — ' + e.message; appReady.value = true; return }
appReady.value = true

View file

@ -23,6 +23,7 @@ import { useMapInstance } from '@map/composables/useMapInstance.js'
import { useShadowStyles } from '@map/composables/useShadowStyles.js'
import { useCockpitStore, COLORS, redColor, reachedColor, logRadius, fmtPop } from './useCockpit.js'
import { setProjectionOn } from '@map/composables/useMapProvider.js'
import { whenStyleReady } from '../whenStyleReady.js'
const store = useCockpitStore()
@ -365,7 +366,8 @@ onMounted(async () => {
await initializeMap()
const m = map.value
if (!m) { return } // no/invalid token — overlay shows the hint, store still drives the rest
setProjectionOn(m, 'mercator') // flat mercator, never globe (the agent); per-engine shape via C2 helper
// flat mercator, never globe (the agent); applied once the style is ready (MapLibre throws before)
whenStyleReady(m, () => setProjectionOn(m, 'mercator'))
// Gated test hook (inert in production): lets a harness use the live map.project().
if (cfg.value.debugExpose && typeof window !== 'undefined') {

View file

@ -389,6 +389,7 @@ function onMove(ev) { if (tip.value.show) { tip.value.x = ev.clientX; tip.value.
import bakedReached from './data/reached-neighbors.json'
import bakedAdmin1 from './data/admin1-membership.json'
import { setProjectionOn } from '@map/composables/useMapProvider.js'
import { whenStyleReady } from './whenStyleReady.js'
async function loadJSON(relCandidates) {
for (const url of relCandidates) {
try { const r = await fetch(url); if (r.ok) return await r.json() } catch (_) {}
@ -411,7 +412,8 @@ async function fetchDoxa() {
onMounted(async () => {
await initializeMap()
const m = map.value
setProjectionOn(m, 'mercator') // flat mercator, never globe (the agent); per-engine shape via C2 helper
// flat mercator, never globe (the agent); applied once the style is ready (MapLibre throws before)
whenStyleReady(m, () => setProjectionOn(m, 'mercator'))
// baked data (own bundle dir). `base` lets the host say where data/ is served from
// (platform deploy serves data/ alongside the bundle, like send-map/flower-mesh).

View file

@ -402,6 +402,7 @@ function flyToSender(n) {
// profile-config `dataUrl` still overrides live.
import bakedReached from './data/reached-neighbors.json'
import { setProjectionOn } from '@map/composables/useMapProvider.js'
import { whenStyleReady } from './whenStyleReady.js'
async function loadDataset() {
const cfgUrl = profileConfig?.value?.dataUrl
if (cfgUrl) {
@ -413,7 +414,8 @@ async function loadDataset() {
onMounted(async () => {
await initializeMap()
const m = map.value
setProjectionOn(m, 'mercator') // flat mercator, never globe (the agent); per-engine shape via C2 helper
// flat mercator, never globe (the agent); applied once the style is ready (MapLibre throws before)
whenStyleReady(m, () => setProjectionOn(m, 'mercator'))
// Test-only hook (inert in production — platform never sets debugExpose). Lets an
// automated harness use the live map.project() to click exact circle positions.

View file

@ -0,0 +1,13 @@
/**
* whenStyleReady.js — run once the map's style has loaded (immediately if it already has).
*
* MapLibre throws "Style is not done loading" from setProjection before that, and setProjectionOn
* swallows the throw, so the lenses that set 'mercator' right after initializeMap() never got it on
* MapLibre (rega, C2: lang-cluster, send-map, the bloom cockpit's MapCell). Mapbox accepts it early,
* which is why this only showed on one engine.
*/
export function whenStyleReady(map, fn) {
if (!map) return
if (typeof map.isStyleLoaded === 'function' && map.isStyleLoaded()) fn()
else map.once('style.load', fn)
}

View file

@ -3,10 +3,12 @@
"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,
"provinces_with_groups": 46,
"provinces_available": 48,
"groups_assigned": 1005,
"groups_unassigned": 4,
"india_note": "India is read from the COMPLETE ADM1 (36 states, geoBoundaries via DataMeet India, CC BY 2.5 IN). The first build of this table read gb-IND-ADM1.geojson, which is the UPG-100 list's curated 34-unit partition, and eleven groups came out with no province because they stood in states that partition does not draw. Switching the file moved 998 assigned to 1,005 and 44 province rows to 46, and turned the province names into India's own states.",
"unassigned_note": "Four remain, each one legible rather than lost. Great Andamanese and the Sentinelese sit on small islands whose simplified coastline the point falls just outside — Andaman and Nicobar IS in the file, so this is geometry precision, not a missing province. Jing and Pana are on China's Vietnam and Laos borders, outside the twelve-province subset. They are listed in `unassigned` with their coordinates.",
"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."
@ -279,8 +281,8 @@
"country": "India",
"iso3": "IND",
"province": "Mahārāshtra",
"groups": 53,
"people": 2858050,
"groups": 54,
"people": 2860150,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
@ -467,6 +469,18 @@
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Puducherry",
"groups": 5,
"people": 41625,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
@ -566,9 +580,21 @@
{
"country": "India",
"iso3": "IND",
"province": "Puducherry",
"province": "Lakshadweep",
"groups": 1,
"people": 20500,
"people": 74500,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
"ways_in": "",
"approximate": true
},
{
"country": "India",
"iso3": "IND",
"province": "Dādra and Nagar Haveli and Damān and Diu",
"groups": 1,
"people": 125,
"zero_access_groups": 0,
"zero_access_people": 0,
"zero_access_examples": "",
@ -589,13 +615,6 @@
}
],
"unassigned": [
{
"country": "India",
"iso3": "IND",
"people_group": "Bharwad",
"lat": 20.322175,
"lng": 72.968458
},
{
"country": "India",
"iso3": "IND",
@ -603,34 +622,6 @@
"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",
@ -638,20 +629,6 @@
"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",

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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl",
"integrity": "sha384-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU",
"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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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>"
}
}
]
@ -836,7 +836,7 @@
"bundle": "pplr-data-maps",
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
"output": "dx-maps/pplr-data-maps/pplr-data-maps.js",
"integrity": "sha384-G/YRcN8CL4Pwn8c8/7ZEfAUTZMuRM5TTL9SeqpDMZwrTOUJ7xp3IEIH50n1+EUxO",
"integrity": "sha384-koAjGVq7VRimsFtaadj919IEV8AB0MLU2DEl4YYmdXhiJL/o1eviZa6pkyZaL9ur",
"elements": [
"pplr-data-maps"
],
@ -852,7 +852,7 @@
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
"embed": {
"iframe": "<iframe src=\"./pplr-data-maps/pplr-data-maps/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=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-G/YRcN8CL4Pwn8c8/7ZEfAUTZMuRM5TTL9SeqpDMZwrTOUJ7xp3IEIH50n1+EUxO\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
"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=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-koAjGVq7VRimsFtaadj919IEV8AB0MLU2DEl4YYmdXhiJL/o1eviZa6pkyZaL9ur\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
},
"bundle": "pplr-data-maps"
}
@ -1058,7 +1058,7 @@
"bundle": "upg-neighbor",
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"output": "dx-maps/upg-neighbor/upg-neighbor.js",
"integrity": "sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU",
"integrity": "sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz",
"elements": [
"upg-neighbor"
],
@ -1074,7 +1074,7 @@
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"embed": {
"iframe": "<iframe src=\"./upg-neighbor/upg-neighbor/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=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
"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=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
},
"instances": [
{

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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl",
"integrity": "sha384-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU",
"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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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-RZB2z6HiN7NM45myfigI8nk0demkfLbfLrHmMP791DqXtaYOVBATI00A/Gez5thl\" 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-ZCIZCTsm9MIQwvJb8DplE+Gutaf94d6a5KJ+0vRCbMxabj6UuNC5xmbd2KCRAoWU\" 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>"
}
}
]
@ -836,7 +836,7 @@
"bundle": "pplr-data-maps",
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
"output": "dx-maps/pplr-data-maps/pplr-data-maps.js",
"integrity": "sha384-G/YRcN8CL4Pwn8c8/7ZEfAUTZMuRM5TTL9SeqpDMZwrTOUJ7xp3IEIH50n1+EUxO",
"integrity": "sha384-koAjGVq7VRimsFtaadj919IEV8AB0MLU2DEl4YYmdXhiJL/o1eviZa6pkyZaL9ur",
"elements": [
"pplr-data-maps"
],
@ -852,7 +852,7 @@
"scriptUrl": "./pplr-data-maps/pplr-data-maps.js",
"embed": {
"iframe": "<iframe src=\"./pplr-data-maps/pplr-data-maps/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=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-G/YRcN8CL4Pwn8c8/7ZEfAUTZMuRM5TTL9SeqpDMZwrTOUJ7xp3IEIH50n1+EUxO\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
"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=\"./pplr-data-maps/pplr-data-maps.js\" integrity=\"sha384-koAjGVq7VRimsFtaadj919IEV8AB0MLU2DEl4YYmdXhiJL/o1eviZa6pkyZaL9ur\" crossorigin=\"anonymous\"></script>\n<pplr-data-maps profile-config='{\"profile\":\"pplr-data-maps\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></pplr-data-maps>"
},
"bundle": "pplr-data-maps"
}
@ -1058,7 +1058,7 @@
"bundle": "upg-neighbor",
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"output": "dx-maps/upg-neighbor/upg-neighbor.js",
"integrity": "sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU",
"integrity": "sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz",
"elements": [
"upg-neighbor"
],
@ -1074,7 +1074,7 @@
"scriptUrl": "./upg-neighbor/upg-neighbor.js",
"embed": {
"iframe": "<iframe src=\"./upg-neighbor/upg-neighbor/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=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
"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=\"./upg-neighbor/upg-neighbor.js\" integrity=\"sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz\" crossorigin=\"anonymous\"></script>\n<upg-neighbor profile-config='{\"profile\":\"upg-neighbor\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></upg-neighbor>"
},
"instances": [
{

File diff suppressed because one or more lines are too long

View file

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <pplr-data-maps> custom element. -->
<script src="../pplr-data-maps.js" integrity="sha384-G/YRcN8CL4Pwn8c8/7ZEfAUTZMuRM5TTL9SeqpDMZwrTOUJ7xp3IEIH50n1+EUxO" crossorigin="anonymous"></script>
<script src="../pplr-data-maps.js" integrity="sha384-koAjGVq7VRimsFtaadj919IEV8AB0MLU2DEl4YYmdXhiJL/o1eviZa6pkyZaL9ur" 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

@ -36,7 +36,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz" 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 <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz" 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 <upg-neighbor> custom element. -->
<script src="../upg-neighbor.js" integrity="sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU" crossorigin="anonymous"></script>
<script src="../upg-neighbor.js" integrity="sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz" 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 <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz" 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 <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz" 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 <upg-neighbor> custom element. -->
<script src="../../upg-neighbor.js" integrity="sha384-7ExyxQyD/BpL7gSmY7yGJjJgM3VWoCyIKdWxnuOu5P8Pl1FJuELz1xKY+2faxSwU" crossorigin="anonymous"></script>
<script src="../../upg-neighbor.js" integrity="sha384-Qs7iIl9Ai7ILa5jY8FihoO/1DYiCkY+pgbhYAJxuku2WyJaf8Ku5XTw+y+EMy/Bz" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order: