Merge branch 'main' of https://git.nuxtbase.app/doxa-life/doxa-maps into bundler-3/work
Some checks are pending
build-gate / build (push) Waiting to run

# Conflicts:
#	public/doxa-maps/index.html
This commit is contained in:
doxa-maps-88655c70 2026-09-25 00:02:18 +00:00
commit 1c7384ee39
17 changed files with 1439 additions and 100 deletions

View file

@ -0,0 +1,82 @@
#!/usr/bin/env node
/**
* build-packet-fixtures — build every committed packet fixture, so check:packets-all has more
* than one SHAPE to evaluate.
*
* THE GAP THIS CLOSES. check:packets-all reported "every generated packet renders, in every locale
* present" and passed on 11 packets — all of them the SAME ZONE (laos) in 11 locales, against 28
* poster zones. The suite proved one zone's layout eleven times. Generating all 28 x 11 is a
* network fetch per zone and ~100MB of artefacts, so the answer is not more zones: it is more
* SHAPES, chosen where the layout can actually break, built from committed records with no network.
*
* ★ THE SHAPES ARE THE PAGE BOUNDARY. packet-render.js:76 sets PER_PAGE = 20, and pagination is
* `for (start = 0; start < groups.length; start += PER_PAGE)`. laos has 95 groups and tibet 43 —
* both mid-range, both remainder cases, so the boundary itself had NEVER been rendered:
* - exactly 20 : one full page. An off-by-one here yields 2 list pages, the second empty.
* - 21 : two pages, the second holding a SINGLE card.
* - 1 : the minimum a zone can have.
* Each is derived by slicing the committed tibet fixture, so they are byte-deterministic and need
* no API.
*
* ⚠ EACH BUILD OVERWRITES THE PREVIOUS ONE, which is the reason this script exists rather than a
* line of shell. packet.mjs names its output for the ZONE, not the fixture, so four fixture builds
* against one zone leave one file — and check:packets-all would go on seeing a single shape while
* reporting success. Each output is renamed to its fixture's own name so all of them coexist and
* every one gets evaluated.
*
* Usage: node internal/build-packet-fixtures.mjs
*/
import { existsSync, renameSync, readdirSync } from 'node:fs'
import { resolve, dirname, join } from 'node:path'
import { fileURLToPath } from 'node:url'
import { spawnSync } from 'node:child_process'
const HERE = dirname(fileURLToPath(import.meta.url))
const REPO = process.env.DOXA_REPO || resolve(HERE, '..')
const FIXTURES = resolve(REPO, 'library/scripts/posters/fixtures')
const OUT = resolve(REPO, 'library/scripts/posters/out/packets')
// Every fixture is built against this zone: the records come from the fixture, and the zone only
// supplies page 1's map. Keeping it constant means a shape difference is the ONLY variable.
const ZONE = 'asia-china-tibet-autonomous-region'
if (!existsSync(FIXTURES)) {
console.log(`PACKET-FIXTURES: SKIP — no fixtures directory at ${FIXTURES}`)
process.exit(0)
}
const fixtures = readdirSync(FIXTURES).filter((f) => /^records-.*\.json$/.test(f)).sort()
if (!fixtures.length) {
console.log('PACKET-FIXTURES: SKIP — no records-*.json fixtures committed')
process.exit(0)
}
console.log(`PACKET-FIXTURES: building ${fixtures.length} fixture(s)`)
const built = []
const failed = []
for (const fx of fixtures) {
const name = fx.replace(/^records-/, '').replace(/\.json$/, '')
const res = spawnSync(process.execPath, [join(REPO, 'library/scripts/posters/packet.mjs')], {
cwd: REPO,
encoding: 'utf8',
env: { ...process.env, PACKET_RECORDS: join(FIXTURES, fx), ONLY: ZONE },
})
const produced = join(OUT, `${ZONE}.html`)
if (res.status !== 0 || !existsSync(produced)) {
failed.push(`${fx}: ${(res.stderr || res.stdout || '').trim().split('\n').slice(-1)[0] || 'no output'}`)
console.log(` ✗ ${fx}`)
continue
}
// Rename BEFORE the next build, or the next one overwrites it — see the warning above.
const dest = join(OUT, `fixture-${name}.html`)
renameSync(produced, dest)
built.push(`fixture-${name}.html`)
console.log(` ✓ ${fx} -> fixture-${name}.html`)
}
if (failed.length) {
console.error(`\nPACKET-FIXTURES: FAIL — ${failed.length} fixture(s) did not build`)
for (const f of failed) console.error(' - ' + f)
process.exit(1)
}
console.log(`\nPACKET-FIXTURES: ${built.length} packet(s) built. Run check:packets-all to evaluate them.`)

View file

@ -32,6 +32,21 @@ const LEAF = process.argv[2] || DEFAULT_LEAF
const WIDTHS = (process.env.CARD_FIT_WIDTH || '390,768,1024,1440,1920')
.split(',').map((n) => Number(n.trim())).filter(Boolean)
// ★ AND SWEEP LOCALES, for exactly the same reason the widths are swept. The Driver's requirement
// was "full words visible AND support localization"; this gate only ever ran in English, which is
// the shortest of the eleven. MEASURED 2026-09-24 at 1440px, the three print labels:
// en Prayer List 76px · Card Deck 72px · Poster Map 79px
// ro Listă de rugăciune 122px · Pachet de cartonașe 133px · Harta afișului 92px (+75%)
// zh 禱告名單 56px · 禱告卡組 56px · 海报地图 56px
// Romanian is the widest RENDERED, which is the property that matters — not the longest string.
// Chinese is only 4 characters yet each glyph is near double-width, so a character-count heuristic
// would have picked the wrong worst case. The gate asserts scrollWidth > clientWidth, which is
// pixels, so the sweep has to be pixels too.
// en is always included as the control; ro and zh are the measured extremes. Override with
// CARD_FIT_LANG to check a specific locale.
const LANGS = (process.env.CARD_FIT_LANG || 'en,ro,zh')
.split(',').map((s) => s.trim()).filter(Boolean)
let reachable = false
try { const r = await fetch(LEAF, { signal: AbortSignal.timeout(4000) }); reachable = r.ok } catch { /* precondition */ }
if (!reachable) {
@ -44,10 +59,15 @@ const WALK = `(root, out) => { out = out || []; const rec = (r) => { for (const
const browser = await chromium.launch({ args: ['--use-gl=swiftshader', '--enable-unsafe-swiftshader'] })
async function measure(width) {
async function measure(width, lang) {
const mobile = width < 500
const page = await browser.newPage({ viewport: { width, height: 1000 }, isMobile: mobile, hasTouch: mobile })
await page.goto(LEAF, { waitUntil: 'load', timeout: 45000 })
// ?lang= is how the app selects a locale (library/i18n/index.js:83). Appended rather than
// replaced so a caller can still pass a leaf URL that already carries query params.
const url = lang && lang !== 'en'
? LEAF + (LEAF.includes('?') ? '&' : '?') + 'lang=' + encodeURIComponent(lang)
: LEAF
await page.goto(url, { waitUntil: 'load', timeout: 45000 })
await page.waitForTimeout(10000)
// ★ HOVER IS INVISIBLE TO A STATIC PROBE, which is exactly how the blue outline stayed
@ -164,12 +184,12 @@ async function measure(width) {
controls: ctrls.length, tiny: tiny.length }
})()`)
await page.close()
return { width, hover, ...out }
return { width, lang, hover, ...out }
}
const results = []
try {
for (const w of WIDTHS) results.push(await measure(w))
for (const lang of LANGS) for (const w of WIDTHS) results.push(await measure(w, lang))
} finally {
await browser.close()
}
@ -177,7 +197,7 @@ try {
console.log('POSTER-CARD-FITS')
console.log(` leaf : ${LEAF}`)
for (const r of results) {
console.log(` ${String(r.width).padStart(4)}px cards ${String(r.cards).padStart(2)}`
console.log(` ${(r.lang || 'en').padEnd(2)} ${String(r.width).padStart(4)}px cards ${String(r.cards).padStart(2)}`
+ ` · overflow ${r.overflowing}${r.worst ? ` (${r.worst}px)` : ''}`
+ ` · neighbour ${r.intrusions}`
+ ` · over-preview ${r.coveringPreview}${r.worstY ? ` (${r.worstY}px)` : ''}`
@ -193,7 +213,7 @@ for (const r of results) {
const fails = []
for (const r of results) {
const at = `${r.width}px`
const at = `${r.lang || 'en'} ${r.width}px`
// PRECONDITION: no cards means nothing was tested at this width — not a pass.
if (!r.cards) { fails.push(`${at}: no poster cards rendered — wrong url, or the wall did not mount`); continue }
if (!r.rows) { fails.push(`${at}: ${r.cards} card(s) but none carry a .pfs print-options row`); continue }
@ -274,6 +294,9 @@ if (fails.length) {
for (const f of fails) console.error(' - ' + f)
process.exit(1)
}
console.log(`\nPOSTER-CARD-FITS: PASS — at ${results.length} width(s) (${WIDTHS.join(', ')}px) every `
// Report widths x LOCALES, not the product. "15 width(s)" misdescribes 5 widths in 3 languages,
// and a summary that overstates its own coverage is how a green line stops meaning anything.
console.log(`\nPOSTER-CARD-FITS: PASS — ${WIDTHS.length} width(s) (${WIDTHS.join(', ')}px) `
+ `x ${LANGS.length} locale(s) (${LANGS.join(', ')}) = ${results.length} combination(s). Every `
+ 'print-options row sits inside its own card and below its preview, with every control still '
+ 'big enough to press.')
+ 'big enough to press and its label fully readable in every locale checked.')

View file

@ -0,0 +1,578 @@
[
{
"slug": "adi",
"name": "Adi",
"country_code": "CHN",
"population": "1400",
"religion": "E",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://flickr.com/photos/ramesh_lalwani/8169468855/",
"text": "Ramesh Lalwani - Flickr"
}
],
"latitude": "29.24961200",
"longitude": "95.17182400",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion"
},
{
"slug": "ainu-china",
"name": "Ainu",
"country_code": "CHN",
"population": "11000",
"religion": "MSN",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "38.93020500",
"longitude": "76.16959600",
"country_code_label": "People's Republic of China",
"religion_label": "Islam - Sunni"
},
{
"slug": "alxa-mongols",
"name": "Alxa Mongols",
"country_code": "CHN",
"population": "35500",
"religion": "MSN",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "39.20798700",
"longitude": "101.67522000",
"country_code_label": "People's Republic of China",
"religion_label": "Islam - Sunni"
},
{
"slug": "bogar-lhoba",
"name": "Bogar Lhoba",
"country_code": "CHN",
"population": "5300",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By bojum"
}
],
"latitude": "28.74470000",
"longitude": "93.64580000",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "bogol",
"name": "Bogol",
"country_code": "CHN",
"population": "1400",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "48.46892600",
"longitude": "124.48821300",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "boyu-tibetans",
"name": "Boyu Tibetans",
"country_code": "CHN",
"population": "5400",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "33.36236100",
"longitude": "104.58044400",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "bunan",
"name": "Bunan",
"country_code": "CHN",
"population": "2500",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "31.79607000",
"longitude": "78.90344000",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "buryat",
"name": "Buryat",
"country_code": "CHN",
"population": "170000",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://commons.wikimedia.org/wiki/File:Me_and_a_Buryat.jpg",
"text": "Telaneo - Wikimedia"
}
],
"latitude": "48.75926000",
"longitude": "117.78630000",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "butuo-nosu",
"name": "Butuo Nosu",
"country_code": "CHN",
"population": "337000",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By Anonymous"
}
],
"latitude": "27.60452900",
"longitude": "102.87518600",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "cona-monba",
"name": "Cona Monba",
"country_code": "CHN",
"population": "58500",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of Joshua Project by Anonymous"
}
],
"latitude": "27.89404900",
"longitude": "92.20691400",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "darang-deng",
"name": "Darang Deng",
"country_code": "CHN",
"population": "12500",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "28.37980000",
"longitude": "97.02930000",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "enger-yugur",
"name": "Enger Yugur",
"country_code": "CHN",
"population": "5500",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://flickr.com/photos/mke1963/154213183/",
"text": "Mark mke1963 - Flickr"
}
],
"latitude": "37.98815000",
"longitude": "101.76214000",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "ersu",
"name": "Ersu",
"country_code": "CHN",
"population": "48000",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "29.23558500",
"longitude": "102.35591600",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "geman-deng",
"name": "Geman Deng",
"country_code": "CHN",
"population": "16500",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "28.47324000",
"longitude": "97.04437000",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "heishui",
"name": "Heishui",
"country_code": "CHN",
"population": "48500",
"religion": "BLA",
"has_photo": false,
"picture_credit": null,
"latitude": "32.19164300",
"longitude": "103.03860100",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "henan-mongols",
"name": "Henan Mongols",
"country_code": "CHN",
"population": "43000",
"religion": "BLA",
"has_photo": false,
"picture_credit": null,
"latitude": "34.73230000",
"longitude": "101.60860000",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "keji",
"name": "Keji",
"country_code": "CHN",
"population": "2600",
"religion": "MSN",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.paulnoll.com/China/Minorities/China-Nationalities.html",
"text": "Paul Noll"
}
],
"latitude": "29.65355100",
"longitude": "91.12095900",
"country_code_label": "People's Republic of China",
"religion_label": "Islam - Sunni"
},
{
"slug": "kyrgyz",
"name": "Kyrgyz",
"country_code": "CHN",
"population": "195000",
"religion": "MOF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://commons.wikimedia.org/wiki/File:Kyrgyz_women_offering_butter_and_salt.jpg",
"text": "Theklan - Wikimedia"
}
],
"latitude": "38.01774000",
"longitude": "76.09630000",
"country_code_label": "People's Republic of China",
"religion_label": "Islam - Folk"
},
{
"slug": "luzu",
"name": "Luzu",
"country_code": "CHN",
"population": "1600",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "28.33754000",
"longitude": "101.35823900",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "manyak",
"name": "Manyak",
"country_code": "CHN",
"population": "3000",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "29.67090000",
"longitude": "101.59510000",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "medog-monba",
"name": "Medog Monba",
"country_code": "CHN",
"population": "11000",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "29.46300000",
"longitude": "95.74060000",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
}
]

View file

@ -0,0 +1,548 @@
[
{
"slug": "adi",
"name": "Adi",
"country_code": "CHN",
"population": "1400",
"religion": "E",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://flickr.com/photos/ramesh_lalwani/8169468855/",
"text": "Ramesh Lalwani - Flickr"
}
],
"latitude": "29.24961200",
"longitude": "95.17182400",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion"
},
{
"slug": "ainu-china",
"name": "Ainu",
"country_code": "CHN",
"population": "11000",
"religion": "MSN",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "38.93020500",
"longitude": "76.16959600",
"country_code_label": "People's Republic of China",
"religion_label": "Islam - Sunni"
},
{
"slug": "alxa-mongols",
"name": "Alxa Mongols",
"country_code": "CHN",
"population": "35500",
"religion": "MSN",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "39.20798700",
"longitude": "101.67522000",
"country_code_label": "People's Republic of China",
"religion_label": "Islam - Sunni"
},
{
"slug": "bogar-lhoba",
"name": "Bogar Lhoba",
"country_code": "CHN",
"population": "5300",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By bojum"
}
],
"latitude": "28.74470000",
"longitude": "93.64580000",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "bogol",
"name": "Bogol",
"country_code": "CHN",
"population": "1400",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "48.46892600",
"longitude": "124.48821300",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "boyu-tibetans",
"name": "Boyu Tibetans",
"country_code": "CHN",
"population": "5400",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "33.36236100",
"longitude": "104.58044400",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "bunan",
"name": "Bunan",
"country_code": "CHN",
"population": "2500",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "31.79607000",
"longitude": "78.90344000",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "buryat",
"name": "Buryat",
"country_code": "CHN",
"population": "170000",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://commons.wikimedia.org/wiki/File:Me_and_a_Buryat.jpg",
"text": "Telaneo - Wikimedia"
}
],
"latitude": "48.75926000",
"longitude": "117.78630000",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "butuo-nosu",
"name": "Butuo Nosu",
"country_code": "CHN",
"population": "337000",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By Anonymous"
}
],
"latitude": "27.60452900",
"longitude": "102.87518600",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "cona-monba",
"name": "Cona Monba",
"country_code": "CHN",
"population": "58500",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of Joshua Project by Anonymous"
}
],
"latitude": "27.89404900",
"longitude": "92.20691400",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "darang-deng",
"name": "Darang Deng",
"country_code": "CHN",
"population": "12500",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "28.37980000",
"longitude": "97.02930000",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "enger-yugur",
"name": "Enger Yugur",
"country_code": "CHN",
"population": "5500",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://flickr.com/photos/mke1963/154213183/",
"text": "Mark mke1963 - Flickr"
}
],
"latitude": "37.98815000",
"longitude": "101.76214000",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "ersu",
"name": "Ersu",
"country_code": "CHN",
"population": "48000",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "29.23558500",
"longitude": "102.35591600",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "geman-deng",
"name": "Geman Deng",
"country_code": "CHN",
"population": "16500",
"religion": "ECF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "28.47324000",
"longitude": "97.04437000",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion - Chinese Folk Religion"
},
{
"slug": "heishui",
"name": "Heishui",
"country_code": "CHN",
"population": "48500",
"religion": "BLA",
"has_photo": false,
"picture_credit": null,
"latitude": "32.19164300",
"longitude": "103.03860100",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "henan-mongols",
"name": "Henan Mongols",
"country_code": "CHN",
"population": "43000",
"religion": "BLA",
"has_photo": false,
"picture_credit": null,
"latitude": "34.73230000",
"longitude": "101.60860000",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "keji",
"name": "Keji",
"country_code": "CHN",
"population": "2600",
"religion": "MSN",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.paulnoll.com/China/Minorities/China-Nationalities.html",
"text": "Paul Noll"
}
],
"latitude": "29.65355100",
"longitude": "91.12095900",
"country_code_label": "People's Republic of China",
"religion_label": "Islam - Sunni"
},
{
"slug": "kyrgyz",
"name": "Kyrgyz",
"country_code": "CHN",
"population": "195000",
"religion": "MOF",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://commons.wikimedia.org/wiki/File:Kyrgyz_women_offering_butter_and_salt.jpg",
"text": "Theklan - Wikimedia"
}
],
"latitude": "38.01774000",
"longitude": "76.09630000",
"country_code_label": "People's Republic of China",
"religion_label": "Islam - Folk"
},
{
"slug": "luzu",
"name": "Luzu",
"country_code": "CHN",
"population": "1600",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "28.33754000",
"longitude": "101.35823900",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
},
{
"slug": "manyak",
"name": "Manyak",
"country_code": "CHN",
"population": "3000",
"religion": "BLA",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://www.asiaharvest.org",
"text": "Operation China, Asia Harvest"
}
],
"latitude": "29.67090000",
"longitude": "101.59510000",
"country_code_label": "People's Republic of China",
"religion_label": "Buddhism - Tibetan"
}
]

View file

@ -0,0 +1,32 @@
[
{
"slug": "adi",
"name": "Adi",
"country_code": "CHN",
"population": "1400",
"religion": "E",
"has_photo": false,
"picture_credit": [
{
"link": null,
"text": "Photo courtesy of "
},
{
"link": "https://www.joshuaproject.net",
"text": "Joshua Project"
},
{
"link": null,
"text": ". By "
},
{
"link": "https://flickr.com/photos/ramesh_lalwani/8169468855/",
"text": "Ramesh Lalwani - Flickr"
}
],
"latitude": "29.24961200",
"longitude": "95.17182400",
"country_code_label": "People's Republic of China",
"religion_label": "Ethnoreligion"
}
]

View file

@ -37,7 +37,7 @@
"packets": "cd library/scripts/posters && VITE_API_BASE_URL=https://pray.doxa.life node packet.mjs # the prayer packets. READS out/posters/<zone>.html for page 1's map, which `bun run posters` writes — without it the packet still builds and page 1 is simply BLANK, so the script now warns per-zone AND in its summary. PACKET_LANG=<loc> for one language, ONLY=<zoneKey> for one zone, NOPHOTOS=1 to skip the photo fetch.",
"packet-fixture": "node internal/generate-packet-fixture.mjs # regenerate the committed records subset (smallest zone, image_url stripped) that lets CI build a packet at all — out/ is gitignored, so a clean checkout has neither the records cache nor any packet.",
"check:packet-fixture": "node internal/generate-packet-fixture.mjs --check # the committed fixture must still match clusters.json and must never carry image_url (CI would fetch 43 photos from someone else's CDN).",
"packet:ci": "sh -c 'F=\"$PWD/library/scripts/posters/fixtures/records-tibet.json\"; PACKET_RECORDS=\"$F\" ONLY=asia-china-tibet-autonomous-region node library/scripts/posters/packet.mjs' # build ONE packet from the committed fixture, no network. This is what makes check:packets-all evaluate something in CI instead of SKIPping, as it had on every build.",
"packet:ci": "node internal/build-packet-fixtures.mjs # build EVERY committed fixture, no network, each renamed to its own output so they coexist. Was one fixture (tibet); packet.mjs names its output for the ZONE not the fixture, so sequential builds overwrote each other and check:packets-all saw a single SHAPE while reporting success. The fixtures are chosen at the PER_PAGE=20 page boundary — exactly 20, 21, and 1 group — because laos (95) and tibet (43) are both mid-range remainder cases and the boundary itself had never rendered.",
"token": "node internal/write-token.mjs",
"smoke": "node internal/smoke.mjs",
"smoke:embeds": "node internal/embed-smoke.mjs",

View file

@ -373,21 +373,97 @@ function popupHtml(p) {
// Re-frame and re-source on a new selection instead of tearing the map down: a rebuilt map
// re-downloads tiles and flashes, and the subject changes on every tab-1 click.
/**
* The chooser's zoom has to follow the CONTAINER WIDTH, not be a constant.
* The chooser's zoom has to follow the CONTAINER, and it has to be asked of the GLOBE.
*
* ★ THIS USED TO BE `log2(width / 512)` — mercator's world is 512*2^z wide, so that is the zoom
* which fits one mercator world. But the chooser renders under the GLOBE projection, and the same
* mistake that made the region pages frame too wide (a mercator answer applied to a sphere) made
* this frame too SMALL. Found by LOOKING at _shot-chooser-map-desktop.png — a sphere adrift in
* white space — not by any assertion, and then measured by
* _qa-cycle/02-builder-cycle/_probe-chooser-globe-fill.mjs at 1200x780:
*
* zoom 1.229 (what the mercator formula returned) -> sphere diameter 390.61px = 50.1% of the
* frame's short side. HALF THE FRAME WAS DEAD SPACE.
*
* Worse, the number was inert. That probe measured zoom 0.5, 1.0 and 1.229 all rendering an
* IDENTICAL 390.61px sphere, because Mapbox clamps the globe's apparent size at low zoom: the
* formula's output sat inside the clamp, so it could have returned 0.5 and changed nothing.
*
* There is no closed form to replace it with. The same probe measured the diameter against a clean
* doubling and found 3.6-10.5% error above the clamp, because the globe-to-mercator transition is
* nonlinear there — so `log2` of anything is the wrong shape. What the measurement DID establish
* is that the diameter never decreases as zoom rises, and monotonicity is the only property a
* solver needs. So SOLVE it against the engine instead of modelling it:
* bisect the zoom whose pole-to-pole projection fills FILL of the frame's short side.
*
* project() is pure transform math — no tiles, no paint, no network — and every setZoom here
* lands in ONE synchronous block before any frame renders, so the bisection is invisible; the
* original zoom is restored in a `finally` regardless. If any of it throws, the old mercator
* formula is the fallback, because a slightly small globe beats a broken chooser.
*
* MEASURED: a fixed zoom of 1.25 fills a 1200px desktop frame and shows barely a third of the
* world at 390px — Asia fell off the right edge, on the one screen whose job is "pick a region".
* Mercator's world is 512*2^z wide, so the zoom that fits it is log2(width/512): ~1.23 at 1200px,
* ~-0.39 at 390px. Mapbox will not go below 0, so a phone still crops, but ~24% instead of ~67%,
* and the map pans. Clamped to [0, 2] so a very wide embed does not zoom past the useful range.
* Only the chooser uses this; a selected page is framed by their own bounds/centre/zoom.
*/
const CHOOSER_FILL = 0.92 // leave a margin so the limb is never clipped by the frame
function chooserZoom(m) {
if (props.colorMode !== 'region') return props.zoom
let w = 0
try { w = m.getContainer()?.clientWidth || 0 } catch (_) { w = 0 }
if (!w) return props.zoom
return Math.max(0, Math.min(2, Math.log2(w / 512)))
let W = 0, H = 0
try { const el = m.getContainer(); W = el?.clientWidth || 0; H = el?.clientHeight || 0 } catch (_) { W = 0 }
if (!W) return props.zoom
const mercatorFallback = Math.max(0, Math.min(2, Math.log2(W / 512)))
if (!H) return mercatorFallback
const z0 = m.getZoom()
try {
const c = m.getCenter()
// ★ THE LIMB, NOT THE POLES. The first version of this measured pole-to-pole and called it the
// diameter, which is only true when the centre sits on the equator. The chooser centres on the
// mean of every people group -- latitude 28 -- so pole-to-pole is a CHORD: measured 717.6px
// where the sphere was really 792-835px across, understating it by 1.104x. The solver therefore
// over-zoomed and the globe was clipped top and bottom, which the screenshot showed plainly
// while every number still looked right.
// Under the globe the silhouette is centred on the map centre, so any point at 90 deg ANGULAR
// distance lies on the limb. Sample several bearings and take the MAX, because Mapbox's globe
// is a perspective camera rather than a true orthographic one, so the silhouette is not a
// perfect screen-space circle -- measured radius 396px along the meridian against 417.3px east
// and west at the same zoom. Taking the max is what keeps the widest axis inside the frame.
const RAD = Math.PI / 180, DEG = 180 / Math.PI
const phi0 = c.lat * RAD
// Great-circle destination at angular distance 90 deg on bearing t, which reduces to this
// because cos(90 deg) is 0 and sin(90 deg) is 1.
const limbPoints = []
for (let i = 0; i < 12; i++) {
const t = (i / 12) * 2 * Math.PI
const lat = Math.asin(Math.cos(phi0) * Math.cos(t))
const lng = c.lng + Math.atan2(Math.sin(t) * Math.cos(phi0), -Math.sin(phi0) * Math.sin(lat)) * DEG
limbPoints.push([lng, lat * DEG])
}
const diameter = (z) => {
m.setZoom(z)
const ctr = m.project([c.lng, c.lat])
let max = 0
for (const pt of limbPoints) {
const q = m.project(pt)
const d = Math.hypot(q.x - ctr.x, q.y - ctr.y)
if (Number.isFinite(d) && d > max) max = d
}
return max * 2
}
const want = Math.min(W, H) * CHOOSER_FILL
let lo = 0, hi = 5
if (diameter(hi) < want) return hi // frame bigger than the globe can fill
for (let i = 0; i < 24; i++) { // 24 halvings of [0,5] resolves to ~3e-7 zoom
const mid = (lo + hi) / 2
if (diameter(mid) < want) lo = mid; else hi = mid
}
const solved = (lo + hi) / 2
return Number.isFinite(solved) ? solved : mercatorFallback
} catch (e) {
console.warn('[RegionCountryMap] globe fill solve failed, using the mercator fit:', e && e.message)
return mercatorFallback
} finally {
// Never leave the camera parked on a probe value.
try { m.setZoom(z0) } catch (_) {}
}
}
/**

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-+miFg4jJ9ffz3j/bWOVAozmvoj7APOdJxIl0WmOWrSMDbutivwv8gRBy43qL6Q5b" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-Z875R7k5jbxkAhY0RmB9TIcg3kpW00VoFj+G5hMKNVN+OK+gdTYHXjnjjhVb1jDV" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-+miFg4jJ9ffz3j/bWOVAozmvoj7APOdJxIl0WmOWrSMDbutivwv8gRBy43qL6Q5b" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-Z875R7k5jbxkAhY0RmB9TIcg3kpW00VoFj+G5hMKNVN+OK+gdTYHXjnjjhVb1jDV" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -40,7 +40,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <country-posters-map> custom element. -->
<script src="../country-posters.js" integrity="sha384-+miFg4jJ9ffz3j/bWOVAozmvoj7APOdJxIl0WmOWrSMDbutivwv8gRBy43qL6Q5b" crossorigin="anonymous"></script>
<script src="../country-posters.js" integrity="sha384-Z875R7k5jbxkAhY0RmB9TIcg3kpW00VoFj+G5hMKNVN+OK+gdTYHXjnjjhVb1jDV" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -158,7 +158,7 @@
"bundle": "country-posters",
"scriptUrl": "./country-posters/country-posters.js",
"output": "doxa-maps/country-posters/country-posters.js",
"integrity": "sha384-+miFg4jJ9ffz3j/bWOVAozmvoj7APOdJxIl0WmOWrSMDbutivwv8gRBy43qL6Q5b",
"integrity": "sha384-Z875R7k5jbxkAhY0RmB9TIcg3kpW00VoFj+G5hMKNVN+OK+gdTYHXjnjjhVb1jDV",
"elements": [
"country-posters-map"
],
@ -178,7 +178,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/countries-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-+miFg4jJ9ffz3j/bWOVAozmvoj7APOdJxIl0WmOWrSMDbutivwv8gRBy43qL6Q5b\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Z875R7k5jbxkAhY0RmB9TIcg3kpW00VoFj+G5hMKNVN+OK+gdTYHXjnjjhVb1jDV\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"countries-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
}
},
{
@ -192,7 +192,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-poster-wall/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-+miFg4jJ9ffz3j/bWOVAozmvoj7APOdJxIl0WmOWrSMDbutivwv8gRBy43qL6Q5b\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Z875R7k5jbxkAhY0RmB9TIcg3kpW00VoFj+G5hMKNVN+OK+gdTYHXjnjjhVb1jDV\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-poster-wall\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
}
},
{
@ -206,7 +206,7 @@
"scriptUrl": "./country-posters/country-posters.js",
"embed": {
"iframe": "<iframe src=\"./country-posters/country-posters-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-+miFg4jJ9ffz3j/bWOVAozmvoj7APOdJxIl0WmOWrSMDbutivwv8gRBy43qL6Q5b\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./country-posters/country-posters.js\" integrity=\"sha384-Z875R7k5jbxkAhY0RmB9TIcg3kpW00VoFj+G5hMKNVN+OK+gdTYHXjnjjhVb1jDV\" crossorigin=\"anonymous\"></script>\n<country-posters-map profile-config='{\"profile\":\"country-posters-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></country-posters-map>"
}
}
]
@ -879,7 +879,7 @@
"bundle": "regions-dashboard",
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"output": "doxa-maps/regions-dashboard/regions-dashboard.js",
"integrity": "sha384-yxWIwZyBb6+xve6pVbhxlLEJn4diVUhzV0fZReHWRYgdIb8U0OZUrAi7SEu9DnpI",
"integrity": "sha384-7ouNc0JA9dufo2S3LgvdwQ/znMBgiow5pEeOs2xWejN7xOuqGRm9wPepdm3uS40z",
"elements": [
"regions-dashboard"
],
@ -899,7 +899,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/region-dashboards/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-yxWIwZyBb6+xve6pVbhxlLEJn4diVUhzV0fZReHWRYgdIb8U0OZUrAi7SEu9DnpI\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-7ouNc0JA9dufo2S3LgvdwQ/znMBgiow5pEeOs2xWejN7xOuqGRm9wPepdm3uS40z\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"region-dashboards\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -913,7 +913,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-yxWIwZyBb6+xve6pVbhxlLEJn4diVUhzV0fZReHWRYgdIb8U0OZUrAi7SEu9DnpI\" 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-7ouNc0JA9dufo2S3LgvdwQ/znMBgiow5pEeOs2xWejN7xOuqGRm9wPepdm3uS40z\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
},
{
@ -927,7 +927,7 @@
"scriptUrl": "./regions-dashboard/regions-dashboard.js",
"embed": {
"iframe": "<iframe src=\"./regions-dashboard/regions-mfe/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-yxWIwZyBb6+xve6pVbhxlLEJn4diVUhzV0fZReHWRYgdIb8U0OZUrAi7SEu9DnpI\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./regions-dashboard/regions-dashboard.js\" integrity=\"sha384-7ouNc0JA9dufo2S3LgvdwQ/znMBgiow5pEeOs2xWejN7xOuqGRm9wPepdm3uS40z\" crossorigin=\"anonymous\"></script>\n<regions-dashboard profile-config='{\"profile\":\"regions-mfe\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></regions-dashboard>"
}
}
]

View file

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

File diff suppressed because one or more lines are too long

View file

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

View file

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